@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,18 +15,17 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React, { createContext, useContext, useState } from 'react';
|
|
19
20
|
import { connect, Provider as ReduxProvider } from 'react-redux';
|
|
20
21
|
import bridge from '../../../bridge';
|
|
21
22
|
import sidebarHandlers from '../../../sidebar/containers/sidebarHandlers';
|
|
22
23
|
import { propsFromState } from '../../../sidebar/containers/Sidebar';
|
|
23
24
|
import configureStore from '../../../sidebar/store/configureStore';
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
...props
|
|
29
|
-
} = _ref;
|
|
25
|
+
function Consumer({
|
|
26
|
+
children,
|
|
27
|
+
...props
|
|
28
|
+
}) {
|
|
30
29
|
return children({
|
|
31
30
|
onLinkClick: bridge.insertLink,
|
|
32
31
|
onImageEmbed: bridge.embedImage,
|
|
@@ -35,14 +34,12 @@ function Consumer(_ref) {
|
|
|
35
34
|
...props
|
|
36
35
|
});
|
|
37
36
|
}
|
|
38
|
-
|
|
39
37
|
export const StoreConsumer = connect(propsFromState, sidebarHandlers)(Consumer);
|
|
40
38
|
const StoreContext = /*#__PURE__*/createContext();
|
|
41
|
-
export function StoreProvider(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
} = _ref2;
|
|
39
|
+
export function StoreProvider({
|
|
40
|
+
children,
|
|
41
|
+
...storeProps
|
|
42
|
+
}) {
|
|
46
43
|
const [store] = useState(() => configureStore(storeProps));
|
|
47
44
|
return /*#__PURE__*/React.createElement(ReduxProvider, {
|
|
48
45
|
store: store
|
|
@@ -15,7 +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 PropTypes, { bool, shape } from 'prop-types';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Interface for content item's 'custom' field, specifically for what is expected to come from Studio
|
|
23
|
+
*
|
|
24
|
+
* Used to determine whether or not Studio embedded media should be resizable, and whether or not we
|
|
25
|
+
* present controls for the user to modify the embedded media.
|
|
26
|
+
*/
|
|
27
|
+
|
|
19
28
|
export const parsedStudioOptionsPropType = shape({
|
|
20
29
|
resizable: bool.isRequired,
|
|
21
30
|
convertibleToLink: bool.isRequired
|
|
@@ -25,7 +34,6 @@ export function isStudioContentItemCustomJson(input) {
|
|
|
25
34
|
}
|
|
26
35
|
export function studioAttributesFrom(customJson) {
|
|
27
36
|
var _customJson$resizable, _customJson$enableMed;
|
|
28
|
-
|
|
29
37
|
return {
|
|
30
38
|
'data-studio-resizable': (_customJson$resizable = customJson.resizable) !== null && _customJson$resizable !== void 0 ? _customJson$resizable : false,
|
|
31
39
|
'data-studio-tray-enabled': (_customJson$enableMed = customJson.enableMediaOptions) !== null && _customJson$enableMed !== void 0 ? _customJson$enableMed : false,
|
|
@@ -37,34 +45,29 @@ export function displayStyleFrom(studioAttributes) {
|
|
|
37
45
|
return studioAttributes['data-studio-resizable'] || studioAttributes['data-studio-tray-enabled'] ? 'inline-block' : '';
|
|
38
46
|
}
|
|
39
47
|
export function isStudioEmbeddedMedia(element) {
|
|
40
|
-
var _tinymceIframeShim$fi;
|
|
41
|
-
|
|
42
48
|
// Borrowing this structure from isMediaElement in ContentSelection.js
|
|
43
|
-
const tinymceIframeShim =
|
|
44
|
-
|
|
45
|
-
if ((tinymceIframeShim === null || tinymceIframeShim === void 0 ? void 0 : (_tinymceIframeShim$fi = tinymceIframeShim.firstElementChild) === null || _tinymceIframeShim$fi === void 0 ? void 0 : _tinymceIframeShim$fi.tagName) !== 'IFRAME') {
|
|
49
|
+
const tinymceIframeShim = element?.tagName === 'IFRAME' ? element?.parentElement : element;
|
|
50
|
+
if (tinymceIframeShim?.firstElementChild?.tagName !== 'IFRAME') {
|
|
46
51
|
return false;
|
|
47
52
|
}
|
|
48
|
-
|
|
49
53
|
return tinymceIframeShim.getAttribute('data-mce-p-data-studio-tray-enabled') === 'true';
|
|
50
54
|
}
|
|
51
55
|
export function parseStudioOptions(element) {
|
|
52
|
-
const tinymceIframeShim =
|
|
56
|
+
const tinymceIframeShim = element?.tagName === 'IFRAME' ? element?.parentElement : element;
|
|
53
57
|
return {
|
|
54
|
-
resizable:
|
|
55
|
-
convertibleToLink:
|
|
58
|
+
resizable: tinymceIframeShim?.getAttribute('data-mce-p-data-studio-resizable') === 'true',
|
|
59
|
+
convertibleToLink: tinymceIframeShim?.getAttribute('data-mce-p-data-studio-convertible-to-link') === 'true'
|
|
56
60
|
};
|
|
57
61
|
}
|
|
62
|
+
|
|
58
63
|
/**
|
|
59
64
|
* Tinymce adds an overlay when you click on an iframe inside the editor. It will by default
|
|
60
65
|
* add resize handles to the corners of the overlay. The code that adds these handles won't
|
|
61
66
|
* if the overlay has `data-mce-resize='false'` on it. Here, we force that behavior when the
|
|
62
67
|
* underlying iframe has a `data-studio-resizable='false'`
|
|
63
68
|
*/
|
|
64
|
-
|
|
65
69
|
export function handleBeforeObjectSelected(e) {
|
|
66
70
|
const targetElement = e.target;
|
|
67
|
-
|
|
68
71
|
if (targetElement.getAttribute('data-mce-p-data-studio-resizable') === 'false') {
|
|
69
72
|
targetElement.setAttribute('data-mce-resize', 'false');
|
|
70
73
|
}
|
|
@@ -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 { View } from '@instructure/ui-view';
|
|
20
21
|
import { Text } from '@instructure/ui-text';
|
|
@@ -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';
|
|
@@ -25,27 +25,27 @@ import PanelFilter from './PanelFilter';
|
|
|
25
25
|
import { FILTER_SETTINGS_BY_PLUGIN, DynamicPanel } from '../canvasContentUtils';
|
|
26
26
|
import { useStoreProps } from '../StoreContext';
|
|
27
27
|
// TODO: Component is only validated for images, need to validate for other content types
|
|
28
|
-
export default function CanvasContentPanel(
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
} = _ref;
|
|
28
|
+
export default function CanvasContentPanel({
|
|
29
|
+
trayProps,
|
|
30
|
+
canvasOrigin,
|
|
31
|
+
plugin,
|
|
32
|
+
setFileUrl
|
|
33
|
+
}) {
|
|
35
34
|
const [filterSettings, setFilterSettings] = useFilterSettings(FILTER_SETTINGS_BY_PLUGIN[plugin]);
|
|
36
35
|
const [link, setLink] = useState(null);
|
|
37
|
-
const [hasLoaded, setHasLoaded] = useState(false);
|
|
36
|
+
const [hasLoaded, setHasLoaded] = useState(false);
|
|
38
37
|
|
|
38
|
+
// storeProps has functions that collide with what we want to do in a block editor setting
|
|
39
39
|
const baseStoreProps = useStoreProps();
|
|
40
40
|
const {
|
|
41
41
|
onImageEmbed: _,
|
|
42
|
+
onMediaEmbed: _m,
|
|
42
43
|
...storeProps
|
|
43
44
|
} = baseStoreProps;
|
|
44
|
-
|
|
45
45
|
function handleFilterChange(newFilter, onChangeContext, onChangeSearchString, onChangeSortBy) {
|
|
46
|
-
const newFilterSettings = {
|
|
46
|
+
const newFilterSettings = {
|
|
47
|
+
...newFilter
|
|
47
48
|
};
|
|
48
|
-
|
|
49
49
|
if (newFilterSettings.sortValue) {
|
|
50
50
|
newFilterSettings.sortDir = newFilterSettings.sortValue === 'alphabetical' ? 'asc' : 'desc';
|
|
51
51
|
onChangeSortBy({
|
|
@@ -53,50 +53,43 @@ export default function CanvasContentPanel(_ref) {
|
|
|
53
53
|
dir: newFilterSettings.sortDir
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
|
-
|
|
57
56
|
if ('searchString' in newFilterSettings && filterSettings.searchString !== newFilterSettings.searchString) {
|
|
58
57
|
onChangeSearchString(newFilterSettings.searchString);
|
|
59
58
|
}
|
|
60
|
-
|
|
61
59
|
setFilterSettings(newFilterSettings);
|
|
62
|
-
|
|
63
60
|
if (newFilterSettings.contentType) {
|
|
64
61
|
let contextType, contextId;
|
|
65
|
-
|
|
66
62
|
switch (newFilterSettings.contentType) {
|
|
67
63
|
case 'user_files':
|
|
68
64
|
contextType = 'user';
|
|
69
65
|
contextId = trayProps.containingContext.userId;
|
|
70
66
|
break;
|
|
71
|
-
|
|
72
67
|
case 'group_files':
|
|
73
68
|
contextType = 'group';
|
|
74
69
|
contextId = trayProps.containingContext.contextId;
|
|
75
70
|
break;
|
|
76
|
-
|
|
77
71
|
case 'course_files':
|
|
78
72
|
contextType = trayProps.contextType;
|
|
79
73
|
contextId = trayProps.containingContext.contextId;
|
|
80
74
|
break;
|
|
81
|
-
|
|
82
75
|
case 'links':
|
|
83
76
|
contextType = trayProps.containingContext.contextType;
|
|
84
77
|
contextId = trayProps.containingContext.contextId;
|
|
85
78
|
}
|
|
86
|
-
|
|
87
79
|
onChangeContext({
|
|
88
80
|
contextType,
|
|
89
81
|
contextId
|
|
90
|
-
});
|
|
91
|
-
|
|
82
|
+
});
|
|
83
|
+
// context is only changed on load
|
|
92
84
|
setHasLoaded(true);
|
|
93
85
|
}
|
|
94
86
|
}
|
|
95
|
-
|
|
96
87
|
const handleImageClick = image => {
|
|
97
88
|
setFileUrl(image.href);
|
|
98
89
|
};
|
|
99
|
-
|
|
90
|
+
const handleMediaClick = media => {
|
|
91
|
+
setFileUrl(`/media_attachments_iframe/${media.id}`);
|
|
92
|
+
};
|
|
100
93
|
return /*#__PURE__*/React.createElement(Flex, {
|
|
101
94
|
as: "div",
|
|
102
95
|
direction: "column",
|
|
@@ -134,7 +127,8 @@ export default function CanvasContentPanel(_ref) {
|
|
|
134
127
|
editing: false,
|
|
135
128
|
onEditClick: setLink,
|
|
136
129
|
selectedLink: link,
|
|
137
|
-
onImageEmbed: handleImageClick
|
|
130
|
+
onImageEmbed: handleImageClick,
|
|
131
|
+
onMediaEmbed: handleMediaClick
|
|
138
132
|
}, storeProps)))))));
|
|
139
133
|
}
|
|
140
134
|
CanvasContentPanel.propTypes = {
|
|
@@ -15,13 +15,12 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import * as SvgProcessor from './SvgCategoryProcessor';
|
|
19
20
|
export async function process(file) {
|
|
20
|
-
var _file$type;
|
|
21
|
-
|
|
22
21
|
// Determine which processor to use based on file type.
|
|
23
22
|
// If no matching processor is found for the given file type, return undefined
|
|
24
|
-
if (file
|
|
23
|
+
if (file?.type?.includes(SvgProcessor.typeTest)) {
|
|
25
24
|
return await SvgProcessor.process(file);
|
|
26
25
|
}
|
|
27
26
|
}
|
|
@@ -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,57 +72,50 @@ 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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
bounds
|
|
102
|
-
} = _ref;
|
|
86
|
+
export default function ComputerPanel({
|
|
87
|
+
theFile,
|
|
88
|
+
setFile,
|
|
89
|
+
setError,
|
|
90
|
+
accept,
|
|
91
|
+
label,
|
|
92
|
+
bounds
|
|
93
|
+
}) {
|
|
103
94
|
const [messages, setMessages] = useState([]);
|
|
104
95
|
const [preview, setPreview] = useState({
|
|
105
96
|
preview: null,
|
|
106
97
|
isLoading: false
|
|
107
|
-
});
|
|
98
|
+
});
|
|
99
|
+
// the trashcan is 38px tall and the 1.5rem margin-bottom
|
|
108
100
|
// the 350 is to guarantee the video doesn't oveflow into the copyright UI,
|
|
109
101
|
// which should probably be rendered here and not up in the modal because
|
|
110
102
|
// dealing with Tabs and size is nearly impossible
|
|
111
|
-
|
|
112
103
|
const height = Math.min(350, 0.8 * (bounds.height - 38 - px('1.5rem')));
|
|
113
104
|
const width = 0.8 * bounds.width;
|
|
114
105
|
useEffect(() => {
|
|
115
106
|
return () => {
|
|
116
|
-
if (Array.isArray(preview
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
(_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);
|
|
107
|
+
if (Array.isArray(preview?.preview)) {
|
|
108
|
+
URL?.revokeObjectURL?.(preview.preview[0].src);
|
|
120
109
|
}
|
|
121
110
|
};
|
|
122
111
|
}, [preview]);
|
|
123
112
|
useEffect(() => {
|
|
124
113
|
if (!theFile || preview.isLoading || preview.preview || preview.error) return;
|
|
125
|
-
|
|
126
114
|
async function getPreview() {
|
|
127
115
|
setPreview({
|
|
128
116
|
preview: null,
|
|
129
117
|
isLoading: true
|
|
130
118
|
});
|
|
131
|
-
|
|
132
119
|
try {
|
|
133
120
|
const previewer = await readFile(theFile);
|
|
134
121
|
setPreview({
|
|
@@ -136,7 +123,6 @@ export default function ComputerPanel(_ref) {
|
|
|
136
123
|
isLoading: false
|
|
137
124
|
});
|
|
138
125
|
setError(null);
|
|
139
|
-
|
|
140
126
|
if (isImage(theFile.type)) {
|
|
141
127
|
// we need the preview to know the image size to show the placeholder
|
|
142
128
|
theFile.preview = previewer;
|
|
@@ -151,7 +137,6 @@ export default function ComputerPanel(_ref) {
|
|
|
151
137
|
});
|
|
152
138
|
}
|
|
153
139
|
}
|
|
154
|
-
|
|
155
140
|
getPreview();
|
|
156
141
|
});
|
|
157
142
|
const handleLoadedMetadata = useCallback(event => {
|
|
@@ -162,16 +147,15 @@ export default function ComputerPanel(_ref) {
|
|
|
162
147
|
});
|
|
163
148
|
player.style.width = sz.width;
|
|
164
149
|
player.style.height = sz.height;
|
|
165
|
-
player.style.margin = '0 auto';
|
|
150
|
+
player.style.margin = '0 auto';
|
|
151
|
+
// from this sub-package, I don't have a URL to use as the
|
|
166
152
|
// audio player's poster image. We can give it a background image though
|
|
167
|
-
|
|
168
153
|
player.classList.add(isAudio(theFile.type) ? 'audio-player' : 'video-player');
|
|
169
154
|
}, [theFile, width, height]);
|
|
170
155
|
const previewPanelRef = useRef(null);
|
|
171
156
|
const clearButtonRef = useRef(null);
|
|
172
157
|
const panelRef = useRef(null);
|
|
173
158
|
useComputerPanelFocus(theFile, panelRef, clearButtonRef);
|
|
174
|
-
|
|
175
159
|
function renderPreview() {
|
|
176
160
|
if (preview.isLoading) {
|
|
177
161
|
return /*#__PURE__*/React.createElement("div", {
|
|
@@ -231,7 +215,6 @@ export default function ComputerPanel(_ref) {
|
|
|
231
215
|
}
|
|
232
216
|
}
|
|
233
217
|
}
|
|
234
|
-
|
|
235
218
|
if (theFile) {
|
|
236
219
|
const filename = theFile.name;
|
|
237
220
|
return /*#__PURE__*/React.createElement("div", {
|
|
@@ -269,19 +252,15 @@ export default function ComputerPanel(_ref) {
|
|
|
269
252
|
margin: "0 auto"
|
|
270
253
|
}, renderPreview()));
|
|
271
254
|
}
|
|
272
|
-
|
|
273
255
|
return /*#__PURE__*/React.createElement("div", {
|
|
274
256
|
ref: panelRef
|
|
275
257
|
}, /*#__PURE__*/React.createElement(FileDrop, {
|
|
276
258
|
"data-testid": "filedrop",
|
|
277
259
|
accept: accept,
|
|
278
|
-
onDropAccepted:
|
|
279
|
-
let [file] = _ref2;
|
|
280
|
-
|
|
260
|
+
onDropAccepted: ([file]) => {
|
|
281
261
|
if (messages.length) {
|
|
282
262
|
setMessages([]);
|
|
283
263
|
}
|
|
284
|
-
|
|
285
264
|
setFile(file);
|
|
286
265
|
},
|
|
287
266
|
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,22 +25,20 @@ 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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
contentType
|
|
40
|
-
} = _ref;
|
|
31
|
+
export default function PanelFilter({
|
|
32
|
+
mountNode,
|
|
33
|
+
onChange,
|
|
34
|
+
sortValue,
|
|
35
|
+
searchString,
|
|
36
|
+
contentType
|
|
37
|
+
}) {
|
|
41
38
|
const [pendingSearchString, setPendingSearchString] = useState(searchString);
|
|
42
|
-
const [searchInputTimer, setSearchInputTimer] = useState(0);
|
|
39
|
+
const [searchInputTimer, setSearchInputTimer] = useState(0);
|
|
43
40
|
|
|
41
|
+
// only run on mounting to trigger change to correct contextType
|
|
44
42
|
useEffect(() => {
|
|
45
43
|
onChange({
|
|
46
44
|
contentType
|
|
@@ -53,28 +51,22 @@ export default function PanelFilter(_ref) {
|
|
|
53
51
|
window.clearTimeout(searchInputTimer);
|
|
54
52
|
setSearchInputTimer(0);
|
|
55
53
|
}
|
|
56
|
-
|
|
57
54
|
onChange({
|
|
58
55
|
searchString: value
|
|
59
56
|
});
|
|
60
57
|
}
|
|
61
58
|
}
|
|
62
|
-
|
|
63
59
|
function handleChangeSearch(value) {
|
|
64
60
|
setPendingSearchString(value);
|
|
65
|
-
|
|
66
61
|
if (searchInputTimer) {
|
|
67
62
|
window.clearTimeout(searchInputTimer);
|
|
68
63
|
}
|
|
69
|
-
|
|
70
64
|
const tid = window.setTimeout(() => doSearch(value), 250);
|
|
71
65
|
setSearchInputTimer(tid);
|
|
72
66
|
}
|
|
73
|
-
|
|
74
67
|
function handleClear() {
|
|
75
68
|
handleChangeSearch('');
|
|
76
69
|
}
|
|
77
|
-
|
|
78
70
|
function renderClearButton() {
|
|
79
71
|
if (pendingSearchString) {
|
|
80
72
|
return /*#__PURE__*/React.createElement(IconButton, {
|
|
@@ -85,10 +77,8 @@ export default function PanelFilter(_ref) {
|
|
|
85
77
|
size: "small"
|
|
86
78
|
}, /*#__PURE__*/React.createElement(IconXLine, null));
|
|
87
79
|
}
|
|
88
|
-
|
|
89
80
|
return undefined;
|
|
90
81
|
}
|
|
91
|
-
|
|
92
82
|
return /*#__PURE__*/React.createElement(Flex, {
|
|
93
83
|
margin: "none xx-large none none",
|
|
94
84
|
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
|
}
|