@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,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 from 'react';
|
|
19
20
|
import PropTypes from 'prop-types';
|
|
20
21
|
import formatMessage from '../../../../format-message';
|
|
21
22
|
import { SimpleSelect } from '@instructure/ui-simple-select';
|
|
22
23
|
import { View } from '@instructure/ui-view';
|
|
23
24
|
import { TextInput } from '@instructure/ui-text-input';
|
|
24
|
-
|
|
25
25
|
const ShowCreativeCommonsOptions = _ref => {
|
|
26
26
|
let {
|
|
27
27
|
ccLicense,
|
|
@@ -48,7 +48,6 @@ const ShowCreativeCommonsOptions = _ref => {
|
|
|
48
48
|
value: license.id
|
|
49
49
|
}, license.name))));
|
|
50
50
|
};
|
|
51
|
-
|
|
52
51
|
const ShowMessage = () => {
|
|
53
52
|
return /*#__PURE__*/React.createElement("div", {
|
|
54
53
|
className: "alert"
|
|
@@ -60,7 +59,6 @@ const ShowMessage = () => {
|
|
|
60
59
|
}
|
|
61
60
|
}, formatMessage("If you do not select usage rights now, this file will be unpublished after it's uploaded."))));
|
|
62
61
|
};
|
|
63
|
-
|
|
64
62
|
const UsageRightsSelectBox = _ref3 => {
|
|
65
63
|
let {
|
|
66
64
|
contextType,
|
|
@@ -100,23 +98,19 @@ const UsageRightsSelectBox = _ref3 => {
|
|
|
100
98
|
function getUsageRightsOptions() {
|
|
101
99
|
fetch(apiUrl()).then(res => res.text()).then(res => setLicenseOptions(JSON.parse(res))).catch(() => {});
|
|
102
100
|
}
|
|
103
|
-
|
|
104
101
|
function apiUrl() {
|
|
105
102
|
const context = contextType.replace(/([^s])$/, '$1s'); // pluralize
|
|
106
|
-
|
|
107
103
|
return `/api/v1/${context}/${contextId}/content_licenses`;
|
|
108
104
|
}
|
|
109
|
-
|
|
110
105
|
getUsageRightsOptions();
|
|
111
106
|
}, [contextType, contextId]);
|
|
112
|
-
|
|
113
107
|
function handleChange(value) {
|
|
114
|
-
setUsageRightsState(state => ({
|
|
108
|
+
setUsageRightsState(state => ({
|
|
109
|
+
...state,
|
|
115
110
|
usageRight: value
|
|
116
111
|
}));
|
|
117
112
|
setShowMessage(showMessageProp && value === 'choose');
|
|
118
113
|
}
|
|
119
|
-
|
|
120
114
|
return /*#__PURE__*/React.createElement(View, {
|
|
121
115
|
as: "div"
|
|
122
116
|
}, /*#__PURE__*/React.createElement(View, {
|
|
@@ -138,7 +132,8 @@ const UsageRightsSelectBox = _ref3 => {
|
|
|
138
132
|
value: contentOption.value
|
|
139
133
|
}, contentOption.display)))), showCreativeCommonsOptions && /*#__PURE__*/React.createElement(ShowCreativeCommonsOptions, {
|
|
140
134
|
ccLicese: ccLicense,
|
|
141
|
-
setCCLicense: license => setUsageRightsState(state => ({
|
|
135
|
+
setCCLicense: license => setUsageRightsState(state => ({
|
|
136
|
+
...state,
|
|
142
137
|
ccLicense: license
|
|
143
138
|
})),
|
|
144
139
|
licenseOptions: licenseOptions
|
|
@@ -148,7 +143,8 @@ const UsageRightsSelectBox = _ref3 => {
|
|
|
148
143
|
}, /*#__PURE__*/React.createElement(TextInput, {
|
|
149
144
|
renderLabel: formatMessage('Copyright Holder:'),
|
|
150
145
|
value: copyrightHolder,
|
|
151
|
-
onChange: (e, value) => setUsageRightsState(state => ({
|
|
146
|
+
onChange: (e, value) => setUsageRightsState(state => ({
|
|
147
|
+
...state,
|
|
152
148
|
copyrightHolder: value
|
|
153
149
|
})),
|
|
154
150
|
placeholder: formatMessage('(c) 2001 Acme Inc.')
|
|
@@ -157,7 +153,6 @@ const UsageRightsSelectBox = _ref3 => {
|
|
|
157
153
|
margin: "medium 0"
|
|
158
154
|
}, showMessage && /*#__PURE__*/React.createElement(ShowMessage, null)));
|
|
159
155
|
};
|
|
160
|
-
|
|
161
156
|
UsageRightsSelectBox.propTypes = {
|
|
162
157
|
usageRightsState: PropTypes.shape({
|
|
163
158
|
ccLicense: PropTypes.string,
|
|
@@ -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 ReactDOM from 'react-dom';
|
|
19
20
|
import formatMessage from '../../../../format-message';
|
|
20
21
|
import React from 'react';
|
|
@@ -25,7 +26,8 @@ export default function doFileUpload(ed, document, opts) {
|
|
|
25
26
|
accept,
|
|
26
27
|
panels,
|
|
27
28
|
preselectedFile
|
|
28
|
-
} = {
|
|
29
|
+
} = {
|
|
30
|
+
...opts
|
|
29
31
|
};
|
|
30
32
|
const title = accept !== null && accept !== void 0 && accept.startsWith('image/') ? formatMessage('Upload Image') : formatMessage('Upload File');
|
|
31
33
|
let shownResolve;
|
|
@@ -34,21 +36,18 @@ export default function doFileUpload(ed, document, opts) {
|
|
|
34
36
|
let {
|
|
35
37
|
UploadFile
|
|
36
38
|
} = _ref;
|
|
37
|
-
|
|
38
39
|
const container = document.querySelector('.canvas-rce-upload-container') || (() => {
|
|
39
40
|
const elem = document.createElement('div');
|
|
40
41
|
elem.className = 'canvas-rce-upload-container';
|
|
41
42
|
document.body.appendChild(elem);
|
|
42
43
|
return elem;
|
|
43
44
|
})();
|
|
44
|
-
|
|
45
45
|
return new Promise(resolve => {
|
|
46
46
|
const handleDismiss = () => {
|
|
47
47
|
ReactDOM.unmountComponentAtNode(container);
|
|
48
48
|
ed.focus(false);
|
|
49
49
|
resolve('dismissed');
|
|
50
50
|
};
|
|
51
|
-
|
|
52
51
|
const wrappedSubmit = function () {
|
|
53
52
|
try {
|
|
54
53
|
return handleSubmit(...arguments);
|
|
@@ -56,8 +55,7 @@ export default function doFileUpload(ed, document, opts) {
|
|
|
56
55
|
resolve('submitted');
|
|
57
56
|
}
|
|
58
57
|
};
|
|
59
|
-
|
|
60
|
-
ReactDOM.render( /*#__PURE__*/React.createElement(UploadFile, {
|
|
58
|
+
ReactDOM.render(/*#__PURE__*/React.createElement(UploadFile, {
|
|
61
59
|
preselectedFile: preselectedFile,
|
|
62
60
|
accept: accept,
|
|
63
61
|
editor: ed,
|
|
@@ -15,5 +15,6 @@
|
|
|
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 { UploadFilePanelIds, handleSubmit, UploadFile } from './UploadFile';
|
|
19
20
|
export { UploadFilePanelIds, handleSubmit, UploadFile };
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import _pt from "prop-types";
|
|
2
|
-
|
|
3
2
|
/*
|
|
4
3
|
* Copyright (C) 2024 - present Instructure, Inc.
|
|
5
4
|
*
|
|
@@ -17,12 +16,12 @@ import _pt from "prop-types";
|
|
|
17
16
|
* You should have received a copy of the GNU Affero General Public License along
|
|
18
17
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
19
18
|
*/
|
|
19
|
+
|
|
20
20
|
import React from 'react';
|
|
21
21
|
import formatMessage from '../../../../format-message';
|
|
22
22
|
import { Button, CloseButton } from '@instructure/ui-buttons';
|
|
23
23
|
import { Heading } from '@instructure/ui-heading';
|
|
24
24
|
import { Modal } from '@instructure/ui-modal';
|
|
25
|
-
|
|
26
25
|
const AIResponseModal = _ref => {
|
|
27
26
|
let {
|
|
28
27
|
open,
|
|
@@ -59,7 +58,6 @@ const AIResponseModal = _ref => {
|
|
|
59
58
|
margin: "medium 0 0 medium"
|
|
60
59
|
}, formatMessage('Insert'))));
|
|
61
60
|
};
|
|
62
|
-
|
|
63
61
|
AIResponseModal.propTypes = {
|
|
64
62
|
open: _pt.bool.isRequired,
|
|
65
63
|
html: _pt.string.isRequired,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import _pt from "prop-types";
|
|
2
|
-
|
|
3
2
|
/*
|
|
4
3
|
* Copyright (C) 2024 - present Instructure, Inc.
|
|
5
4
|
*
|
|
@@ -17,6 +16,7 @@ import _pt from "prop-types";
|
|
|
17
16
|
* You should have received a copy of the GNU Affero General Public License along
|
|
18
17
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
19
18
|
*/
|
|
19
|
+
|
|
20
20
|
import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
21
21
|
import formatMessage from '../../../../format-message';
|
|
22
22
|
import { Button, CloseButton, CondensedButton, IconButton } from '@instructure/ui-buttons';
|
|
@@ -35,9 +35,7 @@ import { showFlashAlert } from '../../../../common/FlashAlert';
|
|
|
35
35
|
import doFetchApi from '../do-fetch-api-effect';
|
|
36
36
|
import { AIWandSVG, AIAvatarSVG, InsertSVG, CopySVG, RefreshSVG, DislikeSVG } from './aiicons';
|
|
37
37
|
import { AIResponseModal } from './AIResponseModal';
|
|
38
|
-
|
|
39
38
|
const msgid = () => uid('msg', 3);
|
|
40
|
-
|
|
41
39
|
const modifyAllTaskMessage = formatMessage('Hello. Please describe the modifications you would like to make to your composition.');
|
|
42
40
|
const modifySelectionTaskMessage = formatMessage('Hello. Please describe the modifications you would like to make to your selection.');
|
|
43
41
|
const generateTaskMessage = formatMessage('Please decribe what you would like to compose.');
|
|
@@ -62,7 +60,6 @@ export const AIToolsTray = _ref => {
|
|
|
62
60
|
transition: container.style.transition
|
|
63
61
|
};
|
|
64
62
|
}
|
|
65
|
-
|
|
66
63
|
return {};
|
|
67
64
|
});
|
|
68
65
|
const [isOpen, setIsOpen] = useState(open);
|
|
@@ -95,7 +92,6 @@ export const AIToolsTray = _ref => {
|
|
|
95
92
|
}, [initChatMessages]);
|
|
96
93
|
useLayoutEffect(() => {
|
|
97
94
|
var _chatContainerRef$cur;
|
|
98
|
-
|
|
99
95
|
const lastbox = (_chatContainerRef$cur = chatContainerRef.current) === null || _chatContainerRef$cur === void 0 ? void 0 : _chatContainerRef$cur.querySelector('.ai-chat-box:last-child');
|
|
100
96
|
lastbox === null || lastbox === void 0 ? void 0 : lastbox.scrollIntoView({
|
|
101
97
|
behavior: 'smooth',
|
|
@@ -121,7 +117,6 @@ export const AIToolsTray = _ref => {
|
|
|
121
117
|
const ed_rect = ed.getBoundingClientRect();
|
|
122
118
|
const padding = parseInt(edstyle.paddingRight, 10);
|
|
123
119
|
const tray_left = window.innerWidth - trayRef.offsetWidth;
|
|
124
|
-
|
|
125
120
|
if (ed_rect.right > tray_left) {
|
|
126
121
|
ed.style.boxSizing = 'border-box';
|
|
127
122
|
ed.style.width = `${ed_rect.width - (ed_rect.right - tray_left - padding)}px`;
|
|
@@ -135,9 +130,10 @@ export const AIToolsTray = _ref => {
|
|
|
135
130
|
}
|
|
136
131
|
}, [containerStyle, open, trayRef]);
|
|
137
132
|
const getResponse = useCallback(prompt => {
|
|
138
|
-
setWaitingForResponse(true);
|
|
139
|
-
// eslint-disable-next-line promise/catch-or-return
|
|
133
|
+
setWaitingForResponse(true);
|
|
140
134
|
|
|
135
|
+
// the .finally triggered the error even though there is a .catch
|
|
136
|
+
// eslint-disable-next-line promise/catch-or-return
|
|
141
137
|
doFetchApi({
|
|
142
138
|
path: '/api/v1/rich_content/generate',
|
|
143
139
|
method: 'POST',
|
|
@@ -156,7 +152,6 @@ export const AIToolsTray = _ref => {
|
|
|
156
152
|
const {
|
|
157
153
|
json
|
|
158
154
|
} = result;
|
|
159
|
-
|
|
160
155
|
if (json.error) {
|
|
161
156
|
chatMessagesRef.current.push({
|
|
162
157
|
id: msgid(),
|
|
@@ -217,7 +212,6 @@ export const AIToolsTray = _ref => {
|
|
|
217
212
|
}, [onInsertContent]);
|
|
218
213
|
const handleCopyResponse = useCallback(async responseText => {
|
|
219
214
|
try {
|
|
220
|
-
// @ts-expect-error ClipboardItem.supports really does exist
|
|
221
215
|
if (ClipboardItem.supports('text/html')) {
|
|
222
216
|
const htmlBlob = new Blob([responseText], {
|
|
223
217
|
type: 'text/html'
|
|
@@ -230,7 +224,6 @@ export const AIToolsTray = _ref => {
|
|
|
230
224
|
div.innerHTML = responseText;
|
|
231
225
|
await navigator.clipboard.writeText(div.textContent || '');
|
|
232
226
|
}
|
|
233
|
-
|
|
234
227
|
showFlashAlert({
|
|
235
228
|
message: formatMessage('Response copied to clipboard'),
|
|
236
229
|
type: 'success',
|
|
@@ -254,7 +247,6 @@ export const AIToolsTray = _ref => {
|
|
|
254
247
|
const handleShowWholeResponse = useCallback(event => {
|
|
255
248
|
const msgId = event.target.dataset.messageId;
|
|
256
249
|
const message = chatMessagesRef.current.find(msg => msg.id === msgId);
|
|
257
|
-
|
|
258
250
|
if (message) {
|
|
259
251
|
setResponseHtml(message.message);
|
|
260
252
|
}
|
|
@@ -270,7 +262,6 @@ export const AIToolsTray = _ref => {
|
|
|
270
262
|
onReplaceContent(responseHtml);
|
|
271
263
|
handleCloseResponseModal();
|
|
272
264
|
}, [handleCloseResponseModal, onReplaceContent, responseHtml]);
|
|
273
|
-
|
|
274
265
|
const sharkfin = () => {
|
|
275
266
|
return /*#__PURE__*/React.createElement("svg", {
|
|
276
267
|
width: "14",
|
|
@@ -288,14 +279,11 @@ export const AIToolsTray = _ref => {
|
|
|
288
279
|
strokeWidth: "2"
|
|
289
280
|
}));
|
|
290
281
|
};
|
|
291
|
-
|
|
292
282
|
const renderResponse = msgId => {
|
|
293
283
|
const message = chatMessagesRef.current.find(msg => msg.id === msgId);
|
|
294
|
-
|
|
295
284
|
if (!message) {
|
|
296
285
|
return /*#__PURE__*/React.createElement("span", null, formatMessage("I'm sorry, but I cannot find the AI's answer"));
|
|
297
286
|
}
|
|
298
|
-
|
|
299
287
|
const div = document.createElement('div');
|
|
300
288
|
div.innerHTML = message.message;
|
|
301
289
|
return /*#__PURE__*/React.createElement("div", {
|
|
@@ -313,9 +301,9 @@ export const AIToolsTray = _ref => {
|
|
|
313
301
|
onClick: handleShowWholeResponse,
|
|
314
302
|
"data-message-id": msgId
|
|
315
303
|
}, formatMessage('Show all'))));
|
|
316
|
-
};
|
|
317
|
-
|
|
304
|
+
};
|
|
318
305
|
|
|
306
|
+
// TODO: should the response box get truncated?
|
|
319
307
|
const renderChatBox = (message, key) => {
|
|
320
308
|
return /*#__PURE__*/React.createElement("div", {
|
|
321
309
|
id: message.id,
|
|
@@ -346,11 +334,9 @@ export const AIToolsTray = _ref => {
|
|
|
346
334
|
top: '-18px',
|
|
347
335
|
// Adjust this value to position the sharkfin
|
|
348
336
|
left: '40px' // Adjust this value to align the sharkfin horizontally
|
|
349
|
-
|
|
350
337
|
}
|
|
351
338
|
}, sharkfin())), message.type === 'response' ?
|
|
352
339
|
/*#__PURE__*/
|
|
353
|
-
|
|
354
340
|
/* TODO: why is it to wide w/o maxWidth? */
|
|
355
341
|
React.createElement("div", {
|
|
356
342
|
style: {
|
|
@@ -394,12 +380,10 @@ export const AIToolsTray = _ref => {
|
|
|
394
380
|
size: "x-small"
|
|
395
381
|
}))) : null);
|
|
396
382
|
};
|
|
397
|
-
|
|
398
383
|
const renderChatMessages = () => {
|
|
399
384
|
const messages = chatMessagesRef.current.map(message => {
|
|
400
385
|
return renderChatBox(message, message.id);
|
|
401
386
|
});
|
|
402
|
-
|
|
403
387
|
if (waitingForResponse) {
|
|
404
388
|
messages.push(renderChatBox({
|
|
405
389
|
id: msgid(),
|
|
@@ -407,10 +391,8 @@ export const AIToolsTray = _ref => {
|
|
|
407
391
|
message: formatMessage('Waiting for response')
|
|
408
392
|
}, 'ai-waiting-message'));
|
|
409
393
|
}
|
|
410
|
-
|
|
411
394
|
return messages;
|
|
412
395
|
};
|
|
413
|
-
|
|
414
396
|
return /*#__PURE__*/React.createElement(Tray, {
|
|
415
397
|
contentRef: el => setTrayRef(el),
|
|
416
398
|
label: "AIToolsTray",
|
|
@@ -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
|
// @ts-expect-error
|
|
19
20
|
import { IconCopyLine, IconRefreshLine } from '@instructure/ui-icons/es/svg';
|
|
20
21
|
const AIWandSVG = `<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
@@ -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 * from './aiicons';
|
|
19
20
|
export * from './AIToolsTray';
|
|
20
21
|
export * from './AIResponseModal';
|
|
@@ -18,14 +18,12 @@
|
|
|
18
18
|
import { ICON_MAKER_PARAM } from '../instructure_icon_maker/svg/constants';
|
|
19
19
|
export default function buildDownloadUrl(url) {
|
|
20
20
|
let downloadUrl;
|
|
21
|
-
|
|
22
21
|
try {
|
|
23
22
|
downloadUrl = new URL(url);
|
|
24
23
|
} catch (e) {
|
|
25
24
|
// eslint-disable-next-line no-throw-literal
|
|
26
25
|
throw `Error parsing ${url}. 'buildDownloadUrl' only supports absolute URLs.`;
|
|
27
26
|
}
|
|
28
|
-
|
|
29
27
|
downloadUrl.searchParams.append(ICON_MAKER_PARAM, 1);
|
|
30
28
|
return downloadUrl.toString();
|
|
31
29
|
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React, { Suspense } from 'react';
|
|
19
20
|
import { Spinner } from '@instructure/ui-spinner';
|
|
20
21
|
import formatMessage from '../../../format-message';
|
|
@@ -27,19 +28,18 @@ const thePanels = {
|
|
|
27
28
|
media: /*#__PURE__*/React.lazy(() => import('../instructure_record/MediaPanel')),
|
|
28
29
|
all: /*#__PURE__*/React.lazy(() => import('./RceFileBrowser')),
|
|
29
30
|
unknown: /*#__PURE__*/React.lazy(() => import('./UnknownFileTypePanel'))
|
|
30
|
-
};
|
|
31
|
-
// pulled from useLazy's cache
|
|
31
|
+
};
|
|
32
32
|
|
|
33
|
+
// Returns a Suspense wrapped lazy loaded component
|
|
34
|
+
// pulled from useLazy's cache
|
|
33
35
|
export function DynamicPanel(props) {
|
|
34
36
|
let key = '';
|
|
35
|
-
|
|
36
37
|
if (props.contentType === 'links') {
|
|
37
38
|
key = 'links';
|
|
38
39
|
} else {
|
|
39
40
|
key = props.contentSubtype in thePanels ? props.contentSubtype : 'unknown';
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
}
|
|
42
|
+
// @ts-expect-error
|
|
43
43
|
const Component = thePanels[key];
|
|
44
44
|
return /*#__PURE__*/React.createElement(Suspense, {
|
|
45
45
|
fallback: /*#__PURE__*/React.createElement(Spinner, {
|
|
@@ -164,14 +164,11 @@ export const FILTER_SETTINGS_BY_PLUGIN = {
|
|
|
164
164
|
};
|
|
165
165
|
export function isLoading(sprops) {
|
|
166
166
|
var _sprops$collections$a, _sprops$collections$a2, _sprops$collections$d, _sprops$collections$m, _sprops$collections$q, _sprops$collections$w, _sprops$documents$cou, _sprops$documents$use, _sprops$documents$gro, _sprops$media$course, _sprops$media$user, _sprops$media$group, _sprops$all_files;
|
|
167
|
-
|
|
168
167
|
return ((_sprops$collections$a = sprops.collections.announcements) === null || _sprops$collections$a === void 0 ? void 0 : _sprops$collections$a.isLoading) || ((_sprops$collections$a2 = sprops.collections.assignments) === null || _sprops$collections$a2 === void 0 ? void 0 : _sprops$collections$a2.isLoading) || ((_sprops$collections$d = sprops.collections.discussions) === null || _sprops$collections$d === void 0 ? void 0 : _sprops$collections$d.isLoading) || ((_sprops$collections$m = sprops.collections.modules) === null || _sprops$collections$m === void 0 ? void 0 : _sprops$collections$m.isLoading) || ((_sprops$collections$q = sprops.collections.quizzes) === null || _sprops$collections$q === void 0 ? void 0 : _sprops$collections$q.isLoading) || ((_sprops$collections$w = sprops.collections.wikiPages) === null || _sprops$collections$w === void 0 ? void 0 : _sprops$collections$w.isLoading) || ((_sprops$documents$cou = sprops.documents.course) === null || _sprops$documents$cou === void 0 ? void 0 : _sprops$documents$cou.isLoading) || ((_sprops$documents$use = sprops.documents.user) === null || _sprops$documents$use === void 0 ? void 0 : _sprops$documents$use.isLoading) || ((_sprops$documents$gro = sprops.documents.group) === null || _sprops$documents$gro === void 0 ? void 0 : _sprops$documents$gro.isLoading) || ((_sprops$media$course = sprops.media.course) === null || _sprops$media$course === void 0 ? void 0 : _sprops$media$course.isLoading) || ((_sprops$media$user = sprops.media.user) === null || _sprops$media$user === void 0 ? void 0 : _sprops$media$user.isLoading) || ((_sprops$media$group = sprops.media.group) === null || _sprops$media$group === void 0 ? void 0 : _sprops$media$group.isLoading) || ((_sprops$all_files = sprops.all_files) === null || _sprops$all_files === void 0 ? void 0 : _sprops$all_files.isLoading);
|
|
169
168
|
}
|
|
170
|
-
|
|
171
169
|
function renderLoading() {
|
|
172
170
|
return formatMessage('Loading');
|
|
173
171
|
}
|
|
174
|
-
|
|
175
172
|
export const UploadCanvasPanelIds = ['user_documents', 'course_documents', 'group_documents', 'user_images', 'course_images', 'group_images', 'user_media', 'course_media', 'group_media', 'course_links', 'group_links', 'list_icon_maker_icons', 'all'];
|
|
176
173
|
export const CanvasPanelTitles = {
|
|
177
174
|
user_documents: formatMessage('User Documents'),
|
|
@@ -15,19 +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
|
const DEFAULT_TARGET_QUALITY = 0.75;
|
|
19
20
|
export const MAX_IMAGE_SIZE_BYTES = 500 * 1024;
|
|
20
|
-
|
|
21
21
|
function blobToBase64(blob) {
|
|
22
22
|
return new Promise(resolve => {
|
|
23
23
|
const reader = new FileReader();
|
|
24
|
-
|
|
25
24
|
reader.onloadend = () => resolve(reader.result);
|
|
26
|
-
|
|
27
25
|
reader.readAsDataURL(blob);
|
|
28
26
|
});
|
|
29
27
|
}
|
|
30
|
-
|
|
31
28
|
function drawImageOnCanvasElement(_ref) {
|
|
32
29
|
let {
|
|
33
30
|
image,
|
|
@@ -42,7 +39,6 @@ function drawImageOnCanvasElement(_ref) {
|
|
|
42
39
|
height
|
|
43
40
|
} = image;
|
|
44
41
|
let compressedImageWidth, compressedImageHeight;
|
|
45
|
-
|
|
46
42
|
if (width > previewWidth || height > previewHeight) {
|
|
47
43
|
if (width > height) {
|
|
48
44
|
compressedImageWidth = previewWidth;
|
|
@@ -54,7 +50,6 @@ function drawImageOnCanvasElement(_ref) {
|
|
|
54
50
|
compressedImageWidth = compressedImageHeight = previewHeight;
|
|
55
51
|
}
|
|
56
52
|
}
|
|
57
|
-
|
|
58
53
|
const canvas = document.createElement('canvas');
|
|
59
54
|
canvas.width = compressedImageWidth;
|
|
60
55
|
canvas.height = compressedImageHeight;
|
|
@@ -62,7 +57,6 @@ function drawImageOnCanvasElement(_ref) {
|
|
|
62
57
|
ctx.drawImage(image, 0, 0, compressedImageWidth, compressedImageHeight);
|
|
63
58
|
canvas.toBlob(blob => blob ? resolve(blob) : reject(blob), 'image/jpeg', quality);
|
|
64
59
|
}
|
|
65
|
-
|
|
66
60
|
export function canCompressImage() {
|
|
67
61
|
// Some old browsers don't support toBlob
|
|
68
62
|
return Boolean(document.createElement('canvas').toBlob);
|
|
@@ -83,7 +77,6 @@ export function compressImage(_ref3) {
|
|
|
83
77
|
return new Promise((resolve, reject) => {
|
|
84
78
|
const image = new Image();
|
|
85
79
|
image.src = encodedImage;
|
|
86
|
-
|
|
87
80
|
image.onload = function () {
|
|
88
81
|
drawImageOnCanvasElement({
|
|
89
82
|
image,
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import moment from 'moment-timezone';
|
|
19
20
|
export const applyTimezoneOffsetToDate = (date, targetTimezone) => {
|
|
20
21
|
if (!targetTimezone) {
|
|
21
22
|
return moment(date).toDate();
|
|
22
23
|
}
|
|
23
|
-
|
|
24
24
|
const currentTimezoneOffset = moment(date).utcOffset();
|
|
25
25
|
const expectedTimezoneOffset = moment.tz(date, targetTimezone).utcOffset();
|
|
26
26
|
const totalOffset = expectedTimezoneOffset - currentTimezoneOffset;
|
|
@@ -15,12 +15,14 @@
|
|
|
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 getCookie from './get-cookie';
|
|
19
|
-
const csrfToken = getCookie('_csrf_token');
|
|
20
|
+
const csrfToken = getCookie('_csrf_token');
|
|
21
|
+
|
|
22
|
+
// these are duplicated in application_helper.rb#prefetch_xhr
|
|
20
23
|
// because we don't have a good pattern for sharing them yet.
|
|
21
24
|
// If you change these defaults, you should probably cascade that change
|
|
22
25
|
// to that ruby location
|
|
23
|
-
|
|
24
26
|
export const defaultFetchOptions = () => ({
|
|
25
27
|
credentials: 'same-origin',
|
|
26
28
|
headers: {
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
|
|
3
1
|
/*
|
|
4
2
|
* Copyright (C) 2019 - present Instructure, Inc.
|
|
5
3
|
*
|
|
@@ -17,10 +15,11 @@
|
|
|
17
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
18
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
19
17
|
*/
|
|
18
|
+
|
|
19
|
+
// @ts-expect-error
|
|
20
20
|
import parseLinkHeader from './parse-link-header';
|
|
21
21
|
import { defaultFetchOptions } from './defaultFetchOptions';
|
|
22
22
|
import { toQueryString } from './query-string-encoding';
|
|
23
|
-
|
|
24
23
|
function constructRelativeUrl(_ref) {
|
|
25
24
|
let {
|
|
26
25
|
path,
|
|
@@ -29,8 +28,9 @@ function constructRelativeUrl(_ref) {
|
|
|
29
28
|
const queryString = toQueryString(params);
|
|
30
29
|
if (queryString.length === 0) return path;
|
|
31
30
|
return path + '?' + queryString;
|
|
32
|
-
}
|
|
31
|
+
}
|
|
33
32
|
|
|
33
|
+
// https://fetch.spec.whatwg.org/#requestinit
|
|
34
34
|
|
|
35
35
|
// NOTE: we do NOT deep-merge customFetchOptions.headers, they should be passed
|
|
36
36
|
// in the headers arg instead.
|
|
@@ -43,14 +43,13 @@ export default async function doFetchApi(_ref2) {
|
|
|
43
43
|
body,
|
|
44
44
|
fetchOpts = {}
|
|
45
45
|
} = _ref2;
|
|
46
|
-
const finalFetchOptions = {
|
|
46
|
+
const finalFetchOptions = {
|
|
47
|
+
...defaultFetchOptions()
|
|
47
48
|
};
|
|
48
|
-
|
|
49
49
|
if (body && typeof body !== 'string') {
|
|
50
50
|
body = JSON.stringify(body);
|
|
51
51
|
finalFetchOptions.headers['Content-Type'] = 'application/json';
|
|
52
52
|
}
|
|
53
|
-
|
|
54
53
|
Object.assign(finalFetchOptions.headers, headers);
|
|
55
54
|
Object.assign(finalFetchOptions, fetchOpts);
|
|
56
55
|
const url = constructRelativeUrl({
|
|
@@ -61,18 +60,16 @@ export default async function doFetchApi(_ref2) {
|
|
|
61
60
|
body,
|
|
62
61
|
method,
|
|
63
62
|
...finalFetchOptions,
|
|
63
|
+
// eslint-disable-next-line no-undef
|
|
64
64
|
credentials: finalFetchOptions.credentials
|
|
65
65
|
});
|
|
66
|
-
|
|
67
66
|
if (!response.ok) {
|
|
68
67
|
const err = new Error(`doFetchApi received a bad response: ${response.status} ${response.statusText}`);
|
|
69
68
|
Object.assign(err, {
|
|
70
69
|
response
|
|
71
70
|
}); // in case anyone wants to check it for something
|
|
72
|
-
|
|
73
71
|
throw err;
|
|
74
72
|
}
|
|
75
|
-
|
|
76
73
|
const linkHeader = response.headers.get('Link');
|
|
77
74
|
const link = linkHeader && parseLinkHeader(linkHeader) || undefined;
|
|
78
75
|
const text = await response.text();
|
|
@@ -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 doFetchApi from './doFetchApi';
|
|
19
20
|
export * from './get-cookie';
|
|
20
21
|
export * from './parse-link-header';
|
|
@@ -15,29 +15,26 @@
|
|
|
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
|
// based on https://github.com/thlorenz/parse-link-header/blob/master/index.js (MIT)
|
|
20
|
+
|
|
19
21
|
function parseQueryParams(linkUrl) {
|
|
20
22
|
const queryParams = {};
|
|
21
23
|
const urlParts = linkUrl.split('?');
|
|
22
|
-
|
|
23
24
|
if (urlParts.length > 1) {
|
|
24
25
|
urlParts[1].split('&').forEach(param => {
|
|
25
26
|
const [key, value] = param.split('=');
|
|
26
27
|
queryParams[key] = decodeURIComponent(value);
|
|
27
28
|
});
|
|
28
29
|
}
|
|
29
|
-
|
|
30
30
|
return queryParams;
|
|
31
31
|
}
|
|
32
|
-
|
|
33
32
|
function parseLink(link) {
|
|
34
33
|
try {
|
|
35
34
|
const linkMatch = link.match(/<([^>]*)>\s*(.*)/);
|
|
36
|
-
|
|
37
35
|
if (!linkMatch) {
|
|
38
36
|
return null;
|
|
39
37
|
}
|
|
40
|
-
|
|
41
38
|
const [, linkUrl, partsString] = linkMatch;
|
|
42
39
|
const parts = partsString.split(';').map(part => part.trim());
|
|
43
40
|
const info = {
|
|
@@ -45,46 +42,40 @@ function parseLink(link) {
|
|
|
45
42
|
};
|
|
46
43
|
parts.forEach(part => {
|
|
47
44
|
const partMatch = part.match(/(.+)\s*=\s*"?([^"]+)"?/);
|
|
48
|
-
|
|
49
45
|
if (partMatch) {
|
|
50
46
|
const [, key, value] = partMatch;
|
|
51
47
|
info[key.trim()] = value.trim();
|
|
52
48
|
}
|
|
53
49
|
});
|
|
54
|
-
return {
|
|
50
|
+
return {
|
|
51
|
+
...parseQueryParams(linkUrl),
|
|
55
52
|
...info
|
|
56
53
|
};
|
|
57
54
|
} catch (e) {
|
|
58
55
|
return null;
|
|
59
56
|
}
|
|
60
57
|
}
|
|
61
|
-
|
|
62
58
|
function hasRel(x) {
|
|
63
59
|
return x !== null && 'rel' in x;
|
|
64
60
|
}
|
|
65
|
-
|
|
66
61
|
function intoRels(acc, x) {
|
|
67
62
|
x.rel.split(/\s+/).forEach(rel => {
|
|
68
|
-
const {
|
|
63
|
+
const {
|
|
64
|
+
...rest
|
|
69
65
|
} = x;
|
|
70
|
-
|
|
71
66
|
switch (rel) {
|
|
72
67
|
case 'first':
|
|
73
68
|
acc.first = rest;
|
|
74
69
|
break;
|
|
75
|
-
|
|
76
70
|
case 'prev':
|
|
77
71
|
acc.prev = rest;
|
|
78
72
|
break;
|
|
79
|
-
|
|
80
73
|
case 'current':
|
|
81
74
|
acc.current = rest;
|
|
82
75
|
break;
|
|
83
|
-
|
|
84
76
|
case 'next':
|
|
85
77
|
acc.next = rest;
|
|
86
78
|
break;
|
|
87
|
-
|
|
88
79
|
case 'last':
|
|
89
80
|
acc.last = rest;
|
|
90
81
|
break;
|
|
@@ -92,13 +83,10 @@ function intoRels(acc, x) {
|
|
|
92
83
|
});
|
|
93
84
|
return acc;
|
|
94
85
|
}
|
|
95
|
-
|
|
96
86
|
const PARSE_LINK_HEADER_MAXLEN = 2000;
|
|
97
87
|
const PARSE_LINK_HEADER_THROW_ON_MAXLEN_EXCEEDED = process.env.PARSE_LINK_HEADER_THROW_ON_MAXLEN_EXCEEDED != null;
|
|
98
|
-
|
|
99
88
|
function checkHeader(linkHeader) {
|
|
100
89
|
if (!linkHeader) return false;
|
|
101
|
-
|
|
102
90
|
if (linkHeader.length > PARSE_LINK_HEADER_MAXLEN) {
|
|
103
91
|
if (PARSE_LINK_HEADER_THROW_ON_MAXLEN_EXCEEDED) {
|
|
104
92
|
throw new Error(`Input string too long, it should be under ${PARSE_LINK_HEADER_MAXLEN} characters.`);
|
|
@@ -106,10 +94,8 @@ function checkHeader(linkHeader) {
|
|
|
106
94
|
return false;
|
|
107
95
|
}
|
|
108
96
|
}
|
|
109
|
-
|
|
110
97
|
return true;
|
|
111
98
|
}
|
|
112
|
-
|
|
113
99
|
export default function parseLinkHeader(linkHeader) {
|
|
114
100
|
if (!checkHeader(linkHeader)) return null;
|
|
115
101
|
return linkHeader.split(/,\s*(?=<)/).map(parseLink).filter(hasRel).reduce(intoRels, {});
|