@instructure/canvas-rce 5.14.1 → 5.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/DEVELOPMENT.md +1 -1
- package/README.md +0 -8
- package/__tests__/common/indicate.test.js +84 -0
- package/__tests__/common/mimeClass.test.js +85 -0
- package/__tests__/module/contentInsertionUtils.test.js +52 -0
- package/__tests__/module/indicatorRegion.test.js +75 -0
- package/__tests__/module/normalizeLocale.test.js +46 -0
- package/__tests__/module/normalizeProps.test.js +51 -0
- package/__tests__/module/sanitizePlugins.test.js +48 -0
- package/__tests__/module/wrapInitCb.test.js +56 -0
- package/__tests__/rcs/api.test.js +819 -0
- package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
- package/__tests__/sidebar/actions/data.test.js +196 -0
- package/__tests__/sidebar/actions/utils.js +44 -0
- package/{es/rce/plugins/shared/__mocks__/screenfull.js → __tests__/sidebar/reducers/all_files.test.js} +10 -6
- package/babel.config.js +3 -1
- package/es/bridge/Bridge.js +8 -56
- package/es/bridge/index.js +1 -0
- package/es/canvasFileBrowser/FileBrowser.js +12 -59
- package/es/canvasFileBrowser/en-US.js +3 -6
- package/es/common/FlashAlert.js +7 -28
- package/es/common/browser.js +4 -2
- package/es/common/fileUrl.js +104 -59
- package/es/common/incremental-loading/LoadMoreButton.js +1 -0
- package/es/common/incremental-loading/LoadingIndicator.js +1 -2
- package/es/common/incremental-loading/LoadingStatus.js +1 -2
- package/es/common/incremental-loading/index.js +1 -0
- package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
- package/es/common/indicate.js +15 -8
- package/es/common/mimeClass.js +3 -4
- package/es/common/natcompare.js +1 -4
- package/es/defaultTinymceConfig.js +5 -3
- package/es/elementDenylist.js +1 -0
- package/es/enhance-user-content/doc_previews.js +17 -28
- package/es/enhance-user-content/enhance_user_content.js +28 -60
- package/es/enhance-user-content/external_links.js +5 -8
- package/es/enhance-user-content/index.js +1 -0
- package/es/enhance-user-content/instructure_helper.js +12 -34
- package/es/enhance-user-content/jqueryish_funcs.js +8 -11
- package/es/enhance-user-content/mathml.js +35 -82
- package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
- package/es/format-message.js +3 -4
- package/es/getThemeVars.js +8 -6
- package/es/getTranslations.js +1 -78
- package/es/index.js +3 -1
- package/es/rce/AlertMessageArea.js +1 -1
- package/es/rce/DraggingBlocker.js +4 -2
- package/es/rce/KeyboardShortcutModal.js +1 -0
- package/es/rce/RCE.js +12 -11
- package/es/rce/RCEGlobals.js +12 -10
- package/es/rce/RCEVariants.js +27 -10
- package/es/rce/RCEWrapper.js +167 -386
- package/es/rce/RCEWrapperProps.js +8 -3
- package/es/rce/RceHtmlEditor.js +5 -8
- package/es/rce/ResizeHandle.js +3 -8
- package/es/rce/RestoreAutoSaveModal.js +1 -2
- package/es/rce/ShowOnFocusButton/index.js +0 -6
- package/es/rce/StatusBar.js +8 -37
- package/es/rce/alertHandler.js +1 -4
- package/es/rce/contentInsertion.js +35 -57
- package/es/rce/contentInsertionUtils.js +6 -8
- package/es/rce/contentRendering.js +7 -12
- package/es/rce/customEvents.js +1 -0
- package/es/rce/editorLanguage.js +22 -10
- package/es/rce/indicatorRegion.js +6 -5
- package/es/rce/normalizeLocale.js +5 -3
- package/es/rce/normalizeProps.js +3 -1
- package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
- package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
- package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
- package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
- package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
- package/es/rce/plugins/instructure_color/plugin.js +40 -0
- package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
- package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
- package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
- package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
- package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
- package/es/rce/plugins/instructure_documents/plugin.js +7 -14
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
- package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
- package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
- package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
- package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
- package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
- package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
- package/es/rce/plugins/instructure_equation/plugin.js +7 -10
- package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
- package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
- package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
- package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
- package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
- package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
- package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
- package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
- package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
- package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
- package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
- package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
- package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
- package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
- package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
- package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
- package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
- package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
- package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
- package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
- package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
- package/es/rce/plugins/instructure_image/Images/index.js +1 -3
- package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_image/plugin.js +13 -18
- package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
- package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
- package/es/rce/plugins/instructure_links/components/Link.js +7 -19
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
- package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
- package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
- package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
- package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
- package/es/rce/plugins/instructure_links/plugin.js +17 -40
- package/es/rce/plugins/instructure_links/validateURL.js +81 -36
- package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
- package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
- package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
- package/es/rce/plugins/instructure_paste/plugin.js +27 -29
- package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
- package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
- package/es/rce/{__mocks__/_mockStudioPlayer.js → plugins/instructure_rce_external_tools/constants.js} +11 -3
- package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
- package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
- package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
- package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
- package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
- package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
- package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
- package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
- package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
- package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
- package/es/rce/plugins/instructure_record/plugin.js +11 -18
- package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
- package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
- package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
- package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
- package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
- package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
- package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
- package/es/rce/plugins/shared/CanvasContentTray.js +22 -49
- package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
- package/es/rce/plugins/shared/ColorInput.js +5 -14
- package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
- package/es/rce/plugins/shared/ContentSelection.js +17 -58
- package/es/rce/plugins/shared/DimensionUtils.js +1 -8
- package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
- package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
- package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
- package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
- package/es/rce/plugins/shared/EventUtils.js +1 -3
- package/es/rce/plugins/shared/Filter.js +8 -38
- package/es/rce/plugins/shared/FixedContentTray.js +3 -3
- package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
- package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
- package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
- package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
- package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
- package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
- package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
- package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
- package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
- package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
- package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
- package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
- package/es/rce/plugins/shared/LinkDisplay.js +1 -2
- package/es/rce/plugins/shared/PreviewIcon.js +1 -6
- package/es/rce/plugins/shared/Previewable.js +1 -0
- package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
- package/es/rce/plugins/shared/StoreContext.js +1 -2
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
- package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
- package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
- package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
- package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
- package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
- package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
- package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
- package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
- package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
- package/es/rce/plugins/shared/Upload/index.js +1 -0
- package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
- package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
- package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
- package/es/rce/plugins/shared/ai_tools/index.js +1 -0
- package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
- package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
- package/es/rce/plugins/shared/compressionUtils.js +1 -8
- package/es/rce/plugins/shared/dateUtils.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
- package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
- package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
- package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
- package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
- package/es/rce/plugins/shared/fileShape.js +4 -9
- package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
- package/es/rce/plugins/shared/fileUtils.js +1 -2
- package/es/rce/plugins/shared/linkUtils.js +1 -16
- package/es/rce/plugins/shared/round.js +1 -0
- package/es/rce/plugins/shared/trayUtils.js +4 -3
- package/es/rce/plugins/shared/useDataUrl.js +9 -9
- package/es/rce/plugins/shared/useFilterSettings.js +3 -3
- package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
- package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
- package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
- package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
- package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
- package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
- package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
- package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
- package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
- package/es/rce/root.js +9 -8
- package/es/rce/sanitizePlugins.js +1 -3
- package/es/rce/style.js +1 -4
- package/es/rce/tinyRCE.js +13 -9
- package/es/rce/tinymce.oxide.content.min.css.js +1 -0
- package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
- package/es/rce/transformContent.js +8 -10
- package/es/rce/types.js +1 -0
- package/es/rce/userOS.js +1 -1
- package/es/rce/wrapInitCb.js +50 -43
- package/es/rcs/api.js +61 -116
- package/es/rcs/buildError.js +5 -17
- package/es/rcs/fake.js +4 -13
- package/es/sidebar/actions/all_files.js +2 -0
- package/es/sidebar/actions/data.js +4 -7
- package/es/sidebar/actions/documents.js +9 -6
- package/es/sidebar/actions/files.js +3 -6
- package/es/sidebar/actions/filter.js +1 -0
- package/es/sidebar/actions/flickr.js +1 -1
- package/es/sidebar/actions/images.js +12 -11
- package/es/sidebar/actions/links.js +1 -0
- package/es/sidebar/actions/media.js +12 -10
- package/es/sidebar/actions/session.js +1 -3
- package/es/sidebar/actions/ui.js +1 -0
- package/es/sidebar/actions/upload.js +14 -39
- package/es/sidebar/containers/Sidebar.js +1 -2
- package/es/sidebar/containers/sidebarHandlers.js +3 -1
- package/es/sidebar/dragHtml.js +5 -3
- package/es/sidebar/reducers/all_files.js +4 -3
- package/es/sidebar/reducers/collection.js +12 -13
- package/es/sidebar/reducers/collections.js +5 -5
- package/es/sidebar/reducers/documents.js +6 -13
- package/es/sidebar/reducers/files.js +3 -3
- package/es/sidebar/reducers/filter.js +1 -8
- package/es/sidebar/reducers/flickr.js +9 -9
- package/es/sidebar/reducers/folder.js +15 -15
- package/es/sidebar/reducers/folders.js +3 -3
- package/es/sidebar/reducers/images.js +3 -13
- package/es/sidebar/reducers/index.js +3 -1
- package/es/sidebar/reducers/media.js +6 -13
- package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
- package/es/sidebar/reducers/noop.js +1 -0
- package/es/sidebar/reducers/rootFolderId.js +1 -2
- package/es/sidebar/reducers/session.js +3 -3
- package/es/sidebar/reducers/ui.js +3 -16
- package/es/sidebar/reducers/upload.js +8 -40
- package/es/sidebar/store/configureStore.js +1 -0
- package/es/sidebar/store/initialState.js +13 -24
- package/es/translations/locales/ab.js +1 -0
- package/es/translations/locales/ar.js +67 -9
- package/es/translations/locales/ca.js +67 -9
- package/es/translations/locales/cs.js +1 -0
- package/es/translations/locales/cs_CZ.js +1 -0
- package/es/translations/locales/cy.js +67 -9
- package/es/translations/locales/da-x-k12.js +67 -9
- package/es/translations/locales/da.js +67 -9
- package/es/translations/locales/da_DK.js +1 -0
- package/es/translations/locales/de.js +67 -9
- package/es/translations/locales/el.js +4 -0
- package/es/translations/locales/en-AU-x-unimelb.js +67 -9
- package/es/translations/locales/en-GB-x-ukhe.js +67 -9
- package/es/translations/locales/en.js +72 -8
- package/es/translations/locales/en_AU.js +67 -9
- package/es/translations/locales/en_CA.js +67 -9
- package/es/translations/locales/en_CY.js +67 -9
- package/es/translations/locales/en_GB.js +67 -9
- package/es/translations/locales/en_NZ.js +1 -0
- package/es/translations/locales/en_SE.js +1 -0
- package/es/translations/locales/en_US.js +1 -0
- package/es/translations/locales/es.js +67 -9
- package/es/translations/locales/es_ES.js +67 -9
- package/es/translations/locales/es_GT.js +1 -0
- package/es/translations/locales/fa_IR.js +7 -0
- package/es/translations/locales/fi.js +67 -9
- package/es/translations/locales/fr.js +67 -9
- package/es/translations/locales/fr_CA.js +68 -10
- package/es/translations/locales/ga.js +5 -13
- package/es/translations/locales/he.js +7 -0
- package/es/translations/locales/hi.js +67 -9
- package/es/translations/locales/ht.js +67 -9
- package/es/translations/locales/hu.js +7 -6
- package/es/translations/locales/hu_HU.js +1 -0
- package/es/translations/locales/hy.js +1 -0
- package/es/translations/locales/id.js +67 -9
- package/es/translations/locales/id_ID.js +1 -0
- package/es/translations/locales/is.js +67 -9
- package/es/translations/locales/it.js +67 -9
- package/es/translations/locales/ja.js +67 -9
- package/es/translations/locales/ko.js +1 -0
- package/es/translations/locales/ko_KR.js +1 -0
- package/es/translations/locales/lt.js +1 -0
- package/es/translations/locales/lt_LT.js +1 -0
- package/es/translations/locales/mi.js +67 -9
- package/es/translations/locales/mn_MN.js +1 -0
- package/es/translations/locales/ms.js +67 -9
- package/es/translations/locales/nb-x-k12.js +67 -9
- package/es/translations/locales/nb.js +67 -9
- package/es/translations/locales/nl.js +67 -9
- package/es/translations/locales/nl_NL.js +1 -0
- package/es/translations/locales/nn.js +7 -6
- package/es/translations/locales/pl.js +67 -9
- package/es/translations/locales/pt.js +67 -9
- package/es/translations/locales/pt_BR.js +67 -9
- package/es/translations/locales/ro.js +1 -0
- package/es/translations/locales/ru.js +67 -9
- package/es/translations/locales/se.js +1 -0
- package/es/translations/locales/sl.js +67 -9
- package/es/translations/locales/sv-x-k12.js +67 -9
- package/es/translations/locales/sv.js +67 -9
- package/es/translations/locales/sv_SE.js +1 -0
- package/es/translations/locales/tg.js +1 -0
- package/es/translations/locales/th.js +67 -9
- package/es/translations/locales/th_TH.js +1 -0
- package/es/translations/locales/tl_PH.js +1 -0
- package/es/translations/locales/tr.js +7 -0
- package/es/translations/locales/uk_UA.js +7 -0
- package/es/translations/locales/vi.js +67 -9
- package/es/translations/locales/vi_VN.js +1 -0
- package/es/translations/locales/zh-Hans.js +67 -9
- package/es/translations/locales/zh-Hant.js +67 -9
- package/es/translations/locales/zh.js +67 -9
- package/es/translations/locales/zh_HK.js +67 -9
- package/es/translations/locales/zh_TW.Big5.js +1 -0
- package/es/translations/locales/zh_TW.js +1 -0
- package/es/translations/tinymce/ar_SA.js +1 -0
- package/es/translations/tinymce/fi.js +1 -0
- package/es/translations/tinymce/ga.js +1 -0
- package/es/translations/tinymce/id.js +1 -0
- package/es/translations/tinymce/ru.js +1 -0
- package/es/translations/tinymce/ru_RU.js +1 -0
- package/es/translations/tinymce/sl.js +1 -0
- package/es/translations/tinymce/sr.js +1 -0
- package/es/translations/tinymce/th.js +1 -0
- package/es/translations/tinymce/uk_UA.js +1 -0
- package/es/translations/tinymce/vi_VN.js +1 -0
- package/es/util/TypedDict.js +4 -2
- package/es/util/encrypted-storage.js +3 -13
- package/es/util/file-url-util.js +1 -6
- package/es/util/fullscreenHelpers.js +4 -1
- package/es/util/instui-icon-helper.js +4 -3
- package/es/util/loadingPlaceholder.js +38 -39
- package/es/util/simpleCache.js +0 -3
- package/es/util/string-util.js +1 -1
- package/es/util/textarea-editing-util.js +3 -7
- package/es/util/tinymce-plugin-util.js +0 -5
- package/es/util/url-util.js +16 -25
- package/eslint.config.js +239 -0
- package/jest.config.js +1 -1
- package/package.json +76 -81
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/testcafe/RCEWrapper.test.js +0 -1
- package/testcafe/StatusBar.test.js +0 -1
- package/testcafe/axe.test.js +3 -4
- package/testcafe/enhanceUserContent.test.js +0 -1
- package/tsconfig.json +20 -15
- package/.eslintrc +0 -45
- package/.prettierignore +0 -6
- package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
- package/es/rce/__mocks__/styleMock.js +0 -18
- package/es/rce/__mocks__/tinymceReact.js +0 -55
- package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
|
@@ -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 round from '../../round';
|
|
19
20
|
import { SHAPE_CONTAINER_LENGTH } from '../constants';
|
|
20
21
|
import { createSvgElement } from './utils';
|
|
@@ -25,37 +26,27 @@ export function buildShapeMask(_ref) {
|
|
|
25
26
|
size
|
|
26
27
|
} = _ref;
|
|
27
28
|
const dimensionSize = size || SHAPE_CONTAINER_LENGTH;
|
|
28
|
-
|
|
29
29
|
switch (shape) {
|
|
30
30
|
case Shape.Square:
|
|
31
31
|
return buildSquare(dimensionSize);
|
|
32
|
-
|
|
33
32
|
case Shape.Circle:
|
|
34
33
|
return buildCircle(dimensionSize);
|
|
35
|
-
|
|
36
34
|
case Shape.Triangle:
|
|
37
35
|
return buildTriangle(dimensionSize);
|
|
38
|
-
|
|
39
36
|
case Shape.Diamond:
|
|
40
37
|
return buildDiamond(dimensionSize);
|
|
41
|
-
|
|
42
38
|
case Shape.Pentagon:
|
|
43
39
|
return buildPentagon(dimensionSize);
|
|
44
|
-
|
|
45
40
|
case Shape.Hexagon:
|
|
46
41
|
return buildHexagon(dimensionSize);
|
|
47
|
-
|
|
48
42
|
case Shape.Octagon:
|
|
49
43
|
return buildOctagon(dimensionSize);
|
|
50
|
-
|
|
51
44
|
case Shape.Star:
|
|
52
45
|
return buildStar(dimensionSize);
|
|
53
|
-
|
|
54
46
|
default:
|
|
55
47
|
throw new Error(`Invalid shape: ${shape}`);
|
|
56
48
|
}
|
|
57
49
|
}
|
|
58
|
-
|
|
59
50
|
function buildSquare(dimensionSize) {
|
|
60
51
|
return createSvgElement('rect', {
|
|
61
52
|
x: 0,
|
|
@@ -65,7 +56,6 @@ function buildSquare(dimensionSize) {
|
|
|
65
56
|
fill: 'black'
|
|
66
57
|
});
|
|
67
58
|
}
|
|
68
|
-
|
|
69
59
|
function buildCircle(dimensionSize) {
|
|
70
60
|
return createSvgElement('circle', {
|
|
71
61
|
cx: dimensionSize / 2,
|
|
@@ -74,19 +64,16 @@ function buildCircle(dimensionSize) {
|
|
|
74
64
|
fill: 'black'
|
|
75
65
|
});
|
|
76
66
|
}
|
|
77
|
-
|
|
78
67
|
function buildTriangle(dimensionSize) {
|
|
79
68
|
return createSvgElement('path', {
|
|
80
69
|
d: `M${dimensionSize / 2} 0L${dimensionSize} ${dimensionSize}H0L${dimensionSize / 2} 0Z`
|
|
81
70
|
});
|
|
82
71
|
}
|
|
83
|
-
|
|
84
72
|
function buildDiamond(dimensionSize) {
|
|
85
73
|
return createSvgElement('path', {
|
|
86
74
|
d: `M${dimensionSize / 2} 0L${dimensionSize} ${dimensionSize / 2}L${dimensionSize / 2} ${dimensionSize}L0 ${dimensionSize / 2}L${dimensionSize / 2} 0Z`
|
|
87
75
|
});
|
|
88
76
|
}
|
|
89
|
-
|
|
90
77
|
function buildPentagon(dimensionSize) {
|
|
91
78
|
const half = round(dimensionSize / 2, 2);
|
|
92
79
|
const alpha = round(0.3906 * dimensionSize, 2);
|
|
@@ -95,14 +82,12 @@ function buildPentagon(dimensionSize) {
|
|
|
95
82
|
d: `M${half} 0L${dimensionSize} ${alpha}L${half + beta} ${dimensionSize}H${half - beta}L0 ${alpha}L${half} 0L${half} 0Z`
|
|
96
83
|
});
|
|
97
84
|
}
|
|
98
|
-
|
|
99
85
|
function buildHexagon(dimensionSize) {
|
|
100
86
|
const leg = round(0.2895 * dimensionSize, 2);
|
|
101
87
|
return createSvgElement('path', {
|
|
102
88
|
d: `M${dimensionSize - leg} 0L${dimensionSize} ${dimensionSize / 2}L${dimensionSize - leg} ${dimensionSize}H${leg}L0 ${dimensionSize / 2}L${leg} 0H${dimensionSize - leg}Z`
|
|
103
89
|
});
|
|
104
90
|
}
|
|
105
|
-
|
|
106
91
|
function buildOctagon(dimensionSize) {
|
|
107
92
|
const leg = round(0.2895 * dimensionSize, 2);
|
|
108
93
|
const side = round(dimensionSize - 2 * leg, 2);
|
|
@@ -110,7 +95,6 @@ function buildOctagon(dimensionSize) {
|
|
|
110
95
|
d: `M0 ${leg}L${leg} 0H${leg + side}L${dimensionSize} ${leg}V${leg + side}L${leg + side} ${dimensionSize}H${leg}L0 ${leg + side}V${leg}Z`
|
|
111
96
|
});
|
|
112
97
|
}
|
|
113
|
-
|
|
114
98
|
function buildStar(dimensionSize) {
|
|
115
99
|
const half = round(dimensionSize / 2, 2);
|
|
116
100
|
const alpha = round(0.1143 * dimensionSize, 2);
|
|
@@ -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
|
export function createSvgElement(tag) {
|
|
19
20
|
let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
20
21
|
const element = document.createElementNS('http://www.w3.org/2000/svg', tag);
|
|
@@ -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 { useEffect, useState, useRef, useCallback } from 'react';
|
|
19
20
|
import { debounce } from '@instructure/debounce';
|
|
20
21
|
import { KEY_EVENT_DELAY, KEY_EVENT_ACCELERATION } from './constants';
|
|
@@ -22,25 +23,20 @@ import { actions } from './reducers/imageCropper';
|
|
|
22
23
|
const EVENT_EXCEPTION_ELEMENT_IDS = ['imageCropperHeader', 'imageCropperFooter', 'imageCropperControls'];
|
|
23
24
|
const TOUCH_EVENTS = ['ontouchmove', 'ontouchend', 'ontouchcancel'];
|
|
24
25
|
const MOUSE_EVENTS = ['onmousemove', 'onmouseup', 'onmouseout'];
|
|
25
|
-
|
|
26
26
|
function useKeysEvents(tempTranslateXRef, tempTranslateYRef, tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, isMoving, setIsMoving, dispatch) {
|
|
27
27
|
// Refs that manage the keydown acceleration
|
|
28
28
|
const direction = useRef(0);
|
|
29
29
|
const initialTime = useRef(null);
|
|
30
|
-
|
|
31
30
|
const onKeyDown = event => {
|
|
32
31
|
// 37 = Left, 38 = Up, 39 = Right, 40 = Down
|
|
33
32
|
const {
|
|
34
33
|
keyCode
|
|
35
34
|
} = event;
|
|
36
|
-
|
|
37
35
|
if (![37, 38, 39, 40].includes(keyCode)) {
|
|
38
36
|
return;
|
|
39
37
|
}
|
|
40
|
-
|
|
41
38
|
event.preventDefault();
|
|
42
39
|
let elapsedTime;
|
|
43
|
-
|
|
44
40
|
if (keyCode !== direction.current) {
|
|
45
41
|
elapsedTime = 0;
|
|
46
42
|
initialTime.current = new Date();
|
|
@@ -55,22 +51,18 @@ function useKeysEvents(tempTranslateXRef, tempTranslateYRef, tempTranslateX, tem
|
|
|
55
51
|
const currentTime = new Date();
|
|
56
52
|
elapsedTime = (currentTime - initialTime.current) / 1000;
|
|
57
53
|
}
|
|
58
|
-
|
|
59
54
|
const translationDiff = Math.floor(KEY_EVENT_ACCELERATION * elapsedTime ** 2) || 1;
|
|
60
|
-
|
|
61
55
|
if ([37, 39].includes(keyCode)) {
|
|
62
56
|
const sign = keyCode === 37 ? -1 : 1;
|
|
63
57
|
const newTranslateX = tempTranslateXRef.current + sign * translationDiff;
|
|
64
58
|
setTempTranslateX(newTranslateX);
|
|
65
59
|
}
|
|
66
|
-
|
|
67
60
|
if ([38, 40].includes(keyCode)) {
|
|
68
61
|
const sign = keyCode === 38 ? -1 : 1;
|
|
69
62
|
const newTranslateY = tempTranslateYRef.current + sign * translationDiff;
|
|
70
63
|
setTempTranslateY(newTranslateY);
|
|
71
64
|
}
|
|
72
65
|
};
|
|
73
|
-
|
|
74
66
|
const stopMovement = useCallback(debounce(() => {
|
|
75
67
|
direction.current = 0;
|
|
76
68
|
initialTime.current = null;
|
|
@@ -83,41 +75,36 @@ function useKeysEvents(tempTranslateXRef, tempTranslateYRef, tempTranslateX, tem
|
|
|
83
75
|
// If the active element is in the modal header, footer or controls.
|
|
84
76
|
if (EVENT_EXCEPTION_ELEMENT_IDS.some(id => {
|
|
85
77
|
var _document$getElementB;
|
|
86
|
-
|
|
87
78
|
return (_document$getElementB = document.getElementById(id)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.contains(document.activeElement);
|
|
88
79
|
})) {
|
|
89
80
|
return;
|
|
90
81
|
}
|
|
91
|
-
|
|
92
82
|
onKeyDown(event);
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
|
|
83
|
+
};
|
|
84
|
+
// Adds the event listener when component did mount
|
|
96
85
|
document.addEventListener('keydown', onKeyDownWrapper);
|
|
97
86
|
return () => {
|
|
98
87
|
// Removes the event listener when component will unmount
|
|
99
88
|
document.removeEventListener('keydown', onKeyDownWrapper);
|
|
100
|
-
};
|
|
89
|
+
};
|
|
90
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
101
91
|
}, []);
|
|
102
92
|
useEffect(() => {
|
|
103
93
|
if (isMoving && direction.current !== 0) {
|
|
104
94
|
stopMovement();
|
|
105
|
-
}
|
|
106
|
-
|
|
95
|
+
}
|
|
96
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
107
97
|
}, [tempTranslateX, tempTranslateY]);
|
|
108
98
|
}
|
|
109
|
-
|
|
110
99
|
function useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, setIsMoving) {
|
|
111
100
|
const initialPageX = useRef(0);
|
|
112
101
|
const initialPageY = useRef(0);
|
|
113
102
|
const isDragging = useRef(false);
|
|
114
103
|
const imgElement = useRef(null);
|
|
115
|
-
|
|
116
104
|
const onStopMove = isMouseEvent => () => {
|
|
117
105
|
isDragging.current = false;
|
|
118
106
|
initialPageX.current = 0;
|
|
119
107
|
initialPageY.current = 0;
|
|
120
|
-
|
|
121
108
|
if (imgElement.current) {
|
|
122
109
|
const [move, end, cancel] = isMouseEvent ? MOUSE_EVENTS : TOUCH_EVENTS;
|
|
123
110
|
imgElement.current[move] = null;
|
|
@@ -125,15 +112,12 @@ function useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslate
|
|
|
125
112
|
imgElement.current[cancel] = null;
|
|
126
113
|
imgElement.current = null;
|
|
127
114
|
}
|
|
128
|
-
|
|
129
115
|
setIsMoving(false);
|
|
130
116
|
};
|
|
131
|
-
|
|
132
117
|
const onMove = isMouseEvent => e => {
|
|
133
118
|
if (!isDragging.current) {
|
|
134
119
|
return onStopMove();
|
|
135
120
|
}
|
|
136
|
-
|
|
137
121
|
const {
|
|
138
122
|
clientX,
|
|
139
123
|
clientY
|
|
@@ -141,7 +125,6 @@ function useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslate
|
|
|
141
125
|
setTempTranslateX(tempTranslateX + clientX - initialPageX.current);
|
|
142
126
|
setTempTranslateY(tempTranslateY + clientY - initialPageY.current);
|
|
143
127
|
};
|
|
144
|
-
|
|
145
128
|
const onStartMove = (e, isMouseEvent) => {
|
|
146
129
|
isDragging.current = true;
|
|
147
130
|
const {
|
|
@@ -155,79 +138,69 @@ function useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslate
|
|
|
155
138
|
initialPageY.current = clientY;
|
|
156
139
|
const [move, end, cancel] = isMouseEvent ? MOUSE_EVENTS : TOUCH_EVENTS;
|
|
157
140
|
target[move] = onMove(isMouseEvent);
|
|
158
|
-
target[end] = onStopMove(isMouseEvent);
|
|
159
|
-
|
|
141
|
+
target[end] = onStopMove(isMouseEvent);
|
|
142
|
+
// Should stop the movement when touch/mouse leaves the preview
|
|
160
143
|
target[cancel] = onStopMove(isMouseEvent);
|
|
161
144
|
imgElement.current = target;
|
|
162
145
|
setIsMoving(true);
|
|
163
146
|
};
|
|
164
|
-
|
|
165
147
|
return [e => onStartMove(e, true), e => onStartMove(e, false)];
|
|
166
148
|
}
|
|
167
|
-
|
|
168
149
|
export function useKeyMouseTouchEvents(translateX, translateY, dispatch) {
|
|
169
150
|
const [tempTranslateX, _setTempTranslateX] = useState(translateX);
|
|
170
151
|
const [tempTranslateY, _setTempTranslateY] = useState(translateY);
|
|
171
|
-
const [isMoving, setIsMoving] = useState(false);
|
|
152
|
+
const [isMoving, setIsMoving] = useState(false);
|
|
172
153
|
|
|
154
|
+
// These are used to get the current values when the callback is called from outside.
|
|
173
155
|
const tempTranslateXRef = useRef(tempTranslateX);
|
|
174
156
|
const tempTranslateYRef = useRef(tempTranslateY);
|
|
175
|
-
|
|
176
157
|
const setTempTranslateX = data => {
|
|
177
158
|
setIsMoving(true);
|
|
178
159
|
tempTranslateXRef.current = data;
|
|
179
|
-
|
|
180
160
|
_setTempTranslateX(data);
|
|
181
161
|
};
|
|
182
|
-
|
|
183
162
|
const setTempTranslateY = data => {
|
|
184
163
|
setIsMoving(true);
|
|
185
164
|
tempTranslateYRef.current = data;
|
|
186
|
-
|
|
187
165
|
_setTempTranslateY(data);
|
|
188
166
|
};
|
|
189
|
-
|
|
190
167
|
useKeysEvents(tempTranslateXRef, tempTranslateYRef, tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, isMoving, setIsMoving, dispatch);
|
|
191
|
-
const [onMouseDown, onTouchStart] = useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, setIsMoving);
|
|
168
|
+
const [onMouseDown, onTouchStart] = useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, setIsMoving);
|
|
192
169
|
|
|
170
|
+
// Updates the reducer state when user stops moving.
|
|
193
171
|
useEffect(() => {
|
|
194
172
|
if (isMoving) {
|
|
195
173
|
return;
|
|
196
174
|
}
|
|
197
|
-
|
|
198
175
|
if (tempTranslateX !== translateX) {
|
|
199
176
|
dispatch({
|
|
200
177
|
type: actions.SET_TRANSLATE_X,
|
|
201
178
|
payload: tempTranslateX
|
|
202
179
|
});
|
|
203
180
|
}
|
|
204
|
-
|
|
205
181
|
if (tempTranslateY !== translateY) {
|
|
206
182
|
dispatch({
|
|
207
183
|
type: actions.SET_TRANSLATE_Y,
|
|
208
184
|
payload: tempTranslateY
|
|
209
185
|
});
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
}, [isMoving]);
|
|
186
|
+
}
|
|
187
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
188
|
+
}, [isMoving]);
|
|
213
189
|
|
|
190
|
+
// Updates the component state when props changed.
|
|
214
191
|
useEffect(() => {
|
|
215
192
|
if (isMoving) {
|
|
216
193
|
return;
|
|
217
194
|
}
|
|
218
|
-
|
|
219
195
|
if (translateX !== tempTranslateX) {
|
|
220
196
|
tempTranslateXRef.current = translateX;
|
|
221
|
-
|
|
222
197
|
_setTempTranslateX(translateX);
|
|
223
198
|
}
|
|
224
|
-
|
|
225
199
|
if (translateY !== tempTranslateY) {
|
|
226
200
|
tempTranslateYRef.current = translateY;
|
|
227
|
-
|
|
228
201
|
_setTempTranslateY(translateY);
|
|
229
|
-
}
|
|
230
|
-
|
|
202
|
+
}
|
|
203
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
231
204
|
}, [translateX, translateY]);
|
|
232
205
|
return [tempTranslateX, tempTranslateY, onMouseDown, onTouchStart];
|
|
233
206
|
}
|
|
@@ -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 { useEffect, useState } from 'react';
|
|
19
20
|
import { debounce } from '@instructure/debounce';
|
|
20
21
|
import { calculateScaleRatio } from './controls/utils';
|
|
@@ -23,35 +24,32 @@ import { actions } from './reducers/imageCropper';
|
|
|
23
24
|
export function useMouseWheel(scaleRatio, dispatch) {
|
|
24
25
|
const [tempScaleRatio, setTempScaleRatio] = useState(scaleRatio);
|
|
25
26
|
const [isScaling, setIsScaling] = useState(false);
|
|
26
|
-
|
|
27
27
|
const onWheelCallback = event => {
|
|
28
28
|
// Couldn't prevent modal body scroll when zoom, when using {passive:false}
|
|
29
29
|
// the zoom event listener makes zoom look like a bouncing effect.
|
|
30
30
|
// https://chromestatus.com/feature/6662647093133312
|
|
31
31
|
// event.preventDefault()
|
|
32
|
-
const newScaleRatio = calculateScaleRatio(tempScaleRatio - event.deltaY * WHEEL_SCALE_STEP);
|
|
33
32
|
|
|
33
|
+
const newScaleRatio = calculateScaleRatio(tempScaleRatio - event.deltaY * WHEEL_SCALE_STEP);
|
|
34
34
|
if (newScaleRatio !== tempScaleRatio) {
|
|
35
35
|
setIsScaling(true);
|
|
36
36
|
setTempScaleRatio(newScaleRatio);
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
|
-
|
|
40
39
|
const setScalingRatio = () => {
|
|
41
40
|
setIsScaling(false);
|
|
42
41
|
};
|
|
43
|
-
|
|
44
42
|
useEffect(() => {
|
|
45
43
|
if (!isScaling) {
|
|
46
44
|
setTempScaleRatio(scaleRatio);
|
|
47
|
-
}
|
|
48
|
-
|
|
45
|
+
}
|
|
46
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
49
47
|
}, [scaleRatio]);
|
|
50
48
|
useEffect(() => {
|
|
51
49
|
if (isScaling) {
|
|
52
50
|
debounce(setScalingRatio, WHEEL_EVENT_DELAY)();
|
|
53
|
-
}
|
|
54
|
-
|
|
51
|
+
}
|
|
52
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
55
53
|
}, [tempScaleRatio]);
|
|
56
54
|
useEffect(() => {
|
|
57
55
|
if (!isScaling) {
|
|
@@ -59,8 +57,8 @@ export function useMouseWheel(scaleRatio, dispatch) {
|
|
|
59
57
|
type: actions.SET_SCALE_RATIO,
|
|
60
58
|
payload: tempScaleRatio
|
|
61
59
|
});
|
|
62
|
-
}
|
|
63
|
-
|
|
60
|
+
}
|
|
61
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
64
62
|
}, [isScaling]);
|
|
65
63
|
return [tempScaleRatio, onWheelCallback];
|
|
66
64
|
}
|
|
@@ -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 { IconButton } from '@instructure/ui-buttons';
|
|
20
21
|
import { SimpleSelect } from '@instructure/ui-simple-select';
|
|
@@ -28,7 +29,6 @@ import { Tooltip } from '@instructure/ui-tooltip';
|
|
|
28
29
|
import { CUSTOM, MIN_HEIGHT, MIN_WIDTH, MIN_PERCENTAGE, imageSizes, labelForImageSize } from '../instructure_image/ImageEmbedOptions';
|
|
29
30
|
import formatMessage from '../../../format-message';
|
|
30
31
|
import DimensionsInput from './DimensionsInput';
|
|
31
|
-
|
|
32
32
|
const ImageOptionsForm = _ref => {
|
|
33
33
|
let {
|
|
34
34
|
imageSize,
|
|
@@ -137,5 +137,4 @@ const ImageOptionsForm = _ref => {
|
|
|
137
137
|
minPercentage: MIN_PERCENTAGE
|
|
138
138
|
})))));
|
|
139
139
|
};
|
|
140
|
-
|
|
141
140
|
export default ImageOptionsForm;
|
|
@@ -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';
|