@atlaskit/editor-plugin-media 0.2.0 → 0.3.1
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 +17 -0
- package/dist/cjs/commands/captions.js +59 -0
- package/dist/cjs/commands/helpers.js +127 -0
- package/dist/cjs/commands/index.js +24 -0
- package/dist/cjs/commands/linking.js +181 -0
- package/dist/cjs/index.js +8 -1
- package/dist/cjs/media-plugin-options.js +5 -0
- package/dist/cjs/next-plugin-type.js +5 -0
- package/dist/cjs/nodeviews/mediaGroup.js +376 -0
- package/dist/cjs/nodeviews/mediaInline.js +288 -0
- package/dist/cjs/nodeviews/mediaNodeUpdater.js +739 -0
- package/dist/cjs/nodeviews/mediaNodeView/index.js +177 -0
- package/dist/cjs/nodeviews/mediaNodeView/media.js +242 -0
- package/dist/cjs/nodeviews/mediaSingle.js +629 -0
- package/dist/cjs/nodeviews/messages.js +14 -0
- package/dist/cjs/nodeviews/styles.js +46 -0
- package/dist/cjs/nodeviews/types.js +5 -0
- package/dist/cjs/picker-facade.js +192 -0
- package/dist/cjs/plugin.js +293 -0
- package/dist/cjs/pm-plugins/alt-text/actions.js +5 -0
- package/dist/cjs/pm-plugins/alt-text/commands.js +59 -0
- package/dist/cjs/pm-plugins/alt-text/index.js +36 -0
- package/dist/cjs/pm-plugins/alt-text/keymap.js +15 -0
- package/dist/cjs/pm-plugins/alt-text/messages.js +44 -0
- package/dist/cjs/pm-plugins/alt-text/reducer.js +32 -0
- package/dist/cjs/pm-plugins/alt-text/types.js +5 -0
- package/dist/cjs/pm-plugins/alt-text/ui/AltTextEdit.js +209 -0
- package/dist/cjs/pm-plugins/keymap-media-single.js +163 -0
- package/dist/cjs/pm-plugins/keymap.js +88 -0
- package/dist/cjs/pm-plugins/linking/actions.js +13 -0
- package/dist/cjs/pm-plugins/linking/index.js +65 -0
- package/dist/cjs/pm-plugins/linking/keymap.js +14 -0
- package/dist/cjs/pm-plugins/linking/reducer.js +43 -0
- package/dist/cjs/pm-plugins/linking/types.js +5 -0
- package/dist/cjs/pm-plugins/main.js +813 -0
- package/dist/cjs/pm-plugins/media-editor-plugin-factory.js +8 -0
- package/dist/cjs/pm-plugins/mediaTaskManager.js +101 -0
- package/dist/cjs/pm-plugins/plugin-key.js +8 -0
- package/dist/cjs/pm-plugins/types.js +5 -0
- package/dist/cjs/toolbar/alt-text.js +80 -0
- package/dist/cjs/toolbar/commands.js +236 -0
- package/dist/cjs/toolbar/filePreviewItem.js +66 -0
- package/dist/cjs/toolbar/imageBorder.js +20 -0
- package/dist/cjs/toolbar/index.js +523 -0
- package/dist/cjs/toolbar/linking-toolbar-appearance.js +100 -0
- package/dist/cjs/toolbar/linking.js +96 -0
- package/dist/cjs/toolbar/utils.js +110 -0
- package/dist/cjs/ui/CaptionPlaceholder/index.js +27 -0
- package/dist/cjs/ui/CaptionPlaceholder/messages.js +14 -0
- package/dist/cjs/ui/ImageBorder/index.js +226 -0
- package/dist/cjs/ui/ImageBorder/messages.js +49 -0
- package/dist/cjs/ui/ImageBorder/styles.js +52 -0
- package/dist/cjs/ui/Media/DropPlaceholder.js +38 -0
- package/dist/cjs/ui/Media/drop-placeholder-messages.js +14 -0
- package/dist/cjs/ui/MediaLinkingToolbar.js +196 -0
- package/dist/cjs/ui/MediaPicker/BrowserWrapper.js +40 -0
- package/dist/cjs/ui/MediaPicker/ClipboardWrapper.js +39 -0
- package/dist/cjs/ui/MediaPicker/DropzoneWrapper.js +51 -0
- package/dist/cjs/ui/MediaPicker/PickerFacadeProvider.js +151 -0
- package/dist/cjs/ui/MediaPicker/index.js +103 -0
- package/dist/cjs/ui/PixelEntry/constants.js +7 -0
- package/dist/cjs/ui/PixelEntry/index.js +185 -0
- package/dist/cjs/ui/PixelEntry/messages.js +54 -0
- package/dist/cjs/ui/PixelEntry/styles.js +19 -0
- package/dist/cjs/ui/PixelEntry/types.js +5 -0
- package/dist/cjs/ui/ResizableMediaSingle/ResizableMediaMigrationNotification.js +16 -0
- package/dist/cjs/ui/ResizableMediaSingle/ResizableMediaSingleNext.js +541 -0
- package/dist/cjs/ui/ResizableMediaSingle/index.js +422 -0
- package/dist/cjs/ui/ResizableMediaSingle/styled.js +14 -0
- package/dist/cjs/ui/ResizableMediaSingle/styles.js +17 -0
- package/dist/cjs/ui/ResizableMediaSingle/types.js +5 -0
- package/dist/cjs/ui/ToolbarMedia/index.js +42 -0
- package/dist/cjs/ui/ToolbarMedia/toolbar-media-messages.js +14 -0
- package/dist/cjs/ui/media-linking-toolbar-messages.js +14 -0
- package/dist/cjs/utils/analytics.js +53 -0
- package/dist/cjs/utils/check-media-type.js +56 -0
- package/dist/cjs/utils/current-media-node.js +41 -0
- package/dist/cjs/utils/is-image.js +9 -0
- package/dist/cjs/utils/media-common.js +181 -0
- package/dist/cjs/utils/media-files.js +297 -0
- package/dist/cjs/utils/media-single.js +181 -0
- package/dist/es2019/commands/captions.js +47 -0
- package/dist/es2019/commands/helpers.js +113 -0
- package/dist/es2019/commands/index.js +1 -0
- package/dist/es2019/commands/linking.js +169 -0
- package/dist/es2019/index.js +1 -1
- package/dist/es2019/media-plugin-options.js +1 -0
- package/dist/es2019/next-plugin-type.js +1 -0
- package/dist/es2019/nodeviews/mediaGroup.js +314 -0
- package/dist/es2019/nodeviews/mediaInline.js +201 -0
- package/dist/es2019/nodeviews/mediaNodeUpdater.js +384 -0
- package/dist/es2019/nodeviews/mediaNodeView/index.js +149 -0
- package/dist/es2019/nodeviews/mediaNodeView/media.js +182 -0
- package/dist/es2019/nodeviews/mediaSingle.js +511 -0
- package/dist/es2019/nodeviews/messages.js +8 -0
- package/dist/es2019/nodeviews/styles.js +46 -0
- package/dist/es2019/nodeviews/types.js +1 -0
- package/dist/es2019/picker-facade.js +146 -0
- package/dist/es2019/plugin.js +284 -0
- package/dist/es2019/pm-plugins/alt-text/actions.js +1 -0
- package/dist/es2019/pm-plugins/alt-text/commands.js +42 -0
- package/dist/es2019/pm-plugins/alt-text/index.js +33 -0
- package/dist/es2019/pm-plugins/alt-text/keymap.js +9 -0
- package/dist/es2019/pm-plugins/alt-text/messages.js +38 -0
- package/dist/es2019/pm-plugins/alt-text/reducer.js +26 -0
- package/dist/es2019/pm-plugins/alt-text/types.js +1 -0
- package/dist/es2019/pm-plugins/alt-text/ui/AltTextEdit.js +228 -0
- package/dist/es2019/pm-plugins/keymap-media-single.js +172 -0
- package/dist/es2019/pm-plugins/keymap.js +84 -0
- package/dist/es2019/pm-plugins/linking/actions.js +7 -0
- package/dist/es2019/pm-plugins/linking/index.js +56 -0
- package/dist/es2019/pm-plugins/linking/keymap.js +8 -0
- package/dist/es2019/pm-plugins/linking/reducer.js +37 -0
- package/dist/es2019/pm-plugins/linking/types.js +1 -0
- package/dist/es2019/pm-plugins/main.js +695 -0
- package/dist/es2019/pm-plugins/media-editor-plugin-factory.js +2 -0
- package/dist/es2019/pm-plugins/mediaTaskManager.js +64 -0
- package/dist/es2019/pm-plugins/plugin-key.js +2 -0
- package/dist/es2019/pm-plugins/types.js +1 -0
- package/dist/es2019/toolbar/alt-text.js +72 -0
- package/dist/es2019/toolbar/commands.js +212 -0
- package/dist/es2019/toolbar/filePreviewItem.js +54 -0
- package/dist/es2019/toolbar/imageBorder.js +15 -0
- package/dist/es2019/toolbar/index.js +538 -0
- package/dist/es2019/toolbar/linking-toolbar-appearance.js +90 -0
- package/dist/es2019/toolbar/linking.js +98 -0
- package/dist/es2019/toolbar/utils.js +86 -0
- package/dist/es2019/ui/CaptionPlaceholder/index.js +25 -0
- package/dist/es2019/ui/CaptionPlaceholder/messages.js +8 -0
- package/dist/es2019/ui/ImageBorder/index.js +213 -0
- package/dist/es2019/ui/ImageBorder/messages.js +43 -0
- package/dist/es2019/ui/ImageBorder/styles.js +126 -0
- package/dist/es2019/ui/Media/DropPlaceholder.js +47 -0
- package/dist/es2019/ui/Media/drop-placeholder-messages.js +8 -0
- package/dist/es2019/ui/MediaLinkingToolbar.js +190 -0
- package/dist/es2019/ui/MediaPicker/BrowserWrapper.js +31 -0
- package/dist/es2019/ui/MediaPicker/ClipboardWrapper.js +32 -0
- package/dist/es2019/ui/MediaPicker/DropzoneWrapper.js +42 -0
- package/dist/es2019/ui/MediaPicker/PickerFacadeProvider.js +85 -0
- package/dist/es2019/ui/MediaPicker/index.js +82 -0
- package/dist/es2019/ui/PixelEntry/constants.js +1 -0
- package/dist/es2019/ui/PixelEntry/index.js +170 -0
- package/dist/es2019/ui/PixelEntry/messages.js +48 -0
- package/dist/es2019/ui/PixelEntry/styles.js +51 -0
- package/dist/es2019/ui/PixelEntry/types.js +1 -0
- package/dist/es2019/ui/ResizableMediaSingle/ResizableMediaMigrationNotification.js +9 -0
- package/dist/es2019/ui/ResizableMediaSingle/ResizableMediaSingleNext.js +454 -0
- package/dist/es2019/ui/ResizableMediaSingle/index.js +344 -0
- package/dist/es2019/ui/ResizableMediaSingle/styled.js +9 -0
- package/dist/es2019/ui/ResizableMediaSingle/styles.js +14 -0
- package/dist/es2019/ui/ResizableMediaSingle/types.js +1 -0
- package/dist/es2019/ui/ToolbarMedia/index.js +37 -0
- package/dist/es2019/ui/ToolbarMedia/toolbar-media-messages.js +8 -0
- package/dist/es2019/ui/media-linking-toolbar-messages.js +8 -0
- package/dist/es2019/utils/analytics.js +51 -0
- package/dist/es2019/utils/check-media-type.js +19 -0
- package/dist/es2019/utils/current-media-node.js +35 -0
- package/dist/es2019/utils/is-image.js +3 -0
- package/dist/es2019/utils/media-common.js +189 -0
- package/dist/es2019/utils/media-files.js +321 -0
- package/dist/es2019/utils/media-single.js +176 -0
- package/dist/esm/commands/captions.js +53 -0
- package/dist/esm/commands/helpers.js +120 -0
- package/dist/esm/commands/index.js +1 -0
- package/dist/esm/commands/linking.js +174 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/media-plugin-options.js +1 -0
- package/dist/esm/next-plugin-type.js +1 -0
- package/dist/esm/nodeviews/mediaGroup.js +369 -0
- package/dist/esm/nodeviews/mediaInline.js +278 -0
- package/dist/esm/nodeviews/mediaNodeUpdater.js +732 -0
- package/dist/esm/nodeviews/mediaNodeView/index.js +170 -0
- package/dist/esm/nodeviews/mediaNodeView/media.js +233 -0
- package/dist/esm/nodeviews/mediaSingle.js +622 -0
- package/dist/esm/nodeviews/messages.js +8 -0
- package/dist/esm/nodeviews/styles.js +39 -0
- package/dist/esm/nodeviews/types.js +1 -0
- package/dist/esm/picker-facade.js +186 -0
- package/dist/esm/plugin.js +282 -0
- package/dist/esm/pm-plugins/alt-text/actions.js +1 -0
- package/dist/esm/pm-plugins/alt-text/commands.js +52 -0
- package/dist/esm/pm-plugins/alt-text/index.js +31 -0
- package/dist/esm/pm-plugins/alt-text/keymap.js +9 -0
- package/dist/esm/pm-plugins/alt-text/messages.js +38 -0
- package/dist/esm/pm-plugins/alt-text/reducer.js +25 -0
- package/dist/esm/pm-plugins/alt-text/types.js +1 -0
- package/dist/esm/pm-plugins/alt-text/ui/AltTextEdit.js +206 -0
- package/dist/esm/pm-plugins/keymap-media-single.js +158 -0
- package/dist/esm/pm-plugins/keymap.js +81 -0
- package/dist/esm/pm-plugins/linking/actions.js +7 -0
- package/dist/esm/pm-plugins/linking/index.js +59 -0
- package/dist/esm/pm-plugins/linking/keymap.js +8 -0
- package/dist/esm/pm-plugins/linking/reducer.js +36 -0
- package/dist/esm/pm-plugins/linking/types.js +1 -0
- package/dist/esm/pm-plugins/main.js +798 -0
- package/dist/esm/pm-plugins/media-editor-plugin-factory.js +2 -0
- package/dist/esm/pm-plugins/mediaTaskManager.js +94 -0
- package/dist/esm/pm-plugins/plugin-key.js +2 -0
- package/dist/esm/pm-plugins/types.js +1 -0
- package/dist/esm/toolbar/alt-text.js +70 -0
- package/dist/esm/toolbar/commands.js +229 -0
- package/dist/esm/toolbar/filePreviewItem.js +56 -0
- package/dist/esm/toolbar/imageBorder.js +14 -0
- package/dist/esm/toolbar/index.js +513 -0
- package/dist/esm/toolbar/linking-toolbar-appearance.js +91 -0
- package/dist/esm/toolbar/linking.js +88 -0
- package/dist/esm/toolbar/utils.js +103 -0
- package/dist/esm/ui/CaptionPlaceholder/index.js +20 -0
- package/dist/esm/ui/CaptionPlaceholder/messages.js +8 -0
- package/dist/esm/ui/ImageBorder/index.js +218 -0
- package/dist/esm/ui/ImageBorder/messages.js +43 -0
- package/dist/esm/ui/ImageBorder/styles.js +42 -0
- package/dist/esm/ui/Media/DropPlaceholder.js +31 -0
- package/dist/esm/ui/Media/drop-placeholder-messages.js +8 -0
- package/dist/esm/ui/MediaLinkingToolbar.js +188 -0
- package/dist/esm/ui/MediaPicker/BrowserWrapper.js +33 -0
- package/dist/esm/ui/MediaPicker/ClipboardWrapper.js +32 -0
- package/dist/esm/ui/MediaPicker/DropzoneWrapper.js +44 -0
- package/dist/esm/ui/MediaPicker/PickerFacadeProvider.js +145 -0
- package/dist/esm/ui/MediaPicker/index.js +96 -0
- package/dist/esm/ui/PixelEntry/constants.js +1 -0
- package/dist/esm/ui/PixelEntry/index.js +174 -0
- package/dist/esm/ui/PixelEntry/messages.js +48 -0
- package/dist/esm/ui/PixelEntry/styles.js +12 -0
- package/dist/esm/ui/PixelEntry/types.js +1 -0
- package/dist/esm/ui/ResizableMediaSingle/ResizableMediaMigrationNotification.js +9 -0
- package/dist/esm/ui/ResizableMediaSingle/ResizableMediaSingleNext.js +535 -0
- package/dist/esm/ui/ResizableMediaSingle/index.js +417 -0
- package/dist/esm/ui/ResizableMediaSingle/styled.js +7 -0
- package/dist/esm/ui/ResizableMediaSingle/styles.js +7 -0
- package/dist/esm/ui/ResizableMediaSingle/types.js +1 -0
- package/dist/esm/ui/ToolbarMedia/index.js +35 -0
- package/dist/esm/ui/ToolbarMedia/toolbar-media-messages.js +8 -0
- package/dist/esm/ui/media-linking-toolbar-messages.js +8 -0
- package/dist/esm/utils/analytics.js +47 -0
- package/dist/esm/utils/check-media-type.js +49 -0
- package/dist/esm/utils/current-media-node.js +35 -0
- package/dist/esm/utils/is-image.js +3 -0
- package/dist/esm/utils/media-common.js +175 -0
- package/dist/esm/utils/media-files.js +291 -0
- package/dist/esm/utils/media-single.js +172 -0
- package/dist/types/commands/captions.d.ts +5 -0
- package/dist/types/commands/helpers.d.ts +15 -0
- package/dist/types/commands/index.d.ts +1 -0
- package/dist/types/commands/linking.d.ts +9 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/media-plugin-options.d.ts +17 -0
- package/dist/types/next-plugin-type.d.ts +33 -0
- package/dist/types/nodeviews/__mocks__/mediaNodeUpdater.d.ts +24 -0
- package/dist/types/nodeviews/mediaGroup.d.ts +33 -0
- package/dist/types/nodeviews/mediaInline.d.ts +50 -0
- package/dist/types/nodeviews/mediaNodeUpdater.d.ts +45 -0
- package/dist/types/nodeviews/mediaNodeView/index.d.ts +28 -0
- package/dist/types/nodeviews/mediaNodeView/media.d.ts +44 -0
- package/dist/types/nodeviews/mediaSingle.d.ts +62 -0
- package/dist/types/nodeviews/messages.d.ts +7 -0
- package/dist/types/nodeviews/styles.d.ts +16 -0
- package/dist/types/nodeviews/types.d.ts +42 -0
- package/dist/types/picker-facade.d.ts +44 -0
- package/dist/types/plugin.d.ts +7 -0
- package/dist/types/pm-plugins/alt-text/actions.d.ts +10 -0
- package/dist/types/pm-plugins/alt-text/commands.d.ts +4 -0
- package/dist/types/pm-plugins/alt-text/index.d.ts +7 -0
- package/dist/types/pm-plugins/alt-text/keymap.d.ts +4 -0
- package/dist/types/pm-plugins/alt-text/messages.d.ts +37 -0
- package/dist/types/pm-plugins/alt-text/reducer.d.ts +4 -0
- package/dist/types/pm-plugins/alt-text/types.d.ts +3 -0
- package/dist/types/pm-plugins/alt-text/ui/AltTextEdit.d.ts +41 -0
- package/dist/types/pm-plugins/keymap-media-single.d.ts +3 -0
- package/dist/types/pm-plugins/keymap.d.ts +6 -0
- package/dist/types/pm-plugins/linking/actions.d.ts +20 -0
- package/dist/types/pm-plugins/linking/index.d.ts +10 -0
- package/dist/types/pm-plugins/linking/keymap.d.ts +3 -0
- package/dist/types/pm-plugins/linking/reducer.d.ts +4 -0
- package/dist/types/pm-plugins/linking/types.d.ts +12 -0
- package/dist/types/pm-plugins/main.d.ts +120 -0
- package/dist/types/pm-plugins/media-editor-plugin-factory.d.ts +3 -0
- package/dist/types/pm-plugins/mediaTaskManager.d.ts +9 -0
- package/dist/types/pm-plugins/plugin-key.d.ts +3 -0
- package/dist/types/pm-plugins/types.d.ts +65 -0
- package/dist/types/toolbar/alt-text.d.ts +13 -0
- package/dist/types/toolbar/commands.d.ts +12 -0
- package/dist/types/toolbar/filePreviewItem.d.ts +9 -0
- package/dist/types/toolbar/imageBorder.d.ts +2 -0
- package/dist/types/toolbar/index.d.ts +6 -0
- package/dist/types/toolbar/linking-toolbar-appearance.d.ts +14 -0
- package/dist/types/toolbar/linking.d.ts +10 -0
- package/dist/types/toolbar/utils.d.ts +11 -0
- package/dist/types/types.d.ts +2 -1
- package/dist/types/ui/CaptionPlaceholder/index.d.ts +6 -0
- package/dist/types/ui/CaptionPlaceholder/messages.d.ts +7 -0
- package/dist/types/ui/ImageBorder/index.d.ts +11 -0
- package/dist/types/ui/ImageBorder/messages.d.ts +42 -0
- package/dist/types/ui/ImageBorder/styles.d.ts +15 -0
- package/dist/types/ui/Media/DropPlaceholder.d.ts +8 -0
- package/dist/types/ui/Media/drop-placeholder-messages.d.ts +7 -0
- package/dist/types/ui/MediaLinkingToolbar.d.ts +35 -0
- package/dist/types/ui/MediaPicker/BrowserWrapper.d.ts +11 -0
- package/dist/types/ui/MediaPicker/ClipboardWrapper.d.ts +10 -0
- package/dist/types/ui/MediaPicker/DropzoneWrapper.d.ts +13 -0
- package/dist/types/ui/MediaPicker/PickerFacadeProvider.d.ts +28 -0
- package/dist/types/ui/MediaPicker/index.d.ts +23 -0
- package/dist/types/ui/PixelEntry/constants.d.ts +1 -0
- package/dist/types/ui/PixelEntry/index.d.ts +8 -0
- package/dist/types/ui/PixelEntry/messages.d.ts +47 -0
- package/dist/types/ui/PixelEntry/styles.d.ts +8 -0
- package/dist/types/ui/PixelEntry/types.d.ts +58 -0
- package/dist/types/ui/ResizableMediaSingle/ResizableMediaMigrationNotification.d.ts +3 -0
- package/dist/types/ui/ResizableMediaSingle/ResizableMediaSingleNext.d.ts +59 -0
- package/dist/types/ui/ResizableMediaSingle/index.d.ts +45 -0
- package/dist/types/ui/ResizableMediaSingle/styled.d.ts +2 -0
- package/dist/types/ui/ResizableMediaSingle/styles.d.ts +1 -0
- package/dist/types/ui/ResizableMediaSingle/types.d.ts +27 -0
- package/dist/types/ui/ToolbarMedia/index.d.ts +13 -0
- package/dist/types/ui/ToolbarMedia/toolbar-media-messages.d.ts +7 -0
- package/dist/types/ui/media-linking-toolbar-messages.d.ts +7 -0
- package/dist/types/utils/analytics.d.ts +3 -0
- package/dist/types/utils/check-media-type.d.ts +4 -0
- package/dist/types/utils/current-media-node.d.ts +9 -0
- package/dist/types/utils/is-image.d.ts +1 -0
- package/dist/types/utils/media-common.d.ts +20 -0
- package/dist/types/utils/media-files.d.ts +30 -0
- package/dist/types/utils/media-single.d.ts +20 -0
- package/package.json +32 -20
- package/report.api.md +430 -0
- package/dist/types-ts4.5/index.d.ts +0 -1
- package/dist/types-ts4.5/types.d.ts +0 -118
- package/tmp/api-report-tmp.d.ts +0 -9
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { atTheBeginningOfBlock, atTheBeginningOfDoc, atTheEndOfBlock, endPositionOfParent, GapCursorSelection, startPositionOfParent } from '@atlaskit/editor-common/selection';
|
|
2
|
+
import { createNewParagraphBelow, createParagraphNear } from '@atlaskit/editor-common/utils';
|
|
3
|
+
import { deleteSelection, splitBlock } from '@atlaskit/editor-prosemirror/commands';
|
|
4
|
+
import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
|
|
5
|
+
import { findPositionOfNodeBefore } from '@atlaskit/editor-prosemirror/utils';
|
|
6
|
+
import { isMediaBlobUrl } from '@atlaskit/media-client';
|
|
7
|
+
var isTemporary = function isTemporary(id) {
|
|
8
|
+
return id.indexOf('temporary:') === 0;
|
|
9
|
+
};
|
|
10
|
+
export var isMediaBlobUrlFromAttrs = function isMediaBlobUrlFromAttrs(attrs) {
|
|
11
|
+
return !!(attrs && attrs.type === 'external' && isMediaBlobUrl(attrs.url));
|
|
12
|
+
};
|
|
13
|
+
export var posOfMediaGroupNearby = function posOfMediaGroupNearby(state) {
|
|
14
|
+
return posOfParentMediaGroup(state) || posOfFollowingMediaGroup(state) || posOfPrecedingMediaGroup(state) || posOfMediaGroupNextToGapCursor(state);
|
|
15
|
+
};
|
|
16
|
+
export var isSelectionNonMediaBlockNode = function isSelectionNonMediaBlockNode(state) {
|
|
17
|
+
var _ref = state.selection,
|
|
18
|
+
node = _ref.node;
|
|
19
|
+
return node && node.type !== state.schema.nodes.media && node.isBlock;
|
|
20
|
+
};
|
|
21
|
+
export var isSelectionMediaSingleNode = function isSelectionMediaSingleNode(state) {
|
|
22
|
+
var _ref2 = state.selection,
|
|
23
|
+
node = _ref2.node;
|
|
24
|
+
return node && node.type === state.schema.nodes.mediaSingle;
|
|
25
|
+
};
|
|
26
|
+
export var posOfPrecedingMediaGroup = function posOfPrecedingMediaGroup(state) {
|
|
27
|
+
if (!atTheBeginningOfBlock(state)) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
return posOfMediaGroupAbove(state, state.selection.$from);
|
|
31
|
+
};
|
|
32
|
+
var posOfMediaGroupNextToGapCursor = function posOfMediaGroupNextToGapCursor(state) {
|
|
33
|
+
var selection = state.selection;
|
|
34
|
+
if (selection instanceof GapCursorSelection) {
|
|
35
|
+
var $pos = state.selection.$from;
|
|
36
|
+
var mediaGroupType = state.schema.nodes.mediaGroup;
|
|
37
|
+
return posOfImmediatePrecedingMediaGroup($pos, mediaGroupType) || posOfImmediateFollowingMediaGroup($pos, mediaGroupType);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
var posOfImmediatePrecedingMediaGroup = function posOfImmediatePrecedingMediaGroup($pos, mediaGroupType) {
|
|
41
|
+
if ($pos.nodeBefore && $pos.nodeBefore.type === mediaGroupType) {
|
|
42
|
+
return $pos.pos - $pos.nodeBefore.nodeSize + 1;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
var posOfImmediateFollowingMediaGroup = function posOfImmediateFollowingMediaGroup($pos, mediaGroupType) {
|
|
46
|
+
if ($pos.nodeAfter && $pos.nodeAfter.type === mediaGroupType) {
|
|
47
|
+
return $pos.pos + 1;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
var posOfFollowingMediaGroup = function posOfFollowingMediaGroup(state) {
|
|
51
|
+
if (!atTheEndOfBlock(state)) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
return posOfMediaGroupBelow(state, state.selection.$to);
|
|
55
|
+
};
|
|
56
|
+
var posOfMediaGroupAbove = function posOfMediaGroupAbove(state, $pos) {
|
|
57
|
+
var adjacentPos;
|
|
58
|
+
var adjacentNode;
|
|
59
|
+
if (isSelectionNonMediaBlockNode(state)) {
|
|
60
|
+
adjacentPos = $pos.pos;
|
|
61
|
+
adjacentNode = $pos.nodeBefore;
|
|
62
|
+
} else {
|
|
63
|
+
adjacentPos = startPositionOfParent($pos) - 1;
|
|
64
|
+
adjacentNode = state.doc.resolve(adjacentPos).nodeBefore;
|
|
65
|
+
}
|
|
66
|
+
if (adjacentNode && adjacentNode.type === state.schema.nodes.mediaGroup) {
|
|
67
|
+
return adjacentPos - adjacentNode.nodeSize + 1;
|
|
68
|
+
}
|
|
69
|
+
return;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Determine whether the cursor is inside empty paragraph
|
|
74
|
+
* or the selection is the entire paragraph
|
|
75
|
+
*/
|
|
76
|
+
export var isInsidePotentialEmptyParagraph = function isInsidePotentialEmptyParagraph(state) {
|
|
77
|
+
var $from = state.selection.$from;
|
|
78
|
+
return $from.parent.type === state.schema.nodes.paragraph && atTheBeginningOfBlock(state) && atTheEndOfBlock(state);
|
|
79
|
+
};
|
|
80
|
+
var posOfMediaGroupBelow = function posOfMediaGroupBelow(state, $pos) {
|
|
81
|
+
var prepend = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
82
|
+
var adjacentPos;
|
|
83
|
+
var adjacentNode;
|
|
84
|
+
if (isSelectionNonMediaBlockNode(state)) {
|
|
85
|
+
adjacentPos = $pos.pos;
|
|
86
|
+
adjacentNode = $pos.nodeAfter;
|
|
87
|
+
} else {
|
|
88
|
+
adjacentPos = endPositionOfParent($pos);
|
|
89
|
+
adjacentNode = state.doc.nodeAt(adjacentPos);
|
|
90
|
+
}
|
|
91
|
+
if (adjacentNode && adjacentNode.type === state.schema.nodes.mediaGroup) {
|
|
92
|
+
return prepend ? adjacentPos + 1 : adjacentPos + adjacentNode.nodeSize - 1;
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
};
|
|
96
|
+
export var posOfParentMediaGroup = function posOfParentMediaGroup(state, $pos) {
|
|
97
|
+
var prepend = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
98
|
+
var $from = state.selection.$from;
|
|
99
|
+
$pos = $pos || $from;
|
|
100
|
+
if ($pos.parent.type === state.schema.nodes.mediaGroup) {
|
|
101
|
+
return prepend ? startPositionOfParent($pos) : endPositionOfParent($pos) - 1;
|
|
102
|
+
}
|
|
103
|
+
return;
|
|
104
|
+
};
|
|
105
|
+
export var removeMediaNode = function removeMediaNode(view, node, getPos) {
|
|
106
|
+
var id = node.attrs.id;
|
|
107
|
+
var state = view.state;
|
|
108
|
+
var tr = state.tr,
|
|
109
|
+
selection = state.selection,
|
|
110
|
+
doc = state.doc;
|
|
111
|
+
var currentMediaNodePos = getPos();
|
|
112
|
+
if (typeof currentMediaNodePos !== 'number') {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
tr.deleteRange(currentMediaNodePos, currentMediaNodePos + node.nodeSize);
|
|
116
|
+
if (isTemporary(id)) {
|
|
117
|
+
tr.setMeta('addToHistory', false);
|
|
118
|
+
}
|
|
119
|
+
var $currentMediaNodePos = doc.resolve(currentMediaNodePos);
|
|
120
|
+
var nodeBefore = $currentMediaNodePos.nodeBefore,
|
|
121
|
+
parent = $currentMediaNodePos.parent;
|
|
122
|
+
var isLastMediaNode = $currentMediaNodePos.index() === parent.childCount - 1;
|
|
123
|
+
|
|
124
|
+
// If deleting a selected media node, we need to tell where the cursor to go next.
|
|
125
|
+
// Prosemirror didn't gave us the behaviour of moving left if the media node is not the last one.
|
|
126
|
+
// So we handle it ourselves.
|
|
127
|
+
if (selection.from === currentMediaNodePos && !isLastMediaNode && !atTheBeginningOfDoc(state) && nodeBefore && nodeBefore.type.name === 'media') {
|
|
128
|
+
var _nodeBefore = findPositionOfNodeBefore(tr.selection);
|
|
129
|
+
if (_nodeBefore) {
|
|
130
|
+
tr.setSelection(NodeSelection.create(tr.doc, _nodeBefore));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
view.dispatch(tr);
|
|
134
|
+
};
|
|
135
|
+
export var splitMediaGroup = function splitMediaGroup(view) {
|
|
136
|
+
var selection = view.state.selection;
|
|
137
|
+
|
|
138
|
+
// if selection is not a media node, do nothing.
|
|
139
|
+
if (!(selection instanceof NodeSelection) || selection.node.type !== view.state.schema.nodes.media) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
deleteSelection(view.state, view.dispatch);
|
|
143
|
+
if (selection.$to.nodeAfter) {
|
|
144
|
+
splitBlock(view.state, view.dispatch);
|
|
145
|
+
createParagraphNear(false)(view.state, view.dispatch);
|
|
146
|
+
} else {
|
|
147
|
+
createNewParagraphBelow(view.state, view.dispatch);
|
|
148
|
+
}
|
|
149
|
+
return true;
|
|
150
|
+
};
|
|
151
|
+
var isOptionalAttr = function isOptionalAttr(attr) {
|
|
152
|
+
return attr.length > 1 && attr[0] === '_' && attr[1] === '_';
|
|
153
|
+
};
|
|
154
|
+
export var copyOptionalAttrsFromMediaState = function copyOptionalAttrsFromMediaState(mediaState, node) {
|
|
155
|
+
Object.keys(node.attrs).filter(isOptionalAttr).forEach(function (key) {
|
|
156
|
+
var mediaStateKey = key.substring(2);
|
|
157
|
+
var attrValue = mediaState[mediaStateKey];
|
|
158
|
+
if (attrValue !== undefined) {
|
|
159
|
+
// @ts-ignore - [unblock prosemirror bump] assigning to readonly prop
|
|
160
|
+
node.attrs[key] = attrValue;
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
};
|
|
164
|
+
export var getMediaNodeFromSelection = function getMediaNodeFromSelection(state) {
|
|
165
|
+
if (!isSelectionMediaSingleNode(state)) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
var tr = state.tr;
|
|
169
|
+
var pos = tr.selection.from + 1;
|
|
170
|
+
var mediaNode = tr.doc.nodeAt(pos);
|
|
171
|
+
if (mediaNode && mediaNode.type === state.schema.nodes.media) {
|
|
172
|
+
return mediaNode;
|
|
173
|
+
}
|
|
174
|
+
return null;
|
|
175
|
+
};
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
|
|
2
|
+
import { atTheBeginningOfBlock, atTheEndOfBlock, atTheEndOfDoc, endPositionOfParent, startPositionOfParent } from '@atlaskit/editor-common/selection';
|
|
3
|
+
import { findFarthestParentNode, insideTableCell, isInLayoutColumn, isInListItem, isSupportedInParent, setNodeSelection, setTextSelection } from '@atlaskit/editor-common/utils';
|
|
4
|
+
import { Fragment } from '@atlaskit/editor-prosemirror/model';
|
|
5
|
+
import { canInsert, hasParentNode, safeInsert } from '@atlaskit/editor-prosemirror/utils';
|
|
6
|
+
import { copyOptionalAttrsFromMediaState, isInsidePotentialEmptyParagraph, isSelectionNonMediaBlockNode, posOfMediaGroupNearby, posOfParentMediaGroup, posOfPrecedingMediaGroup } from './media-common';
|
|
7
|
+
export var canInsertMediaInline = function canInsertMediaInline(state) {
|
|
8
|
+
var node = state.schema.nodes.mediaInline.create({});
|
|
9
|
+
return canInsert(state.selection.$to, Fragment.from(node));
|
|
10
|
+
};
|
|
11
|
+
var getInsertMediaGroupAnalytics = function getInsertMediaGroupAnalytics(mediaState, inputMethod) {
|
|
12
|
+
var media = '';
|
|
13
|
+
if (mediaState.length === 1) {
|
|
14
|
+
media = mediaState[0].fileMimeType || 'unknown';
|
|
15
|
+
} else if (mediaState.length > 1) {
|
|
16
|
+
media = 'multiple';
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
action: ACTION.INSERTED,
|
|
20
|
+
actionSubject: ACTION_SUBJECT.DOCUMENT,
|
|
21
|
+
actionSubjectId: ACTION_SUBJECT_ID.MEDIA,
|
|
22
|
+
attributes: {
|
|
23
|
+
type: ACTION_SUBJECT_ID.MEDIA_GROUP,
|
|
24
|
+
inputMethod: inputMethod,
|
|
25
|
+
fileExtension: media
|
|
26
|
+
},
|
|
27
|
+
eventType: EVENT_TYPE.TRACK
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
var getInsertMediaInlineAnalytics = function getInsertMediaInlineAnalytics(mediaState, inputMethod) {
|
|
31
|
+
var media = mediaState.fileMimeType || 'unknown';
|
|
32
|
+
return {
|
|
33
|
+
action: ACTION.INSERTED,
|
|
34
|
+
actionSubject: ACTION_SUBJECT.DOCUMENT,
|
|
35
|
+
actionSubjectId: ACTION_SUBJECT_ID.MEDIA,
|
|
36
|
+
attributes: {
|
|
37
|
+
type: ACTION_SUBJECT_ID.MEDIA_INLINE,
|
|
38
|
+
inputMethod: inputMethod,
|
|
39
|
+
fileExtension: media
|
|
40
|
+
},
|
|
41
|
+
eventType: EVENT_TYPE.TRACK
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Check if current editor selections is a media group or not.
|
|
47
|
+
* @param state Editor state
|
|
48
|
+
*/
|
|
49
|
+
function isSelectionMediaGroup(state) {
|
|
50
|
+
var schema = state.schema;
|
|
51
|
+
var selectionParent = state.selection.$anchor.node();
|
|
52
|
+
return selectionParent && selectionParent.type === schema.nodes.mediaGroup;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Insert a paragraph after if reach the end of doc
|
|
57
|
+
* and there is no media group in the front or selection is a non media block node
|
|
58
|
+
* @param node Node at insertion point
|
|
59
|
+
* @param state Editor state
|
|
60
|
+
*/
|
|
61
|
+
function shouldAppendParagraph(state, node) {
|
|
62
|
+
var media = state.schema.nodes.media;
|
|
63
|
+
var wasMediaNode = node && node.type === media;
|
|
64
|
+
return (insideTableCell(state) || isInListItem(state) || isInLayoutColumn(state) || atTheEndOfDoc(state) && (!posOfPrecedingMediaGroup(state) || isSelectionNonMediaBlockNode(state))) && !wasMediaNode;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Create a new media inline to insert the new media.
|
|
69
|
+
* @param view Editor view
|
|
70
|
+
* @param mediaState Media file to be added to the editor
|
|
71
|
+
* @param collection Collection for the media to be added
|
|
72
|
+
*/
|
|
73
|
+
export var insertMediaInlineNode = function insertMediaInlineNode(editorAnalyticsAPI) {
|
|
74
|
+
return function (view, mediaState, collection, inputMethod) {
|
|
75
|
+
var state = view.state,
|
|
76
|
+
dispatch = view.dispatch;
|
|
77
|
+
var schema = state.schema,
|
|
78
|
+
tr = state.tr;
|
|
79
|
+
var mediaInline = schema.nodes.mediaInline;
|
|
80
|
+
|
|
81
|
+
// Do nothing if no media found
|
|
82
|
+
if (!mediaInline || !mediaState || collection === undefined) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
var id = mediaState.id;
|
|
86
|
+
var mediaInlineNode = mediaInline.create({
|
|
87
|
+
id: id,
|
|
88
|
+
collection: collection
|
|
89
|
+
});
|
|
90
|
+
var space = state.schema.text(' ');
|
|
91
|
+
var pos = state.selection.$to.pos;
|
|
92
|
+
|
|
93
|
+
// If the selection is inside an empty list item set pos inside paragraph
|
|
94
|
+
if (isInListItem(state) && isInsidePotentialEmptyParagraph(state)) {
|
|
95
|
+
pos = pos + 1;
|
|
96
|
+
}
|
|
97
|
+
var content = Fragment.from([mediaInlineNode, space]);
|
|
98
|
+
|
|
99
|
+
// Delete the selection if a selection is made
|
|
100
|
+
var deleteRange = findDeleteRange(state);
|
|
101
|
+
if (!deleteRange) {
|
|
102
|
+
tr.insert(pos, content);
|
|
103
|
+
} else {
|
|
104
|
+
tr.insert(pos, content).deleteRange(deleteRange.start, deleteRange.end);
|
|
105
|
+
}
|
|
106
|
+
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent(getInsertMediaInlineAnalytics(mediaState, inputMethod))(tr);
|
|
107
|
+
dispatch(tr);
|
|
108
|
+
return true;
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Insert a media into an existing media group
|
|
114
|
+
* or create a new media group to insert the new media.
|
|
115
|
+
* @param view Editor view
|
|
116
|
+
* @param mediaStates Media files to be added to the editor
|
|
117
|
+
* @param collection Collection for the media to be added
|
|
118
|
+
*/
|
|
119
|
+
export var insertMediaGroupNode = function insertMediaGroupNode(editorAnalyticsAPI) {
|
|
120
|
+
return function (view, mediaStates, collection, inputMethod) {
|
|
121
|
+
var state = view.state,
|
|
122
|
+
dispatch = view.dispatch;
|
|
123
|
+
var tr = state.tr,
|
|
124
|
+
schema = state.schema;
|
|
125
|
+
var _schema$nodes = schema.nodes,
|
|
126
|
+
media = _schema$nodes.media,
|
|
127
|
+
paragraph = _schema$nodes.paragraph;
|
|
128
|
+
|
|
129
|
+
// Do nothing if no media found
|
|
130
|
+
if (!media || !mediaStates.length) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
var mediaNodes = createMediaFileNodes(mediaStates, collection, media);
|
|
134
|
+
var mediaInsertPos = findMediaInsertPos(state);
|
|
135
|
+
var resolvedInsertPos = tr.doc.resolve(mediaInsertPos);
|
|
136
|
+
var parent = resolvedInsertPos.parent;
|
|
137
|
+
var nodeAtInsertionPoint = tr.doc.nodeAt(mediaInsertPos);
|
|
138
|
+
var shouldSplit = !isSelectionMediaGroup(state) && isSupportedInParent(state, Fragment.from(state.schema.nodes.mediaGroup.createChecked({}, mediaNodes)));
|
|
139
|
+
var withParagraph = shouldAppendParagraph(state, nodeAtInsertionPoint);
|
|
140
|
+
var content = parent.type === schema.nodes.mediaGroup ? mediaNodes // If parent is a mediaGroup do not wrap items again.
|
|
141
|
+
: [schema.nodes.mediaGroup.createChecked({}, mediaNodes)];
|
|
142
|
+
if (shouldSplit) {
|
|
143
|
+
content = withParagraph ? content.concat(paragraph.create()) : content;
|
|
144
|
+
// delete the selection or empty paragraph
|
|
145
|
+
var deleteRange = findDeleteRange(state);
|
|
146
|
+
if (!deleteRange) {
|
|
147
|
+
tr.insert(mediaInsertPos, content);
|
|
148
|
+
} else if (mediaInsertPos <= deleteRange.start) {
|
|
149
|
+
tr.deleteRange(deleteRange.start, deleteRange.end).insert(mediaInsertPos, content);
|
|
150
|
+
} else {
|
|
151
|
+
tr.insert(mediaInsertPos, content).deleteRange(deleteRange.start, deleteRange.end);
|
|
152
|
+
}
|
|
153
|
+
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent(getInsertMediaGroupAnalytics(mediaStates, inputMethod))(tr);
|
|
154
|
+
dispatch(tr);
|
|
155
|
+
setSelectionAfterMediaInsertion(view);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Don't append new paragraph when adding media to a existing mediaGroup
|
|
160
|
+
if (withParagraph && parent.type !== schema.nodes.mediaGroup) {
|
|
161
|
+
content.push(paragraph.create());
|
|
162
|
+
}
|
|
163
|
+
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent(getInsertMediaGroupAnalytics(mediaStates, inputMethod))(tr);
|
|
164
|
+
dispatch(safeInsert(Fragment.fromArray(content), mediaInsertPos)(tr));
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
var createMediaFileNodes = function createMediaFileNodes(mediaStates, collection, media) {
|
|
168
|
+
var nodes = mediaStates.map(function (mediaState) {
|
|
169
|
+
var id = mediaState.id;
|
|
170
|
+
var node = media.create({
|
|
171
|
+
id: id,
|
|
172
|
+
type: 'file',
|
|
173
|
+
collection: collection
|
|
174
|
+
});
|
|
175
|
+
copyOptionalAttrsFromMediaState(mediaState, node);
|
|
176
|
+
return node;
|
|
177
|
+
});
|
|
178
|
+
return nodes;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Find root list node if exist from current selection
|
|
183
|
+
* @param state Editor state
|
|
184
|
+
*/
|
|
185
|
+
var findRootListNode = function findRootListNode(state) {
|
|
186
|
+
var _state$schema$nodes = state.schema.nodes,
|
|
187
|
+
bulletList = _state$schema$nodes.bulletList,
|
|
188
|
+
orderedList = _state$schema$nodes.orderedList;
|
|
189
|
+
return findFarthestParentNode(function (node) {
|
|
190
|
+
return node.type === bulletList || node.type === orderedList;
|
|
191
|
+
})(state.selection.$from);
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Return position of media to be inserted, if it is inside a list
|
|
196
|
+
* @param content Content to be inserted
|
|
197
|
+
* @param state Editor State
|
|
198
|
+
*/
|
|
199
|
+
export var getPosInList = function getPosInList(state) {
|
|
200
|
+
var _state$schema$nodes2 = state.schema.nodes,
|
|
201
|
+
mediaGroup = _state$schema$nodes2.mediaGroup,
|
|
202
|
+
listItem = _state$schema$nodes2.listItem;
|
|
203
|
+
|
|
204
|
+
// 1. Check if I am inside a list.
|
|
205
|
+
if (hasParentNode(function (node) {
|
|
206
|
+
return node.type === listItem;
|
|
207
|
+
})(state.selection)) {
|
|
208
|
+
// 2. Get end position of root list
|
|
209
|
+
var rootListNode = findRootListNode(state);
|
|
210
|
+
if (rootListNode) {
|
|
211
|
+
var pos = rootListNode.pos + rootListNode.node.nodeSize;
|
|
212
|
+
// 3. Fint the first location inside the media group
|
|
213
|
+
var nextNode = state.doc.nodeAt(pos);
|
|
214
|
+
if (nextNode && nextNode.type === mediaGroup) {
|
|
215
|
+
return pos + 1;
|
|
216
|
+
}
|
|
217
|
+
return pos;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return;
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Find insertion point,
|
|
225
|
+
* If it is in a List it will return position to the next block,
|
|
226
|
+
* If there are any media group close it will return this position
|
|
227
|
+
* Otherwise, It will return the respective block given selection.
|
|
228
|
+
* @param content Content to be inserted
|
|
229
|
+
* @param state Editor state
|
|
230
|
+
*/
|
|
231
|
+
var findMediaInsertPos = function findMediaInsertPos(state) {
|
|
232
|
+
var _state$selection = state.selection,
|
|
233
|
+
$from = _state$selection.$from,
|
|
234
|
+
$to = _state$selection.$to;
|
|
235
|
+
|
|
236
|
+
// Check if selection is inside a list.
|
|
237
|
+
var posInList = getPosInList(state);
|
|
238
|
+
if (posInList) {
|
|
239
|
+
// If I have a position in lists, I should return, otherwise I am not inside a list
|
|
240
|
+
return posInList;
|
|
241
|
+
}
|
|
242
|
+
var nearbyMediaGroupPos = posOfMediaGroupNearby(state);
|
|
243
|
+
if (nearbyMediaGroupPos && (!isSelectionNonMediaBlockNode(state) || $from.pos < nearbyMediaGroupPos && $to.pos < nearbyMediaGroupPos)) {
|
|
244
|
+
return nearbyMediaGroupPos;
|
|
245
|
+
}
|
|
246
|
+
if (isSelectionNonMediaBlockNode(state)) {
|
|
247
|
+
return $to.pos;
|
|
248
|
+
}
|
|
249
|
+
if (atTheEndOfBlock(state)) {
|
|
250
|
+
return $to.pos + 1;
|
|
251
|
+
}
|
|
252
|
+
if (atTheBeginningOfBlock(state)) {
|
|
253
|
+
return $from.pos - 1;
|
|
254
|
+
}
|
|
255
|
+
return $to.pos;
|
|
256
|
+
};
|
|
257
|
+
var findDeleteRange = function findDeleteRange(state) {
|
|
258
|
+
var _state$selection2 = state.selection,
|
|
259
|
+
$from = _state$selection2.$from,
|
|
260
|
+
$to = _state$selection2.$to;
|
|
261
|
+
if (posOfParentMediaGroup(state)) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (!isInsidePotentialEmptyParagraph(state) || posOfMediaGroupNearby(state)) {
|
|
265
|
+
return range($from.pos, $to.pos);
|
|
266
|
+
}
|
|
267
|
+
return range(startPositionOfParent($from) - 1, endPositionOfParent($to));
|
|
268
|
+
};
|
|
269
|
+
var range = function range(start) {
|
|
270
|
+
var end = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : start;
|
|
271
|
+
return {
|
|
272
|
+
start: start,
|
|
273
|
+
end: end
|
|
274
|
+
};
|
|
275
|
+
};
|
|
276
|
+
var setSelectionAfterMediaInsertion = function setSelectionAfterMediaInsertion(view) {
|
|
277
|
+
var state = view.state;
|
|
278
|
+
var doc = state.doc;
|
|
279
|
+
var mediaPos = posOfMediaGroupNearby(state);
|
|
280
|
+
if (!mediaPos) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
var $mediaPos = doc.resolve(mediaPos);
|
|
284
|
+
var endOfMediaGroup = endPositionOfParent($mediaPos);
|
|
285
|
+
if (endOfMediaGroup + 1 >= doc.nodeSize - 1) {
|
|
286
|
+
// if nothing after the media group, fallback to select the newest uploaded media item
|
|
287
|
+
setNodeSelection(view, mediaPos);
|
|
288
|
+
} else {
|
|
289
|
+
setTextSelection(view, endOfMediaGroup + 1);
|
|
290
|
+
}
|
|
291
|
+
};
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
|
|
5
|
+
import { safeInsert, shouldSplitSelectedNodeOnNodeInsertion } from '@atlaskit/editor-common/insert';
|
|
6
|
+
import { getMaxWidthForNestedNodeNext, getMediaSingleInitialWidth, MEDIA_SINGLE_DEFAULT_MIN_PIXEL_WIDTH, MEDIA_SINGLE_VIDEO_MIN_PIXEL_WIDTH } from '@atlaskit/editor-common/media-single';
|
|
7
|
+
import { atTheBeginningOfBlock } from '@atlaskit/editor-common/selection';
|
|
8
|
+
import { checkNodeDown, isEmptyParagraph } from '@atlaskit/editor-common/utils';
|
|
9
|
+
import { Fragment, Slice } from '@atlaskit/editor-prosemirror/model';
|
|
10
|
+
import { safeInsert as pmSafeInsert } from '@atlaskit/editor-prosemirror/utils';
|
|
11
|
+
import { getBooleanFF } from '@atlaskit/platform-feature-flags';
|
|
12
|
+
import { copyOptionalAttrsFromMediaState } from '../utils/media-common';
|
|
13
|
+
import { isImage } from './is-image';
|
|
14
|
+
var getInsertMediaAnalytics = function getInsertMediaAnalytics(inputMethod, fileExtension) {
|
|
15
|
+
return {
|
|
16
|
+
action: ACTION.INSERTED,
|
|
17
|
+
actionSubject: ACTION_SUBJECT.DOCUMENT,
|
|
18
|
+
actionSubjectId: ACTION_SUBJECT_ID.MEDIA,
|
|
19
|
+
attributes: {
|
|
20
|
+
inputMethod: inputMethod,
|
|
21
|
+
fileExtension: fileExtension,
|
|
22
|
+
type: ACTION_SUBJECT_ID.MEDIA_SINGLE
|
|
23
|
+
},
|
|
24
|
+
eventType: EVENT_TYPE.TRACK
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
function shouldAddParagraph(state) {
|
|
28
|
+
return atTheBeginningOfBlock(state) && !checkNodeDown(state.selection, state.doc, isEmptyParagraph);
|
|
29
|
+
}
|
|
30
|
+
function insertNodesWithOptionalParagraph(nodes) {
|
|
31
|
+
var analyticsAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
32
|
+
var editorAnalyticsAPI = arguments.length > 2 ? arguments[2] : undefined;
|
|
33
|
+
return function (state, dispatch) {
|
|
34
|
+
var tr = state.tr,
|
|
35
|
+
schema = state.schema;
|
|
36
|
+
var paragraph = schema.nodes.paragraph;
|
|
37
|
+
var inputMethod = analyticsAttributes.inputMethod,
|
|
38
|
+
fileExtension = analyticsAttributes.fileExtension;
|
|
39
|
+
var openEnd = 0;
|
|
40
|
+
if (shouldAddParagraph(state)) {
|
|
41
|
+
nodes.push(paragraph.create());
|
|
42
|
+
openEnd = 1;
|
|
43
|
+
}
|
|
44
|
+
tr.replaceSelection(new Slice(Fragment.from(nodes), 0, openEnd));
|
|
45
|
+
if (inputMethod) {
|
|
46
|
+
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent(getInsertMediaAnalytics(inputMethod, fileExtension))(tr);
|
|
47
|
+
}
|
|
48
|
+
if (dispatch) {
|
|
49
|
+
dispatch(tr);
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export var isMediaSingle = function isMediaSingle(schema, fileMimeType) {
|
|
55
|
+
return !!schema.nodes.mediaSingle && isImage(fileMimeType);
|
|
56
|
+
};
|
|
57
|
+
export var insertMediaAsMediaSingle = function insertMediaAsMediaSingle(view, node, inputMethod, editorAnalyticsAPI) {
|
|
58
|
+
var state = view.state,
|
|
59
|
+
dispatch = view.dispatch;
|
|
60
|
+
var _state$schema$nodes = state.schema.nodes,
|
|
61
|
+
mediaSingle = _state$schema$nodes.mediaSingle,
|
|
62
|
+
media = _state$schema$nodes.media;
|
|
63
|
+
if (!mediaSingle) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// if not an image type media node
|
|
68
|
+
if (node.type !== media || !isImage(node.attrs.__fileMimeType) && node.attrs.type !== 'external') {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
var mediaSingleNode = mediaSingle.create({}, node);
|
|
72
|
+
var nodes = [mediaSingleNode];
|
|
73
|
+
var analyticsAttributes = {
|
|
74
|
+
inputMethod: inputMethod,
|
|
75
|
+
fileExtension: node.attrs.__fileMimeType
|
|
76
|
+
};
|
|
77
|
+
return insertNodesWithOptionalParagraph(nodes, analyticsAttributes, editorAnalyticsAPI)(state, dispatch);
|
|
78
|
+
};
|
|
79
|
+
export var insertMediaSingleNode = function insertMediaSingleNode(view, mediaState, inputMethod, collection, alignLeftOnInsert, newInsertionBehaviour, widthPluginState, editorAnalyticsAPI) {
|
|
80
|
+
var _state$selection$$fro;
|
|
81
|
+
if (collection === undefined) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
var state = view.state,
|
|
85
|
+
dispatch = view.dispatch;
|
|
86
|
+
var grandParentNodeType = (_state$selection$$fro = state.selection.$from.node(-1)) === null || _state$selection$$fro === void 0 ? void 0 : _state$selection$$fro.type;
|
|
87
|
+
var parentNodeType = state.selection.$from.parent.type;
|
|
88
|
+
|
|
89
|
+
// add undefined as fallback as we don't want media single width to have upper limit as 0
|
|
90
|
+
// if widthPluginState.width is 0, default 760 will be used
|
|
91
|
+
var contentWidth = getMaxWidthForNestedNodeNext(view, state.selection.$from.pos, true) || (widthPluginState === null || widthPluginState === void 0 ? void 0 : widthPluginState.lineLength) || (widthPluginState === null || widthPluginState === void 0 ? void 0 : widthPluginState.width) || undefined;
|
|
92
|
+
var node = createMediaSingleNode(state.schema, collection, contentWidth, mediaState.status !== 'error' && isVideo(mediaState.fileMimeType) ? MEDIA_SINGLE_VIDEO_MIN_PIXEL_WIDTH : MEDIA_SINGLE_DEFAULT_MIN_PIXEL_WIDTH, alignLeftOnInsert)(mediaState);
|
|
93
|
+
var fileExtension;
|
|
94
|
+
if (mediaState.fileName) {
|
|
95
|
+
var extensionIdx = mediaState.fileName.lastIndexOf('.');
|
|
96
|
+
fileExtension = extensionIdx >= 0 ? mediaState.fileName.substring(extensionIdx + 1) : undefined;
|
|
97
|
+
}
|
|
98
|
+
// should split if media is valid content for the grandparent of the selected node
|
|
99
|
+
// and the parent node is a paragraph
|
|
100
|
+
if (shouldSplitSelectedNodeOnNodeInsertion({
|
|
101
|
+
parentNodeType: parentNodeType,
|
|
102
|
+
grandParentNodeType: grandParentNodeType,
|
|
103
|
+
content: node
|
|
104
|
+
})) {
|
|
105
|
+
insertNodesWithOptionalParagraph([node], {
|
|
106
|
+
fileExtension: fileExtension,
|
|
107
|
+
inputMethod: inputMethod
|
|
108
|
+
}, editorAnalyticsAPI)(state, dispatch);
|
|
109
|
+
} else {
|
|
110
|
+
var tr = null;
|
|
111
|
+
if (newInsertionBehaviour) {
|
|
112
|
+
tr = safeInsert(node, state.selection.from)(state.tr);
|
|
113
|
+
}
|
|
114
|
+
if (!tr) {
|
|
115
|
+
var content = shouldAddParagraph(view.state) ? Fragment.fromArray([node, state.schema.nodes.paragraph.create()]) : node;
|
|
116
|
+
tr = pmSafeInsert(content, undefined, true)(state.tr);
|
|
117
|
+
}
|
|
118
|
+
if (inputMethod) {
|
|
119
|
+
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent(getInsertMediaAnalytics(inputMethod, fileExtension))(tr);
|
|
120
|
+
}
|
|
121
|
+
dispatch(tr);
|
|
122
|
+
}
|
|
123
|
+
return true;
|
|
124
|
+
};
|
|
125
|
+
export var createMediaSingleNode = function createMediaSingleNode(schema, collection, maxWidth, minWidth, alignLeftOnInsert) {
|
|
126
|
+
return function (mediaState) {
|
|
127
|
+
var id = mediaState.id,
|
|
128
|
+
dimensions = mediaState.dimensions,
|
|
129
|
+
contextId = mediaState.contextId,
|
|
130
|
+
_mediaState$scaleFact = mediaState.scaleFactor,
|
|
131
|
+
scaleFactor = _mediaState$scaleFact === void 0 ? 1 : _mediaState$scaleFact;
|
|
132
|
+
var _ref = dimensions || {
|
|
133
|
+
height: undefined,
|
|
134
|
+
width: undefined
|
|
135
|
+
},
|
|
136
|
+
width = _ref.width,
|
|
137
|
+
height = _ref.height;
|
|
138
|
+
var _schema$nodes = schema.nodes,
|
|
139
|
+
media = _schema$nodes.media,
|
|
140
|
+
mediaSingle = _schema$nodes.mediaSingle;
|
|
141
|
+
var scaledWidth = width && Math.round(width / scaleFactor);
|
|
142
|
+
var mediaNode = media.create({
|
|
143
|
+
id: id,
|
|
144
|
+
type: 'file',
|
|
145
|
+
collection: collection,
|
|
146
|
+
contextId: contextId,
|
|
147
|
+
width: scaledWidth,
|
|
148
|
+
height: height && Math.round(height / scaleFactor)
|
|
149
|
+
});
|
|
150
|
+
var mediaSingleAttrs = alignLeftOnInsert ? {
|
|
151
|
+
layout: 'align-start'
|
|
152
|
+
} : {};
|
|
153
|
+
var extendedMediaSingleAttrs = getBooleanFF('platform.editor.media.extended-resize-experience') ? _objectSpread(_objectSpread({}, mediaSingleAttrs), {}, {
|
|
154
|
+
width: getMediaSingleInitialWidth(scaledWidth, maxWidth, minWidth),
|
|
155
|
+
// TODO: change to use enum
|
|
156
|
+
widthType: 'pixel'
|
|
157
|
+
}) : mediaSingleAttrs;
|
|
158
|
+
copyOptionalAttrsFromMediaState(mediaState, mediaNode);
|
|
159
|
+
return mediaSingle.createChecked(extendedMediaSingleAttrs, mediaNode);
|
|
160
|
+
};
|
|
161
|
+
};
|
|
162
|
+
export function isCaptionNode(editorView) {
|
|
163
|
+
var $from = editorView.state.selection.$from;
|
|
164
|
+
var immediateWrapperParentNode = editorView.state.doc.nodeAt($from.before(Math.max($from.depth, 1)));
|
|
165
|
+
if (immediateWrapperParentNode && immediateWrapperParentNode.type.name === 'caption') {
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
export var isVideo = function isVideo(fileType) {
|
|
171
|
+
return !!fileType && fileType.includes('video');
|
|
172
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { EditorAnalyticsAPI } from '@atlaskit/editor-common/analytics';
|
|
2
|
+
import type { Command } from '@atlaskit/editor-common/types';
|
|
3
|
+
import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
|
|
4
|
+
export declare const selectCaptionFromMediaSinglePos: (mediaSingleNodePos: number, mediaSingleNode: PMNode) => Command;
|
|
5
|
+
export declare const insertAndSelectCaptionFromMediaSinglePos: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => (mediaSingleNodePos: number | undefined, mediaSingleNode: PMNode) => Command;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Command } from '@atlaskit/editor-common/types';
|
|
2
|
+
import type { EditorState } from '@atlaskit/editor-prosemirror/state';
|
|
3
|
+
import type { MediaNodeWithPosHandler, MediaPluginState } from '../pm-plugins/types';
|
|
4
|
+
/**
|
|
5
|
+
* Note that Media Inline is inserted like a media single node into the media plugin state.
|
|
6
|
+
* Though it is not of type mediaSingle, it shares the same `findMediaSingleNode` method
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
export declare const findMediaSingleNode: (mediaPluginState: MediaPluginState, id: string) => MediaNodeWithPosHandler | null;
|
|
10
|
+
export declare const findAllMediaSingleNodes: (mediaPluginState: MediaPluginState, id: string) => MediaNodeWithPosHandler[];
|
|
11
|
+
export declare const isMediaNode: (pos: number, state: EditorState) => boolean | null;
|
|
12
|
+
export declare const updateAllMediaSingleNodesAttrs: (id: string, attrs: object) => Command;
|
|
13
|
+
export declare const updateCurrentMediaNodeAttrs: (attrs: object, mediaNode: MediaNodeWithPosHandler) => Command;
|
|
14
|
+
export declare const updateMediaSingleNodeAttrs: (id: string, attrs: object) => Command;
|
|
15
|
+
export declare const replaceExternalMedia: (pos: number, attrs: object) => Command;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { updateMediaSingleNodeAttrs, updateAllMediaSingleNodesAttrs, replaceExternalMedia, } from './helpers';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EditorAnalyticsAPI, INPUT_METHOD } from '@atlaskit/editor-common/analytics';
|
|
2
|
+
import type { Command, CommandDispatch } from '@atlaskit/editor-common/types';
|
|
3
|
+
import type { EditorState } from '@atlaskit/editor-prosemirror/state';
|
|
4
|
+
import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
5
|
+
export declare const showLinkingToolbar: Command;
|
|
6
|
+
export declare const showLinkingToolbarWithMediaTypeCheck: Command;
|
|
7
|
+
export declare const hideLinkingToolbar: (state: EditorState, dispatch?: CommandDispatch, view?: EditorView, focusFloatingToolbar?: boolean) => void;
|
|
8
|
+
export declare const unlink: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
|
|
9
|
+
export declare const setUrlToMedia: (url: string, inputMethod: INPUT_METHOD.TYPEAHEAD | INPUT_METHOD.MANUAL, editorAnalyticsAPI: EditorAnalyticsAPI | undefined) => Command;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export {};
|
|
1
|
+
export type { MediaNextEditorPluginType as MediaPlugin } from './next-plugin-type';
|
|
2
|
+
export { mediaPlugin } from './plugin';
|