@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,52 +15,45 @@
|
|
|
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
|
function scaleEvenly(width, height, scaleFactor, constraints) {
|
|
19
20
|
const minHeight = constraints.minHeight || 0;
|
|
20
21
|
const minWidth = constraints.minWidth || 0;
|
|
21
22
|
const scaledWidth = width * scaleFactor;
|
|
22
23
|
const scaledHeight = height * scaleFactor;
|
|
23
24
|
let minimumScaleFactor = scaleFactor;
|
|
24
|
-
|
|
25
25
|
if (scaledWidth < minWidth) {
|
|
26
26
|
const atLeastMinWidth = Math.max(scaledWidth, minWidth);
|
|
27
27
|
minimumScaleFactor = atLeastMinWidth / width;
|
|
28
28
|
}
|
|
29
|
-
|
|
30
29
|
if (scaledHeight < minHeight) {
|
|
31
30
|
const atLeastMinHeight = Math.max(scaledHeight, minHeight);
|
|
32
31
|
minimumScaleFactor = Math.max(atLeastMinHeight / height, minimumScaleFactor);
|
|
33
32
|
}
|
|
34
|
-
|
|
35
33
|
return {
|
|
36
34
|
height: Math.round(height * minimumScaleFactor),
|
|
37
35
|
width: Math.round(width * minimumScaleFactor)
|
|
38
36
|
};
|
|
39
37
|
}
|
|
40
|
-
|
|
41
38
|
export function scaleForHeight(width, height, targetHeight) {
|
|
42
39
|
let constraints = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
43
|
-
|
|
44
40
|
if (targetHeight == null) {
|
|
45
41
|
return {
|
|
46
42
|
height: null,
|
|
47
43
|
width: null
|
|
48
44
|
};
|
|
49
45
|
}
|
|
50
|
-
|
|
51
46
|
const scaleFactor = targetHeight / height;
|
|
52
47
|
return scaleEvenly(width, height, scaleFactor, constraints);
|
|
53
48
|
}
|
|
54
49
|
export function scaleForWidth(width, height, targetWidth) {
|
|
55
50
|
let constraints = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
56
|
-
|
|
57
51
|
if (targetWidth == null) {
|
|
58
52
|
return {
|
|
59
53
|
height: null,
|
|
60
54
|
width: null
|
|
61
55
|
};
|
|
62
56
|
}
|
|
63
|
-
|
|
64
57
|
const scaleFactor = targetWidth / width;
|
|
65
58
|
return scaleEvenly(width, height, scaleFactor, constraints);
|
|
66
59
|
}
|
|
@@ -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 { func, shape, string } from 'prop-types';
|
|
20
21
|
import { ScreenReaderContent } from '@instructure/ui-a11y-content';
|
|
@@ -22,34 +23,33 @@ import { NumberInput } from '@instructure/ui-number-input';
|
|
|
22
23
|
export default function DimensionInput(props) {
|
|
23
24
|
const {
|
|
24
25
|
dimensionState,
|
|
25
|
-
label
|
|
26
|
+
label,
|
|
27
|
+
messages
|
|
26
28
|
} = props;
|
|
27
29
|
const {
|
|
28
30
|
addOffset,
|
|
29
31
|
inputValue,
|
|
30
32
|
setInputValue
|
|
31
33
|
} = dimensionState;
|
|
32
|
-
|
|
33
34
|
function handleChange(_event, value) {
|
|
34
35
|
setInputValue(value);
|
|
35
36
|
}
|
|
36
|
-
|
|
37
37
|
function handleDecrement() {
|
|
38
38
|
addOffset(-1);
|
|
39
39
|
}
|
|
40
|
-
|
|
41
40
|
function handleIncrement() {
|
|
42
41
|
addOffset(1);
|
|
43
42
|
}
|
|
44
|
-
|
|
45
43
|
return /*#__PURE__*/React.createElement(NumberInput, {
|
|
44
|
+
allowStringValue: true,
|
|
46
45
|
renderLabel: /*#__PURE__*/React.createElement(ScreenReaderContent, null, label),
|
|
47
46
|
onChange: handleChange,
|
|
48
47
|
onDecrement: handleDecrement,
|
|
49
48
|
onIncrement: handleIncrement,
|
|
50
49
|
isRequired: true,
|
|
51
50
|
showArrows: false,
|
|
52
|
-
value: inputValue
|
|
51
|
+
value: inputValue,
|
|
52
|
+
messages: messages
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
55
|
DimensionInput.propTypes = {
|
|
@@ -15,24 +15,34 @@
|
|
|
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 { bool, func, number, shape, string } from 'prop-types';
|
|
20
21
|
import { ScreenReaderContent } from '@instructure/ui-a11y-content';
|
|
21
22
|
import { FormFieldGroup } from '@instructure/ui-form-field';
|
|
22
|
-
import { IconLockLine } from '@instructure/ui-icons';
|
|
23
|
+
import { IconLockLine, IconWarningSolid } from '@instructure/ui-icons';
|
|
23
24
|
import { Flex } from '@instructure/ui-flex';
|
|
24
25
|
import { Text } from '@instructure/ui-text';
|
|
25
26
|
import { RadioInput, RadioInputGroup } from '@instructure/ui-radio-input';
|
|
26
27
|
import formatMessage from '../../../../format-message';
|
|
27
28
|
import DimensionInput from './DimensionInput';
|
|
28
29
|
export { default as useDimensionsState } from './useDimensionsState';
|
|
29
|
-
|
|
30
|
+
const errorMessage = message => {
|
|
31
|
+
return /*#__PURE__*/React.createElement(Flex, {
|
|
32
|
+
gap: "xx-small",
|
|
33
|
+
alignItems: "center"
|
|
34
|
+
}, /*#__PURE__*/React.createElement(IconWarningSolid, {
|
|
35
|
+
color: "error"
|
|
36
|
+
}), /*#__PURE__*/React.createElement(Text, {
|
|
37
|
+
color: "danger",
|
|
38
|
+
size: "small"
|
|
39
|
+
}, message));
|
|
40
|
+
};
|
|
30
41
|
const getMessage = (dimensionsState, minWidth, minHeight, minPercentage) => {
|
|
31
42
|
let result = {
|
|
32
43
|
text: formatMessage('Aspect ratio will be preserved'),
|
|
33
44
|
type: 'hint'
|
|
34
45
|
};
|
|
35
|
-
|
|
36
46
|
if (dimensionsState.usePercentageUnits) {
|
|
37
47
|
if (!dimensionsState.isNumeric) {
|
|
38
48
|
result = {
|
|
@@ -41,7 +51,7 @@ const getMessage = (dimensionsState, minWidth, minHeight, minPercentage) => {
|
|
|
41
51
|
};
|
|
42
52
|
} else if (!dimensionsState.isAtLeastMinimums) {
|
|
43
53
|
result = {
|
|
44
|
-
text: formatMessage('
|
|
54
|
+
text: formatMessage('Percentage must be at least {percentage}%', {
|
|
45
55
|
percentage: minPercentage
|
|
46
56
|
}),
|
|
47
57
|
type: 'error'
|
|
@@ -54,17 +64,15 @@ const getMessage = (dimensionsState, minWidth, minHeight, minPercentage) => {
|
|
|
54
64
|
};
|
|
55
65
|
} else if (!dimensionsState.isAtLeastMinimums) {
|
|
56
66
|
result = {
|
|
57
|
-
text: formatMessage('
|
|
67
|
+
text: formatMessage('Pixels must be at least {width} x {height}px', {
|
|
58
68
|
width: minWidth,
|
|
59
69
|
height: minHeight
|
|
60
70
|
}),
|
|
61
71
|
type: 'error'
|
|
62
72
|
};
|
|
63
73
|
}
|
|
64
|
-
|
|
65
74
|
return result;
|
|
66
75
|
};
|
|
67
|
-
|
|
68
76
|
export default function DimensionsInput(props) {
|
|
69
77
|
const {
|
|
70
78
|
dimensionsState,
|
|
@@ -73,12 +81,24 @@ export default function DimensionsInput(props) {
|
|
|
73
81
|
minPercentage,
|
|
74
82
|
hidePercentage
|
|
75
83
|
} = props;
|
|
76
|
-
|
|
77
84
|
const handleDimensionTypeChange = e => {
|
|
78
85
|
dimensionsState.setUsePercentageUnits(e.target.value === 'percentage');
|
|
79
86
|
};
|
|
80
|
-
|
|
81
87
|
const message = getMessage(dimensionsState, minWidth, minHeight, minPercentage);
|
|
88
|
+
const secondaryMessage = {
|
|
89
|
+
...message,
|
|
90
|
+
text: ''
|
|
91
|
+
};
|
|
92
|
+
const displayMessage = message => {
|
|
93
|
+
if (!message) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
97
|
+
"data-testid": "message"
|
|
98
|
+
}, message.type === 'error' ? errorMessage(message.text) : /*#__PURE__*/React.createElement(Text, {
|
|
99
|
+
size: "small"
|
|
100
|
+
}, message.text));
|
|
101
|
+
};
|
|
82
102
|
return /*#__PURE__*/React.createElement(Flex, {
|
|
83
103
|
direction: "column"
|
|
84
104
|
}, /*#__PURE__*/React.createElement(Flex.Item, {
|
|
@@ -100,8 +120,7 @@ export default function DimensionsInput(props) {
|
|
|
100
120
|
}))), /*#__PURE__*/React.createElement(Flex.Item, {
|
|
101
121
|
padding: "small"
|
|
102
122
|
}, /*#__PURE__*/React.createElement(FormFieldGroup, {
|
|
103
|
-
description: /*#__PURE__*/React.createElement(ScreenReaderContent, null, formatMessage('Dimensions'))
|
|
104
|
-
messages: [message]
|
|
123
|
+
description: /*#__PURE__*/React.createElement(ScreenReaderContent, null, formatMessage('Dimensions'))
|
|
105
124
|
}, /*#__PURE__*/React.createElement(Flex, {
|
|
106
125
|
alignItems: "start",
|
|
107
126
|
direction: "row",
|
|
@@ -111,7 +130,8 @@ export default function DimensionsInput(props) {
|
|
|
111
130
|
shouldGrow: true
|
|
112
131
|
}, /*#__PURE__*/React.createElement(DimensionInput, {
|
|
113
132
|
dimensionState: dimensionsState.percentageState,
|
|
114
|
-
label: formatMessage('Percentage')
|
|
133
|
+
label: formatMessage('Percentage'),
|
|
134
|
+
messages: [secondaryMessage]
|
|
115
135
|
})), /*#__PURE__*/React.createElement(Flex.Item, {
|
|
116
136
|
padding: "x-small small"
|
|
117
137
|
}, "%")) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Flex.Item, {
|
|
@@ -119,7 +139,8 @@ export default function DimensionsInput(props) {
|
|
|
119
139
|
}, /*#__PURE__*/React.createElement(DimensionInput, {
|
|
120
140
|
dimensionState: dimensionsState.widthState,
|
|
121
141
|
label: formatMessage('Width'),
|
|
122
|
-
minValue: minWidth
|
|
142
|
+
minValue: minWidth,
|
|
143
|
+
messages: [secondaryMessage]
|
|
123
144
|
})), /*#__PURE__*/React.createElement(Flex.Item, {
|
|
124
145
|
padding: "x-small small"
|
|
125
146
|
}, /*#__PURE__*/React.createElement(IconLockLine, null)), /*#__PURE__*/React.createElement(Flex.Item, {
|
|
@@ -127,8 +148,9 @@ export default function DimensionsInput(props) {
|
|
|
127
148
|
}, /*#__PURE__*/React.createElement(DimensionInput, {
|
|
128
149
|
dimensionState: dimensionsState.heightState,
|
|
129
150
|
label: formatMessage('Height'),
|
|
130
|
-
minValue: minHeight
|
|
131
|
-
|
|
151
|
+
minValue: minHeight,
|
|
152
|
+
messages: [secondaryMessage]
|
|
153
|
+
}))))), displayMessage(message)));
|
|
132
154
|
}
|
|
133
155
|
DimensionsInput.propTypes = {
|
|
134
156
|
dimensionsState: shape({
|
|
@@ -15,30 +15,25 @@
|
|
|
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 { useState } from 'react';
|
|
19
20
|
import { scaleForHeight, scaleForWidth } from '../DimensionUtils';
|
|
20
|
-
|
|
21
21
|
function normalizedNumber(number) {
|
|
22
22
|
if (number == null) {
|
|
23
23
|
return null;
|
|
24
24
|
}
|
|
25
|
-
|
|
26
25
|
return Number.isFinite(number) ? Math.round(number) : NaN;
|
|
27
26
|
}
|
|
28
|
-
|
|
29
27
|
function parseAsInteger(inputString) {
|
|
30
28
|
if (inputString.trim() === '') {
|
|
31
29
|
return null;
|
|
32
30
|
}
|
|
33
|
-
|
|
34
31
|
const number = Number.parseFloat(inputString, 10);
|
|
35
32
|
return Number.isFinite(number) ? Math.round(number) : NaN;
|
|
36
33
|
}
|
|
37
|
-
|
|
38
34
|
function inputValueFor(initialNumber) {
|
|
39
35
|
return Number.isFinite(initialNumber) ? `${initialNumber}` : '';
|
|
40
36
|
}
|
|
41
|
-
|
|
42
37
|
export default function useDimensionsState(initialDimensions, constraints) {
|
|
43
38
|
const {
|
|
44
39
|
appliedHeight,
|
|
@@ -81,19 +76,17 @@ export default function useDimensionsState(initialDimensions, constraints) {
|
|
|
81
76
|
height: scaleForHeight,
|
|
82
77
|
width: scaleForWidth
|
|
83
78
|
};
|
|
84
|
-
|
|
85
79
|
function updateDimensions(attributes) {
|
|
86
|
-
setDimensions({
|
|
80
|
+
setDimensions({
|
|
81
|
+
...dimensions,
|
|
87
82
|
...attributes,
|
|
88
83
|
numericHeight: normalizedNumber(attributes.numericHeight),
|
|
89
84
|
numericWidth: normalizedNumber(attributes.numericWidth),
|
|
90
85
|
numericPercentage: normalizedNumber(attributes.numericPercentage)
|
|
91
86
|
});
|
|
92
87
|
}
|
|
93
|
-
|
|
94
88
|
function scaleDimensions(dimensionName, number, scaleConstraints) {
|
|
95
89
|
let width, height, percentage;
|
|
96
|
-
|
|
97
90
|
if (dimensionName === 'percentage') {
|
|
98
91
|
width = naturalWidth;
|
|
99
92
|
height = naturalHeight;
|
|
@@ -105,14 +98,12 @@ export default function useDimensionsState(initialDimensions, constraints) {
|
|
|
105
98
|
height = scaledDimensions.height;
|
|
106
99
|
percentage = initialNumericValues.percentage;
|
|
107
100
|
}
|
|
108
|
-
|
|
109
101
|
return {
|
|
110
102
|
width,
|
|
111
103
|
height,
|
|
112
104
|
percentage
|
|
113
105
|
};
|
|
114
106
|
}
|
|
115
|
-
|
|
116
107
|
function setNumericDimension(dimensionName, number) {
|
|
117
108
|
const {
|
|
118
109
|
height,
|
|
@@ -128,7 +119,6 @@ export default function useDimensionsState(initialDimensions, constraints) {
|
|
|
128
119
|
inputPercentage: inputValueFor(percentage)
|
|
129
120
|
});
|
|
130
121
|
}
|
|
131
|
-
|
|
132
122
|
function setDimensionValue(dimensionName, value) {
|
|
133
123
|
const number = parseAsInteger(value);
|
|
134
124
|
const {
|
|
@@ -145,63 +135,49 @@ export default function useDimensionsState(initialDimensions, constraints) {
|
|
|
145
135
|
inputPercentage: dimensionName === 'percentage' ? value : inputValueFor(percentage)
|
|
146
136
|
});
|
|
147
137
|
}
|
|
148
|
-
|
|
149
138
|
function offsetDimension(dimensionName, offset) {
|
|
150
139
|
const minValue = dimensionMinimums[dimensionName];
|
|
151
140
|
const initialNumber = initialNumericValues[dimensionName];
|
|
152
141
|
const numericValue = currentNumericValues[dimensionName];
|
|
153
|
-
|
|
154
142
|
if (numericValue != null && !Number.isFinite(numericValue)) {
|
|
155
143
|
return;
|
|
156
144
|
}
|
|
157
|
-
|
|
158
145
|
const newNumber = numericValue == null ? initialNumber + offset : Math.max(minValue, Math.floor(numericValue + offset));
|
|
159
146
|
setNumericDimension(dimensionName, newNumber);
|
|
160
147
|
}
|
|
161
|
-
|
|
162
148
|
const widthState = {
|
|
163
149
|
inputValue: dimensions.inputWidth,
|
|
164
|
-
|
|
165
150
|
addOffset(offset) {
|
|
166
151
|
offsetDimension('width', offset);
|
|
167
152
|
},
|
|
168
|
-
|
|
169
153
|
setInputValue(value) {
|
|
170
154
|
setDimensionValue('width', value);
|
|
171
155
|
}
|
|
172
|
-
|
|
173
156
|
};
|
|
174
157
|
const heightState = {
|
|
175
158
|
inputValue: dimensions.inputHeight,
|
|
176
|
-
|
|
177
159
|
addOffset(offset) {
|
|
178
160
|
offsetDimension('height', offset);
|
|
179
161
|
},
|
|
180
|
-
|
|
181
162
|
setInputValue(value) {
|
|
182
163
|
setDimensionValue('height', value);
|
|
183
164
|
}
|
|
184
|
-
|
|
185
165
|
};
|
|
186
166
|
const percentageState = {
|
|
187
167
|
inputValue: dimensions.inputPercentage,
|
|
188
|
-
|
|
189
168
|
addOffset(offset) {
|
|
190
169
|
offsetDimension('percentage', offset);
|
|
191
170
|
},
|
|
192
|
-
|
|
193
171
|
setInputValue(value) {
|
|
194
172
|
setDimensionValue('percentage', value);
|
|
195
173
|
}
|
|
196
|
-
|
|
197
174
|
};
|
|
198
|
-
|
|
199
175
|
const handleUsePercentageUnitsChange = value => {
|
|
200
|
-
setDimensions({
|
|
176
|
+
setDimensions({
|
|
177
|
+
...dimensions,
|
|
201
178
|
usePercentageUnits: value
|
|
202
179
|
});
|
|
203
180
|
};
|
|
204
|
-
|
|
205
181
|
const isNumeric = dimensions.usePercentageUnits ? Number.isFinite(dimensions.numericPercentage) : [dimensions.numericHeight, dimensions.numericWidth].every(Number.isFinite);
|
|
206
182
|
const isAtLeastMinimums = dimensions.usePercentageUnits ? dimensions.numericPercentage >= minPercentage : dimensions.numericHeight >= minHeight && dimensions.numericWidth >= minWidth;
|
|
207
183
|
return {
|
|
@@ -17,8 +17,9 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import React from 'react';
|
|
19
19
|
import PropTypes from 'prop-types';
|
|
20
|
-
import formatMessage from '../../../format-message';
|
|
20
|
+
import formatMessage from '../../../format-message';
|
|
21
21
|
|
|
22
|
+
// TODO: a placeholder. Design a better one. See CORE-2826
|
|
22
23
|
export default class ErrorBoundary extends React.Component {
|
|
23
24
|
constructor(props) {
|
|
24
25
|
super(props);
|
|
@@ -26,7 +27,6 @@ export default class ErrorBoundary extends React.Component {
|
|
|
26
27
|
hasError: false
|
|
27
28
|
};
|
|
28
29
|
}
|
|
29
|
-
|
|
30
30
|
static getDerivedStateFromError(error) {
|
|
31
31
|
// Update state so the next render will show the fallback UI.
|
|
32
32
|
return {
|
|
@@ -34,7 +34,6 @@ export default class ErrorBoundary extends React.Component {
|
|
|
34
34
|
error
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
|
-
|
|
38
37
|
render() {
|
|
39
38
|
if (this.state.hasError) {
|
|
40
39
|
const msg = this.state.error.message ? this.state.error.message : this.state.error.toString();
|
|
@@ -44,10 +43,8 @@ export default class ErrorBoundary extends React.Component {
|
|
|
44
43
|
}
|
|
45
44
|
}, /*#__PURE__*/React.createElement("h2", null, formatMessage('Something went wrong.')), /*#__PURE__*/React.createElement("p", null, msg));
|
|
46
45
|
}
|
|
47
|
-
|
|
48
46
|
return this.props.children;
|
|
49
47
|
}
|
|
50
|
-
|
|
51
48
|
}
|
|
52
49
|
ErrorBoundary.propTypes = {
|
|
53
50
|
children: PropTypes.node
|
|
@@ -15,17 +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
|
// Microsoft word will include an image of the text being pasted on the clipboard
|
|
19
20
|
// Let's look at the text/html to see if it's word before deciding to paste the image
|
|
20
21
|
// Assumes we've already confirmed that cbdata includes files
|
|
21
22
|
export function isMicrosoftWordContentInEvent(event) {
|
|
22
23
|
const cbdata = event.type === 'paste' ? event.clipboardData : event.dataTransfer;
|
|
23
|
-
|
|
24
24
|
if ((cbdata === null || cbdata === void 0 ? void 0 : cbdata.files[0].type.indexOf('image/')) === 0 && cbdata.types.includes('text/html')) {
|
|
25
25
|
const html = cbdata.getData('text/html');
|
|
26
26
|
return isMicrosoftWordContent(html);
|
|
27
27
|
}
|
|
28
|
-
|
|
29
28
|
return false;
|
|
30
29
|
}
|
|
31
30
|
export function isMicrosoftWordContent(html) {
|
|
@@ -34,6 +33,5 @@ export function isMicrosoftWordContent(html) {
|
|
|
34
33
|
const doc = parser.parseFromString(html, 'text/html');
|
|
35
34
|
return Array.from(doc.documentElement.attributes).some(attr => /schemas[-.]microsoft[-.]com/.test(attr.value)) || /<o:|class="Mso/.test(doc.body.innerHTML || '');
|
|
36
35
|
}
|
|
37
|
-
|
|
38
36
|
return false;
|
|
39
37
|
}
|
|
@@ -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, useState } from 'react';
|
|
19
20
|
import { bool, element, func, oneOf, oneOfType, string } from 'prop-types';
|
|
20
21
|
import formatMessage from '../../../format-message';
|
|
@@ -26,24 +27,19 @@ import { IconButton } from '@instructure/ui-buttons';
|
|
|
26
27
|
import { ScreenReaderContent } from '@instructure/ui-a11y-content';
|
|
27
28
|
import { ICON_MAKER_ICONS } from '../instructure_icon_maker/svg/constants';
|
|
28
29
|
import { IconLinkLine, IconFolderLine, IconImageLine, IconDocumentLine, IconAttachMediaLine, IconSearchLine, IconXLine } from '@instructure/ui-icons';
|
|
29
|
-
|
|
30
30
|
function fileLabelFromContext(contextType) {
|
|
31
31
|
switch (contextType) {
|
|
32
32
|
case 'user':
|
|
33
33
|
return formatMessage('User Files');
|
|
34
|
-
|
|
35
34
|
case 'course':
|
|
36
35
|
return formatMessage('Course Files');
|
|
37
|
-
|
|
38
36
|
case 'group':
|
|
39
37
|
return formatMessage('Group Files');
|
|
40
|
-
|
|
41
38
|
case 'files':
|
|
42
39
|
default:
|
|
43
40
|
return formatMessage('Files');
|
|
44
41
|
}
|
|
45
42
|
}
|
|
46
|
-
|
|
47
43
|
function renderTypeOptions(contentType, contentSubtype, userContextType) {
|
|
48
44
|
const options = [/*#__PURE__*/React.createElement(SimpleSelect.Option, {
|
|
49
45
|
key: "links",
|
|
@@ -51,38 +47,34 @@ function renderTypeOptions(contentType, contentSubtype, userContextType) {
|
|
|
51
47
|
value: "links",
|
|
52
48
|
renderBeforeLabel: IconLinkLine
|
|
53
49
|
}, formatMessage('Links'))];
|
|
54
|
-
|
|
55
50
|
if (userContextType === 'course' && contentType !== 'links' && contentSubtype !== 'all') {
|
|
56
|
-
options.push(
|
|
51
|
+
options.push(/*#__PURE__*/React.createElement(SimpleSelect.Option, {
|
|
57
52
|
key: "course_files",
|
|
58
53
|
id: "course_files",
|
|
59
54
|
value: "course_files",
|
|
60
55
|
renderBeforeLabel: IconFolderLine
|
|
61
56
|
}, fileLabelFromContext('course')));
|
|
62
57
|
}
|
|
63
|
-
|
|
64
58
|
if (userContextType === 'group' && contentType !== 'links' && contentSubtype !== 'all') {
|
|
65
|
-
options.push(
|
|
59
|
+
options.push(/*#__PURE__*/React.createElement(SimpleSelect.Option, {
|
|
66
60
|
key: "group_files",
|
|
67
61
|
id: "group_files",
|
|
68
62
|
value: "group_files",
|
|
69
63
|
renderBeforeLabel: IconFolderLine
|
|
70
64
|
}, fileLabelFromContext('group')));
|
|
71
|
-
}
|
|
72
|
-
|
|
65
|
+
}
|
|
73
66
|
|
|
67
|
+
// Icon Maker icons are only stored in course folders.
|
|
74
68
|
if (contentSubtype !== ICON_MAKER_ICONS) {
|
|
75
|
-
options.push(
|
|
69
|
+
options.push(/*#__PURE__*/React.createElement(SimpleSelect.Option, {
|
|
76
70
|
key: "user_files",
|
|
77
71
|
id: "user_files",
|
|
78
72
|
value: "user_files",
|
|
79
73
|
renderBeforeLabel: IconFolderLine
|
|
80
74
|
}, fileLabelFromContext(contentType === 'links' || contentSubtype === 'all' ? 'files' : 'user')));
|
|
81
75
|
}
|
|
82
|
-
|
|
83
76
|
return options;
|
|
84
77
|
}
|
|
85
|
-
|
|
86
78
|
function renderType(contentType, contentSubtype, mountNode, onChange, userContextType, containingContextType) {
|
|
87
79
|
// Check containingContextType so that we always show context links
|
|
88
80
|
if (containingContextType === 'course' || containingContextType === 'group') {
|
|
@@ -95,12 +87,10 @@ function renderType(contentType, contentSubtype, mountNode, onChange, userContex
|
|
|
95
87
|
const changed = {
|
|
96
88
|
contentType: selection.value
|
|
97
89
|
};
|
|
98
|
-
|
|
99
90
|
if (contentType === 'links') {
|
|
100
91
|
// when changing away from links, go to all user files
|
|
101
92
|
changed.contentSubtype = 'all';
|
|
102
93
|
}
|
|
103
|
-
|
|
104
94
|
onChange(changed);
|
|
105
95
|
},
|
|
106
96
|
value: contentType
|
|
@@ -115,11 +105,9 @@ function renderType(contentType, contentSubtype, mountNode, onChange, userContex
|
|
|
115
105
|
}, /*#__PURE__*/React.createElement(ScreenReaderContent, null, formatMessage('Content Type')), fileLabelFromContext('user', contentSubtype));
|
|
116
106
|
}
|
|
117
107
|
}
|
|
118
|
-
|
|
119
108
|
function shouldSearch(searchString) {
|
|
120
109
|
return searchString.length === 0 || searchString.length >= 3;
|
|
121
110
|
}
|
|
122
|
-
|
|
123
111
|
export default function Filter(props) {
|
|
124
112
|
const {
|
|
125
113
|
contentType,
|
|
@@ -133,8 +121,9 @@ export default function Filter(props) {
|
|
|
133
121
|
containingContextType
|
|
134
122
|
} = props;
|
|
135
123
|
const [pendingSearchString, setPendingSearchString] = useState(searchString);
|
|
136
|
-
const [searchInputTimer, setSearchInputTimer] = useState(0);
|
|
124
|
+
const [searchInputTimer, setSearchInputTimer] = useState(0);
|
|
137
125
|
|
|
126
|
+
// only run on mounting to trigger change to correct contextType
|
|
138
127
|
useEffect(() => {
|
|
139
128
|
onChange({
|
|
140
129
|
contentType
|
|
@@ -147,28 +136,22 @@ export default function Filter(props) {
|
|
|
147
136
|
window.clearTimeout(searchInputTimer);
|
|
148
137
|
setSearchInputTimer(0);
|
|
149
138
|
}
|
|
150
|
-
|
|
151
139
|
onChange({
|
|
152
140
|
searchString: value
|
|
153
141
|
});
|
|
154
142
|
}
|
|
155
143
|
}
|
|
156
|
-
|
|
157
144
|
function handleChangeSearch(value) {
|
|
158
145
|
setPendingSearchString(value);
|
|
159
|
-
|
|
160
146
|
if (searchInputTimer) {
|
|
161
147
|
window.clearTimeout(searchInputTimer);
|
|
162
148
|
}
|
|
163
|
-
|
|
164
149
|
const tid = window.setTimeout(() => doSearch(value), 250);
|
|
165
150
|
setSearchInputTimer(tid);
|
|
166
151
|
}
|
|
167
|
-
|
|
168
152
|
function handleClear() {
|
|
169
153
|
handleChangeSearch('');
|
|
170
154
|
}
|
|
171
|
-
|
|
172
155
|
function renderClearButton() {
|
|
173
156
|
if (pendingSearchString) {
|
|
174
157
|
return /*#__PURE__*/React.createElement(IconButton, {
|
|
@@ -179,10 +162,8 @@ export default function Filter(props) {
|
|
|
179
162
|
size: "small"
|
|
180
163
|
}, /*#__PURE__*/React.createElement(IconXLine, null));
|
|
181
164
|
}
|
|
182
|
-
|
|
183
165
|
return undefined;
|
|
184
166
|
}
|
|
185
|
-
|
|
186
167
|
const searchMessage = formatMessage('Enter at least 3 characters to search');
|
|
187
168
|
const loadingMessage = formatMessage('Loading, please wait');
|
|
188
169
|
const msg = isContentLoading ? loadingMessage : searchMessage;
|
|
@@ -205,7 +186,6 @@ export default function Filter(props) {
|
|
|
205
186
|
const changed = {
|
|
206
187
|
contentSubtype: selection.value
|
|
207
188
|
};
|
|
208
|
-
|
|
209
189
|
if (changed.contentSubtype === 'all') {
|
|
210
190
|
// when flipped to All, the context needs to be user
|
|
211
191
|
// so we can get media_objects, which are all returned in the user context
|
|
@@ -214,7 +194,6 @@ export default function Filter(props) {
|
|
|
214
194
|
// Icon Maker icons only belong to Courses.
|
|
215
195
|
changed.contentType = 'course_files';
|
|
216
196
|
}
|
|
217
|
-
|
|
218
197
|
onChange(changed);
|
|
219
198
|
},
|
|
220
199
|
value: contentSubtype
|
|
@@ -287,48 +266,39 @@ Filter.propTypes = {
|
|
|
287
266
|
* `contentType` is set to "files"
|
|
288
267
|
*/
|
|
289
268
|
contentSubtype: string.isRequired,
|
|
290
|
-
|
|
291
269
|
/**
|
|
292
270
|
* `contentType` is the primary filter setting (e.g. links, files)
|
|
293
271
|
*/
|
|
294
272
|
contentType: oneOf(['links', 'user_files', 'course_files', 'group_files']).isRequired,
|
|
295
|
-
|
|
296
273
|
/**
|
|
297
274
|
* `mountNode` is where INSTUI popups should mount. This is necessary for them
|
|
298
275
|
* to work correctly when the RCE is in fullscreen
|
|
299
276
|
*/
|
|
300
277
|
mountNode: oneOfType([element, func]),
|
|
301
|
-
|
|
302
278
|
/**
|
|
303
279
|
* `onChange` is called when any of the Filter settings are changed
|
|
304
280
|
*/
|
|
305
281
|
onChange: func.isRequired,
|
|
306
|
-
|
|
307
282
|
/**
|
|
308
283
|
* `sortValue` defines how items in the CanvasContentTray are sorted
|
|
309
284
|
*/
|
|
310
285
|
sortValue: string.isRequired,
|
|
311
|
-
|
|
312
286
|
/**
|
|
313
287
|
* `searchString` is used to search for matching file names. Must be >3 chars long
|
|
314
288
|
*/
|
|
315
289
|
searchString: string.isRequired,
|
|
316
|
-
|
|
317
290
|
/**
|
|
318
291
|
* The user's context
|
|
319
292
|
*/
|
|
320
293
|
userContextType: oneOf(['user', 'course', 'group']),
|
|
321
|
-
|
|
322
294
|
/**
|
|
323
295
|
* Is my content currently loading?
|
|
324
296
|
*/
|
|
325
297
|
isContentLoading: bool,
|
|
326
|
-
|
|
327
298
|
/**
|
|
328
299
|
* The page context
|
|
329
300
|
*/
|
|
330
301
|
containingContextType: oneOf(['user', 'course', 'group']),
|
|
331
|
-
|
|
332
302
|
/**
|
|
333
303
|
* Should include Icon Maker?
|
|
334
304
|
*/
|
|
@@ -15,17 +15,18 @@
|
|
|
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 { Flex } from '@instructure/ui-flex';
|
|
21
22
|
import { Tray } from '@instructure/ui-tray';
|
|
22
23
|
import { View } from '@instructure/ui-view';
|
|
23
|
-
import { getTrayHeight } from './trayUtils';
|
|
24
|
+
import { getTrayHeight } from './trayUtils';
|
|
24
25
|
|
|
26
|
+
// Need these styles for drawing over <ColorInput /> popup.
|
|
25
27
|
const topElementStyles = {
|
|
26
28
|
zIndex: 10000
|
|
27
29
|
};
|
|
28
|
-
|
|
29
30
|
function renderJoinedItem(bodyAs, renderBody, renderFooter) {
|
|
30
31
|
return /*#__PURE__*/React.createElement(Flex.Item, {
|
|
31
32
|
height: "0",
|
|
@@ -47,7 +48,6 @@ function renderJoinedItem(bodyAs, renderBody, renderFooter) {
|
|
|
47
48
|
borderWidth: "small none none none"
|
|
48
49
|
}, renderFooter()))));
|
|
49
50
|
}
|
|
50
|
-
|
|
51
51
|
export const FixedContentTray = _ref => {
|
|
52
52
|
let {
|
|
53
53
|
title,
|