@instructure/canvas-rce 5.14.1 → 5.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/DEVELOPMENT.md +1 -1
- package/README.md +0 -8
- package/__tests__/common/indicate.test.js +84 -0
- package/__tests__/common/mimeClass.test.js +85 -0
- package/__tests__/module/contentInsertionUtils.test.js +52 -0
- package/__tests__/module/indicatorRegion.test.js +75 -0
- package/__tests__/module/normalizeLocale.test.js +46 -0
- package/__tests__/module/normalizeProps.test.js +51 -0
- package/__tests__/module/sanitizePlugins.test.js +48 -0
- package/__tests__/module/wrapInitCb.test.js +56 -0
- package/__tests__/rcs/api.test.js +819 -0
- package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
- package/__tests__/sidebar/actions/data.test.js +196 -0
- package/__tests__/sidebar/actions/utils.js +44 -0
- package/{es/rce/plugins/shared/__mocks__/screenfull.js → __tests__/sidebar/reducers/all_files.test.js} +10 -6
- package/babel.config.js +3 -1
- package/es/bridge/Bridge.js +8 -56
- package/es/bridge/index.js +1 -0
- package/es/canvasFileBrowser/FileBrowser.js +12 -59
- package/es/canvasFileBrowser/en-US.js +3 -6
- package/es/common/FlashAlert.js +7 -28
- package/es/common/browser.js +4 -2
- package/es/common/fileUrl.js +104 -59
- package/es/common/incremental-loading/LoadMoreButton.js +1 -0
- package/es/common/incremental-loading/LoadingIndicator.js +1 -2
- package/es/common/incremental-loading/LoadingStatus.js +1 -2
- package/es/common/incremental-loading/index.js +1 -0
- package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
- package/es/common/indicate.js +15 -8
- package/es/common/mimeClass.js +3 -4
- package/es/common/natcompare.js +1 -4
- package/es/defaultTinymceConfig.js +5 -3
- package/es/elementDenylist.js +1 -0
- package/es/enhance-user-content/doc_previews.js +17 -28
- package/es/enhance-user-content/enhance_user_content.js +28 -60
- package/es/enhance-user-content/external_links.js +5 -8
- package/es/enhance-user-content/index.js +1 -0
- package/es/enhance-user-content/instructure_helper.js +12 -34
- package/es/enhance-user-content/jqueryish_funcs.js +8 -11
- package/es/enhance-user-content/mathml.js +35 -82
- package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
- package/es/format-message.js +3 -4
- package/es/getThemeVars.js +8 -6
- package/es/getTranslations.js +1 -78
- package/es/index.js +3 -1
- package/es/rce/AlertMessageArea.js +1 -1
- package/es/rce/DraggingBlocker.js +4 -2
- package/es/rce/KeyboardShortcutModal.js +1 -0
- package/es/rce/RCE.js +12 -11
- package/es/rce/RCEGlobals.js +12 -10
- package/es/rce/RCEVariants.js +27 -10
- package/es/rce/RCEWrapper.js +167 -386
- package/es/rce/RCEWrapperProps.js +8 -3
- package/es/rce/RceHtmlEditor.js +5 -8
- package/es/rce/ResizeHandle.js +3 -8
- package/es/rce/RestoreAutoSaveModal.js +1 -2
- package/es/rce/ShowOnFocusButton/index.js +0 -6
- package/es/rce/StatusBar.js +8 -37
- package/es/rce/alertHandler.js +1 -4
- package/es/rce/contentInsertion.js +35 -57
- package/es/rce/contentInsertionUtils.js +6 -8
- package/es/rce/contentRendering.js +7 -12
- package/es/rce/customEvents.js +1 -0
- package/es/rce/editorLanguage.js +22 -10
- package/es/rce/indicatorRegion.js +6 -5
- package/es/rce/normalizeLocale.js +5 -3
- package/es/rce/normalizeProps.js +3 -1
- package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
- package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
- package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
- package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
- package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
- package/es/rce/plugins/instructure_color/plugin.js +40 -0
- package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
- package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
- package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
- package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
- package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
- package/es/rce/plugins/instructure_documents/plugin.js +7 -14
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
- package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
- package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
- package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
- package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
- package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
- package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
- package/es/rce/plugins/instructure_equation/plugin.js +7 -10
- package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
- package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
- package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
- package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
- package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
- package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
- package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
- package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
- package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
- package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
- package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
- package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
- package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
- package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
- package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
- package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
- package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
- package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
- package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
- package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
- package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
- package/es/rce/plugins/instructure_image/Images/index.js +1 -3
- package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_image/plugin.js +13 -18
- package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
- package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
- package/es/rce/plugins/instructure_links/components/Link.js +7 -19
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
- package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
- package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
- package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
- package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
- package/es/rce/plugins/instructure_links/plugin.js +17 -40
- package/es/rce/plugins/instructure_links/validateURL.js +81 -36
- package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
- package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
- package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
- package/es/rce/plugins/instructure_paste/plugin.js +27 -29
- package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
- package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
- package/es/rce/{__mocks__/_mockStudioPlayer.js → plugins/instructure_rce_external_tools/constants.js} +11 -3
- package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
- package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
- package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
- package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
- package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
- package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
- package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
- package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
- package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
- package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
- package/es/rce/plugins/instructure_record/plugin.js +11 -18
- package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
- package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
- package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
- package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
- package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
- package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
- package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
- package/es/rce/plugins/shared/CanvasContentTray.js +22 -49
- package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
- package/es/rce/plugins/shared/ColorInput.js +5 -14
- package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
- package/es/rce/plugins/shared/ContentSelection.js +17 -58
- package/es/rce/plugins/shared/DimensionUtils.js +1 -8
- package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
- package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
- package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
- package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
- package/es/rce/plugins/shared/EventUtils.js +1 -3
- package/es/rce/plugins/shared/Filter.js +8 -38
- package/es/rce/plugins/shared/FixedContentTray.js +3 -3
- package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
- package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
- package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
- package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
- package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
- package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
- package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
- package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
- package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
- package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
- package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
- package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
- package/es/rce/plugins/shared/LinkDisplay.js +1 -2
- package/es/rce/plugins/shared/PreviewIcon.js +1 -6
- package/es/rce/plugins/shared/Previewable.js +1 -0
- package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
- package/es/rce/plugins/shared/StoreContext.js +1 -2
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
- package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
- package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
- package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
- package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
- package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
- package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
- package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
- package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
- package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
- package/es/rce/plugins/shared/Upload/index.js +1 -0
- package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
- package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
- package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
- package/es/rce/plugins/shared/ai_tools/index.js +1 -0
- package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
- package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
- package/es/rce/plugins/shared/compressionUtils.js +1 -8
- package/es/rce/plugins/shared/dateUtils.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
- package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
- package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
- package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
- package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
- package/es/rce/plugins/shared/fileShape.js +4 -9
- package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
- package/es/rce/plugins/shared/fileUtils.js +1 -2
- package/es/rce/plugins/shared/linkUtils.js +1 -16
- package/es/rce/plugins/shared/round.js +1 -0
- package/es/rce/plugins/shared/trayUtils.js +4 -3
- package/es/rce/plugins/shared/useDataUrl.js +9 -9
- package/es/rce/plugins/shared/useFilterSettings.js +3 -3
- package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
- package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
- package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
- package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
- package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
- package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
- package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
- package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
- package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
- package/es/rce/root.js +9 -8
- package/es/rce/sanitizePlugins.js +1 -3
- package/es/rce/style.js +1 -4
- package/es/rce/tinyRCE.js +13 -9
- package/es/rce/tinymce.oxide.content.min.css.js +1 -0
- package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
- package/es/rce/transformContent.js +8 -10
- package/es/rce/types.js +1 -0
- package/es/rce/userOS.js +1 -1
- package/es/rce/wrapInitCb.js +50 -43
- package/es/rcs/api.js +61 -116
- package/es/rcs/buildError.js +5 -17
- package/es/rcs/fake.js +4 -13
- package/es/sidebar/actions/all_files.js +2 -0
- package/es/sidebar/actions/data.js +4 -7
- package/es/sidebar/actions/documents.js +9 -6
- package/es/sidebar/actions/files.js +3 -6
- package/es/sidebar/actions/filter.js +1 -0
- package/es/sidebar/actions/flickr.js +1 -1
- package/es/sidebar/actions/images.js +12 -11
- package/es/sidebar/actions/links.js +1 -0
- package/es/sidebar/actions/media.js +12 -10
- package/es/sidebar/actions/session.js +1 -3
- package/es/sidebar/actions/ui.js +1 -0
- package/es/sidebar/actions/upload.js +14 -39
- package/es/sidebar/containers/Sidebar.js +1 -2
- package/es/sidebar/containers/sidebarHandlers.js +3 -1
- package/es/sidebar/dragHtml.js +5 -3
- package/es/sidebar/reducers/all_files.js +4 -3
- package/es/sidebar/reducers/collection.js +12 -13
- package/es/sidebar/reducers/collections.js +5 -5
- package/es/sidebar/reducers/documents.js +6 -13
- package/es/sidebar/reducers/files.js +3 -3
- package/es/sidebar/reducers/filter.js +1 -8
- package/es/sidebar/reducers/flickr.js +9 -9
- package/es/sidebar/reducers/folder.js +15 -15
- package/es/sidebar/reducers/folders.js +3 -3
- package/es/sidebar/reducers/images.js +3 -13
- package/es/sidebar/reducers/index.js +3 -1
- package/es/sidebar/reducers/media.js +6 -13
- package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
- package/es/sidebar/reducers/noop.js +1 -0
- package/es/sidebar/reducers/rootFolderId.js +1 -2
- package/es/sidebar/reducers/session.js +3 -3
- package/es/sidebar/reducers/ui.js +3 -16
- package/es/sidebar/reducers/upload.js +8 -40
- package/es/sidebar/store/configureStore.js +1 -0
- package/es/sidebar/store/initialState.js +13 -24
- package/es/translations/locales/ab.js +1 -0
- package/es/translations/locales/ar.js +67 -9
- package/es/translations/locales/ca.js +67 -9
- package/es/translations/locales/cs.js +1 -0
- package/es/translations/locales/cs_CZ.js +1 -0
- package/es/translations/locales/cy.js +67 -9
- package/es/translations/locales/da-x-k12.js +67 -9
- package/es/translations/locales/da.js +67 -9
- package/es/translations/locales/da_DK.js +1 -0
- package/es/translations/locales/de.js +67 -9
- package/es/translations/locales/el.js +4 -0
- package/es/translations/locales/en-AU-x-unimelb.js +67 -9
- package/es/translations/locales/en-GB-x-ukhe.js +67 -9
- package/es/translations/locales/en.js +72 -8
- package/es/translations/locales/en_AU.js +67 -9
- package/es/translations/locales/en_CA.js +67 -9
- package/es/translations/locales/en_CY.js +67 -9
- package/es/translations/locales/en_GB.js +67 -9
- package/es/translations/locales/en_NZ.js +1 -0
- package/es/translations/locales/en_SE.js +1 -0
- package/es/translations/locales/en_US.js +1 -0
- package/es/translations/locales/es.js +67 -9
- package/es/translations/locales/es_ES.js +67 -9
- package/es/translations/locales/es_GT.js +1 -0
- package/es/translations/locales/fa_IR.js +7 -0
- package/es/translations/locales/fi.js +67 -9
- package/es/translations/locales/fr.js +67 -9
- package/es/translations/locales/fr_CA.js +68 -10
- package/es/translations/locales/ga.js +5 -13
- package/es/translations/locales/he.js +7 -0
- package/es/translations/locales/hi.js +67 -9
- package/es/translations/locales/ht.js +67 -9
- package/es/translations/locales/hu.js +7 -6
- package/es/translations/locales/hu_HU.js +1 -0
- package/es/translations/locales/hy.js +1 -0
- package/es/translations/locales/id.js +67 -9
- package/es/translations/locales/id_ID.js +1 -0
- package/es/translations/locales/is.js +67 -9
- package/es/translations/locales/it.js +67 -9
- package/es/translations/locales/ja.js +67 -9
- package/es/translations/locales/ko.js +1 -0
- package/es/translations/locales/ko_KR.js +1 -0
- package/es/translations/locales/lt.js +1 -0
- package/es/translations/locales/lt_LT.js +1 -0
- package/es/translations/locales/mi.js +67 -9
- package/es/translations/locales/mn_MN.js +1 -0
- package/es/translations/locales/ms.js +67 -9
- package/es/translations/locales/nb-x-k12.js +67 -9
- package/es/translations/locales/nb.js +67 -9
- package/es/translations/locales/nl.js +67 -9
- package/es/translations/locales/nl_NL.js +1 -0
- package/es/translations/locales/nn.js +7 -6
- package/es/translations/locales/pl.js +67 -9
- package/es/translations/locales/pt.js +67 -9
- package/es/translations/locales/pt_BR.js +67 -9
- package/es/translations/locales/ro.js +1 -0
- package/es/translations/locales/ru.js +67 -9
- package/es/translations/locales/se.js +1 -0
- package/es/translations/locales/sl.js +67 -9
- package/es/translations/locales/sv-x-k12.js +67 -9
- package/es/translations/locales/sv.js +67 -9
- package/es/translations/locales/sv_SE.js +1 -0
- package/es/translations/locales/tg.js +1 -0
- package/es/translations/locales/th.js +67 -9
- package/es/translations/locales/th_TH.js +1 -0
- package/es/translations/locales/tl_PH.js +1 -0
- package/es/translations/locales/tr.js +7 -0
- package/es/translations/locales/uk_UA.js +7 -0
- package/es/translations/locales/vi.js +67 -9
- package/es/translations/locales/vi_VN.js +1 -0
- package/es/translations/locales/zh-Hans.js +67 -9
- package/es/translations/locales/zh-Hant.js +67 -9
- package/es/translations/locales/zh.js +67 -9
- package/es/translations/locales/zh_HK.js +67 -9
- package/es/translations/locales/zh_TW.Big5.js +1 -0
- package/es/translations/locales/zh_TW.js +1 -0
- package/es/translations/tinymce/ar_SA.js +1 -0
- package/es/translations/tinymce/fi.js +1 -0
- package/es/translations/tinymce/ga.js +1 -0
- package/es/translations/tinymce/id.js +1 -0
- package/es/translations/tinymce/ru.js +1 -0
- package/es/translations/tinymce/ru_RU.js +1 -0
- package/es/translations/tinymce/sl.js +1 -0
- package/es/translations/tinymce/sr.js +1 -0
- package/es/translations/tinymce/th.js +1 -0
- package/es/translations/tinymce/uk_UA.js +1 -0
- package/es/translations/tinymce/vi_VN.js +1 -0
- package/es/util/TypedDict.js +4 -2
- package/es/util/encrypted-storage.js +3 -13
- package/es/util/file-url-util.js +1 -6
- package/es/util/fullscreenHelpers.js +4 -1
- package/es/util/instui-icon-helper.js +4 -3
- package/es/util/loadingPlaceholder.js +38 -39
- package/es/util/simpleCache.js +0 -3
- package/es/util/string-util.js +1 -1
- package/es/util/textarea-editing-util.js +3 -7
- package/es/util/tinymce-plugin-util.js +0 -5
- package/es/util/url-util.js +16 -25
- package/eslint.config.js +239 -0
- package/jest.config.js +1 -1
- package/package.json +76 -81
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/testcafe/RCEWrapper.test.js +0 -1
- package/testcafe/StatusBar.test.js +0 -1
- package/testcafe/axe.test.js +3 -4
- package/testcafe/enhanceUserContent.test.js +0 -1
- package/tsconfig.json +20 -15
- package/.eslintrc +0 -45
- package/.prettierignore +0 -6
- package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
- package/es/rce/__mocks__/styleMock.js +0 -18
- package/es/rce/__mocks__/tinymceReact.js +0 -55
- package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import _pt from "prop-types";
|
|
2
|
-
|
|
3
2
|
/*
|
|
4
3
|
* Copyright (C) 2024 - present Instructure, Inc.
|
|
5
4
|
*
|
|
@@ -17,6 +16,7 @@ import _pt from "prop-types";
|
|
|
17
16
|
* You should have received a copy of the GNU Affero General Public License along
|
|
18
17
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
19
18
|
*/
|
|
19
|
+
|
|
20
20
|
import React, { useState } from 'react';
|
|
21
21
|
import { Flex } from '@instructure/ui-flex';
|
|
22
22
|
import ErrorBoundary from '../ErrorBoundary';
|
|
@@ -34,18 +34,19 @@ export default function CanvasContentPanel(_ref) {
|
|
|
34
34
|
} = _ref;
|
|
35
35
|
const [filterSettings, setFilterSettings] = useFilterSettings(FILTER_SETTINGS_BY_PLUGIN[plugin]);
|
|
36
36
|
const [link, setLink] = useState(null);
|
|
37
|
-
const [hasLoaded, setHasLoaded] = useState(false);
|
|
37
|
+
const [hasLoaded, setHasLoaded] = useState(false);
|
|
38
38
|
|
|
39
|
+
// storeProps has functions that collide with what we want to do in a block editor setting
|
|
39
40
|
const baseStoreProps = useStoreProps();
|
|
40
41
|
const {
|
|
41
42
|
onImageEmbed: _,
|
|
43
|
+
onMediaEmbed: _m,
|
|
42
44
|
...storeProps
|
|
43
45
|
} = baseStoreProps;
|
|
44
|
-
|
|
45
46
|
function handleFilterChange(newFilter, onChangeContext, onChangeSearchString, onChangeSortBy) {
|
|
46
|
-
const newFilterSettings = {
|
|
47
|
+
const newFilterSettings = {
|
|
48
|
+
...newFilter
|
|
47
49
|
};
|
|
48
|
-
|
|
49
50
|
if (newFilterSettings.sortValue) {
|
|
50
51
|
newFilterSettings.sortDir = newFilterSettings.sortValue === 'alphabetical' ? 'asc' : 'desc';
|
|
51
52
|
onChangeSortBy({
|
|
@@ -53,50 +54,43 @@ export default function CanvasContentPanel(_ref) {
|
|
|
53
54
|
dir: newFilterSettings.sortDir
|
|
54
55
|
});
|
|
55
56
|
}
|
|
56
|
-
|
|
57
57
|
if ('searchString' in newFilterSettings && filterSettings.searchString !== newFilterSettings.searchString) {
|
|
58
58
|
onChangeSearchString(newFilterSettings.searchString);
|
|
59
59
|
}
|
|
60
|
-
|
|
61
60
|
setFilterSettings(newFilterSettings);
|
|
62
|
-
|
|
63
61
|
if (newFilterSettings.contentType) {
|
|
64
62
|
let contextType, contextId;
|
|
65
|
-
|
|
66
63
|
switch (newFilterSettings.contentType) {
|
|
67
64
|
case 'user_files':
|
|
68
65
|
contextType = 'user';
|
|
69
66
|
contextId = trayProps.containingContext.userId;
|
|
70
67
|
break;
|
|
71
|
-
|
|
72
68
|
case 'group_files':
|
|
73
69
|
contextType = 'group';
|
|
74
70
|
contextId = trayProps.containingContext.contextId;
|
|
75
71
|
break;
|
|
76
|
-
|
|
77
72
|
case 'course_files':
|
|
78
73
|
contextType = trayProps.contextType;
|
|
79
74
|
contextId = trayProps.containingContext.contextId;
|
|
80
75
|
break;
|
|
81
|
-
|
|
82
76
|
case 'links':
|
|
83
77
|
contextType = trayProps.containingContext.contextType;
|
|
84
78
|
contextId = trayProps.containingContext.contextId;
|
|
85
79
|
}
|
|
86
|
-
|
|
87
80
|
onChangeContext({
|
|
88
81
|
contextType,
|
|
89
82
|
contextId
|
|
90
|
-
});
|
|
91
|
-
|
|
83
|
+
});
|
|
84
|
+
// context is only changed on load
|
|
92
85
|
setHasLoaded(true);
|
|
93
86
|
}
|
|
94
87
|
}
|
|
95
|
-
|
|
96
88
|
const handleImageClick = image => {
|
|
97
89
|
setFileUrl(image.href);
|
|
98
90
|
};
|
|
99
|
-
|
|
91
|
+
const handleMediaClick = media => {
|
|
92
|
+
setFileUrl(`/media_attachments_iframe/${media.id}`);
|
|
93
|
+
};
|
|
100
94
|
return /*#__PURE__*/React.createElement(Flex, {
|
|
101
95
|
as: "div",
|
|
102
96
|
direction: "column",
|
|
@@ -134,7 +128,8 @@ export default function CanvasContentPanel(_ref) {
|
|
|
134
128
|
editing: false,
|
|
135
129
|
onEditClick: setLink,
|
|
136
130
|
selectedLink: link,
|
|
137
|
-
onImageEmbed: handleImageClick
|
|
131
|
+
onImageEmbed: handleImageClick,
|
|
132
|
+
onMediaEmbed: handleMediaClick
|
|
138
133
|
}, storeProps)))))));
|
|
139
134
|
}
|
|
140
135
|
CanvasContentPanel.propTypes = {
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import * as SvgProcessor from './SvgCategoryProcessor';
|
|
19
20
|
export async function process(file) {
|
|
20
21
|
var _file$type;
|
|
21
|
-
|
|
22
22
|
// Determine which processor to use based on file type.
|
|
23
23
|
// If no matching processor is found for the given file type, return undefined
|
|
24
24
|
if (file !== null && file !== void 0 && (_file$type = file.type) !== null && _file$type !== void 0 && _file$type.includes(SvgProcessor.typeTest)) {
|
|
@@ -15,10 +15,12 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
// NOTE: if you're looking in here for the ComputerPanel that's used for
|
|
19
20
|
// the RCE's Media > Upload/Record Media function, it's not this one
|
|
20
21
|
// (though this panel can handle video with the right "accept" prop).
|
|
21
22
|
// See @instructure/canvas-media/src/ComputerPanel.js
|
|
23
|
+
|
|
22
24
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
23
25
|
import { arrayOf, func, number, object, oneOfType, shape, string } from 'prop-types';
|
|
24
26
|
import { StyleSheet, css } from 'aphrodite';
|
|
@@ -38,34 +40,26 @@ import { MediaPlayer } from '@instructure/ui-media-player';
|
|
|
38
40
|
import { RocketSVG, useComputerPanelFocus, isAudio, isPreviewable, sizeMediaPlayer } from '@instructure/canvas-media';
|
|
39
41
|
import formatMessage from '../../../../format-message';
|
|
40
42
|
import { getIconFromType, isAudioOrVideo, isImage, isText, isIWork, getIWorkType } from '../fileTypeUtils';
|
|
41
|
-
|
|
42
43
|
function isPreviewableAudioOrVideo(type) {
|
|
43
44
|
return isPreviewable(type) && isAudioOrVideo(type);
|
|
44
45
|
}
|
|
45
|
-
|
|
46
46
|
function readFile(theFile) {
|
|
47
47
|
const p = new Promise((resolve, reject) => {
|
|
48
48
|
const reader = new FileReader();
|
|
49
|
-
|
|
50
49
|
reader.onload = () => {
|
|
51
50
|
let result = reader.result;
|
|
52
|
-
|
|
53
51
|
if (isText(theFile.type) && result.length > 1000) {
|
|
54
52
|
result = `${result.substr(0, 1000)}...`;
|
|
55
53
|
}
|
|
56
|
-
|
|
57
54
|
resolve(result);
|
|
58
55
|
};
|
|
59
|
-
|
|
60
56
|
reader.onerror = () => {
|
|
61
57
|
reject(new Error(formatMessage('An error occured reading the file')));
|
|
62
58
|
};
|
|
63
|
-
|
|
64
59
|
if (theFile.size === 0) {
|
|
65
60
|
// canvas will reject uploading an empty file
|
|
66
61
|
reject(new Error(formatMessage('You may not upload an empty file.')));
|
|
67
62
|
}
|
|
68
|
-
|
|
69
63
|
if (isImage(theFile.type)) {
|
|
70
64
|
reader.readAsDataURL(theFile);
|
|
71
65
|
} else if (isText(theFile.type)) {
|
|
@@ -78,19 +72,17 @@ function readFile(theFile) {
|
|
|
78
72
|
}];
|
|
79
73
|
resolve(sources);
|
|
80
74
|
} else {
|
|
81
|
-
let type = theFile.type;
|
|
82
|
-
|
|
75
|
+
let type = theFile.type;
|
|
76
|
+
// Native JS File API returns empty string if it can't determine the type
|
|
83
77
|
if (type === '' && isIWork(theFile.name)) {
|
|
84
78
|
type = getIWorkType(theFile.name);
|
|
85
79
|
}
|
|
86
|
-
|
|
87
80
|
const icon = getIconFromType(type);
|
|
88
81
|
resolve(icon);
|
|
89
82
|
}
|
|
90
83
|
});
|
|
91
84
|
return p;
|
|
92
85
|
}
|
|
93
|
-
|
|
94
86
|
export default function ComputerPanel(_ref) {
|
|
95
87
|
let {
|
|
96
88
|
theFile,
|
|
@@ -104,31 +96,28 @@ export default function ComputerPanel(_ref) {
|
|
|
104
96
|
const [preview, setPreview] = useState({
|
|
105
97
|
preview: null,
|
|
106
98
|
isLoading: false
|
|
107
|
-
});
|
|
99
|
+
});
|
|
100
|
+
// the trashcan is 38px tall and the 1.5rem margin-bottom
|
|
108
101
|
// the 350 is to guarantee the video doesn't oveflow into the copyright UI,
|
|
109
102
|
// which should probably be rendered here and not up in the modal because
|
|
110
103
|
// dealing with Tabs and size is nearly impossible
|
|
111
|
-
|
|
112
104
|
const height = Math.min(350, 0.8 * (bounds.height - 38 - px('1.5rem')));
|
|
113
105
|
const width = 0.8 * bounds.width;
|
|
114
106
|
useEffect(() => {
|
|
115
107
|
return () => {
|
|
116
108
|
if (Array.isArray(preview === null || preview === void 0 ? void 0 : preview.preview)) {
|
|
117
109
|
var _URL, _URL$revokeObjectURL;
|
|
118
|
-
|
|
119
110
|
(_URL = URL) === null || _URL === void 0 ? void 0 : (_URL$revokeObjectURL = _URL.revokeObjectURL) === null || _URL$revokeObjectURL === void 0 ? void 0 : _URL$revokeObjectURL.call(_URL, preview.preview[0].src);
|
|
120
111
|
}
|
|
121
112
|
};
|
|
122
113
|
}, [preview]);
|
|
123
114
|
useEffect(() => {
|
|
124
115
|
if (!theFile || preview.isLoading || preview.preview || preview.error) return;
|
|
125
|
-
|
|
126
116
|
async function getPreview() {
|
|
127
117
|
setPreview({
|
|
128
118
|
preview: null,
|
|
129
119
|
isLoading: true
|
|
130
120
|
});
|
|
131
|
-
|
|
132
121
|
try {
|
|
133
122
|
const previewer = await readFile(theFile);
|
|
134
123
|
setPreview({
|
|
@@ -136,7 +125,6 @@ export default function ComputerPanel(_ref) {
|
|
|
136
125
|
isLoading: false
|
|
137
126
|
});
|
|
138
127
|
setError(null);
|
|
139
|
-
|
|
140
128
|
if (isImage(theFile.type)) {
|
|
141
129
|
// we need the preview to know the image size to show the placeholder
|
|
142
130
|
theFile.preview = previewer;
|
|
@@ -151,7 +139,6 @@ export default function ComputerPanel(_ref) {
|
|
|
151
139
|
});
|
|
152
140
|
}
|
|
153
141
|
}
|
|
154
|
-
|
|
155
142
|
getPreview();
|
|
156
143
|
});
|
|
157
144
|
const handleLoadedMetadata = useCallback(event => {
|
|
@@ -162,16 +149,15 @@ export default function ComputerPanel(_ref) {
|
|
|
162
149
|
});
|
|
163
150
|
player.style.width = sz.width;
|
|
164
151
|
player.style.height = sz.height;
|
|
165
|
-
player.style.margin = '0 auto';
|
|
152
|
+
player.style.margin = '0 auto';
|
|
153
|
+
// from this sub-package, I don't have a URL to use as the
|
|
166
154
|
// audio player's poster image. We can give it a background image though
|
|
167
|
-
|
|
168
155
|
player.classList.add(isAudio(theFile.type) ? 'audio-player' : 'video-player');
|
|
169
156
|
}, [theFile, width, height]);
|
|
170
157
|
const previewPanelRef = useRef(null);
|
|
171
158
|
const clearButtonRef = useRef(null);
|
|
172
159
|
const panelRef = useRef(null);
|
|
173
160
|
useComputerPanelFocus(theFile, panelRef, clearButtonRef);
|
|
174
|
-
|
|
175
161
|
function renderPreview() {
|
|
176
162
|
if (preview.isLoading) {
|
|
177
163
|
return /*#__PURE__*/React.createElement("div", {
|
|
@@ -231,7 +217,6 @@ export default function ComputerPanel(_ref) {
|
|
|
231
217
|
}
|
|
232
218
|
}
|
|
233
219
|
}
|
|
234
|
-
|
|
235
220
|
if (theFile) {
|
|
236
221
|
const filename = theFile.name;
|
|
237
222
|
return /*#__PURE__*/React.createElement("div", {
|
|
@@ -269,7 +254,6 @@ export default function ComputerPanel(_ref) {
|
|
|
269
254
|
margin: "0 auto"
|
|
270
255
|
}, renderPreview()));
|
|
271
256
|
}
|
|
272
|
-
|
|
273
257
|
return /*#__PURE__*/React.createElement("div", {
|
|
274
258
|
ref: panelRef
|
|
275
259
|
}, /*#__PURE__*/React.createElement(FileDrop, {
|
|
@@ -277,11 +261,9 @@ export default function ComputerPanel(_ref) {
|
|
|
277
261
|
accept: accept,
|
|
278
262
|
onDropAccepted: _ref2 => {
|
|
279
263
|
let [file] = _ref2;
|
|
280
|
-
|
|
281
264
|
if (messages.length) {
|
|
282
265
|
setMessages([]);
|
|
283
266
|
}
|
|
284
|
-
|
|
285
267
|
setFile(file);
|
|
286
268
|
},
|
|
287
269
|
onDropRejected: () => {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import _pt from "prop-types";
|
|
2
|
-
|
|
3
2
|
/*
|
|
4
3
|
* Copyright (C) 2024 - present Instructure, Inc.
|
|
5
4
|
*
|
|
@@ -17,6 +16,7 @@ import _pt from "prop-types";
|
|
|
17
16
|
* You should have received a copy of the GNU Affero General Public License along
|
|
18
17
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
19
18
|
*/
|
|
19
|
+
|
|
20
20
|
import { ScreenReaderContent } from '@instructure/ui-a11y-content';
|
|
21
21
|
import { IconButton } from '@instructure/ui-buttons';
|
|
22
22
|
import { Flex } from '@instructure/ui-flex';
|
|
@@ -25,11 +25,9 @@ import { SimpleSelect } from '@instructure/ui-simple-select';
|
|
|
25
25
|
import { TextInput } from '@instructure/ui-text-input';
|
|
26
26
|
import formatMessage from 'format-message';
|
|
27
27
|
import React, { useEffect, useState } from 'react';
|
|
28
|
-
|
|
29
28
|
function shouldSearch(searchString) {
|
|
30
29
|
return searchString.length === 0 || searchString.length >= 3;
|
|
31
30
|
}
|
|
32
|
-
|
|
33
31
|
export default function PanelFilter(_ref) {
|
|
34
32
|
let {
|
|
35
33
|
mountNode,
|
|
@@ -39,8 +37,9 @@ export default function PanelFilter(_ref) {
|
|
|
39
37
|
contentType
|
|
40
38
|
} = _ref;
|
|
41
39
|
const [pendingSearchString, setPendingSearchString] = useState(searchString);
|
|
42
|
-
const [searchInputTimer, setSearchInputTimer] = useState(0);
|
|
40
|
+
const [searchInputTimer, setSearchInputTimer] = useState(0);
|
|
43
41
|
|
|
42
|
+
// only run on mounting to trigger change to correct contextType
|
|
44
43
|
useEffect(() => {
|
|
45
44
|
onChange({
|
|
46
45
|
contentType
|
|
@@ -53,28 +52,22 @@ export default function PanelFilter(_ref) {
|
|
|
53
52
|
window.clearTimeout(searchInputTimer);
|
|
54
53
|
setSearchInputTimer(0);
|
|
55
54
|
}
|
|
56
|
-
|
|
57
55
|
onChange({
|
|
58
56
|
searchString: value
|
|
59
57
|
});
|
|
60
58
|
}
|
|
61
59
|
}
|
|
62
|
-
|
|
63
60
|
function handleChangeSearch(value) {
|
|
64
61
|
setPendingSearchString(value);
|
|
65
|
-
|
|
66
62
|
if (searchInputTimer) {
|
|
67
63
|
window.clearTimeout(searchInputTimer);
|
|
68
64
|
}
|
|
69
|
-
|
|
70
65
|
const tid = window.setTimeout(() => doSearch(value), 250);
|
|
71
66
|
setSearchInputTimer(tid);
|
|
72
67
|
}
|
|
73
|
-
|
|
74
68
|
function handleClear() {
|
|
75
69
|
handleChangeSearch('');
|
|
76
70
|
}
|
|
77
|
-
|
|
78
71
|
function renderClearButton() {
|
|
79
72
|
if (pendingSearchString) {
|
|
80
73
|
return /*#__PURE__*/React.createElement(IconButton, {
|
|
@@ -85,10 +78,8 @@ export default function PanelFilter(_ref) {
|
|
|
85
78
|
size: "small"
|
|
86
79
|
}, /*#__PURE__*/React.createElement(IconXLine, null));
|
|
87
80
|
}
|
|
88
|
-
|
|
89
81
|
return undefined;
|
|
90
82
|
}
|
|
91
|
-
|
|
92
83
|
return /*#__PURE__*/React.createElement(Flex, {
|
|
93
84
|
margin: "none xx-large none none",
|
|
94
85
|
gap: "small",
|
|
@@ -15,21 +15,22 @@
|
|
|
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 { ICON_MAKER_ICONS, TYPE, SVG_TYPE } from '../../instructure_icon_maker/svg/constants';
|
|
19
20
|
export const typeTest = SVG_TYPE;
|
|
20
21
|
const sliceSize = 400; // bytes
|
|
21
|
-
|
|
22
22
|
const iconMakerType = TYPE;
|
|
23
23
|
export async function process(file) {
|
|
24
24
|
try {
|
|
25
25
|
// The first slice of 400 bytes is sufficient to grab
|
|
26
26
|
// the "type" metadata for icon maker SVGs
|
|
27
27
|
const slice = await file.slice(0, sliceSize).text();
|
|
28
|
-
|
|
29
28
|
if (slice.includes(iconMakerType)) {
|
|
30
29
|
return {
|
|
31
30
|
category: ICON_MAKER_ICONS
|
|
32
31
|
};
|
|
33
32
|
}
|
|
34
|
-
} catch {
|
|
33
|
+
} catch {
|
|
34
|
+
// intentionally empty
|
|
35
|
+
}
|
|
35
36
|
}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import _pt from "prop-types";
|
|
2
|
-
// @ts-nocheck
|
|
3
|
-
|
|
4
2
|
/*
|
|
5
3
|
* Copyright (C) 2019 - present Instructure, Inc.
|
|
6
4
|
*
|
|
@@ -18,6 +16,7 @@ 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, { useEffect, useState } from 'react';
|
|
22
21
|
import ReactDOM from 'react-dom';
|
|
23
22
|
import { px } from '@instructure/ui-utils';
|
|
@@ -31,25 +30,27 @@ import RCEWrapper from '../../../RCEWrapper';
|
|
|
31
30
|
import { UploadCanvasPanelIds } from '../canvasContentUtils';
|
|
32
31
|
export const UploadFilePanelIds = ['COMPUTER', 'URL'];
|
|
33
32
|
export const FullPanelIds = [...UploadCanvasPanelIds, ...UploadFilePanelIds];
|
|
34
|
-
|
|
35
33
|
/**
|
|
36
34
|
* Handles uploading data based on what type of data is submitted.
|
|
37
35
|
*/
|
|
38
|
-
export const handleSubmit = function (editor, accept, selectedPanel,
|
|
36
|
+
export const handleSubmit = function (editor, accept, selectedPanel,
|
|
37
|
+
// @ts-expect-error
|
|
38
|
+
uploadData,
|
|
39
|
+
// @ts-expect-error
|
|
40
|
+
storeProps,
|
|
41
|
+
// @ts-expect-error
|
|
42
|
+
_source) {
|
|
39
43
|
let afterInsert = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : () => undefined;
|
|
40
44
|
Bridge.focusEditor(RCEWrapper.getByEditor(editor)); // necessary since it blurred when the modal opened
|
|
41
|
-
|
|
42
45
|
const {
|
|
43
46
|
altText,
|
|
44
47
|
isDecorativeImage,
|
|
45
48
|
displayAs
|
|
46
49
|
} = (uploadData === null || uploadData === void 0 ? void 0 : uploadData.imageOptions) || {};
|
|
47
|
-
|
|
48
50
|
switch (selectedPanel) {
|
|
49
51
|
case 'COMPUTER':
|
|
50
52
|
{
|
|
51
53
|
var _uploadData$usageRigh;
|
|
52
|
-
|
|
53
54
|
const {
|
|
54
55
|
theFile
|
|
55
56
|
} = uploadData;
|
|
@@ -65,24 +66,20 @@ export const handleSubmit = function (editor, accept, selectedPanel, uploadData,
|
|
|
65
66
|
usageRights: (uploadData === null || uploadData === void 0 ? void 0 : (_uploadData$usageRigh = uploadData.usageRights) === null || _uploadData$usageRigh === void 0 ? void 0 : _uploadData$usageRigh.usageRight) === 'choose' ? undefined : uploadData === null || uploadData === void 0 ? void 0 : uploadData.usageRights
|
|
66
67
|
};
|
|
67
68
|
let tabContext = 'documents';
|
|
68
|
-
|
|
69
69
|
if (isImage(theFile.type)) {
|
|
70
70
|
tabContext = 'images';
|
|
71
71
|
} else if (isAudioOrVideo(theFile.type)) {
|
|
72
72
|
tabContext = 'media';
|
|
73
73
|
}
|
|
74
|
-
|
|
75
74
|
storeProps.startMediaUpload(tabContext, fileMetaData);
|
|
76
75
|
break;
|
|
77
76
|
}
|
|
78
|
-
|
|
79
77
|
case 'URL':
|
|
80
78
|
{
|
|
81
79
|
const {
|
|
82
80
|
fileUrl
|
|
83
81
|
} = uploadData;
|
|
84
82
|
let editorHtml;
|
|
85
|
-
|
|
86
83
|
if (displayAs !== 'link' && /image/.test(accept)) {
|
|
87
84
|
editorHtml = editor.dom.createHTML('img', {
|
|
88
85
|
src: fileUrl,
|
|
@@ -96,16 +93,13 @@ export const handleSubmit = function (editor, accept, selectedPanel, uploadData,
|
|
|
96
93
|
href: fileUrl
|
|
97
94
|
}, altText || fileUrl);
|
|
98
95
|
}
|
|
99
|
-
|
|
100
96
|
editor.insertContent(editorHtml);
|
|
101
97
|
break;
|
|
102
98
|
}
|
|
103
|
-
|
|
104
99
|
default:
|
|
105
100
|
throw new Error('Selected Panel is invalid');
|
|
106
101
|
// Should never get here
|
|
107
102
|
}
|
|
108
|
-
|
|
109
103
|
const element = editor.selection.getEnd();
|
|
110
104
|
element.addEventListener('load', () => indicate(indicatorRegion(editor, element)));
|
|
111
105
|
afterInsert();
|
|
@@ -129,18 +123,20 @@ export function UploadFile(_ref) {
|
|
|
129
123
|
const [modalBodyHeight, setModalBodyHeight] = useState(undefined);
|
|
130
124
|
const [theFile] = useState(preselectedFile);
|
|
131
125
|
const bodyRef = React.useRef();
|
|
132
|
-
|
|
126
|
+
|
|
127
|
+
// @ts-expect-error
|
|
128
|
+
trayProps = trayProps || Bridge.trayProps.get(editor);
|
|
129
|
+
|
|
130
|
+
// the panels get rendered inside tab panels. it's difficult for them to
|
|
133
131
|
// figure out how much space they have to work with, and I'd like the previews
|
|
134
132
|
// not to trigger scrollbars in the modal's body. Get the Modal.Body's size
|
|
135
133
|
// and to the ComputerPanel how much space it has so it can render the file preview
|
|
136
|
-
|
|
137
134
|
useEffect(() => {
|
|
138
135
|
if (bodyRef.current) {
|
|
139
136
|
// eslint-disable-next-line react/no-find-dom-node
|
|
140
137
|
const thebody = ReactDOM.findDOMNode(bodyRef.current);
|
|
141
138
|
const sz = thebody === null || thebody === void 0 ? void 0 : thebody.getBoundingClientRect();
|
|
142
139
|
sz.height -= px('3rem'); // leave room for the tabs
|
|
143
|
-
|
|
144
140
|
setModalBodyWidth(sz.width);
|
|
145
141
|
setModalBodyHeight(sz.height);
|
|
146
142
|
}
|
|
@@ -148,7 +144,8 @@ export function UploadFile(_ref) {
|
|
|
148
144
|
return /*#__PURE__*/React.createElement(StoreProvider, Object.assign({}, trayProps, {
|
|
149
145
|
canvasOrigin: canvasOrigin
|
|
150
146
|
}), contentProps => /*#__PURE__*/React.createElement(UploadFileModal, {
|
|
151
|
-
ref: bodyRef
|
|
147
|
+
ref: bodyRef
|
|
148
|
+
// @ts-expect-error
|
|
152
149
|
,
|
|
153
150
|
preselectedFile: theFile,
|
|
154
151
|
editor: editor,
|
|
@@ -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, { Suspense, useState } from 'react';
|
|
19
20
|
import { arrayOf, bool, func, number, object, oneOf, oneOfType, string } from 'prop-types';
|
|
20
21
|
import { Modal } from '@instructure/ui-modal';
|
|
@@ -33,35 +34,28 @@ import { UploadCanvasPanelIds, CanvasPanelTitles } from '../canvasContentUtils';
|
|
|
33
34
|
const CanvasContentPanel = /*#__PURE__*/React.lazy(() => import('./CanvasContentPanel'));
|
|
34
35
|
const ComputerPanel = /*#__PURE__*/React.lazy(() => import('./ComputerPanel'));
|
|
35
36
|
const UrlPanel = /*#__PURE__*/React.lazy(() => import('./UrlPanel'));
|
|
36
|
-
|
|
37
37
|
function shouldBeDisabled(_ref, selectedPanel, usageRightNotSet) {
|
|
38
38
|
let {
|
|
39
39
|
fileUrl,
|
|
40
40
|
theFile,
|
|
41
41
|
error
|
|
42
42
|
} = _ref;
|
|
43
|
-
|
|
44
43
|
if (error || usageRightNotSet && selectedPanel === 'COMPUTER') {
|
|
45
44
|
return true;
|
|
46
45
|
}
|
|
47
|
-
|
|
48
46
|
switch (selectedPanel) {
|
|
49
47
|
case 'COMPUTER':
|
|
50
48
|
return !theFile || theFile.error;
|
|
51
|
-
|
|
52
49
|
case 'URL':
|
|
53
50
|
return !fileUrl;
|
|
54
|
-
|
|
55
51
|
default:
|
|
56
52
|
if (UploadCanvasPanelIds.includes(selectedPanel)) return !fileUrl;
|
|
57
53
|
return false;
|
|
58
54
|
// When in doubt, don't disable (but we shouldn't get here either)
|
|
59
55
|
}
|
|
60
56
|
}
|
|
61
|
-
|
|
62
57
|
const UploadFileModal = /*#__PURE__*/React.forwardRef((_ref2, ref) => {
|
|
63
58
|
var _contentProps$session;
|
|
64
|
-
|
|
65
59
|
let {
|
|
66
60
|
preselectedFile,
|
|
67
61
|
editor,
|
|
@@ -87,38 +81,35 @@ const UploadFileModal = /*#__PURE__*/React.forwardRef((_ref2, ref) => {
|
|
|
87
81
|
usageRight: 'choose',
|
|
88
82
|
ccLicense: '',
|
|
89
83
|
copyrightHolder: ''
|
|
90
|
-
});
|
|
84
|
+
});
|
|
91
85
|
|
|
86
|
+
// Image options props
|
|
92
87
|
const [altText, setAltText] = useState('');
|
|
93
88
|
const [isDecorativeImage, setIsDecorativeImage] = useState(false);
|
|
94
|
-
const [displayAs, setDisplayAs] = useState('embed');
|
|
89
|
+
const [displayAs, setDisplayAs] = useState('embed');
|
|
90
|
+
// even though usage rights might be required by the course, canvas has no place
|
|
95
91
|
// on the user to store it. Only Group and Course.
|
|
96
|
-
|
|
97
92
|
const requiresUsageRights = (contentProps === null || contentProps === void 0 ? void 0 : (_contentProps$session = contentProps.session) === null || _contentProps$session === void 0 ? void 0 : _contentProps$session.usageRightsRequired) && /(?:course|group)/.test(trayProps.contextType);
|
|
98
|
-
|
|
99
93
|
function handleAltTextChange(event) {
|
|
100
94
|
setAltText(event.target.value);
|
|
101
95
|
}
|
|
102
|
-
|
|
103
96
|
function handleIsDecorativeChange(event) {
|
|
104
97
|
setIsDecorativeImage(event.target.checked);
|
|
105
98
|
}
|
|
106
|
-
|
|
107
99
|
function handleDisplayAsChange(event) {
|
|
108
100
|
setDisplayAs(event.target.value);
|
|
109
101
|
}
|
|
110
|
-
|
|
111
102
|
const handleRequestTabChange = index => {
|
|
112
103
|
setSelectedPanel(panels[index]);
|
|
113
104
|
setFileUrl('');
|
|
114
105
|
};
|
|
115
|
-
|
|
116
106
|
const submitDisabled = shouldBeDisabled({
|
|
117
107
|
fileUrl,
|
|
118
108
|
theFile,
|
|
119
109
|
error
|
|
120
|
-
}, selectedPanel, requiresUsageRights && usageRightsState.usageRight === 'choose');
|
|
110
|
+
}, selectedPanel, requiresUsageRights && usageRightsState.usageRight === 'choose');
|
|
121
111
|
|
|
112
|
+
// Load the necessary session values, if not already loaded
|
|
122
113
|
const loadSession = contentProps.loadSession;
|
|
123
114
|
React.useEffect(() => {
|
|
124
115
|
loadSession();
|
|
@@ -129,11 +120,9 @@ const UploadFileModal = /*#__PURE__*/React.forwardRef((_ref2, ref) => {
|
|
|
129
120
|
host: trayProps.host,
|
|
130
121
|
canvasOrigin
|
|
131
122
|
});
|
|
132
|
-
|
|
133
123
|
if (forBlockEditorUse && !['COMPUTER', 'URL'].includes(selectedPanel)) {
|
|
134
124
|
requireA11yAttributes = false;
|
|
135
125
|
}
|
|
136
|
-
|
|
137
126
|
return /*#__PURE__*/React.createElement(Modal, {
|
|
138
127
|
"data-mce-component": true,
|
|
139
128
|
as: "form",
|
|
@@ -144,11 +133,9 @@ const UploadFileModal = /*#__PURE__*/React.forwardRef((_ref2, ref) => {
|
|
|
144
133
|
onDismiss: onDismiss,
|
|
145
134
|
onSubmit: e => {
|
|
146
135
|
e.preventDefault();
|
|
147
|
-
|
|
148
136
|
if (submitDisabled || uploading) {
|
|
149
137
|
return false;
|
|
150
138
|
}
|
|
151
|
-
|
|
152
139
|
onSubmit(editor, accept, selectedPanel, {
|
|
153
140
|
fileUrl,
|
|
154
141
|
theFile,
|
|
@@ -202,7 +189,6 @@ const UploadFileModal = /*#__PURE__*/React.forwardRef((_ref2, ref) => {
|
|
|
202
189
|
height: modalBodyHeight
|
|
203
190
|
}
|
|
204
191
|
})));
|
|
205
|
-
|
|
206
192
|
case 'URL':
|
|
207
193
|
return /*#__PURE__*/React.createElement(Tabs.Panel, {
|
|
208
194
|
key: panel,
|
|
@@ -219,7 +205,6 @@ const UploadFileModal = /*#__PURE__*/React.forwardRef((_ref2, ref) => {
|
|
|
219
205
|
fileUrl: fileUrl,
|
|
220
206
|
setFileUrl: setFileUrl
|
|
221
207
|
})));
|
|
222
|
-
|
|
223
208
|
default:
|
|
224
209
|
if (UploadCanvasPanelIds.includes(panel)) {
|
|
225
210
|
return /*#__PURE__*/React.createElement(Tabs.Panel, {
|
|
@@ -238,10 +223,10 @@ const UploadFileModal = /*#__PURE__*/React.forwardRef((_ref2, ref) => {
|
|
|
238
223
|
setFileUrl: setFileUrl
|
|
239
224
|
})));
|
|
240
225
|
}
|
|
241
|
-
|
|
242
226
|
return null;
|
|
243
227
|
}
|
|
244
|
-
})),
|
|
228
|
+
})),
|
|
229
|
+
// We shouldn't show the accordions until the session data is loaded.
|
|
245
230
|
Object.keys(contentProps.session || {}).length > 0 && /*#__PURE__*/React.createElement(React.Fragment, null, selectedPanel === 'COMPUTER' && requiresUsageRights && /*#__PURE__*/React.createElement(View, {
|
|
246
231
|
as: "div",
|
|
247
232
|
role: "group",
|
|
@@ -304,6 +289,5 @@ UploadFileModal.propTypes = {
|
|
|
304
289
|
forBlockEditorUse: bool,
|
|
305
290
|
uploading: bool,
|
|
306
291
|
preselectedFile: object // JS File
|
|
307
|
-
|
|
308
292
|
};
|
|
309
293
|
export default UploadFileModal;
|
|
@@ -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 { string, func } from 'prop-types';
|
|
20
21
|
import { TextInput } from '@instructure/ui-text-input';
|