@quadrats/common 1.1.4 → 1.1.5
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/card/createCard.js +20 -2
- package/card/index.cjs.js +19 -1
- package/carousel/createCarousel.js +20 -2
- package/carousel/index.cjs.js +19 -1
- package/carousel/typings.d.ts +1 -1
- package/embed/createEmbed.js +46 -12
- package/embed/index.cjs.js +45 -11
- package/file-uploader/createFileUploader.d.ts +2 -2
- package/file-uploader/createFileUploader.js +34 -10
- package/file-uploader/index.cjs.js +33 -9
- package/package.json +2 -2
package/card/createCard.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Element, Node, Transforms, Editor, createParagraphElement } from '@quadrats/core';
|
|
1
|
+
import { Element, Node, Transforms, Editor, Path, createParagraphElement } from '@quadrats/core';
|
|
2
2
|
import { CARD_TYPES, CARD_PLACEHOLDER_TYPE } from './constants.js';
|
|
3
3
|
|
|
4
4
|
function createCard(options) {
|
|
@@ -43,7 +43,25 @@ function createCard(options) {
|
|
|
43
43
|
return Object.assign(Object.assign({ type: types.card, confirmModal }, cardValues), { children: [cardImageElement, cardContentsElement] });
|
|
44
44
|
};
|
|
45
45
|
const insertCard = ({ editor, cardValues }) => {
|
|
46
|
-
|
|
46
|
+
const [currentBlockEntry] = Editor.nodes(editor, {
|
|
47
|
+
match: (n) => Element.isElement(n) && Editor.isBlock(editor, n),
|
|
48
|
+
});
|
|
49
|
+
if (currentBlockEntry) {
|
|
50
|
+
const [, currentPath] = currentBlockEntry;
|
|
51
|
+
// 在目前 block 後面插入
|
|
52
|
+
const insertPath = Path.next(currentPath);
|
|
53
|
+
Editor.withoutNormalizing(editor, () => {
|
|
54
|
+
Transforms.insertNodes(editor, [createCardElement(cardValues), createParagraphElement()], {
|
|
55
|
+
at: insertPath,
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
// 沒找到 block(例如空編輯器)
|
|
61
|
+
Editor.withoutNormalizing(editor, () => {
|
|
62
|
+
Transforms.insertNodes(editor, [createCardElement(cardValues), createParagraphElement()]);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
47
65
|
};
|
|
48
66
|
const updateCardElement = ({ editor, cardValues, path }) => {
|
|
49
67
|
var _a;
|
package/card/index.cjs.js
CHANGED
|
@@ -54,7 +54,25 @@ function createCard(options) {
|
|
|
54
54
|
return Object.assign(Object.assign({ type: types.card, confirmModal }, cardValues), { children: [cardImageElement, cardContentsElement] });
|
|
55
55
|
};
|
|
56
56
|
const insertCard = ({ editor, cardValues }) => {
|
|
57
|
-
core.
|
|
57
|
+
const [currentBlockEntry] = core.Editor.nodes(editor, {
|
|
58
|
+
match: (n) => core.Element.isElement(n) && core.Editor.isBlock(editor, n),
|
|
59
|
+
});
|
|
60
|
+
if (currentBlockEntry) {
|
|
61
|
+
const [, currentPath] = currentBlockEntry;
|
|
62
|
+
// 在目前 block 後面插入
|
|
63
|
+
const insertPath = core.Path.next(currentPath);
|
|
64
|
+
core.Editor.withoutNormalizing(editor, () => {
|
|
65
|
+
core.Transforms.insertNodes(editor, [createCardElement(cardValues), core.createParagraphElement()], {
|
|
66
|
+
at: insertPath,
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// 沒找到 block(例如空編輯器)
|
|
72
|
+
core.Editor.withoutNormalizing(editor, () => {
|
|
73
|
+
core.Transforms.insertNodes(editor, [createCardElement(cardValues), core.createParagraphElement()]);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
58
76
|
};
|
|
59
77
|
const updateCardElement = ({ editor, cardValues, path }) => {
|
|
60
78
|
var _a;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __awaiter } from './_virtual/_tslib.js';
|
|
2
|
-
import { Element, Node, Transforms, Editor, createParagraphElement } from '@quadrats/core';
|
|
2
|
+
import { Element, Node, Transforms, Editor, Path, createParagraphElement } from '@quadrats/core';
|
|
3
3
|
import { CAROUSEL_TYPES, CAROUSEL_PLACEHOLDER_TYPE } from './constants.js';
|
|
4
4
|
import { getFilesFromInput } from './getFilesFromInput.js';
|
|
5
5
|
|
|
@@ -48,7 +48,25 @@ function createCarousel(options) {
|
|
|
48
48
|
};
|
|
49
49
|
};
|
|
50
50
|
const insertCarousel = ({ editor, items }) => {
|
|
51
|
-
|
|
51
|
+
const [currentBlockEntry] = Editor.nodes(editor, {
|
|
52
|
+
match: (n) => Element.isElement(n) && Editor.isBlock(editor, n),
|
|
53
|
+
});
|
|
54
|
+
if (currentBlockEntry) {
|
|
55
|
+
const [, currentPath] = currentBlockEntry;
|
|
56
|
+
// 在目前 block 後面插入
|
|
57
|
+
const insertPath = Path.next(currentPath);
|
|
58
|
+
Editor.withoutNormalizing(editor, () => {
|
|
59
|
+
Transforms.insertNodes(editor, [createCarouselElement({ items }), createParagraphElement()], {
|
|
60
|
+
at: insertPath,
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// 沒找到 block(例如空編輯器)
|
|
66
|
+
Editor.withoutNormalizing(editor, () => {
|
|
67
|
+
Transforms.insertNodes(editor, [createCarouselElement({ items }), createParagraphElement()]);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
52
70
|
};
|
|
53
71
|
const updateCarouselElement = ({ editor, items, path }) => {
|
|
54
72
|
Transforms.setNodes(editor, { items }, { at: path });
|
package/carousel/index.cjs.js
CHANGED
|
@@ -118,7 +118,25 @@ function createCarousel(options) {
|
|
|
118
118
|
};
|
|
119
119
|
};
|
|
120
120
|
const insertCarousel = ({ editor, items }) => {
|
|
121
|
-
core.
|
|
121
|
+
const [currentBlockEntry] = core.Editor.nodes(editor, {
|
|
122
|
+
match: (n) => core.Element.isElement(n) && core.Editor.isBlock(editor, n),
|
|
123
|
+
});
|
|
124
|
+
if (currentBlockEntry) {
|
|
125
|
+
const [, currentPath] = currentBlockEntry;
|
|
126
|
+
// 在目前 block 後面插入
|
|
127
|
+
const insertPath = core.Path.next(currentPath);
|
|
128
|
+
core.Editor.withoutNormalizing(editor, () => {
|
|
129
|
+
core.Transforms.insertNodes(editor, [createCarouselElement({ items }), core.createParagraphElement()], {
|
|
130
|
+
at: insertPath,
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// 沒找到 block(例如空編輯器)
|
|
136
|
+
core.Editor.withoutNormalizing(editor, () => {
|
|
137
|
+
core.Transforms.insertNodes(editor, [createCarouselElement({ items }), core.createParagraphElement()]);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
122
140
|
};
|
|
123
141
|
const updateCarouselElement = ({ editor, items, path }) => {
|
|
124
142
|
core.Transforms.setNodes(editor, { items }, { at: path });
|
package/carousel/typings.d.ts
CHANGED
|
@@ -50,7 +50,7 @@ export interface Carousel<T extends Editor = Editor> extends Withable {
|
|
|
50
50
|
maxLength: number;
|
|
51
51
|
limitSize: number;
|
|
52
52
|
confirmModal: boolean;
|
|
53
|
-
selectFiles(
|
|
53
|
+
selectFiles(): Promise<File[] | undefined>;
|
|
54
54
|
getBody: FileUploaderGetBody;
|
|
55
55
|
getHeaders?: FileUploaderGetHeaders;
|
|
56
56
|
getUrl: FileUploaderGetUrl;
|
package/embed/createEmbed.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PARAGRAPH_TYPE, Element, Transforms, normalizeVoidElementChildren, Editor, isAboveBlockEmpty } from '@quadrats/core';
|
|
1
|
+
import { PARAGRAPH_TYPE, Element, Transforms, normalizeVoidElementChildren, Editor, Path, isAboveBlockEmpty } from '@quadrats/core';
|
|
2
2
|
import { EMBED_TYPE, EMBED_PLACEHOLDER_TYPE } from './constants.js';
|
|
3
3
|
import { serializeEmbedCode } from './serializeEmbedCode.js';
|
|
4
4
|
|
|
@@ -9,17 +9,42 @@ function createEmbed(options) {
|
|
|
9
9
|
const result = serializeEmbedCode(embedCode, strategies, provider);
|
|
10
10
|
if (result) {
|
|
11
11
|
const [provider, data] = result;
|
|
12
|
-
const embedElement = Object.assign(Object.assign({}, data), { type,
|
|
12
|
+
const embedElement = Object.assign(Object.assign({}, data), { type,
|
|
13
|
+
provider, children: [{ text: '' }] });
|
|
14
|
+
const [currentBlockEntry] = Editor.nodes(editor, {
|
|
15
|
+
match: (n) => Element.isElement(n) && Editor.isBlock(editor, n),
|
|
16
|
+
});
|
|
17
|
+
if (currentBlockEntry) {
|
|
18
|
+
const [, currentPath] = currentBlockEntry;
|
|
19
|
+
// 在目前 block 後面插入
|
|
20
|
+
const insertPath = Path.next(currentPath);
|
|
21
|
+
Editor.withoutNormalizing(editor, () => {
|
|
22
|
+
Transforms.insertNodes(editor, [
|
|
23
|
+
embedElement,
|
|
24
|
+
typeof defaultNode === 'string'
|
|
25
|
+
? { type: defaultNode, children: [{ text: '' }] }
|
|
26
|
+
: defaultNode,
|
|
27
|
+
], {
|
|
28
|
+
at: insertPath,
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// 沒找到 block(例如空編輯器)
|
|
34
|
+
Editor.withoutNormalizing(editor, () => {
|
|
35
|
+
Transforms.insertNodes(editor, [
|
|
36
|
+
embedElement,
|
|
37
|
+
typeof defaultNode === 'string'
|
|
38
|
+
? { type: defaultNode, children: [{ text: '' }] }
|
|
39
|
+
: defaultNode,
|
|
40
|
+
]);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
13
43
|
if (isAboveBlockEmpty(editor)) {
|
|
14
44
|
Transforms.removeNodes(editor, {
|
|
15
45
|
at: (_a = editor.selection) === null || _a === void 0 ? void 0 : _a.anchor,
|
|
16
46
|
});
|
|
17
47
|
}
|
|
18
|
-
Transforms.insertNodes(editor, [
|
|
19
|
-
embedElement,
|
|
20
|
-
typeof defaultNode === 'string'
|
|
21
|
-
? { type: defaultNode, children: [{ text: '' }] } : defaultNode,
|
|
22
|
-
]);
|
|
23
48
|
Transforms.move(editor);
|
|
24
49
|
}
|
|
25
50
|
};
|
|
@@ -34,9 +59,17 @@ function createEmbed(options) {
|
|
|
34
59
|
});
|
|
35
60
|
};
|
|
36
61
|
const removeEmbedPlaceholder = (editor) => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
62
|
+
const matches = Array.from(Editor.nodes(editor, {
|
|
63
|
+
at: [],
|
|
64
|
+
match: (node) => Element.isElement(node) && node.type === EMBED_PLACEHOLDER_TYPE,
|
|
65
|
+
}));
|
|
66
|
+
if (matches.length) {
|
|
67
|
+
matches
|
|
68
|
+
.map(([, path]) => path)
|
|
69
|
+
.forEach((path) => {
|
|
70
|
+
Transforms.removeNodes(editor, { at: path });
|
|
71
|
+
});
|
|
72
|
+
}
|
|
40
73
|
};
|
|
41
74
|
return {
|
|
42
75
|
type,
|
|
@@ -46,12 +79,13 @@ function createEmbed(options) {
|
|
|
46
79
|
removeEmbedPlaceholder,
|
|
47
80
|
with(editor) {
|
|
48
81
|
const { isVoid, normalizeNode } = editor;
|
|
49
|
-
editor.isVoid = element => element.type === type || isVoid(element);
|
|
82
|
+
editor.isVoid = (element) => element.type === type || isVoid(element);
|
|
50
83
|
editor.normalizeNode = (entry) => {
|
|
51
84
|
const [node, path] = entry;
|
|
52
85
|
if (Element.isElement(node) && node.type === type) {
|
|
53
86
|
const strategy = node.provider
|
|
54
|
-
? strategies[node.provider]
|
|
87
|
+
? strategies[node.provider]
|
|
88
|
+
: undefined;
|
|
55
89
|
if (!strategy || !strategy.isElementDataValid(node)) {
|
|
56
90
|
Transforms.removeNodes(editor, { at: path });
|
|
57
91
|
return;
|
package/embed/index.cjs.js
CHANGED
|
@@ -28,17 +28,42 @@ function createEmbed(options) {
|
|
|
28
28
|
const result = serializeEmbedCode(embedCode, strategies, provider);
|
|
29
29
|
if (result) {
|
|
30
30
|
const [provider, data] = result;
|
|
31
|
-
const embedElement = Object.assign(Object.assign({}, data), { type,
|
|
31
|
+
const embedElement = Object.assign(Object.assign({}, data), { type,
|
|
32
|
+
provider, children: [{ text: '' }] });
|
|
33
|
+
const [currentBlockEntry] = core.Editor.nodes(editor, {
|
|
34
|
+
match: (n) => core.Element.isElement(n) && core.Editor.isBlock(editor, n),
|
|
35
|
+
});
|
|
36
|
+
if (currentBlockEntry) {
|
|
37
|
+
const [, currentPath] = currentBlockEntry;
|
|
38
|
+
// 在目前 block 後面插入
|
|
39
|
+
const insertPath = core.Path.next(currentPath);
|
|
40
|
+
core.Editor.withoutNormalizing(editor, () => {
|
|
41
|
+
core.Transforms.insertNodes(editor, [
|
|
42
|
+
embedElement,
|
|
43
|
+
typeof defaultNode === 'string'
|
|
44
|
+
? { type: defaultNode, children: [{ text: '' }] }
|
|
45
|
+
: defaultNode,
|
|
46
|
+
], {
|
|
47
|
+
at: insertPath,
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// 沒找到 block(例如空編輯器)
|
|
53
|
+
core.Editor.withoutNormalizing(editor, () => {
|
|
54
|
+
core.Transforms.insertNodes(editor, [
|
|
55
|
+
embedElement,
|
|
56
|
+
typeof defaultNode === 'string'
|
|
57
|
+
? { type: defaultNode, children: [{ text: '' }] }
|
|
58
|
+
: defaultNode,
|
|
59
|
+
]);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
32
62
|
if (core.isAboveBlockEmpty(editor)) {
|
|
33
63
|
core.Transforms.removeNodes(editor, {
|
|
34
64
|
at: (_a = editor.selection) === null || _a === void 0 ? void 0 : _a.anchor,
|
|
35
65
|
});
|
|
36
66
|
}
|
|
37
|
-
core.Transforms.insertNodes(editor, [
|
|
38
|
-
embedElement,
|
|
39
|
-
typeof defaultNode === 'string'
|
|
40
|
-
? { type: defaultNode, children: [{ text: '' }] } : defaultNode,
|
|
41
|
-
]);
|
|
42
67
|
core.Transforms.move(editor);
|
|
43
68
|
}
|
|
44
69
|
};
|
|
@@ -53,9 +78,17 @@ function createEmbed(options) {
|
|
|
53
78
|
});
|
|
54
79
|
};
|
|
55
80
|
const removeEmbedPlaceholder = (editor) => {
|
|
56
|
-
core.
|
|
57
|
-
|
|
58
|
-
|
|
81
|
+
const matches = Array.from(core.Editor.nodes(editor, {
|
|
82
|
+
at: [],
|
|
83
|
+
match: (node) => core.Element.isElement(node) && node.type === EMBED_PLACEHOLDER_TYPE,
|
|
84
|
+
}));
|
|
85
|
+
if (matches.length) {
|
|
86
|
+
matches
|
|
87
|
+
.map(([, path]) => path)
|
|
88
|
+
.forEach((path) => {
|
|
89
|
+
core.Transforms.removeNodes(editor, { at: path });
|
|
90
|
+
});
|
|
91
|
+
}
|
|
59
92
|
};
|
|
60
93
|
return {
|
|
61
94
|
type,
|
|
@@ -65,12 +98,13 @@ function createEmbed(options) {
|
|
|
65
98
|
removeEmbedPlaceholder,
|
|
66
99
|
with(editor) {
|
|
67
100
|
const { isVoid, normalizeNode } = editor;
|
|
68
|
-
editor.isVoid = element => element.type === type || isVoid(element);
|
|
101
|
+
editor.isVoid = (element) => element.type === type || isVoid(element);
|
|
69
102
|
editor.normalizeNode = (entry) => {
|
|
70
103
|
const [node, path] = entry;
|
|
71
104
|
if (core.Element.isElement(node) && node.type === type) {
|
|
72
105
|
const strategy = node.provider
|
|
73
|
-
? strategies[node.provider]
|
|
106
|
+
? strategies[node.provider]
|
|
107
|
+
: undefined;
|
|
74
108
|
if (!strategy || !strategy.isElementDataValid(node)) {
|
|
75
109
|
core.Transforms.removeNodes(editor, { at: path });
|
|
76
110
|
return;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Editor } from '@quadrats/core';
|
|
1
|
+
import { Editor, NodeEntry, Node } from '@quadrats/core';
|
|
2
2
|
import { FileUploader, FileUploaderElement } from './typings';
|
|
3
3
|
export interface CreateFileUploaderOptions {
|
|
4
4
|
type?: string;
|
|
5
5
|
}
|
|
6
6
|
export declare const createFileUploaderElementByType: (type: string) => FileUploader<Editor>['createFileUploaderElement'];
|
|
7
|
-
export declare function insertFileUploaderElement(editor: Editor, fileUploaderElement: FileUploaderElement | undefined): void;
|
|
7
|
+
export declare function insertFileUploaderElement(editor: Editor, fileUploaderElement: FileUploaderElement | undefined, currentBlockEntry?: NodeEntry<Node> | undefined): void;
|
|
8
8
|
export declare function createFileUploader(options?: CreateFileUploaderOptions): FileUploader<Editor>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __awaiter } from './_virtual/_tslib.js';
|
|
2
2
|
import { readFileAsDataURL } from '@quadrats/utils';
|
|
3
|
-
import { Editor,
|
|
3
|
+
import { Editor, Transforms, createParagraphElement, isAboveBlockEmpty, Element, HistoryEditor } from '@quadrats/core';
|
|
4
4
|
import { FILE_UPLOADER_TYPE, FILE_UPLOADER_PLACEHOLDER_TYPE } from './constants.js';
|
|
5
5
|
import { getFilesFromInput } from './getFilesFromInput.js';
|
|
6
6
|
import { TABLE_CELL_TYPE } from '@quadrats/common/table';
|
|
@@ -54,8 +54,7 @@ const createFileUploaderElementByType = (type) => (editor, file, options) => __a
|
|
|
54
54
|
}
|
|
55
55
|
return fileUploaderElement;
|
|
56
56
|
});
|
|
57
|
-
function insertFileUploaderElement(editor, fileUploaderElement) {
|
|
58
|
-
var _a, _b;
|
|
57
|
+
function insertFileUploaderElement(editor, fileUploaderElement, currentBlockEntry) {
|
|
59
58
|
if (fileUploaderElement) {
|
|
60
59
|
// 驗證當前 selection 是否仍然有效
|
|
61
60
|
if (!editor.selection) {
|
|
@@ -73,25 +72,47 @@ function insertFileUploaderElement(editor, fileUploaderElement) {
|
|
|
73
72
|
console.warn('Cannot insert file uploader element: invalid selection path', error);
|
|
74
73
|
return;
|
|
75
74
|
}
|
|
75
|
+
if (currentBlockEntry) {
|
|
76
|
+
const [, currentPath] = currentBlockEntry;
|
|
77
|
+
Editor.withoutNormalizing(editor, () => {
|
|
78
|
+
Transforms.insertNodes(editor, [fileUploaderElement, createParagraphElement()], {
|
|
79
|
+
at: currentPath,
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// 沒找到 block(例如空編輯器)
|
|
85
|
+
Editor.withoutNormalizing(editor, () => {
|
|
86
|
+
Transforms.insertNodes(editor, [fileUploaderElement, createParagraphElement()]);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
76
89
|
// Clear empty node
|
|
77
90
|
if (isAboveBlockEmpty(editor)) {
|
|
78
91
|
Transforms.removeNodes(editor, {
|
|
79
92
|
at: editor.selection.anchor,
|
|
80
93
|
});
|
|
81
94
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
95
|
+
if (currentBlockEntry) {
|
|
96
|
+
const [, currentPath] = currentBlockEntry;
|
|
97
|
+
Transforms.select(editor, Editor.start(editor, currentPath));
|
|
98
|
+
}
|
|
86
99
|
}
|
|
87
100
|
}
|
|
88
101
|
function createFileUploader(options = {}) {
|
|
89
102
|
const { type = FILE_UPLOADER_TYPE } = options;
|
|
90
103
|
const createFileUploaderElement = createFileUploaderElementByType(type);
|
|
91
104
|
const removeUploaderPlaceholder = (editor) => {
|
|
92
|
-
|
|
105
|
+
const matches = Array.from(Editor.nodes(editor, {
|
|
106
|
+
at: [],
|
|
93
107
|
match: (node) => Element.isElement(node) && node.type === FILE_UPLOADER_PLACEHOLDER_TYPE,
|
|
94
|
-
});
|
|
108
|
+
}));
|
|
109
|
+
if (matches.length) {
|
|
110
|
+
matches
|
|
111
|
+
.map(([, path]) => path)
|
|
112
|
+
.forEach((path) => {
|
|
113
|
+
Transforms.removeNodes(editor, { at: path });
|
|
114
|
+
});
|
|
115
|
+
}
|
|
95
116
|
};
|
|
96
117
|
const upload = (editor, options) => __awaiter(this, void 0, void 0, function* () {
|
|
97
118
|
// 檢查是否在不允許的元件之中,如果是則不執行上傳
|
|
@@ -109,6 +130,9 @@ function createFileUploader(options = {}) {
|
|
|
109
130
|
}
|
|
110
131
|
}
|
|
111
132
|
const { accept, multiple } = options;
|
|
133
|
+
const [currentBlockEntry] = Editor.nodes(editor, {
|
|
134
|
+
match: (n) => Element.isElement(n) && Editor.isBlock(editor, n),
|
|
135
|
+
});
|
|
112
136
|
const files = yield getFilesFromInput({ accept, multiple });
|
|
113
137
|
if (!files) {
|
|
114
138
|
removeUploaderPlaceholder(editor);
|
|
@@ -118,7 +142,7 @@ function createFileUploader(options = {}) {
|
|
|
118
142
|
files.reduce((prev, file) => __awaiter(this, void 0, void 0, function* () {
|
|
119
143
|
yield prev;
|
|
120
144
|
return createFileUploaderElement(editor, file, options).then((fileUploaderElement) => {
|
|
121
|
-
insertFileUploaderElement(editor, fileUploaderElement);
|
|
145
|
+
insertFileUploaderElement(editor, fileUploaderElement, currentBlockEntry);
|
|
122
146
|
});
|
|
123
147
|
}), Promise.resolve());
|
|
124
148
|
});
|
|
@@ -117,8 +117,7 @@ const createFileUploaderElementByType = (type) => (editor, file, options) => __a
|
|
|
117
117
|
}
|
|
118
118
|
return fileUploaderElement;
|
|
119
119
|
});
|
|
120
|
-
function insertFileUploaderElement(editor, fileUploaderElement) {
|
|
121
|
-
var _a, _b;
|
|
120
|
+
function insertFileUploaderElement(editor, fileUploaderElement, currentBlockEntry) {
|
|
122
121
|
if (fileUploaderElement) {
|
|
123
122
|
// 驗證當前 selection 是否仍然有效
|
|
124
123
|
if (!editor.selection) {
|
|
@@ -136,25 +135,47 @@ function insertFileUploaderElement(editor, fileUploaderElement) {
|
|
|
136
135
|
console.warn('Cannot insert file uploader element: invalid selection path', error);
|
|
137
136
|
return;
|
|
138
137
|
}
|
|
138
|
+
if (currentBlockEntry) {
|
|
139
|
+
const [, currentPath] = currentBlockEntry;
|
|
140
|
+
core.Editor.withoutNormalizing(editor, () => {
|
|
141
|
+
core.Transforms.insertNodes(editor, [fileUploaderElement, core.createParagraphElement()], {
|
|
142
|
+
at: currentPath,
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
// 沒找到 block(例如空編輯器)
|
|
148
|
+
core.Editor.withoutNormalizing(editor, () => {
|
|
149
|
+
core.Transforms.insertNodes(editor, [fileUploaderElement, core.createParagraphElement()]);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
139
152
|
// Clear empty node
|
|
140
153
|
if (core.isAboveBlockEmpty(editor)) {
|
|
141
154
|
core.Transforms.removeNodes(editor, {
|
|
142
155
|
at: editor.selection.anchor,
|
|
143
156
|
});
|
|
144
157
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
158
|
+
if (currentBlockEntry) {
|
|
159
|
+
const [, currentPath] = currentBlockEntry;
|
|
160
|
+
core.Transforms.select(editor, core.Editor.start(editor, currentPath));
|
|
161
|
+
}
|
|
149
162
|
}
|
|
150
163
|
}
|
|
151
164
|
function createFileUploader(options = {}) {
|
|
152
165
|
const { type = FILE_UPLOADER_TYPE } = options;
|
|
153
166
|
const createFileUploaderElement = createFileUploaderElementByType(type);
|
|
154
167
|
const removeUploaderPlaceholder = (editor) => {
|
|
155
|
-
core.
|
|
168
|
+
const matches = Array.from(core.Editor.nodes(editor, {
|
|
169
|
+
at: [],
|
|
156
170
|
match: (node) => core.Element.isElement(node) && node.type === FILE_UPLOADER_PLACEHOLDER_TYPE,
|
|
157
|
-
});
|
|
171
|
+
}));
|
|
172
|
+
if (matches.length) {
|
|
173
|
+
matches
|
|
174
|
+
.map(([, path]) => path)
|
|
175
|
+
.forEach((path) => {
|
|
176
|
+
core.Transforms.removeNodes(editor, { at: path });
|
|
177
|
+
});
|
|
178
|
+
}
|
|
158
179
|
};
|
|
159
180
|
const upload = (editor, options) => __awaiter(this, void 0, void 0, function* () {
|
|
160
181
|
// 檢查是否在不允許的元件之中,如果是則不執行上傳
|
|
@@ -172,6 +193,9 @@ function createFileUploader(options = {}) {
|
|
|
172
193
|
}
|
|
173
194
|
}
|
|
174
195
|
const { accept, multiple } = options;
|
|
196
|
+
const [currentBlockEntry] = core.Editor.nodes(editor, {
|
|
197
|
+
match: (n) => core.Element.isElement(n) && core.Editor.isBlock(editor, n),
|
|
198
|
+
});
|
|
175
199
|
const files = yield getFilesFromInput({ accept, multiple });
|
|
176
200
|
if (!files) {
|
|
177
201
|
removeUploaderPlaceholder(editor);
|
|
@@ -181,7 +205,7 @@ function createFileUploader(options = {}) {
|
|
|
181
205
|
files.reduce((prev, file) => __awaiter(this, void 0, void 0, function* () {
|
|
182
206
|
yield prev;
|
|
183
207
|
return createFileUploaderElement(editor, file, options).then((fileUploaderElement) => {
|
|
184
|
-
insertFileUploaderElement(editor, fileUploaderElement);
|
|
208
|
+
insertFileUploaderElement(editor, fileUploaderElement, currentBlockEntry);
|
|
185
209
|
});
|
|
186
210
|
}), Promise.resolve());
|
|
187
211
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quadrats/common",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.5",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "Rytass",
|
|
6
6
|
"homepage": "https://github.com/Quadrats/quadrats#readme",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"url": "https://github.com/Quadrats/quadrats/issues"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@quadrats/core": "^1.1.
|
|
21
|
+
"@quadrats/core": "^1.1.5",
|
|
22
22
|
"@quadrats/locales": "^1.0.0",
|
|
23
23
|
"@quadrats/utils": "^1.0.0"
|
|
24
24
|
}
|