@instructure/canvas-rce 5.14.0 → 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 +33 -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/__tests__/sidebar/reducers/all_files.test.js +28 -0
- package/babel.config.js +3 -1
- package/build.sh +7 -7
- 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 +25 -38
- 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/plugins/instructure_rce_external_tools/constants.js +28 -0
- 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 +43 -63
- 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 +77 -82
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/scripts/publish_to_npm.sh +1 -1
- 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/common/components/FileTree/File.js +0 -64
- package/es/common/components/FileTree/Folder.js +0 -110
- package/es/common/components/FileTree/index.js +0 -84
- package/es/common/components/FileTree/styles.js +0 -72
- package/es/common/components/Loading.js +0 -83
|
@@ -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, { useEffect } from 'react';
|
|
19
20
|
import { View } from '@instructure/ui-view';
|
|
20
21
|
import { Text } from '@instructure/ui-text';
|
|
@@ -24,9 +25,7 @@ import formatMessage from '../../../format-message';
|
|
|
24
25
|
import { showFlashAlert } from '../../../common/FlashAlert';
|
|
25
26
|
import { ScreenReaderContent } from '@instructure/ui-a11y-content';
|
|
26
27
|
import { getIcon, getFriendlyLinkType } from './linkUtils';
|
|
27
|
-
|
|
28
28
|
const getEditMessage = () => formatMessage('If left empty, link text will display as course link name');
|
|
29
|
-
|
|
30
29
|
export const LinkDisplay = _ref => {
|
|
31
30
|
let {
|
|
32
31
|
linkText,
|
|
@@ -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 PropTypes from 'prop-types';
|
|
20
21
|
import { Spinner } from '@instructure/ui-spinner';
|
|
@@ -22,7 +23,6 @@ import { Flex } from '@instructure/ui-flex';
|
|
|
22
23
|
import formatMessage from '../../../format-message';
|
|
23
24
|
import checkerboardStyle from './CheckerboardStyling';
|
|
24
25
|
const SQUARE_SIZE = 4;
|
|
25
|
-
|
|
26
26
|
const PreviewIcon = _ref => {
|
|
27
27
|
let {
|
|
28
28
|
color,
|
|
@@ -33,10 +33,8 @@ const PreviewIcon = _ref => {
|
|
|
33
33
|
checkered
|
|
34
34
|
} = _ref;
|
|
35
35
|
const variantSettings = PreviewIcon.variants[variant];
|
|
36
|
-
|
|
37
36
|
const background = () => {
|
|
38
37
|
if (loading) return {};
|
|
39
|
-
|
|
40
38
|
if (image) {
|
|
41
39
|
return {
|
|
42
40
|
backgroundImage: `url(${image})`,
|
|
@@ -45,7 +43,6 @@ const PreviewIcon = _ref => {
|
|
|
45
43
|
backgroundPosition: 'center'
|
|
46
44
|
};
|
|
47
45
|
}
|
|
48
|
-
|
|
49
46
|
return {
|
|
50
47
|
border: '1px solid #73818C',
|
|
51
48
|
borderRadius: '3px',
|
|
@@ -58,7 +55,6 @@ const PreviewIcon = _ref => {
|
|
|
58
55
|
`
|
|
59
56
|
};
|
|
60
57
|
};
|
|
61
|
-
|
|
62
58
|
return /*#__PURE__*/React.createElement("div", {
|
|
63
59
|
id: "preview-background-wrapper",
|
|
64
60
|
style: checkered ? checkerboardStyle(SQUARE_SIZE) : {}
|
|
@@ -80,7 +76,6 @@ const PreviewIcon = _ref => {
|
|
|
80
76
|
size: "small"
|
|
81
77
|
})))));
|
|
82
78
|
};
|
|
83
|
-
|
|
84
79
|
PreviewIcon.variants = {
|
|
85
80
|
small: {
|
|
86
81
|
width: '25px',
|
|
@@ -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
|
// copied from canvas-lms/ui/shared/features/doc-previews/jquery/index.js
|
|
19
20
|
export const previewableMimeTypes = ['application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.sun.xml.writer', 'application/excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'text/rtf', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'application/vnd.sun.xml.impress', 'application/vnd.sun.xml.calc', 'application/vnd.ms-excel', 'application/msword', 'application/mspowerpoint', 'application/rtf', 'application/vnd.oasis.opendocument.presentation', 'application/vnd.oasis.opendocument.text', 'application/vnd.openxmlformats-officedocument.presentationml.template', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'text/plain', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/postscript', 'application/pdf', 'application/vnd.ms-powerpoint'];
|
|
20
21
|
export function isPreviewable(type) {
|
|
@@ -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, { useMemo } from 'react';
|
|
19
20
|
import { func, object, string } from 'prop-types';
|
|
20
21
|
import classnames from 'classnames';
|
|
@@ -22,8 +23,9 @@ import { View } from '@instructure/ui-view';
|
|
|
22
23
|
import { downloadToWrap } from '../../../common/fileUrl';
|
|
23
24
|
import { mediaPlayerURLFromFile } from './fileTypeUtils';
|
|
24
25
|
import RceApiSource from '../../../rcs/api';
|
|
25
|
-
import addIconMakerAttributes from '../instructure_icon_maker/utils/addIconMakerAttributes';
|
|
26
|
+
import addIconMakerAttributes from '../instructure_icon_maker/utils/addIconMakerAttributes';
|
|
26
27
|
|
|
28
|
+
// TODO: should find a better way to share this code
|
|
27
29
|
import FileBrowser from '../../../canvasFileBrowser/FileBrowser';
|
|
28
30
|
import { isPreviewable } from './Previewable';
|
|
29
31
|
RceFileBrowser.propTypes = {
|
|
@@ -56,10 +58,8 @@ export default function RceFileBrowser(props) {
|
|
|
56
58
|
canvasOrigin
|
|
57
59
|
});
|
|
58
60
|
}, [host, jwt, refreshToken, source, canvasOrigin]);
|
|
59
|
-
|
|
60
61
|
function handleFileSelect(fileInfo) {
|
|
61
62
|
var _fileInfo$api$embed, _fileInfo$api;
|
|
62
|
-
|
|
63
63
|
const content_type = fileInfo.api.type;
|
|
64
64
|
const canPreview = isPreviewable(content_type);
|
|
65
65
|
const url = downloadToWrap(fileInfo.src);
|
|
@@ -73,7 +73,6 @@ export default function RceFileBrowser(props) {
|
|
|
73
73
|
target: '_blank',
|
|
74
74
|
content_type
|
|
75
75
|
};
|
|
76
|
-
|
|
77
76
|
if (((_fileInfo$api = fileInfo.api) === null || _fileInfo$api === void 0 ? void 0 : _fileInfo$api.category) === 'icon_maker_icons') {
|
|
78
77
|
onFileSelectParams.src = fileInfo.api.url;
|
|
79
78
|
addIconMakerAttributes(onFileSelectParams);
|
|
@@ -83,14 +82,13 @@ export default function RceFileBrowser(props) {
|
|
|
83
82
|
instructure_scribd_file: canPreview,
|
|
84
83
|
inline_disabled: true
|
|
85
84
|
});
|
|
86
|
-
onFileSelectParams = {
|
|
85
|
+
onFileSelectParams = {
|
|
86
|
+
...onFileSelectParams,
|
|
87
87
|
class: clazz
|
|
88
88
|
};
|
|
89
89
|
}
|
|
90
|
-
|
|
91
90
|
onFileSelect(onFileSelectParams);
|
|
92
91
|
}
|
|
93
|
-
|
|
94
92
|
return /*#__PURE__*/React.createElement(View, {
|
|
95
93
|
as: "div",
|
|
96
94
|
margin: "medium",
|
|
@@ -15,13 +15,13 @@
|
|
|
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
25
|
function Consumer(_ref) {
|
|
26
26
|
let {
|
|
27
27
|
children,
|
|
@@ -35,7 +35,6 @@ function Consumer(_ref) {
|
|
|
35
35
|
...props
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
|
-
|
|
39
38
|
export const StoreConsumer = connect(propsFromState, sidebarHandlers)(Consumer);
|
|
40
39
|
const StoreContext = /*#__PURE__*/createContext();
|
|
41
40
|
export function StoreProvider(_ref2) {
|
|
@@ -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,
|
|
@@ -38,14 +46,11 @@ export function displayStyleFrom(studioAttributes) {
|
|
|
38
46
|
}
|
|
39
47
|
export function isStudioEmbeddedMedia(element) {
|
|
40
48
|
var _tinymceIframeShim$fi;
|
|
41
|
-
|
|
42
49
|
// Borrowing this structure from isMediaElement in ContentSelection.js
|
|
43
50
|
const tinymceIframeShim = (element === null || element === void 0 ? void 0 : element.tagName) === 'IFRAME' ? element === null || element === void 0 ? void 0 : element.parentElement : element;
|
|
44
|
-
|
|
45
51
|
if ((tinymceIframeShim === null || tinymceIframeShim === void 0 ? void 0 : (_tinymceIframeShim$fi = tinymceIframeShim.firstElementChild) === null || _tinymceIframeShim$fi === void 0 ? void 0 : _tinymceIframeShim$fi.tagName) !== 'IFRAME') {
|
|
46
52
|
return false;
|
|
47
53
|
}
|
|
48
|
-
|
|
49
54
|
return tinymceIframeShim.getAttribute('data-mce-p-data-studio-tray-enabled') === 'true';
|
|
50
55
|
}
|
|
51
56
|
export function parseStudioOptions(element) {
|
|
@@ -55,16 +60,15 @@ export function parseStudioOptions(element) {
|
|
|
55
60
|
convertibleToLink: (tinymceIframeShim === null || tinymceIframeShim === void 0 ? void 0 : tinymceIframeShim.getAttribute('data-mce-p-data-studio-convertible-to-link')) === 'true'
|
|
56
61
|
};
|
|
57
62
|
}
|
|
63
|
+
|
|
58
64
|
/**
|
|
59
65
|
* Tinymce adds an overlay when you click on an iframe inside the editor. It will by default
|
|
60
66
|
* add resize handles to the corners of the overlay. The code that adds these handles won't
|
|
61
67
|
* if the overlay has `data-mce-resize='false'` on it. Here, we force that behavior when the
|
|
62
68
|
* underlying iframe has a `data-studio-resizable='false'`
|
|
63
69
|
*/
|
|
64
|
-
|
|
65
70
|
export function handleBeforeObjectSelected(e) {
|
|
66
71
|
const targetElement = e.target;
|
|
67
|
-
|
|
68
72
|
if (targetElement.getAttribute('data-mce-p-data-studio-resizable') === 'false') {
|
|
69
73
|
targetElement.setAttribute('data-mce-resize', 'false');
|
|
70
74
|
}
|
|
@@ -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';
|
|
@@ -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
|
}
|