@gravity-ui/markdown-editor 15.0.2 → 15.1.0
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/build/cjs/extensions/yfm/ImgSize/ImageWidget/index.d.ts +3 -1
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/index.js +2 -0
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/index.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.d.ts +15 -3
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.js +16 -8
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/widget.d.ts +3 -0
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/widget.js +13 -2
- package/build/cjs/extensions/yfm/ImgSize/ImageWidget/widget.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/index.d.ts +2 -1
- package/build/cjs/extensions/yfm/ImgSize/index.js +2 -0
- package/build/cjs/extensions/yfm/ImgSize/index.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmCut/index.css +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/index.d.ts +3 -1
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/index.js +2 -0
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/index.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.d.ts +15 -3
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.js +15 -7
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/widget.d.ts +3 -0
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/widget.js +14 -3
- package/build/esm/extensions/yfm/ImgSize/ImageWidget/widget.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/index.d.ts +2 -1
- package/build/esm/extensions/yfm/ImgSize/index.js +2 -0
- package/build/esm/extensions/yfm/ImgSize/index.js.map +1 -1
- package/build/esm/extensions/yfm/YfmCut/index.css +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/styles.css +1 -1
- package/package.json +2 -2
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { Action, ExtensionAuto } from "../../../../core/index.js";
|
|
2
2
|
import type { FileUploadHandler } from "../../../../utils/upload.js";
|
|
3
|
+
import type { RenderImageWidgetFormFn } from "./view.js";
|
|
3
4
|
import type { ImageWidgetDescriptorOpts } from "./widget.js";
|
|
4
5
|
declare const addImageWidgetAction = "addImageWidget";
|
|
5
|
-
export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages'> & {
|
|
6
|
+
export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'> & {
|
|
6
7
|
imageUploadHandler?: FileUploadHandler;
|
|
8
|
+
renderImageWidgetForm?: RenderImageWidgetFormFn;
|
|
7
9
|
};
|
|
8
10
|
export declare const ImageWidget: ExtensionAuto<ImageWidgetOptions>;
|
|
9
11
|
declare global {
|
|
@@ -6,7 +6,9 @@ const addImageWidgetAction = 'addImageWidget';
|
|
|
6
6
|
const ImageWidget = (builder, opts) => {
|
|
7
7
|
builder.addAction(addImageWidgetAction, (deps) => (0, actions_1.addImageWidget)(deps, {
|
|
8
8
|
uploadImages: opts.imageUploadHandler,
|
|
9
|
+
renderImageForm: opts.renderImageWidgetForm,
|
|
9
10
|
needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,
|
|
11
|
+
enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,
|
|
10
12
|
}));
|
|
11
13
|
};
|
|
12
14
|
exports.ImageWidget = ImageWidget;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":";;;AAGA,0CAAyC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":";;;AAGA,0CAAyC;AAIzC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAUvC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,OAAO,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7C,IAAA,wBAAc,EAAC,IAAI,EAAE;QACjB,YAAY,EAAE,IAAI,CAAC,kBAAkB;QACrC,eAAe,EAAE,IAAI,CAAC,qBAAqB;QAC3C,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;QAC/E,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;KACpE,CAAC,CACL,CAAC;AACN,CAAC,CAAC;AATW,QAAA,WAAW,eAStB","sourcesContent":["import type {Action, ExtensionAuto} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\n\nimport {addImageWidget} from './actions';\nimport type {RenderImageWidgetFormFn} from './view';\nimport type {ImageWidgetDescriptorOpts} from './widget';\n\nconst addImageWidgetAction = 'addImageWidget';\n\nexport type ImageWidgetOptions = Pick<\n ImageWidgetDescriptorOpts,\n 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'\n> & {\n imageUploadHandler?: FileUploadHandler;\n renderImageWidgetForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImageWidget: ExtensionAuto<ImageWidgetOptions> = (builder, opts) => {\n builder.addAction(addImageWidgetAction, (deps) =>\n addImageWidget(deps, {\n uploadImages: opts.imageUploadHandler,\n renderImageForm: opts.renderImageWidgetForm,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n }),\n );\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [addImageWidgetAction]: Action;\n }\n }\n}\n"]}
|
|
@@ -1,8 +1,20 @@
|
|
|
1
|
-
import { type ImageFormProps } from "../../../../forms/ImageForm.js";
|
|
1
|
+
import { type ImageFormProps, type ImageFormSubmitParams } from "../../../../forms/ImageForm.js";
|
|
2
2
|
import "./view.css";
|
|
3
|
-
export type
|
|
3
|
+
export type RenderImageWidgetFormProps = {
|
|
4
|
+
/** Handler for submitting form */
|
|
5
|
+
onSubmit: (params: ImageFormSubmitParams) => void;
|
|
6
|
+
/** Handler for cancellation */
|
|
7
|
+
onCancel: () => void;
|
|
8
|
+
/** Handler for attach file from device */
|
|
9
|
+
onAttach?: (files: File[]) => void;
|
|
10
|
+
/** Uploading attached file */
|
|
11
|
+
uploading?: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;
|
|
14
|
+
export type ImagePlaceholderProps = {
|
|
4
15
|
onCancel: () => void;
|
|
5
16
|
onSubmit: ImageFormProps['onSubmit'];
|
|
6
17
|
onAttach?: (files: File[]) => Promise<void>;
|
|
18
|
+
renderForm?: RenderImageWidgetFormFn;
|
|
7
19
|
};
|
|
8
|
-
export declare const
|
|
20
|
+
export declare const ImagePlaceholder: React.FC<ImagePlaceholderProps>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.ImagePlaceholder = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
const icons_1 = require("@gravity-ui/icons");
|
|
@@ -13,23 +13,31 @@ const hooks_1 = require("../../../../react-utils/hooks.js");
|
|
|
13
13
|
require("./view.css");
|
|
14
14
|
const b = (0, classname_1.cn)('image-placeholder');
|
|
15
15
|
const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
|
|
16
|
-
const
|
|
16
|
+
const defaultFormRenderer = (props) => {
|
|
17
|
+
return ((0, jsx_runtime_1.jsx)(ImageForm_1.ImageForm, { autoFocus: true, loading: props.uploading, onCancel: props.onCancel, onSubmit: props.onSubmit, onAttach: props.onAttach }));
|
|
18
|
+
};
|
|
19
|
+
const ImagePlaceholder = ({ onCancel, onSubmit, onAttach, renderForm, }) => {
|
|
17
20
|
const isMounted = (0, react_use_1.useMountedState)();
|
|
18
|
-
const [
|
|
21
|
+
const [uploading, startUploading, stopUploading] = (0, hooks_1.useBooleanState)(false);
|
|
19
22
|
const [anchor, setAnchor] = (0, hooks_1.useElementState)();
|
|
20
23
|
const attachHandler = (0, react_1.useCallback)((files) => {
|
|
21
24
|
if (!onAttach)
|
|
22
25
|
return;
|
|
23
26
|
if (isMounted()) {
|
|
24
|
-
|
|
27
|
+
startUploading();
|
|
25
28
|
onAttach(files).finally(() => {
|
|
26
29
|
if (isMounted()) {
|
|
27
|
-
|
|
30
|
+
stopUploading();
|
|
28
31
|
}
|
|
29
32
|
});
|
|
30
33
|
}
|
|
31
|
-
}, [isMounted, onAttach,
|
|
32
|
-
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { ref: setAnchor, className: b(), children: [(0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Picture, size: 24 }), (0, widgets_1.i18n)('image')] }), (0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: (
|
|
34
|
+
}, [isMounted, onAttach, startUploading, stopUploading]);
|
|
35
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { ref: setAnchor, className: b(), children: [(0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Picture, size: 24 }), (0, widgets_1.i18n)('image')] }), (0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: (renderForm || defaultFormRenderer)({
|
|
36
|
+
onCancel,
|
|
37
|
+
onSubmit,
|
|
38
|
+
uploading,
|
|
39
|
+
onAttach: onAttach && attachHandler,
|
|
40
|
+
}) })] }));
|
|
33
41
|
};
|
|
34
|
-
exports.
|
|
42
|
+
exports.ImagePlaceholder = ImagePlaceholder;
|
|
35
43
|
//# sourceMappingURL=view.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";;;;AAAA,iCAAkC;AAElC,6CAAuD;AACvD,6CAAmE;AACnE,yCAA0C;AAE1C,wDAAyC;AACzC,
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";;;;AAAA,iCAAkC;AAElC,6CAAuD;AACvD,6CAAmE;AACnE,yCAA0C;AAE1C,wDAAyC;AACzC,8DAIqC;AACrC,+DAA8C;AAC9C,4DAA+E;AAE/E,sBAAqB;AAErB,MAAM,CAAC,GAAG,IAAA,cAAE,EAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAczF,MAAM,mBAAmB,GAA4B,CAAC,KAAK,EAAE,EAAE;IAC3D,OAAO,CACH,uBAAC,qBAAS,IACN,SAAS,QACT,OAAO,EAAE,KAAK,CAAC,SAAS,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAC1B,CACL,CAAC;AACN,CAAC,CAAC;AASK,MAAM,gBAAgB,GAAoC,CAAC,EAC9D,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,GACb,EAAE,EAAE;IACD,MAAM,SAAS,GAAG,IAAA,2BAAe,GAAE,CAAC;IACpC,MAAM,CAAC,SAAS,EAAE,cAAc,EAAE,aAAa,CAAC,GAAG,IAAA,uBAAe,EAAC,KAAK,CAAC,CAAC;IAC1E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,uBAAe,GAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAA,mBAAW,EAC7B,CAAC,KAAK,EAAE,EAAE;QACN,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,SAAS,EAAE,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;YACjB,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzB,IAAI,SAAS,EAAE,EAAE,CAAC;oBACd,aAAa,EAAE,CAAC;gBACpB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC,EACD,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,CACvD,CAAC;IAEF,OAAO,CACH,6DACI,iCAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,aAC/B,uBAAC,YAAI,IAAC,IAAI,EAAE,eAAS,EAAE,IAAI,EAAE,EAAE,GAAI,EAClC,IAAA,cAAI,EAAC,OAAO,CAAC,IACZ,EACN,uBAAC,aAAK,IAAC,IAAI,QAAC,KAAK,QAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,YAChF,CAAC,UAAU,IAAI,mBAAmB,CAAC,CAAC;oBACjC,QAAQ;oBACR,QAAQ;oBACR,SAAS;oBACT,QAAQ,EAAE,QAAQ,IAAI,aAAa;iBACtC,CAAC,GACE,IACT,CACN,CAAC;AACN,CAAC,CAAC;AAxCW,QAAA,gBAAgB,oBAwC3B","sourcesContent":["import {useCallback} from 'react';\n\nimport {Picture as ImageIcon} from '@gravity-ui/icons';\nimport {Icon, Popup, type PopupPlacement} from '@gravity-ui/uikit';\nimport {useMountedState} from 'react-use';\n\nimport {cn} from '../../../../classname';\nimport {\n ImageForm,\n type ImageFormProps,\n type ImageFormSubmitParams,\n} from '../../../../forms/ImageForm';\nimport {i18n} from '../../../../i18n/widgets';\nimport {useBooleanState, useElementState} from '../../../../react-utils/hooks';\n\nimport './view.scss';\n\nconst b = cn('image-placeholder');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type RenderImageWidgetFormProps = {\n /** Handler for submitting form */\n onSubmit: (params: ImageFormSubmitParams) => void;\n /** Handler for cancellation */\n onCancel: () => void;\n /** Handler for attach file from device */\n onAttach?: (files: File[]) => void;\n /** Uploading attached file */\n uploading?: boolean;\n};\nexport type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;\n\nconst defaultFormRenderer: RenderImageWidgetFormFn = (props) => {\n return (\n <ImageForm\n autoFocus\n loading={props.uploading}\n onCancel={props.onCancel}\n onSubmit={props.onSubmit}\n onAttach={props.onAttach}\n />\n );\n};\n\nexport type ImagePlaceholderProps = {\n onCancel: () => void;\n onSubmit: ImageFormProps['onSubmit'];\n onAttach?: (files: File[]) => Promise<void>;\n renderForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImagePlaceholder: React.FC<ImagePlaceholderProps> = ({\n onCancel,\n onSubmit,\n onAttach,\n renderForm,\n}) => {\n const isMounted = useMountedState();\n const [uploading, startUploading, stopUploading] = useBooleanState(false);\n const [anchor, setAnchor] = useElementState();\n const attachHandler = useCallback<NonNullable<ImageFormProps['onAttach']>>(\n (files) => {\n if (!onAttach) return;\n if (isMounted()) {\n startUploading();\n onAttach(files).finally(() => {\n if (isMounted()) {\n stopUploading();\n }\n });\n }\n },\n [isMounted, onAttach, startUploading, stopUploading],\n );\n\n return (\n <>\n <div ref={setAnchor} className={b()}>\n <Icon data={ImageIcon} size={24} />\n {i18n('image')}\n </div>\n <Popup open modal onOpenChange={onCancel} anchorElement={anchor} placement={placement}>\n {(renderForm || defaultFormRenderer)({\n onCancel,\n onSubmit,\n uploading,\n onAttach: onAttach && attachHandler,\n })}\n </Popup>\n </>\n );\n};\n"]}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { Transaction } from 'prosemirror-state';
|
|
2
2
|
import type { ExtensionDeps } from "../../../../core/index.js";
|
|
3
3
|
import type { FileUploadHandler } from "../../../../utils/upload.js";
|
|
4
|
+
import { type RenderImageWidgetFormFn } from "./view.js";
|
|
4
5
|
export declare const addWidget: (tr: Transaction, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) => Transaction;
|
|
5
6
|
export declare const removeWidget: (tr: Transaction, id: string) => Transaction;
|
|
6
7
|
export type ImageWidgetDescriptorOpts = {
|
|
7
8
|
needToSetDimensionsForUploadedImages: boolean;
|
|
8
9
|
uploadImages?: FileUploadHandler;
|
|
10
|
+
enableNewImageSizeCalculation?: boolean;
|
|
11
|
+
renderImageForm?: RenderImageWidgetFormFn;
|
|
9
12
|
};
|
|
@@ -19,13 +19,17 @@ class ImageWidgetDescriptor extends WidgetDecoration_1.ReactWidgetDescriptor {
|
|
|
19
19
|
deps;
|
|
20
20
|
uploadImages;
|
|
21
21
|
needToSetDimensionsForUploadedImages;
|
|
22
|
+
enableNewImageSizeCalculation;
|
|
23
|
+
renderImageForm;
|
|
22
24
|
widgetHandler = null;
|
|
23
25
|
constructor(initPos, deps, opts) {
|
|
24
26
|
super(initPos, 'image_placeholder');
|
|
25
27
|
this.domElem = document.createElement('span');
|
|
26
28
|
this.deps = deps;
|
|
27
29
|
this.uploadImages = opts.uploadImages;
|
|
30
|
+
this.renderImageForm = opts.renderImageForm;
|
|
28
31
|
this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;
|
|
32
|
+
this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;
|
|
29
33
|
}
|
|
30
34
|
getWidgetHandler(view, getPos) {
|
|
31
35
|
if (!this.widgetHandler) {
|
|
@@ -34,7 +38,9 @@ class ImageWidgetDescriptor extends WidgetDecoration_1.ReactWidgetDescriptor {
|
|
|
34
38
|
getPos,
|
|
35
39
|
decoId: this.id,
|
|
36
40
|
uploadImages: this.uploadImages,
|
|
41
|
+
renderImageForm: this.renderImageForm,
|
|
37
42
|
needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,
|
|
43
|
+
enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
|
|
38
44
|
}, this.deps);
|
|
39
45
|
}
|
|
40
46
|
return this.widgetHandler;
|
|
@@ -58,14 +64,18 @@ class ImageWidgetHandler {
|
|
|
58
64
|
uploadImages;
|
|
59
65
|
normalizeUrl;
|
|
60
66
|
needToSetDimensionsForUploadedImages;
|
|
67
|
+
enableNewImageSizeCalculation;
|
|
68
|
+
renderImageForm;
|
|
61
69
|
cancelled = false;
|
|
62
|
-
constructor({ decoId, view, getPos, uploadImages, needToSetDimensionsForUploadedImages, }, deps) {
|
|
70
|
+
constructor({ decoId, view, getPos, uploadImages, renderImageForm, needToSetDimensionsForUploadedImages, enableNewImageSizeCalculation, }, deps) {
|
|
63
71
|
this.decoId = decoId;
|
|
64
72
|
this.view = view;
|
|
65
73
|
this.getPos = getPos;
|
|
66
74
|
this.uploadImages = uploadImages;
|
|
67
75
|
this.normalizeUrl = (0, markdown_1.normalizeUrlFactory)(deps);
|
|
76
|
+
this.renderImageForm = renderImageForm;
|
|
68
77
|
this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;
|
|
78
|
+
this.enableNewImageSizeCalculation = enableNewImageSizeCalculation;
|
|
69
79
|
}
|
|
70
80
|
destruct() {
|
|
71
81
|
this.cancelled = true;
|
|
@@ -73,7 +83,7 @@ class ImageWidgetHandler {
|
|
|
73
83
|
renderWidgetView(view, getPos) {
|
|
74
84
|
this.view = view;
|
|
75
85
|
this.getPos = getPos;
|
|
76
|
-
return ((0, jsx_runtime_1.jsx)(view_1.
|
|
86
|
+
return ((0, jsx_runtime_1.jsx)(view_1.ImagePlaceholder, { onCancel: this.onCancel, onSubmit: this.onSubmit, onAttach: this.uploadImages && this.onAttach, renderForm: this.renderImageForm }));
|
|
77
87
|
}
|
|
78
88
|
onCancel = () => {
|
|
79
89
|
this.cancelled = true;
|
|
@@ -102,6 +112,7 @@ class ImageWidgetHandler {
|
|
|
102
112
|
const { view } = this;
|
|
103
113
|
new upload_1.ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {
|
|
104
114
|
needDimensions: this.needToSetDimensionsForUploadedImages,
|
|
115
|
+
enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
|
|
105
116
|
}).run();
|
|
106
117
|
view.dispatch((0, exports.removeWidget)(view.state.tr, this.decoId));
|
|
107
118
|
view.focus();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\nimport {ReactWidgetDescriptor, removeDecoration} from '../../../behavior/WidgetDecoration';\nimport {imageType, normalizeUrlFactory} from '../../../markdown';\nimport {ImgSizeAttr} from '../../../specs';\nimport {ImagesUploadProcess} from '../ImagePaste/upload';\n\nimport {FilePlaceholder, type FilePlaceholderProps} from './view';\n\nexport const addWidget = (\n tr: Transaction,\n deps: ExtensionDeps,\n opts: ImageWidgetDescriptorOpts,\n) => {\n return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);\n};\n\nexport const removeWidget = removeDecoration;\n\nexport type ImageWidgetDescriptorOpts = {\n needToSetDimensionsForUploadedImages: boolean;\n uploadImages?: FileUploadHandler;\n};\n\nclass ImageWidgetDescriptor extends ReactWidgetDescriptor {\n private readonly domElem;\n private readonly deps;\n private readonly uploadImages;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n\n private widgetHandler: ImageWidgetHandler | null = null;\n\n constructor(initPos: number, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) {\n super(initPos, 'image_placeholder');\n this.domElem = document.createElement('span');\n this.deps = deps;\n this.uploadImages = opts.uploadImages;\n this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;\n }\n\n getWidgetHandler(view: EditorView, getPos: () => number): ImageWidgetHandler {\n if (!this.widgetHandler) {\n this.widgetHandler = new ImageWidgetHandler(\n {\n view,\n getPos,\n decoId: this.id,\n uploadImages: this.uploadImages,\n needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,\n },\n this.deps,\n );\n }\n return this.widgetHandler;\n }\n\n getDomElem(): HTMLElement {\n return this.domElem;\n }\n\n renderReactElement(view: EditorView, getPos: () => number): React.ReactElement {\n return this.getWidgetHandler(view, getPos).renderWidgetView(view, getPos);\n }\n\n remove(): void {\n super.remove();\n this.widgetHandler?.destruct();\n this.widgetHandler = null;\n }\n}\n\ntype ImageWidgetHandlerProps = {\n decoId: string;\n view: EditorView;\n getPos: () => number;\n uploadImages?: FileUploadHandler;\n needToSetDimensionsForUploadedImages: boolean;\n};\n\nclass ImageWidgetHandler {\n private view;\n private getPos;\n\n private readonly decoId: string;\n private readonly uploadImages;\n private readonly normalizeUrl;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n\n private cancelled = false;\n\n constructor(\n {\n decoId,\n view,\n getPos,\n uploadImages,\n needToSetDimensionsForUploadedImages,\n }: ImageWidgetHandlerProps,\n deps: ExtensionDeps,\n ) {\n this.decoId = decoId;\n this.view = view;\n this.getPos = getPos;\n this.uploadImages = uploadImages;\n this.normalizeUrl = normalizeUrlFactory(deps);\n this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;\n }\n\n destruct() {\n this.cancelled = true;\n }\n\n renderWidgetView(view: EditorView, getPos: () => number): React.ReactElement {\n this.view = view;\n this.getPos = getPos;\n return (\n <FilePlaceholder\n onCancel={this.onCancel}\n onSubmit={this.onSubmit}\n onAttach={this.uploadImages && this.onAttach}\n />\n );\n }\n\n private onCancel: FilePlaceholderProps['onCancel'] = () => {\n this.cancelled = true;\n this.view.dispatch(removeDecoration(this.view.state.tr, this.decoId));\n this.view.focus();\n };\n\n private onSubmit: FilePlaceholderProps['onSubmit'] = (params) => {\n if (this.cancelled) return;\n\n const url = this.normalizeUrl(params.url)?.url;\n if (!url) return;\n\n const attrs = {\n [ImgSizeAttr.Src]: url,\n [ImgSizeAttr.Title]: params.name,\n [ImgSizeAttr.Alt]: params.alt,\n [ImgSizeAttr.Width]: isNumber(params.width) ? String(params.width) : null,\n [ImgSizeAttr.Height]: isNumber(params.height) ? String(params.height) : null,\n };\n\n const node = imageType(this.view.state.schema).create(attrs);\n this.insertNodes([node]);\n };\n\n private onAttach: FilePlaceholderProps['onAttach'] = async (files) => {\n if (this.cancelled || !this.uploadImages) return;\n\n const {view} = this;\n new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {\n needDimensions: this.needToSetDimensionsForUploadedImages,\n }).run();\n view.dispatch(removeWidget(view.state.tr, this.decoId));\n view.focus();\n };\n\n private insertNodes(fileNodes: Node[]) {\n if (this.cancelled) return;\n\n let tr = this.view.state.tr;\n tr = tr.insert(tr.mapping.map(this.getPos()), fileNodes);\n tr = removeWidget(tr, this.decoId);\n this.view.dispatch(tr);\n this.view.focus();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/widget.tsx"],"names":[],"mappings":";;;;;AAAA,kEAAiC;AAOjC,kFAA2F;AAC3F,yDAAiE;AACjE,6CAA2C;AAC3C,oDAAyD;AAEzD,oCAAkG;AAE3F,MAAM,SAAS,GAAG,CACrB,EAAe,EACf,IAAmB,EACnB,IAA+B,EACjC,EAAE;IACA,OAAO,IAAI,qBAAqB,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAChF,CAAC,CAAC;AANW,QAAA,SAAS,aAMpB;AAEW,QAAA,YAAY,GAAG,mCAAgB,CAAC;AAS7C,MAAM,qBAAsB,SAAQ,wCAAqB;IACpC,OAAO,CAAC;IACR,IAAI,CAAC;IACL,YAAY,CAAC;IACb,oCAAoC,CAAU;IAC9C,6BAA6B,CAAW;IACxC,eAAe,CAAsC;IAE9D,aAAa,GAA8B,IAAI,CAAC;IAExD,YAAY,OAAe,EAAE,IAAmB,EAAE,IAA+B;QAC7E,KAAK,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,oCAAoC,GAAG,IAAI,CAAC,oCAAoC,CAAC;QACtF,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,6BAA6B,CAAC;IAC5E,CAAC;IAED,gBAAgB,CAAC,IAAgB,EAAE,MAAoB;QACnD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACtB,IAAI,CAAC,aAAa,GAAG,IAAI,kBAAkB,CACvC;gBACI,IAAI;gBACJ,MAAM;gBACN,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;gBAC/E,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;aACpE,EACD,IAAI,CAAC,IAAI,CACZ,CAAC;QACN,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,kBAAkB,CAAC,IAAgB,EAAE,MAAoB;QACrD,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM;QACF,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC9B,CAAC;CACJ;AAYD,MAAM,kBAAkB;IACZ,IAAI,CAAC;IACL,MAAM,CAAC;IAEE,MAAM,CAAS;IACf,YAAY,CAAC;IACb,YAAY,CAAC;IACb,oCAAoC,CAAU;IAC9C,6BAA6B,CAAW;IACxC,eAAe,CAAsC;IAE9D,SAAS,GAAG,KAAK,CAAC;IAE1B,YACI,EACI,MAAM,EACN,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,eAAe,EACf,oCAAoC,EACpC,6BAA6B,GACP,EAC1B,IAAmB;QAEnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,IAAA,8BAAmB,EAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,oCAAoC,GAAG,oCAAoC,CAAC;QACjF,IAAI,CAAC,6BAA6B,GAAG,6BAA6B,CAAC;IACvE,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,gBAAgB,CAAC,IAAgB,EAAE,MAAoB;QACnD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,OAAO,CACH,uBAAC,uBAAgB,IACb,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,QAAQ,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,EAC5C,UAAU,EAAE,IAAI,CAAC,eAAe,GAClC,CACL,CAAC;IACN,CAAC;IAEO,QAAQ,GAAsC,GAAG,EAAE;QACvD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAA,mCAAgB,EAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC,CAAC;IAEM,QAAQ,GAAsC,CAAC,MAAM,EAAE,EAAE;QAC7D,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QAC/C,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,MAAM,KAAK,GAAG;YACV,CAAC,mBAAW,CAAC,GAAG,CAAC,EAAE,GAAG;YACtB,CAAC,mBAAW,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI;YAChC,CAAC,mBAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG;YAC7B,CAAC,mBAAW,CAAC,KAAK,CAAC,EAAE,IAAA,mBAAQ,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;YACzE,CAAC,mBAAW,CAAC,MAAM,CAAC,EAAE,IAAA,mBAAQ,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;SAC/E,CAAC;QAEF,MAAM,IAAI,GAAG,IAAA,oBAAS,EAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEM,QAAQ,GAAsC,KAAK,EAAE,KAAK,EAAE,EAAE;QAClE,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAEjD,MAAM,EAAC,IAAI,EAAC,GAAG,IAAI,CAAC;QACpB,IAAI,4BAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;YACnE,cAAc,EAAE,IAAI,CAAC,oCAAoC;YACzD,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;SACpE,CAAC,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,CAAC,QAAQ,CAAC,IAAA,oBAAY,EAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC;IAEM,WAAW,CAAC,SAAiB;QACjC,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAE3B,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QACzD,EAAE,GAAG,IAAA,oBAAY,EAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACJ","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\nimport {ReactWidgetDescriptor, removeDecoration} from '../../../behavior/WidgetDecoration';\nimport {imageType, normalizeUrlFactory} from '../../../markdown';\nimport {ImgSizeAttr} from '../../../specs';\nimport {ImagesUploadProcess} from '../ImagePaste/upload';\n\nimport {ImagePlaceholder, type ImagePlaceholderProps, type RenderImageWidgetFormFn} from './view';\n\nexport const addWidget = (\n tr: Transaction,\n deps: ExtensionDeps,\n opts: ImageWidgetDescriptorOpts,\n) => {\n return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);\n};\n\nexport const removeWidget = removeDecoration;\n\nexport type ImageWidgetDescriptorOpts = {\n needToSetDimensionsForUploadedImages: boolean;\n uploadImages?: FileUploadHandler;\n enableNewImageSizeCalculation?: boolean;\n renderImageForm?: RenderImageWidgetFormFn;\n};\n\nclass ImageWidgetDescriptor extends ReactWidgetDescriptor {\n private readonly domElem;\n private readonly deps;\n private readonly uploadImages;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n private readonly enableNewImageSizeCalculation?: boolean;\n private readonly renderImageForm: RenderImageWidgetFormFn | undefined;\n\n private widgetHandler: ImageWidgetHandler | null = null;\n\n constructor(initPos: number, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) {\n super(initPos, 'image_placeholder');\n this.domElem = document.createElement('span');\n this.deps = deps;\n this.uploadImages = opts.uploadImages;\n this.renderImageForm = opts.renderImageForm;\n this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;\n this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;\n }\n\n getWidgetHandler(view: EditorView, getPos: () => number): ImageWidgetHandler {\n if (!this.widgetHandler) {\n this.widgetHandler = new ImageWidgetHandler(\n {\n view,\n getPos,\n decoId: this.id,\n uploadImages: this.uploadImages,\n renderImageForm: this.renderImageForm,\n needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n },\n this.deps,\n );\n }\n return this.widgetHandler;\n }\n\n getDomElem(): HTMLElement {\n return this.domElem;\n }\n\n renderReactElement(view: EditorView, getPos: () => number): React.ReactElement {\n return this.getWidgetHandler(view, getPos).renderWidgetView(view, getPos);\n }\n\n remove(): void {\n super.remove();\n this.widgetHandler?.destruct();\n this.widgetHandler = null;\n }\n}\n\ntype ImageWidgetHandlerProps = {\n decoId: string;\n view: EditorView;\n getPos: () => number;\n uploadImages?: FileUploadHandler;\n renderImageForm?: RenderImageWidgetFormFn;\n needToSetDimensionsForUploadedImages: boolean;\n enableNewImageSizeCalculation?: boolean;\n};\n\nclass ImageWidgetHandler {\n private view;\n private getPos;\n\n private readonly decoId: string;\n private readonly uploadImages;\n private readonly normalizeUrl;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n private readonly enableNewImageSizeCalculation?: boolean;\n private readonly renderImageForm: RenderImageWidgetFormFn | undefined;\n\n private cancelled = false;\n\n constructor(\n {\n decoId,\n view,\n getPos,\n uploadImages,\n renderImageForm,\n needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation,\n }: ImageWidgetHandlerProps,\n deps: ExtensionDeps,\n ) {\n this.decoId = decoId;\n this.view = view;\n this.getPos = getPos;\n this.uploadImages = uploadImages;\n this.normalizeUrl = normalizeUrlFactory(deps);\n this.renderImageForm = renderImageForm;\n this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;\n this.enableNewImageSizeCalculation = enableNewImageSizeCalculation;\n }\n\n destruct() {\n this.cancelled = true;\n }\n\n renderWidgetView(view: EditorView, getPos: () => number): React.ReactElement {\n this.view = view;\n this.getPos = getPos;\n return (\n <ImagePlaceholder\n onCancel={this.onCancel}\n onSubmit={this.onSubmit}\n onAttach={this.uploadImages && this.onAttach}\n renderForm={this.renderImageForm}\n />\n );\n }\n\n private onCancel: ImagePlaceholderProps['onCancel'] = () => {\n this.cancelled = true;\n this.view.dispatch(removeDecoration(this.view.state.tr, this.decoId));\n this.view.focus();\n };\n\n private onSubmit: ImagePlaceholderProps['onSubmit'] = (params) => {\n if (this.cancelled) return;\n\n const url = this.normalizeUrl(params.url)?.url;\n if (!url) return;\n\n const attrs = {\n [ImgSizeAttr.Src]: url,\n [ImgSizeAttr.Title]: params.name,\n [ImgSizeAttr.Alt]: params.alt,\n [ImgSizeAttr.Width]: isNumber(params.width) ? String(params.width) : null,\n [ImgSizeAttr.Height]: isNumber(params.height) ? String(params.height) : null,\n };\n\n const node = imageType(this.view.state.schema).create(attrs);\n this.insertNodes([node]);\n };\n\n private onAttach: ImagePlaceholderProps['onAttach'] = async (files) => {\n if (this.cancelled || !this.uploadImages) return;\n\n const {view} = this;\n new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {\n needDimensions: this.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n }).run();\n view.dispatch(removeWidget(view.state.tr, this.decoId));\n view.focus();\n };\n\n private insertNodes(fileNodes: Node[]) {\n if (this.cancelled) return;\n\n let tr = this.view.state.tr;\n tr = tr.insert(tr.mapping.map(this.getPos()), fileNodes);\n tr = removeWidget(tr, this.decoId);\n this.view.dispatch(tr);\n this.view.focus();\n }\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Action, ExtensionAuto } from "../../../core/index.js";
|
|
2
2
|
import { type ImagePasteOptions } from "./ImagePaste/index.js";
|
|
3
|
+
import { type ImageWidgetOptions } from "./ImageWidget/index.js";
|
|
3
4
|
import { type ImgSizeSpecsOptions } from "./ImgSizeSpecs/index.js";
|
|
4
5
|
import { type AddImageAttrs } from "./actions.js";
|
|
5
6
|
import { addImageAction } from "./const.js";
|
|
@@ -10,7 +11,7 @@ export type ImgSizeOptions = ImgSizeSpecsOptions & {
|
|
|
10
11
|
* @default false
|
|
11
12
|
*/
|
|
12
13
|
needToSetDimensionsForUploadedImages?: boolean;
|
|
13
|
-
} & Pick<ImagePasteOptions, 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'>;
|
|
14
|
+
} & Pick<ImagePasteOptions, 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'> & Pick<ImageWidgetOptions, 'renderImageWidgetForm'>;
|
|
14
15
|
export declare const ImgSize: ExtensionAuto<ImgSizeOptions>;
|
|
15
16
|
declare global {
|
|
16
17
|
namespace WysiwygEditor {
|
|
@@ -11,7 +11,9 @@ const ImgSize = (builder, opts) => {
|
|
|
11
11
|
builder.use(ImgSizeSpecs_1.ImgSizeSpecs, opts);
|
|
12
12
|
builder.use(ImageWidget_1.ImageWidget, {
|
|
13
13
|
imageUploadHandler: opts.imageUploadHandler,
|
|
14
|
+
renderImageWidgetForm: opts.renderImageWidgetForm,
|
|
14
15
|
needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),
|
|
16
|
+
enableNewImageSizeCalculation: Boolean(opts.enableNewImageSizeCalculation),
|
|
15
17
|
});
|
|
16
18
|
if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {
|
|
17
19
|
builder.use(ImagePaste_1.ImagePaste, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/index.ts"],"names":[],"mappings":";;;AAEA,sDAAgE;AAChE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/index.ts"],"names":[],"mappings":";;;AAEA,sDAAgE;AAChE,wDAAmE;AACnE,0DAAsE;AACtE,0CAAuD;AACvD,sCAAuC;AACvC,wEAAgE;AAezD,MAAM,OAAO,GAAkC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACpE,OAAO,CAAC,GAAG,CAAC,2BAAY,EAAE,IAAI,CAAC,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,yBAAW,EAAE;QACrB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,oCAAoC,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;QACxF,6BAA6B,EAAE,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC;KAC7E,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,uBAAU,EAAE;YACpB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;YAClE,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;SACpE,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,sBAAc,EAAE,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,IAAA,kBAAQ,EAAC,MAAM,CAAC,CAAC,CAAC;IAElE,OAAO,CAAC,SAAS,CAAC,uCAAqB,CAAC,CAAC;AAC7C,CAAC,CAAC;AAtBW,QAAA,OAAO,WAsBlB","sourcesContent":["import type {Action, ExtensionAuto} from '../../../core';\n\nimport {ImagePaste, type ImagePasteOptions} from './ImagePaste';\nimport {ImageWidget, type ImageWidgetOptions} from './ImageWidget';\nimport {ImgSizeSpecs, type ImgSizeSpecsOptions} from './ImgSizeSpecs';\nimport {type AddImageAttrs, addImage} from './actions';\nimport {addImageAction} from './const';\nimport {imgSizeNodeViewPlugin} from './plugins/ImgSizeNodeView';\n\nexport type ImgSizeOptions = ImgSizeSpecsOptions & {\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n} & Pick<\n ImagePasteOptions,\n 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'\n > &\n Pick<ImageWidgetOptions, 'renderImageWidgetForm'>;\n\nexport const ImgSize: ExtensionAuto<ImgSizeOptions> = (builder, opts) => {\n builder.use(ImgSizeSpecs, opts);\n\n builder.use(ImageWidget, {\n imageUploadHandler: opts.imageUploadHandler,\n renderImageWidgetForm: opts.renderImageWidgetForm,\n needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),\n enableNewImageSizeCalculation: Boolean(opts.enableNewImageSizeCalculation),\n });\n\n if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {\n builder.use(ImagePaste, {\n imageUploadHandler: opts.imageUploadHandler,\n needDimensions: Boolean(opts.needToSetDimensionsForUploadedImages),\n parseInsertedUrlAsImage: opts.parseInsertedUrlAsImage,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n });\n }\n\n builder.addAction(addImageAction, ({schema}) => addImage(schema));\n\n builder.addPlugin(imgSizeNodeViewPlugin);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n // @ts-expect-error\n [addImageAction]: Action<AddImageAttrs>;\n }\n }\n}\n"]}
|
package/build/cjs/version.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.VERSION = void 0;
|
|
4
4
|
/** During build process, the current version will be injected here */
|
|
5
|
-
exports.VERSION = typeof '15.0
|
|
5
|
+
exports.VERSION = typeof '15.1.0' !== 'undefined' ? '15.1.0' : 'unknown';
|
|
6
6
|
//# sourceMappingURL=version.js.map
|
package/build/cjs/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.0
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.1.0' !== 'undefined' ? '15.1.0' : 'unknown';\n"]}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { Action, ExtensionAuto } from "../../../../core/index.js";
|
|
2
2
|
import type { FileUploadHandler } from "../../../../utils/upload.js";
|
|
3
|
+
import type { RenderImageWidgetFormFn } from "./view.js";
|
|
3
4
|
import type { ImageWidgetDescriptorOpts } from "./widget.js";
|
|
4
5
|
declare const addImageWidgetAction = "addImageWidget";
|
|
5
|
-
export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages'> & {
|
|
6
|
+
export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'> & {
|
|
6
7
|
imageUploadHandler?: FileUploadHandler;
|
|
8
|
+
renderImageWidgetForm?: RenderImageWidgetFormFn;
|
|
7
9
|
};
|
|
8
10
|
export declare const ImageWidget: ExtensionAuto<ImageWidgetOptions>;
|
|
9
11
|
declare global {
|
|
@@ -3,7 +3,9 @@ const addImageWidgetAction = 'addImageWidget';
|
|
|
3
3
|
export const ImageWidget = (builder, opts) => {
|
|
4
4
|
builder.addAction(addImageWidgetAction, (deps) => addImageWidget(deps, {
|
|
5
5
|
uploadImages: opts.imageUploadHandler,
|
|
6
|
+
renderImageForm: opts.renderImageWidgetForm,
|
|
6
7
|
needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,
|
|
8
|
+
enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,
|
|
7
9
|
}));
|
|
8
10
|
};
|
|
9
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,cAAc,EAAC,qBAAkB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,cAAc,EAAC,qBAAkB;AAIzC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAU9C,MAAM,CAAC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,OAAO,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7C,cAAc,CAAC,IAAI,EAAE;QACjB,YAAY,EAAE,IAAI,CAAC,kBAAkB;QACrC,eAAe,EAAE,IAAI,CAAC,qBAAqB;QAC3C,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;QAC/E,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;KACpE,CAAC,CACL,CAAC;AACN,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\n\nimport {addImageWidget} from './actions';\nimport type {RenderImageWidgetFormFn} from './view';\nimport type {ImageWidgetDescriptorOpts} from './widget';\n\nconst addImageWidgetAction = 'addImageWidget';\n\nexport type ImageWidgetOptions = Pick<\n ImageWidgetDescriptorOpts,\n 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'\n> & {\n imageUploadHandler?: FileUploadHandler;\n renderImageWidgetForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImageWidget: ExtensionAuto<ImageWidgetOptions> = (builder, opts) => {\n builder.addAction(addImageWidgetAction, (deps) =>\n addImageWidget(deps, {\n uploadImages: opts.imageUploadHandler,\n renderImageForm: opts.renderImageWidgetForm,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n }),\n );\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [addImageWidgetAction]: Action;\n }\n }\n}\n"]}
|
|
@@ -1,8 +1,20 @@
|
|
|
1
|
-
import { type ImageFormProps } from "../../../../forms/ImageForm.js";
|
|
1
|
+
import { type ImageFormProps, type ImageFormSubmitParams } from "../../../../forms/ImageForm.js";
|
|
2
2
|
import "./view.css";
|
|
3
|
-
export type
|
|
3
|
+
export type RenderImageWidgetFormProps = {
|
|
4
|
+
/** Handler for submitting form */
|
|
5
|
+
onSubmit: (params: ImageFormSubmitParams) => void;
|
|
6
|
+
/** Handler for cancellation */
|
|
7
|
+
onCancel: () => void;
|
|
8
|
+
/** Handler for attach file from device */
|
|
9
|
+
onAttach?: (files: File[]) => void;
|
|
10
|
+
/** Uploading attached file */
|
|
11
|
+
uploading?: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;
|
|
14
|
+
export type ImagePlaceholderProps = {
|
|
4
15
|
onCancel: () => void;
|
|
5
16
|
onSubmit: ImageFormProps['onSubmit'];
|
|
6
17
|
onAttach?: (files: File[]) => Promise<void>;
|
|
18
|
+
renderForm?: RenderImageWidgetFormFn;
|
|
7
19
|
};
|
|
8
|
-
export declare const
|
|
20
|
+
export declare const ImagePlaceholder: React.FC<ImagePlaceholderProps>;
|
|
@@ -4,28 +4,36 @@ import { Picture as ImageIcon } from '@gravity-ui/icons';
|
|
|
4
4
|
import { Icon, Popup } from '@gravity-ui/uikit';
|
|
5
5
|
import { useMountedState } from 'react-use';
|
|
6
6
|
import { cn } from "../../../../classname.js";
|
|
7
|
-
import { ImageForm } from "../../../../forms/ImageForm.js";
|
|
7
|
+
import { ImageForm, } from "../../../../forms/ImageForm.js";
|
|
8
8
|
import { i18n } from "../../../../i18n/widgets/index.js";
|
|
9
9
|
import { useBooleanState, useElementState } from "../../../../react-utils/hooks.js";
|
|
10
10
|
import "./view.css";
|
|
11
11
|
const b = cn('image-placeholder');
|
|
12
12
|
const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
|
|
13
|
-
|
|
13
|
+
const defaultFormRenderer = (props) => {
|
|
14
|
+
return (_jsx(ImageForm, { autoFocus: true, loading: props.uploading, onCancel: props.onCancel, onSubmit: props.onSubmit, onAttach: props.onAttach }));
|
|
15
|
+
};
|
|
16
|
+
export const ImagePlaceholder = ({ onCancel, onSubmit, onAttach, renderForm, }) => {
|
|
14
17
|
const isMounted = useMountedState();
|
|
15
|
-
const [
|
|
18
|
+
const [uploading, startUploading, stopUploading] = useBooleanState(false);
|
|
16
19
|
const [anchor, setAnchor] = useElementState();
|
|
17
20
|
const attachHandler = useCallback((files) => {
|
|
18
21
|
if (!onAttach)
|
|
19
22
|
return;
|
|
20
23
|
if (isMounted()) {
|
|
21
|
-
|
|
24
|
+
startUploading();
|
|
22
25
|
onAttach(files).finally(() => {
|
|
23
26
|
if (isMounted()) {
|
|
24
|
-
|
|
27
|
+
stopUploading();
|
|
25
28
|
}
|
|
26
29
|
});
|
|
27
30
|
}
|
|
28
|
-
}, [isMounted, onAttach,
|
|
29
|
-
return (_jsxs(_Fragment, { children: [_jsxs("div", { ref: setAnchor, className: b(), children: [_jsx(Icon, { data: ImageIcon, size: 24 }), i18n('image')] }), _jsx(Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children:
|
|
31
|
+
}, [isMounted, onAttach, startUploading, stopUploading]);
|
|
32
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { ref: setAnchor, className: b(), children: [_jsx(Icon, { data: ImageIcon, size: 24 }), i18n('image')] }), _jsx(Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: (renderForm || defaultFormRenderer)({
|
|
33
|
+
onCancel,
|
|
34
|
+
onSubmit,
|
|
35
|
+
uploading,
|
|
36
|
+
onAttach: onAttach && attachHandler,
|
|
37
|
+
}) })] }));
|
|
30
38
|
};
|
|
31
39
|
//# sourceMappingURL=view.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAC,IAAI,EAAE,KAAK,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAC,IAAI,EAAE,KAAK,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,EACH,SAAS,GAGZ,uCAAoC;AACrC,OAAO,EAAC,IAAI,EAAC,0CAAiC;AAC9C,OAAO,EAAC,eAAe,EAAE,eAAe,EAAC,yCAAsC;AAE/E,oBAAqB;AAErB,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAczF,MAAM,mBAAmB,GAA4B,CAAC,KAAK,EAAE,EAAE;IAC3D,OAAO,CACH,KAAC,SAAS,IACN,SAAS,QACT,OAAO,EAAE,KAAK,CAAC,SAAS,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAC1B,CACL,CAAC;AACN,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAC9D,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,GACb,EAAE,EAAE;IACD,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,CAAC,SAAS,EAAE,cAAc,EAAE,aAAa,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAC1E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,eAAe,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,WAAW,CAC7B,CAAC,KAAK,EAAE,EAAE;QACN,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,SAAS,EAAE,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;YACjB,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzB,IAAI,SAAS,EAAE,EAAE,CAAC;oBACd,aAAa,EAAE,CAAC;gBACpB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC,EACD,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,CACvD,CAAC;IAEF,OAAO,CACH,8BACI,eAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,aAC/B,KAAC,IAAI,IAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAI,EAClC,IAAI,CAAC,OAAO,CAAC,IACZ,EACN,KAAC,KAAK,IAAC,IAAI,QAAC,KAAK,QAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,YAChF,CAAC,UAAU,IAAI,mBAAmB,CAAC,CAAC;oBACjC,QAAQ;oBACR,QAAQ;oBACR,SAAS;oBACT,QAAQ,EAAE,QAAQ,IAAI,aAAa;iBACtC,CAAC,GACE,IACT,CACN,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Picture as ImageIcon} from '@gravity-ui/icons';\nimport {Icon, Popup, type PopupPlacement} from '@gravity-ui/uikit';\nimport {useMountedState} from 'react-use';\n\nimport {cn} from '../../../../classname';\nimport {\n ImageForm,\n type ImageFormProps,\n type ImageFormSubmitParams,\n} from '../../../../forms/ImageForm';\nimport {i18n} from '../../../../i18n/widgets';\nimport {useBooleanState, useElementState} from '../../../../react-utils/hooks';\n\nimport './view.scss';\n\nconst b = cn('image-placeholder');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type RenderImageWidgetFormProps = {\n /** Handler for submitting form */\n onSubmit: (params: ImageFormSubmitParams) => void;\n /** Handler for cancellation */\n onCancel: () => void;\n /** Handler for attach file from device */\n onAttach?: (files: File[]) => void;\n /** Uploading attached file */\n uploading?: boolean;\n};\nexport type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;\n\nconst defaultFormRenderer: RenderImageWidgetFormFn = (props) => {\n return (\n <ImageForm\n autoFocus\n loading={props.uploading}\n onCancel={props.onCancel}\n onSubmit={props.onSubmit}\n onAttach={props.onAttach}\n />\n );\n};\n\nexport type ImagePlaceholderProps = {\n onCancel: () => void;\n onSubmit: ImageFormProps['onSubmit'];\n onAttach?: (files: File[]) => Promise<void>;\n renderForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImagePlaceholder: React.FC<ImagePlaceholderProps> = ({\n onCancel,\n onSubmit,\n onAttach,\n renderForm,\n}) => {\n const isMounted = useMountedState();\n const [uploading, startUploading, stopUploading] = useBooleanState(false);\n const [anchor, setAnchor] = useElementState();\n const attachHandler = useCallback<NonNullable<ImageFormProps['onAttach']>>(\n (files) => {\n if (!onAttach) return;\n if (isMounted()) {\n startUploading();\n onAttach(files).finally(() => {\n if (isMounted()) {\n stopUploading();\n }\n });\n }\n },\n [isMounted, onAttach, startUploading, stopUploading],\n );\n\n return (\n <>\n <div ref={setAnchor} className={b()}>\n <Icon data={ImageIcon} size={24} />\n {i18n('image')}\n </div>\n <Popup open modal onOpenChange={onCancel} anchorElement={anchor} placement={placement}>\n {(renderForm || defaultFormRenderer)({\n onCancel,\n onSubmit,\n uploading,\n onAttach: onAttach && attachHandler,\n })}\n </Popup>\n </>\n );\n};\n"]}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { Transaction } from 'prosemirror-state';
|
|
2
2
|
import type { ExtensionDeps } from "../../../../core/index.js";
|
|
3
3
|
import type { FileUploadHandler } from "../../../../utils/upload.js";
|
|
4
|
+
import { type RenderImageWidgetFormFn } from "./view.js";
|
|
4
5
|
export declare const addWidget: (tr: Transaction, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) => Transaction;
|
|
5
6
|
export declare const removeWidget: (tr: Transaction, id: string) => Transaction;
|
|
6
7
|
export type ImageWidgetDescriptorOpts = {
|
|
7
8
|
needToSetDimensionsForUploadedImages: boolean;
|
|
8
9
|
uploadImages?: FileUploadHandler;
|
|
10
|
+
enableNewImageSizeCalculation?: boolean;
|
|
11
|
+
renderImageForm?: RenderImageWidgetFormFn;
|
|
9
12
|
};
|
|
@@ -4,7 +4,7 @@ import { ReactWidgetDescriptor, removeDecoration } from "../../../behavior/Widge
|
|
|
4
4
|
import { imageType, normalizeUrlFactory } from "../../../markdown/index.js";
|
|
5
5
|
import { ImgSizeAttr } from "../../../specs.js";
|
|
6
6
|
import { ImagesUploadProcess } from "../ImagePaste/upload.js";
|
|
7
|
-
import {
|
|
7
|
+
import { ImagePlaceholder } from "./view.js";
|
|
8
8
|
export const addWidget = (tr, deps, opts) => {
|
|
9
9
|
return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);
|
|
10
10
|
};
|
|
@@ -14,13 +14,17 @@ class ImageWidgetDescriptor extends ReactWidgetDescriptor {
|
|
|
14
14
|
deps;
|
|
15
15
|
uploadImages;
|
|
16
16
|
needToSetDimensionsForUploadedImages;
|
|
17
|
+
enableNewImageSizeCalculation;
|
|
18
|
+
renderImageForm;
|
|
17
19
|
widgetHandler = null;
|
|
18
20
|
constructor(initPos, deps, opts) {
|
|
19
21
|
super(initPos, 'image_placeholder');
|
|
20
22
|
this.domElem = document.createElement('span');
|
|
21
23
|
this.deps = deps;
|
|
22
24
|
this.uploadImages = opts.uploadImages;
|
|
25
|
+
this.renderImageForm = opts.renderImageForm;
|
|
23
26
|
this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;
|
|
27
|
+
this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;
|
|
24
28
|
}
|
|
25
29
|
getWidgetHandler(view, getPos) {
|
|
26
30
|
if (!this.widgetHandler) {
|
|
@@ -29,7 +33,9 @@ class ImageWidgetDescriptor extends ReactWidgetDescriptor {
|
|
|
29
33
|
getPos,
|
|
30
34
|
decoId: this.id,
|
|
31
35
|
uploadImages: this.uploadImages,
|
|
36
|
+
renderImageForm: this.renderImageForm,
|
|
32
37
|
needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,
|
|
38
|
+
enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
|
|
33
39
|
}, this.deps);
|
|
34
40
|
}
|
|
35
41
|
return this.widgetHandler;
|
|
@@ -53,14 +59,18 @@ class ImageWidgetHandler {
|
|
|
53
59
|
uploadImages;
|
|
54
60
|
normalizeUrl;
|
|
55
61
|
needToSetDimensionsForUploadedImages;
|
|
62
|
+
enableNewImageSizeCalculation;
|
|
63
|
+
renderImageForm;
|
|
56
64
|
cancelled = false;
|
|
57
|
-
constructor({ decoId, view, getPos, uploadImages, needToSetDimensionsForUploadedImages, }, deps) {
|
|
65
|
+
constructor({ decoId, view, getPos, uploadImages, renderImageForm, needToSetDimensionsForUploadedImages, enableNewImageSizeCalculation, }, deps) {
|
|
58
66
|
this.decoId = decoId;
|
|
59
67
|
this.view = view;
|
|
60
68
|
this.getPos = getPos;
|
|
61
69
|
this.uploadImages = uploadImages;
|
|
62
70
|
this.normalizeUrl = normalizeUrlFactory(deps);
|
|
71
|
+
this.renderImageForm = renderImageForm;
|
|
63
72
|
this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;
|
|
73
|
+
this.enableNewImageSizeCalculation = enableNewImageSizeCalculation;
|
|
64
74
|
}
|
|
65
75
|
destruct() {
|
|
66
76
|
this.cancelled = true;
|
|
@@ -68,7 +78,7 @@ class ImageWidgetHandler {
|
|
|
68
78
|
renderWidgetView(view, getPos) {
|
|
69
79
|
this.view = view;
|
|
70
80
|
this.getPos = getPos;
|
|
71
|
-
return (_jsx(
|
|
81
|
+
return (_jsx(ImagePlaceholder, { onCancel: this.onCancel, onSubmit: this.onSubmit, onAttach: this.uploadImages && this.onAttach, renderForm: this.renderImageForm }));
|
|
72
82
|
}
|
|
73
83
|
onCancel = () => {
|
|
74
84
|
this.cancelled = true;
|
|
@@ -97,6 +107,7 @@ class ImageWidgetHandler {
|
|
|
97
107
|
const { view } = this;
|
|
98
108
|
new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {
|
|
99
109
|
needDimensions: this.needToSetDimensionsForUploadedImages,
|
|
110
|
+
enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
|
|
100
111
|
}).run();
|
|
101
112
|
view.dispatch(removeWidget(view.state.tr, this.decoId));
|
|
102
113
|
view.focus();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/widget.tsx"],"names":[],"mappings":";AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAOjC,OAAO,EAAC,qBAAqB,EAAE,gBAAgB,EAAC,oDAA2C;AAC3F,OAAO,EAAC,SAAS,EAAE,mBAAmB,EAAC,mCAA0B;AACjE,OAAO,EAAC,WAAW,EAAC,0BAAuB;AAC3C,OAAO,EAAC,mBAAmB,EAAC,gCAA6B;AAEzD,OAAO,EAAC,eAAe,EAA4B,kBAAe;AAElE,MAAM,CAAC,MAAM,SAAS,GAAG,CACrB,EAAe,EACf,IAAmB,EACnB,IAA+B,EACjC,EAAE;IACA,OAAO,IAAI,qBAAqB,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAChF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAO7C,MAAM,qBAAsB,SAAQ,qBAAqB;IACpC,OAAO,CAAC;IACR,IAAI,CAAC;IACL,YAAY,CAAC;IACb,oCAAoC,CAAU;IAEvD,aAAa,GAA8B,IAAI,CAAC;IAExD,YAAY,OAAe,EAAE,IAAmB,EAAE,IAA+B;QAC7E,KAAK,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,oCAAoC,GAAG,IAAI,CAAC,oCAAoC,CAAC;IAC1F,CAAC;IAED,gBAAgB,CAAC,IAAgB,EAAE,MAAoB;QACnD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACtB,IAAI,CAAC,aAAa,GAAG,IAAI,kBAAkB,CACvC;gBACI,IAAI;gBACJ,MAAM;gBACN,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;aAClF,EACD,IAAI,CAAC,IAAI,CACZ,CAAC;QACN,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,kBAAkB,CAAC,IAAgB,EAAE,MAAoB;QACrD,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM;QACF,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC9B,CAAC;CACJ;AAUD,MAAM,kBAAkB;IACZ,IAAI,CAAC;IACL,MAAM,CAAC;IAEE,MAAM,CAAS;IACf,YAAY,CAAC;IACb,YAAY,CAAC;IACb,oCAAoC,CAAU;IAEvD,SAAS,GAAG,KAAK,CAAC;IAE1B,YACI,EACI,MAAM,EACN,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,oCAAoC,GACd,EAC1B,IAAmB;QAEnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,oCAAoC,GAAG,oCAAoC,CAAC;IACrF,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,gBAAgB,CAAC,IAAgB,EAAE,MAAoB;QACnD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,OAAO,CACH,KAAC,eAAe,IACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,QAAQ,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,GAC9C,CACL,CAAC;IACN,CAAC;IAEO,QAAQ,GAAqC,GAAG,EAAE;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC,CAAC;IAEM,QAAQ,GAAqC,CAAC,MAAM,EAAE,EAAE;QAC5D,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QAC/C,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,MAAM,KAAK,GAAG;YACV,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG;YACtB,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI;YAChC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG;YAC7B,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;YACzE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;SAC/E,CAAC;QAEF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEM,QAAQ,GAAqC,KAAK,EAAE,KAAK,EAAE,EAAE;QACjE,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAEjD,MAAM,EAAC,IAAI,EAAC,GAAG,IAAI,CAAC;QACpB,IAAI,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;YACnE,cAAc,EAAE,IAAI,CAAC,oCAAoC;SAC5D,CAAC,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC;IAEM,WAAW,CAAC,SAAiB;QACjC,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAE3B,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QACzD,EAAE,GAAG,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACJ","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\nimport {ReactWidgetDescriptor, removeDecoration} from '../../../behavior/WidgetDecoration';\nimport {imageType, normalizeUrlFactory} from '../../../markdown';\nimport {ImgSizeAttr} from '../../../specs';\nimport {ImagesUploadProcess} from '../ImagePaste/upload';\n\nimport {FilePlaceholder, type FilePlaceholderProps} from './view';\n\nexport const addWidget = (\n tr: Transaction,\n deps: ExtensionDeps,\n opts: ImageWidgetDescriptorOpts,\n) => {\n return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);\n};\n\nexport const removeWidget = removeDecoration;\n\nexport type ImageWidgetDescriptorOpts = {\n needToSetDimensionsForUploadedImages: boolean;\n uploadImages?: FileUploadHandler;\n};\n\nclass ImageWidgetDescriptor extends ReactWidgetDescriptor {\n private readonly domElem;\n private readonly deps;\n private readonly uploadImages;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n\n private widgetHandler: ImageWidgetHandler | null = null;\n\n constructor(initPos: number, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) {\n super(initPos, 'image_placeholder');\n this.domElem = document.createElement('span');\n this.deps = deps;\n this.uploadImages = opts.uploadImages;\n this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;\n }\n\n getWidgetHandler(view: EditorView, getPos: () => number): ImageWidgetHandler {\n if (!this.widgetHandler) {\n this.widgetHandler = new ImageWidgetHandler(\n {\n view,\n getPos,\n decoId: this.id,\n uploadImages: this.uploadImages,\n needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,\n },\n this.deps,\n );\n }\n return this.widgetHandler;\n }\n\n getDomElem(): HTMLElement {\n return this.domElem;\n }\n\n renderReactElement(view: EditorView, getPos: () => number): React.ReactElement {\n return this.getWidgetHandler(view, getPos).renderWidgetView(view, getPos);\n }\n\n remove(): void {\n super.remove();\n this.widgetHandler?.destruct();\n this.widgetHandler = null;\n }\n}\n\ntype ImageWidgetHandlerProps = {\n decoId: string;\n view: EditorView;\n getPos: () => number;\n uploadImages?: FileUploadHandler;\n needToSetDimensionsForUploadedImages: boolean;\n};\n\nclass ImageWidgetHandler {\n private view;\n private getPos;\n\n private readonly decoId: string;\n private readonly uploadImages;\n private readonly normalizeUrl;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n\n private cancelled = false;\n\n constructor(\n {\n decoId,\n view,\n getPos,\n uploadImages,\n needToSetDimensionsForUploadedImages,\n }: ImageWidgetHandlerProps,\n deps: ExtensionDeps,\n ) {\n this.decoId = decoId;\n this.view = view;\n this.getPos = getPos;\n this.uploadImages = uploadImages;\n this.normalizeUrl = normalizeUrlFactory(deps);\n this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;\n }\n\n destruct() {\n this.cancelled = true;\n }\n\n renderWidgetView(view: EditorView, getPos: () => number): React.ReactElement {\n this.view = view;\n this.getPos = getPos;\n return (\n <FilePlaceholder\n onCancel={this.onCancel}\n onSubmit={this.onSubmit}\n onAttach={this.uploadImages && this.onAttach}\n />\n );\n }\n\n private onCancel: FilePlaceholderProps['onCancel'] = () => {\n this.cancelled = true;\n this.view.dispatch(removeDecoration(this.view.state.tr, this.decoId));\n this.view.focus();\n };\n\n private onSubmit: FilePlaceholderProps['onSubmit'] = (params) => {\n if (this.cancelled) return;\n\n const url = this.normalizeUrl(params.url)?.url;\n if (!url) return;\n\n const attrs = {\n [ImgSizeAttr.Src]: url,\n [ImgSizeAttr.Title]: params.name,\n [ImgSizeAttr.Alt]: params.alt,\n [ImgSizeAttr.Width]: isNumber(params.width) ? String(params.width) : null,\n [ImgSizeAttr.Height]: isNumber(params.height) ? String(params.height) : null,\n };\n\n const node = imageType(this.view.state.schema).create(attrs);\n this.insertNodes([node]);\n };\n\n private onAttach: FilePlaceholderProps['onAttach'] = async (files) => {\n if (this.cancelled || !this.uploadImages) return;\n\n const {view} = this;\n new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {\n needDimensions: this.needToSetDimensionsForUploadedImages,\n }).run();\n view.dispatch(removeWidget(view.state.tr, this.decoId));\n view.focus();\n };\n\n private insertNodes(fileNodes: Node[]) {\n if (this.cancelled) return;\n\n let tr = this.view.state.tr;\n tr = tr.insert(tr.mapping.map(this.getPos()), fileNodes);\n tr = removeWidget(tr, this.decoId);\n this.view.dispatch(tr);\n this.view.focus();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"widget.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\nimport type {Transaction} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\nimport {ReactWidgetDescriptor, removeDecoration} from '../../../behavior/WidgetDecoration';\nimport {imageType, normalizeUrlFactory} from '../../../markdown';\nimport {ImgSizeAttr} from '../../../specs';\nimport {ImagesUploadProcess} from '../ImagePaste/upload';\n\nimport {ImagePlaceholder, type ImagePlaceholderProps, type RenderImageWidgetFormFn} from './view';\n\nexport const addWidget = (\n tr: Transaction,\n deps: ExtensionDeps,\n opts: ImageWidgetDescriptorOpts,\n) => {\n return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);\n};\n\nexport const removeWidget = removeDecoration;\n\nexport type ImageWidgetDescriptorOpts = {\n needToSetDimensionsForUploadedImages: boolean;\n uploadImages?: FileUploadHandler;\n enableNewImageSizeCalculation?: boolean;\n renderImageForm?: RenderImageWidgetFormFn;\n};\n\nclass ImageWidgetDescriptor extends ReactWidgetDescriptor {\n private readonly domElem;\n private readonly deps;\n private readonly uploadImages;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n private readonly enableNewImageSizeCalculation?: boolean;\n private readonly renderImageForm: RenderImageWidgetFormFn | undefined;\n\n private widgetHandler: ImageWidgetHandler | null = null;\n\n constructor(initPos: number, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) {\n super(initPos, 'image_placeholder');\n this.domElem = document.createElement('span');\n this.deps = deps;\n this.uploadImages = opts.uploadImages;\n this.renderImageForm = opts.renderImageForm;\n this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;\n this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;\n }\n\n getWidgetHandler(view: EditorView, getPos: () => number): ImageWidgetHandler {\n if (!this.widgetHandler) {\n this.widgetHandler = new ImageWidgetHandler(\n {\n view,\n getPos,\n decoId: this.id,\n uploadImages: this.uploadImages,\n renderImageForm: this.renderImageForm,\n needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n },\n this.deps,\n );\n }\n return this.widgetHandler;\n }\n\n getDomElem(): HTMLElement {\n return this.domElem;\n }\n\n renderReactElement(view: EditorView, getPos: () => number): React.ReactElement {\n return this.getWidgetHandler(view, getPos).renderWidgetView(view, getPos);\n }\n\n remove(): void {\n super.remove();\n this.widgetHandler?.destruct();\n this.widgetHandler = null;\n }\n}\n\ntype ImageWidgetHandlerProps = {\n decoId: string;\n view: EditorView;\n getPos: () => number;\n uploadImages?: FileUploadHandler;\n renderImageForm?: RenderImageWidgetFormFn;\n needToSetDimensionsForUploadedImages: boolean;\n enableNewImageSizeCalculation?: boolean;\n};\n\nclass ImageWidgetHandler {\n private view;\n private getPos;\n\n private readonly decoId: string;\n private readonly uploadImages;\n private readonly normalizeUrl;\n private readonly needToSetDimensionsForUploadedImages: boolean;\n private readonly enableNewImageSizeCalculation?: boolean;\n private readonly renderImageForm: RenderImageWidgetFormFn | undefined;\n\n private cancelled = false;\n\n constructor(\n {\n decoId,\n view,\n getPos,\n uploadImages,\n renderImageForm,\n needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation,\n }: ImageWidgetHandlerProps,\n deps: ExtensionDeps,\n ) {\n this.decoId = decoId;\n this.view = view;\n this.getPos = getPos;\n this.uploadImages = uploadImages;\n this.normalizeUrl = normalizeUrlFactory(deps);\n this.renderImageForm = renderImageForm;\n this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;\n this.enableNewImageSizeCalculation = enableNewImageSizeCalculation;\n }\n\n destruct() {\n this.cancelled = true;\n }\n\n renderWidgetView(view: EditorView, getPos: () => number): React.ReactElement {\n this.view = view;\n this.getPos = getPos;\n return (\n <ImagePlaceholder\n onCancel={this.onCancel}\n onSubmit={this.onSubmit}\n onAttach={this.uploadImages && this.onAttach}\n renderForm={this.renderImageForm}\n />\n );\n }\n\n private onCancel: ImagePlaceholderProps['onCancel'] = () => {\n this.cancelled = true;\n this.view.dispatch(removeDecoration(this.view.state.tr, this.decoId));\n this.view.focus();\n };\n\n private onSubmit: ImagePlaceholderProps['onSubmit'] = (params) => {\n if (this.cancelled) return;\n\n const url = this.normalizeUrl(params.url)?.url;\n if (!url) return;\n\n const attrs = {\n [ImgSizeAttr.Src]: url,\n [ImgSizeAttr.Title]: params.name,\n [ImgSizeAttr.Alt]: params.alt,\n [ImgSizeAttr.Width]: isNumber(params.width) ? String(params.width) : null,\n [ImgSizeAttr.Height]: isNumber(params.height) ? String(params.height) : null,\n };\n\n const node = imageType(this.view.state.schema).create(attrs);\n this.insertNodes([node]);\n };\n\n private onAttach: ImagePlaceholderProps['onAttach'] = async (files) => {\n if (this.cancelled || !this.uploadImages) return;\n\n const {view} = this;\n new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {\n needDimensions: this.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n }).run();\n view.dispatch(removeWidget(view.state.tr, this.decoId));\n view.focus();\n };\n\n private insertNodes(fileNodes: Node[]) {\n if (this.cancelled) return;\n\n let tr = this.view.state.tr;\n tr = tr.insert(tr.mapping.map(this.getPos()), fileNodes);\n tr = removeWidget(tr, this.decoId);\n this.view.dispatch(tr);\n this.view.focus();\n }\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Action, ExtensionAuto } from "../../../core/index.js";
|
|
2
2
|
import { type ImagePasteOptions } from "./ImagePaste/index.js";
|
|
3
|
+
import { type ImageWidgetOptions } from "./ImageWidget/index.js";
|
|
3
4
|
import { type ImgSizeSpecsOptions } from "./ImgSizeSpecs/index.js";
|
|
4
5
|
import { type AddImageAttrs } from "./actions.js";
|
|
5
6
|
import { addImageAction } from "./const.js";
|
|
@@ -10,7 +11,7 @@ export type ImgSizeOptions = ImgSizeSpecsOptions & {
|
|
|
10
11
|
* @default false
|
|
11
12
|
*/
|
|
12
13
|
needToSetDimensionsForUploadedImages?: boolean;
|
|
13
|
-
} & Pick<ImagePasteOptions, 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'>;
|
|
14
|
+
} & Pick<ImagePasteOptions, 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'> & Pick<ImageWidgetOptions, 'renderImageWidgetForm'>;
|
|
14
15
|
export declare const ImgSize: ExtensionAuto<ImgSizeOptions>;
|
|
15
16
|
declare global {
|
|
16
17
|
namespace WysiwygEditor {
|
|
@@ -8,7 +8,9 @@ export const ImgSize = (builder, opts) => {
|
|
|
8
8
|
builder.use(ImgSizeSpecs, opts);
|
|
9
9
|
builder.use(ImageWidget, {
|
|
10
10
|
imageUploadHandler: opts.imageUploadHandler,
|
|
11
|
+
renderImageWidgetForm: opts.renderImageWidgetForm,
|
|
11
12
|
needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),
|
|
13
|
+
enableNewImageSizeCalculation: Boolean(opts.enableNewImageSizeCalculation),
|
|
12
14
|
});
|
|
13
15
|
if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {
|
|
14
16
|
builder.use(ImagePaste, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,UAAU,EAAyB,8BAAqB;AAChE,OAAO,EAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,UAAU,EAAyB,8BAAqB;AAChE,OAAO,EAAC,WAAW,EAA0B,+BAAsB;AACnE,OAAO,EAAC,YAAY,EAA2B,gCAAuB;AACtE,OAAO,EAAqB,QAAQ,EAAC,qBAAkB;AACvD,OAAO,EAAC,cAAc,EAAC,mBAAgB;AACvC,OAAO,EAAC,qBAAqB,EAAC,2CAAkC;AAehE,MAAM,CAAC,MAAM,OAAO,GAAkC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACpE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE;QACrB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,oCAAoC,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;QACxF,6BAA6B,EAAE,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC;KAC7E,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE;YACpB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;YAClE,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;SACpE,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAElE,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;AAC7C,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto} from '../../../core';\n\nimport {ImagePaste, type ImagePasteOptions} from './ImagePaste';\nimport {ImageWidget, type ImageWidgetOptions} from './ImageWidget';\nimport {ImgSizeSpecs, type ImgSizeSpecsOptions} from './ImgSizeSpecs';\nimport {type AddImageAttrs, addImage} from './actions';\nimport {addImageAction} from './const';\nimport {imgSizeNodeViewPlugin} from './plugins/ImgSizeNodeView';\n\nexport type ImgSizeOptions = ImgSizeSpecsOptions & {\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n} & Pick<\n ImagePasteOptions,\n 'imageUploadHandler' | 'parseInsertedUrlAsImage' | 'enableNewImageSizeCalculation'\n > &\n Pick<ImageWidgetOptions, 'renderImageWidgetForm'>;\n\nexport const ImgSize: ExtensionAuto<ImgSizeOptions> = (builder, opts) => {\n builder.use(ImgSizeSpecs, opts);\n\n builder.use(ImageWidget, {\n imageUploadHandler: opts.imageUploadHandler,\n renderImageWidgetForm: opts.renderImageWidgetForm,\n needToSetDimensionsForUploadedImages: Boolean(opts.needToSetDimensionsForUploadedImages),\n enableNewImageSizeCalculation: Boolean(opts.enableNewImageSizeCalculation),\n });\n\n if (opts.imageUploadHandler || opts.parseInsertedUrlAsImage) {\n builder.use(ImagePaste, {\n imageUploadHandler: opts.imageUploadHandler,\n needDimensions: Boolean(opts.needToSetDimensionsForUploadedImages),\n parseInsertedUrlAsImage: opts.parseInsertedUrlAsImage,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n });\n }\n\n builder.addAction(addImageAction, ({schema}) => addImage(schema));\n\n builder.addPlugin(imgSizeNodeViewPlugin);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n // @ts-expect-error\n [addImageAction]: Action<AddImageAttrs>;\n }\n }\n}\n"]}
|
package/build/esm/version.js
CHANGED
package/build/esm/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.0
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.1.0' !== 'undefined' ? '15.1.0' : 'unknown';\n"]}
|
package/build/styles.css
CHANGED
|
@@ -1162,7 +1162,7 @@ body :has(.g-md-resizable_resizing) {
|
|
|
1162
1162
|
.ProseMirror.yfm .yfm-cut .yfm-cut-title:focus {
|
|
1163
1163
|
outline: 0;
|
|
1164
1164
|
}
|
|
1165
|
-
.ProseMirror.yfm .yfm-cut.open .yfm-cut-title:before {
|
|
1165
|
+
.ProseMirror.yfm .yfm-cut.open > .yfm-cut-title:before {
|
|
1166
1166
|
transform: translateY(-50%);
|
|
1167
1167
|
}
|
|
1168
1168
|
.yfm-editor .yfm-file {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gravity-ui/markdown-editor",
|
|
3
|
-
"version": "15.0
|
|
3
|
+
"version": "15.1.0",
|
|
4
4
|
"description": "Markdown wysiwyg and markup editor",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -259,7 +259,7 @@
|
|
|
259
259
|
"jsdom": "25.0.1",
|
|
260
260
|
"lowlight": "3.0.0",
|
|
261
261
|
"markdown-it-testgen": "^0.1.6",
|
|
262
|
-
"mermaid": "
|
|
262
|
+
"mermaid": "11.4.1",
|
|
263
263
|
"npm-run-all": "^4.1.5",
|
|
264
264
|
"postcss": "^8.4.27",
|
|
265
265
|
"prettier": "3.1.1",
|