@univerjs/docs-drawing 1.0.0-insiders.20260809-70eefdd → 1.0.0-rc.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/LICENSE +176 -0
- package/README.md +1 -2
- package/lib/cjs/facade.js +13 -9
- package/lib/cjs/index.js +163 -42
- package/lib/es/facade.js +15 -11
- package/lib/es/index.js +164 -45
- package/lib/facade.js +15 -11
- package/lib/index.js +164 -45
- package/lib/types/commands/commands/remove-doc-drawing.command.d.ts +2 -1
- package/lib/types/commands/commands/set-drawing-arrange.command.d.ts +6 -2
- package/lib/types/commands/commands/update-doc-drawing-transform.command.d.ts +3 -3
- package/lib/types/commands/commands/update-doc-drawing-wrapping-style.command.d.ts +0 -6
- package/lib/types/controllers/doc-drawing.controller.d.ts +1 -0
- package/lib/types/facade/f-document-image.d.ts +3 -2
- package/lib/types/index.d.ts +1 -0
- package/lib/types/services/doc-drawing-source.d.ts +27 -0
- package/lib/umd/facade.js +1 -1
- package/lib/umd/index.js +1 -1
- package/package.json +7 -7
package/lib/es/facade.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { ArrangeTypeEnum, BooleanNumber, DrawingTypeEnum, ICommandService, IImageIoService, IURLImageService, ImageSourceType, ObjectRelativeFromH, ObjectRelativeFromV, WrapTextType, generateRandomId } from "@univerjs/core";
|
|
2
2
|
import { buildDocTransform, docDrawingPositionToTransform } from "@univerjs/docs";
|
|
3
|
-
import { InsertDocDrawingCommand, RemoveDocDrawingCommand, SetDocDrawingArrangeCommand, TextWrappingStyle, UpdateDocDrawingWrappingStyleCommand, UpdateDrawingDocTransformCommand, WRAPPING_STYLE_TO_LAYOUT_TYPE } from "@univerjs/docs-drawing";
|
|
3
|
+
import { InsertDocDrawingCommand, RemoveDocDrawingCommand, SetDocDrawingArrangeCommand, TextWrappingStyle, UpdateDocDrawingWrappingStyleCommand, UpdateDrawingDocTransformCommand, WRAPPING_STYLE_TO_LAYOUT_TYPE, collectDocDrawings, findDocDrawing } from "@univerjs/docs-drawing";
|
|
4
4
|
import { FDocument } from "@univerjs/docs/facade";
|
|
5
5
|
import { DRAWING_IMAGE_HEIGHT_LIMIT, DRAWING_IMAGE_WIDTH_LIMIT, getImageSize } from "@univerjs/drawing";
|
|
6
|
-
import { FEnum } from "@univerjs/core/facade";
|
|
6
|
+
import { FBase, FEnum } from "@univerjs/core/facade";
|
|
7
7
|
|
|
8
8
|
//#region src/facade/f-document-image.ts
|
|
9
9
|
/**
|
|
10
10
|
* Facade API for an image in a document.
|
|
11
11
|
* @hideconstructor
|
|
12
12
|
*/
|
|
13
|
-
var FDocumentImage = class {
|
|
13
|
+
var FDocumentImage = class extends FBase {
|
|
14
14
|
constructor(_document, _imageId, _injector) {
|
|
15
|
+
super();
|
|
15
16
|
this._document = _document;
|
|
16
17
|
this._imageId = _imageId;
|
|
17
18
|
this._injector = _injector;
|
|
@@ -164,8 +165,8 @@ var FDocumentImage = class {
|
|
|
164
165
|
* ```
|
|
165
166
|
*/
|
|
166
167
|
getImageData() {
|
|
167
|
-
var
|
|
168
|
-
const drawing = (
|
|
168
|
+
var _findDocDrawing;
|
|
169
|
+
const drawing = (_findDocDrawing = findDocDrawing(this._document.getDocumentDataModel().getSnapshot(), this._imageId)) === null || _findDocDrawing === void 0 ? void 0 : _findDocDrawing.drawing;
|
|
169
170
|
if (!drawing || drawing.drawingType !== DrawingTypeEnum.DRAWING_IMAGE) return null;
|
|
170
171
|
return drawing;
|
|
171
172
|
}
|
|
@@ -404,7 +405,7 @@ var FDocumentImage = class {
|
|
|
404
405
|
});
|
|
405
406
|
}
|
|
406
407
|
_getTextRange() {
|
|
407
|
-
const { body, headers = {}, footers = {} } = this._document.getDocumentDataModel().getSnapshot();
|
|
408
|
+
const { body, headers = {}, footers = {}, notes = {} } = this._document.getDocumentDataModel().getSnapshot();
|
|
408
409
|
const segments = [
|
|
409
410
|
{
|
|
410
411
|
segmentId: "",
|
|
@@ -417,6 +418,10 @@ var FDocumentImage = class {
|
|
|
417
418
|
...Object.entries(footers).map(([segmentId, footer]) => ({
|
|
418
419
|
segmentId,
|
|
419
420
|
body: footer.body
|
|
421
|
+
})),
|
|
422
|
+
...Object.entries(notes).map(([segmentId, note]) => ({
|
|
423
|
+
segmentId,
|
|
424
|
+
body: note.body
|
|
420
425
|
}))
|
|
421
426
|
];
|
|
422
427
|
for (const { segmentId, body } of segments) {
|
|
@@ -479,15 +484,14 @@ var FDocumentImageMixin = class extends FDocument {
|
|
|
479
484
|
return this._injector.createInstance(FDocumentImage, this, imageId, this._injector);
|
|
480
485
|
}
|
|
481
486
|
getImage(imageId) {
|
|
482
|
-
var
|
|
483
|
-
const drawing = (
|
|
487
|
+
var _findDocDrawing;
|
|
488
|
+
const drawing = (_findDocDrawing = findDocDrawing(this.getDocumentDataModel().getSnapshot(), imageId)) === null || _findDocDrawing === void 0 ? void 0 : _findDocDrawing.drawing;
|
|
484
489
|
if (!drawing || drawing.drawingType !== DrawingTypeEnum.DRAWING_IMAGE) return null;
|
|
485
490
|
return this._injector.createInstance(FDocumentImage, this, imageId, this._injector);
|
|
486
491
|
}
|
|
487
492
|
getImages() {
|
|
488
|
-
const
|
|
489
|
-
|
|
490
|
-
return (documentDataModel.getDrawingsOrder() ?? Object.keys(drawings)).filter((drawingId) => {
|
|
493
|
+
const { drawings, drawingsOrder: drawingIds } = collectDocDrawings(this.getDocumentDataModel().getSnapshot());
|
|
494
|
+
return drawingIds.filter((drawingId) => {
|
|
491
495
|
var _drawings$drawingId;
|
|
492
496
|
return ((_drawings$drawingId = drawings[drawingId]) === null || _drawings$drawingId === void 0 ? void 0 : _drawings$drawingId.drawingType) === DrawingTypeEnum.DRAWING_IMAGE;
|
|
493
497
|
}).map((drawingId) => this._injector.createInstance(FDocumentImage, this, drawingId, this._injector));
|
package/lib/es/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ArrangeTypeEnum, BooleanNumber, BuildTextUtils, CommandType, DependentOn, Disposable, ICommandService, IConfigService, IResourceManagerService, IUndoRedoService, IUniverInstanceService, Inject, Injector, JSONX, MemoryCursor, Plugin, PositionedObjectLayoutType, TextX, TextXActionType, Tools, UniverInstanceType, createIdentifier, getRichTextEditPath, merge, toDisposable, touchDependencies } from "@univerjs/core";
|
|
2
|
-
import { DocSelectionManagerService, RichTextEditingMutation, UniverDocsPlugin, getContentInsertRange, normalizeTextRange } from "@univerjs/docs";
|
|
1
|
+
import { ArrangeTypeEnum, BooleanNumber, BuildTextUtils, CommandType, DependentOn, Disposable, DrawingTypeEnum, ICommandService, IConfigService, IResourceManagerService, IUndoRedoService, IUniverInstanceService, Inject, Injector, JSONX, MemoryCursor, Plugin, PositionedObjectLayoutType, TextX, TextXActionType, Tools, UniverInstanceType, createIdentifier, getRichTextEditPath, merge, normalizeDrawingOrderIndex, toDisposable, touchDependencies } from "@univerjs/core";
|
|
2
|
+
import { DocHistoryAction, DocSelectionManagerService, RichTextEditingMutation, UniverDocsPlugin, getContentInsertRange, normalizeTextRange } from "@univerjs/docs";
|
|
3
3
|
import { IDrawingManagerService, UnitDrawingService, UniverDrawingPlugin } from "@univerjs/drawing";
|
|
4
4
|
|
|
5
5
|
//#region src/commands/commands/insert-doc-drawing.command.ts
|
|
@@ -10,7 +10,7 @@ const InsertDocDrawingCommand = {
|
|
|
10
10
|
id: "doc.command.insert-doc-image",
|
|
11
11
|
type: CommandType.COMMAND,
|
|
12
12
|
handler: (accessor, params) => {
|
|
13
|
-
var _documentDataModel$ge, _snapshot$headers, _snapshot$footers;
|
|
13
|
+
var _documentDataModel$ge, _snapshot$notes, _snapshot$headers, _snapshot$footers;
|
|
14
14
|
if (!params) return false;
|
|
15
15
|
const commandService = accessor.get(ICommandService);
|
|
16
16
|
const univerInstanceService = accessor.get(IUniverInstanceService);
|
|
@@ -22,11 +22,17 @@ const InsertDocDrawingCommand = {
|
|
|
22
22
|
const { segmentId = "" } = resolvedTextRange;
|
|
23
23
|
if (!((_documentDataModel$ge = documentDataModel.getSelfOrHeaderFooterModel(segmentId)) === null || _documentDataModel$ge === void 0 ? void 0 : _documentDataModel$ge.getBody())) return false;
|
|
24
24
|
const snapshot = documentDataModel.getSnapshot();
|
|
25
|
-
const
|
|
25
|
+
const isFootnote = !!((_snapshot$notes = snapshot.notes) === null || _snapshot$notes === void 0 ? void 0 : _snapshot$notes[segmentId]);
|
|
26
|
+
if (isFootnote && drawings.some((drawing) => drawing.drawingType !== DrawingTypeEnum.DRAWING_IMAGE)) return false;
|
|
27
|
+
let targetDrawings = !!((_snapshot$headers = snapshot.headers) === null || _snapshot$headers === void 0 ? void 0 : _snapshot$headers[segmentId]) || !!((_snapshot$footers = snapshot.footers) === null || _snapshot$footers === void 0 ? void 0 : _snapshot$footers[segmentId]) ? drawings.map((drawing) => ({
|
|
26
28
|
...drawing,
|
|
27
29
|
isMultiTransform: BooleanNumber.TRUE,
|
|
28
30
|
transforms: drawing.transforms ?? (drawing.transform ? [drawing.transform] : null)
|
|
29
31
|
})) : drawings;
|
|
32
|
+
if (isFootnote) targetDrawings = drawings.map((drawing) => ({
|
|
33
|
+
...drawing,
|
|
34
|
+
layoutType: PositionedObjectLayoutType.INLINE
|
|
35
|
+
}));
|
|
30
36
|
const actions = BuildTextUtils.drawing.add({
|
|
31
37
|
selection: resolvedTextRange,
|
|
32
38
|
documentDataModel,
|
|
@@ -37,6 +43,7 @@ const InsertDocDrawingCommand = {
|
|
|
37
43
|
id: RichTextEditingMutation.id,
|
|
38
44
|
params: {
|
|
39
45
|
unitId,
|
|
46
|
+
segmentId,
|
|
40
47
|
actions: [],
|
|
41
48
|
textRanges: []
|
|
42
49
|
}
|
|
@@ -139,13 +146,60 @@ var DocDrawingAdapterService = class {
|
|
|
139
146
|
}
|
|
140
147
|
};
|
|
141
148
|
|
|
149
|
+
//#endregion
|
|
150
|
+
//#region src/services/doc-drawing-source.ts
|
|
151
|
+
/** Resolve persisted drawing ownership independently of the current text selection. */
|
|
152
|
+
function findDocDrawing(snapshot, drawingId) {
|
|
153
|
+
var _snapshot$drawings;
|
|
154
|
+
const drawing = (_snapshot$drawings = snapshot.drawings) === null || _snapshot$drawings === void 0 ? void 0 : _snapshot$drawings[drawingId];
|
|
155
|
+
if (drawing) return {
|
|
156
|
+
drawing,
|
|
157
|
+
path: ["drawings", drawingId],
|
|
158
|
+
segmentId: ""
|
|
159
|
+
};
|
|
160
|
+
for (const [segmentId, note] of Object.entries(snapshot.notes ?? {})) {
|
|
161
|
+
var _note$drawings;
|
|
162
|
+
const drawing = (_note$drawings = note.drawings) === null || _note$drawings === void 0 ? void 0 : _note$drawings[drawingId];
|
|
163
|
+
if (drawing) return {
|
|
164
|
+
drawing,
|
|
165
|
+
path: [
|
|
166
|
+
"notes",
|
|
167
|
+
segmentId,
|
|
168
|
+
"drawings",
|
|
169
|
+
drawingId
|
|
170
|
+
],
|
|
171
|
+
segmentId
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/** The render registry is flat; persisted note resources retain their own scope. */
|
|
176
|
+
function collectDocDrawings(snapshot) {
|
|
177
|
+
let drawings = snapshot.drawings ?? {};
|
|
178
|
+
let drawingsOrder = snapshot.drawingsOrder ?? Object.keys(drawings);
|
|
179
|
+
let copied = false;
|
|
180
|
+
for (const note of Object.values(snapshot.notes ?? {})) {
|
|
181
|
+
if (!note.drawings || Object.keys(note.drawings).length === 0) continue;
|
|
182
|
+
if (!copied) {
|
|
183
|
+
drawings = { ...drawings };
|
|
184
|
+
drawingsOrder = [...drawingsOrder];
|
|
185
|
+
copied = true;
|
|
186
|
+
}
|
|
187
|
+
Object.assign(drawings, note.drawings);
|
|
188
|
+
drawingsOrder.push(...note.drawingsOrder ?? Object.keys(note.drawings));
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
drawings,
|
|
192
|
+
drawingsOrder
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
142
196
|
//#endregion
|
|
143
197
|
//#region src/commands/commands/remove-doc-drawing.command.ts
|
|
144
198
|
const RemoveDocDrawingCommand = {
|
|
145
199
|
id: "doc.command.remove-doc-image",
|
|
146
200
|
type: CommandType.COMMAND,
|
|
147
201
|
handler: (accessor, params) => {
|
|
148
|
-
var _documentDataModel$ge;
|
|
202
|
+
var _snapshot$notes, _documentDataModel$ge;
|
|
149
203
|
if (!params) return false;
|
|
150
204
|
const commandService = accessor.get(ICommandService);
|
|
151
205
|
const undoRedoService = accessor.get(IUndoRedoService);
|
|
@@ -157,13 +211,22 @@ const RemoveDocDrawingCommand = {
|
|
|
157
211
|
if (!documentDataModel || removeDrawings.length === 0) return false;
|
|
158
212
|
const activeTextRange = docSelectionManagerService.getActiveTextRange();
|
|
159
213
|
const contentInsertRange = (!textRange ? null : normalizeTextRange(textRange)) ?? getContentInsertRange(accessor, unitId);
|
|
160
|
-
const
|
|
214
|
+
const snapshot = documentDataModel.getSnapshot();
|
|
215
|
+
const noteSegments = removeDrawings.map(({ drawingId }) => {
|
|
216
|
+
var _findDocDrawing;
|
|
217
|
+
return ((_findDocDrawing = findDocDrawing(snapshot, drawingId)) === null || _findDocDrawing === void 0 ? void 0 : _findDocDrawing.segmentId) ?? "";
|
|
218
|
+
});
|
|
219
|
+
if (noteSegments.some((id) => id !== noteSegments[0])) return false;
|
|
220
|
+
const segmentId = noteSegments[0] || ((contentInsertRange === null || contentInsertRange === void 0 ? void 0 : contentInsertRange.segmentId) ?? (activeTextRange === null || activeTextRange === void 0 ? void 0 : activeTextRange.segmentId) ?? "");
|
|
221
|
+
const footnote = (_snapshot$notes = snapshot.notes) === null || _snapshot$notes === void 0 ? void 0 : _snapshot$notes[segmentId];
|
|
222
|
+
const source = footnote ?? snapshot;
|
|
223
|
+
const prefix = footnote ? ["notes", segmentId] : [];
|
|
161
224
|
const textX = new TextX();
|
|
162
225
|
const jsonX = JSONX.getInstance();
|
|
163
226
|
const customBlocks = ((_documentDataModel$ge = documentDataModel.getSelfOrHeaderFooterModel(segmentId)) === null || _documentDataModel$ge === void 0 || (_documentDataModel$ge = _documentDataModel$ge.getBody()) === null || _documentDataModel$ge === void 0 ? void 0 : _documentDataModel$ge.customBlocks) ?? [];
|
|
164
227
|
const removeCustomBlocks = removeDrawings.map((drawing) => customBlocks.find((customBlock) => customBlock.blockId === drawing.drawingId)).filter((block) => !!block).sort((a, b) => a.startIndex > b.startIndex ? 1 : -1);
|
|
165
228
|
if (removeCustomBlocks.length === 0) return false;
|
|
166
|
-
const drawings =
|
|
229
|
+
const drawings = source.drawings ?? {};
|
|
167
230
|
const removeDrawingParamById = new Map(removeDrawings.map((drawing) => [drawing.drawingId, drawing]));
|
|
168
231
|
const removeDrawingSnapshots = removeCustomBlocks.map((block) => drawings[block.blockId]).filter((drawing) => drawing != null);
|
|
169
232
|
const resourceRedoMutations = [];
|
|
@@ -203,12 +266,15 @@ const RemoveDocDrawingCommand = {
|
|
|
203
266
|
startOffset: cursorIndex,
|
|
204
267
|
endOffset: cursorIndex
|
|
205
268
|
}];
|
|
269
|
+
const historyActions = getHistoryActions(removeDrawings);
|
|
206
270
|
const doMutation = {
|
|
207
271
|
id: RichTextEditingMutation.id,
|
|
208
272
|
params: {
|
|
209
273
|
unitId,
|
|
274
|
+
segmentId,
|
|
210
275
|
actions: [],
|
|
211
|
-
textRanges
|
|
276
|
+
textRanges,
|
|
277
|
+
historyActions
|
|
212
278
|
}
|
|
213
279
|
};
|
|
214
280
|
const rawActions = [];
|
|
@@ -225,11 +291,21 @@ const RemoveDocDrawingCommand = {
|
|
|
225
291
|
memoryCursor.moveCursorTo(startIndex + 1);
|
|
226
292
|
}
|
|
227
293
|
rawActions.push(jsonX.editOp(textX.serialize(), getRichTextEditPath(documentDataModel, segmentId)));
|
|
228
|
-
|
|
294
|
+
const drawingOrder = source.drawingsOrder ?? [];
|
|
295
|
+
const resourceBlocks = [...removeCustomBlocks].sort((left, right) => drawingOrder.indexOf(right.blockId) - drawingOrder.indexOf(left.blockId));
|
|
296
|
+
for (const block of resourceBlocks) {
|
|
229
297
|
const { blockId } = block;
|
|
230
|
-
const drawingIndex =
|
|
231
|
-
rawActions.push(jsonX.removeOp([
|
|
232
|
-
|
|
298
|
+
const drawingIndex = drawingOrder.indexOf(blockId);
|
|
299
|
+
if (drawings[blockId]) rawActions.push(jsonX.removeOp([
|
|
300
|
+
...prefix,
|
|
301
|
+
"drawings",
|
|
302
|
+
blockId
|
|
303
|
+
], drawings[blockId]));
|
|
304
|
+
if (drawingIndex >= 0) rawActions.push(jsonX.removeOp([
|
|
305
|
+
...prefix,
|
|
306
|
+
"drawingsOrder",
|
|
307
|
+
drawingIndex
|
|
308
|
+
], blockId));
|
|
233
309
|
}
|
|
234
310
|
doMutation.params.actions = rawActions.reduce((acc, cur) => JSONX.compose(acc, cur), null);
|
|
235
311
|
const result = commandService.syncExecuteCommand(doMutation.id, doMutation.params);
|
|
@@ -242,6 +318,17 @@ const RemoveDocDrawingCommand = {
|
|
|
242
318
|
return Boolean(result);
|
|
243
319
|
}
|
|
244
320
|
};
|
|
321
|
+
function getHistoryActions(drawings) {
|
|
322
|
+
const historyActions = drawings.flatMap((drawing) => {
|
|
323
|
+
switch (drawing.drawingType) {
|
|
324
|
+
case DrawingTypeEnum.DRAWING_IMAGE: return [DocHistoryAction.DeleteImage];
|
|
325
|
+
case DrawingTypeEnum.DRAWING_SHAPE: return [DocHistoryAction.DeleteShape];
|
|
326
|
+
case DrawingTypeEnum.DRAWING_CHART: return [DocHistoryAction.DeleteChart];
|
|
327
|
+
default: return [];
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
return [...new Set(historyActions)];
|
|
331
|
+
}
|
|
245
332
|
function executeResourceMutationGroups(mutationGroups, commandService) {
|
|
246
333
|
const executedUndoGroups = [];
|
|
247
334
|
for (const mutationGroup of mutationGroups) {
|
|
@@ -283,6 +370,16 @@ function getArrangedDrawingOrder(drawingOrder, drawingIds, arrangeType) {
|
|
|
283
370
|
}
|
|
284
371
|
return arrangedDrawingOrder;
|
|
285
372
|
}
|
|
373
|
+
function getDrawingOrderAtIndex(drawingOrder, drawingIds, zOrder) {
|
|
374
|
+
if (drawingIds.length !== 1) return [...drawingOrder];
|
|
375
|
+
const arrangedDrawingOrder = [...drawingOrder];
|
|
376
|
+
const currentIndex = arrangedDrawingOrder.indexOf(drawingIds[0]);
|
|
377
|
+
if (currentIndex < 0) return arrangedDrawingOrder;
|
|
378
|
+
const [drawingId] = arrangedDrawingOrder.splice(currentIndex, 1);
|
|
379
|
+
const targetIndex = normalizeDrawingOrderIndex(zOrder, drawingOrder.length);
|
|
380
|
+
arrangedDrawingOrder.splice(targetIndex, 0, drawingId);
|
|
381
|
+
return arrangedDrawingOrder;
|
|
382
|
+
}
|
|
286
383
|
/**
|
|
287
384
|
* Converts the target order into granular JSONX move operations. This avoids replacing
|
|
288
385
|
* the entire drawingsOrder array and keeps collaboration conflicts scoped to moved items.
|
|
@@ -311,11 +408,11 @@ const SetDocDrawingArrangeCommand = {
|
|
|
311
408
|
handler: (accessor, params) => {
|
|
312
409
|
const commandService = accessor.get(ICommandService);
|
|
313
410
|
if (params == null) return false;
|
|
314
|
-
const { unitId, drawingIds
|
|
411
|
+
const { unitId, drawingIds } = params;
|
|
315
412
|
const documentDataModel = accessor.get(IUniverInstanceService).getUnit(unitId, UniverInstanceType.UNIVER_DOC);
|
|
316
413
|
const drawingOrder = documentDataModel === null || documentDataModel === void 0 ? void 0 : documentDataModel.getDrawingsOrder();
|
|
317
414
|
if (!drawingOrder) return false;
|
|
318
|
-
const actions = createDrawingOrderActions(drawingOrder, getArrangedDrawingOrder(drawingOrder, drawingIds, arrangeType));
|
|
415
|
+
const actions = createDrawingOrderActions(drawingOrder, params.zOrder !== void 0 ? getDrawingOrderAtIndex(drawingOrder, drawingIds, params.zOrder) : getArrangedDrawingOrder(drawingOrder, drawingIds, params.arrangeType));
|
|
319
416
|
if (JSONX.isNoop(actions)) return false;
|
|
320
417
|
const result = commandService.syncExecuteCommand(RichTextEditingMutation.id, {
|
|
321
418
|
unitId,
|
|
@@ -338,16 +435,22 @@ const UpdateDrawingDocTransformCommand = {
|
|
|
338
435
|
const { unitId, drawings } = params;
|
|
339
436
|
const documentDataModel = univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_DOC);
|
|
340
437
|
if (!documentDataModel) return false;
|
|
341
|
-
const
|
|
438
|
+
const snapshot = documentDataModel.getSnapshot();
|
|
439
|
+
const historyAction = drawings.length > 0 && drawings.every(({ drawingId }) => {
|
|
440
|
+
var _findDocDrawing;
|
|
441
|
+
return ((_findDocDrawing = findDocDrawing(snapshot, drawingId)) === null || _findDocDrawing === void 0 ? void 0 : _findDocDrawing.drawing.drawingType) === DrawingTypeEnum.DRAWING_IMAGE;
|
|
442
|
+
}) ? DocHistoryAction.UpdateImage : void 0;
|
|
342
443
|
const jsonX = JSONX.getInstance();
|
|
343
444
|
const actions = [];
|
|
344
445
|
for (const { drawingId, key, value } of drawings) {
|
|
345
|
-
var
|
|
346
|
-
const
|
|
446
|
+
var _oldDrawing$docTransf;
|
|
447
|
+
const source = findDocDrawing(snapshot, drawingId);
|
|
448
|
+
if (!source) return false;
|
|
449
|
+
const oldDrawing = source.drawing;
|
|
450
|
+
const oldValue = key === "srcRect" ? oldDrawing === null || oldDrawing === void 0 ? void 0 : oldDrawing.srcRect : oldDrawing === null || oldDrawing === void 0 || (_oldDrawing$docTransf = oldDrawing.docTransform) === null || _oldDrawing$docTransf === void 0 ? void 0 : _oldDrawing$docTransf[key];
|
|
347
451
|
if (!Tools.diffValue(oldValue, value)) {
|
|
348
|
-
const path = [
|
|
349
|
-
|
|
350
|
-
drawingId,
|
|
452
|
+
const path = key === "srcRect" ? [...source.path, key] : [
|
|
453
|
+
...source.path,
|
|
351
454
|
"docTransform",
|
|
352
455
|
key
|
|
353
456
|
];
|
|
@@ -356,6 +459,7 @@ const UpdateDrawingDocTransformCommand = {
|
|
|
356
459
|
}
|
|
357
460
|
return Boolean(commandService.syncExecuteCommand(RichTextEditingMutation.id, {
|
|
358
461
|
unitId,
|
|
462
|
+
historyAction,
|
|
359
463
|
actions: actions.reduce((acc, action) => JSONX.compose(acc, action), null),
|
|
360
464
|
textRanges: null,
|
|
361
465
|
debounce: true
|
|
@@ -424,33 +528,33 @@ const UpdateDocDrawingWrappingStyleCommand = {
|
|
|
424
528
|
const commandService = accessor.get(ICommandService);
|
|
425
529
|
const documentDataModel = accessor.get(IUniverInstanceService).getUnit(unitId, UniverInstanceType.UNIVER_DOC);
|
|
426
530
|
if (!documentDataModel) return false;
|
|
427
|
-
const
|
|
531
|
+
const snapshot = documentDataModel.getSnapshot();
|
|
532
|
+
if (wrappingStyle !== "inline" && drawings.some(({ drawingId }) => {
|
|
533
|
+
var _findDocDrawing;
|
|
534
|
+
return (_findDocDrawing = findDocDrawing(snapshot, drawingId)) === null || _findDocDrawing === void 0 ? void 0 : _findDocDrawing.segmentId;
|
|
535
|
+
})) return false;
|
|
536
|
+
const historyAction = drawings.length > 0 && drawings.every(({ drawingId }) => {
|
|
537
|
+
var _findDocDrawing2;
|
|
538
|
+
return ((_findDocDrawing2 = findDocDrawing(snapshot, drawingId)) === null || _findDocDrawing2 === void 0 ? void 0 : _findDocDrawing2.drawing.drawingType) === DrawingTypeEnum.DRAWING_IMAGE;
|
|
539
|
+
}) ? DocHistoryAction.UpdateImage : void 0;
|
|
428
540
|
const jsonX = JSONX.getInstance();
|
|
429
541
|
const rawActions = [];
|
|
430
542
|
for (const drawing of drawings) {
|
|
431
|
-
const
|
|
432
|
-
|
|
543
|
+
const source = findDocDrawing(snapshot, drawing.drawingId);
|
|
544
|
+
const oldDrawing = source === null || source === void 0 ? void 0 : source.drawing;
|
|
545
|
+
if (!oldDrawing || !source) continue;
|
|
433
546
|
const layoutType = WRAPPING_STYLE_TO_LAYOUT_TYPE[wrappingStyle];
|
|
434
|
-
if (oldDrawing.layoutType !== layoutType) rawActions.push(jsonX.replaceOp([
|
|
435
|
-
"drawings",
|
|
436
|
-
drawing.drawingId,
|
|
437
|
-
"layoutType"
|
|
438
|
-
], oldDrawing.layoutType, layoutType));
|
|
547
|
+
if (oldDrawing.layoutType !== layoutType) rawActions.push(jsonX.replaceOp([...source.path, "layoutType"], oldDrawing.layoutType, layoutType));
|
|
439
548
|
if (wrappingStyle === "behindText" || wrappingStyle === "inFrontOfText") {
|
|
440
549
|
const behindDoc = wrappingStyle === "behindText" ? BooleanNumber.TRUE : BooleanNumber.FALSE;
|
|
441
|
-
if (oldDrawing.behindDoc !== behindDoc) rawActions.push(jsonX.replaceOp([
|
|
442
|
-
"drawings",
|
|
443
|
-
drawing.drawingId,
|
|
444
|
-
"behindDoc"
|
|
445
|
-
], oldDrawing.behindDoc, behindDoc));
|
|
550
|
+
if (oldDrawing.behindDoc !== behindDoc) rawActions.push(jsonX.replaceOp([...source.path, "behindDoc"], oldDrawing.behindDoc, behindDoc));
|
|
446
551
|
}
|
|
447
552
|
if (wrappingStyle !== "inline") for (const key of ["positionH", "positionV"]) {
|
|
448
553
|
var _drawing$docTransform;
|
|
449
554
|
const value = (_drawing$docTransform = drawing.docTransform) === null || _drawing$docTransform === void 0 ? void 0 : _drawing$docTransform[key];
|
|
450
555
|
const oldValue = oldDrawing.docTransform[key];
|
|
451
556
|
if (value && !Tools.diffValue(oldValue, value)) rawActions.push(jsonX.replaceOp([
|
|
452
|
-
|
|
453
|
-
drawing.drawingId,
|
|
557
|
+
...source.path,
|
|
454
558
|
"docTransform",
|
|
455
559
|
key
|
|
456
560
|
], oldValue, value));
|
|
@@ -460,6 +564,7 @@ const UpdateDocDrawingWrappingStyleCommand = {
|
|
|
460
564
|
id: RichTextEditingMutation.id,
|
|
461
565
|
params: {
|
|
462
566
|
unitId,
|
|
567
|
+
historyAction,
|
|
463
568
|
actions: rawActions.reduce((actions, action) => JSONX.compose(actions, action), null),
|
|
464
569
|
textRanges: null
|
|
465
570
|
}
|
|
@@ -540,7 +645,7 @@ let DocDrawingController = class DocDrawingController extends Disposable {
|
|
|
540
645
|
};
|
|
541
646
|
try {
|
|
542
647
|
return JSON.parse(json);
|
|
543
|
-
} catch
|
|
648
|
+
} catch {
|
|
544
649
|
return {
|
|
545
650
|
data: {},
|
|
546
651
|
order: []
|
|
@@ -553,10 +658,7 @@ let DocDrawingController = class DocDrawingController extends Disposable {
|
|
|
553
658
|
toJson: (unitId) => toJson(unitId),
|
|
554
659
|
parseJson: (json) => parseJson(json),
|
|
555
660
|
onUnLoad: (unitId) => {
|
|
556
|
-
this.
|
|
557
|
-
data: {},
|
|
558
|
-
order: []
|
|
559
|
-
});
|
|
661
|
+
this._unloadDrawingDataForUnit(unitId);
|
|
560
662
|
},
|
|
561
663
|
onLoad: (unitId, value) => {
|
|
562
664
|
this._setDrawingDataForUnit(unitId, {
|
|
@@ -566,6 +668,12 @@ let DocDrawingController = class DocDrawingController extends Disposable {
|
|
|
566
668
|
}
|
|
567
669
|
}));
|
|
568
670
|
}
|
|
671
|
+
_unloadDrawingDataForUnit(unitId) {
|
|
672
|
+
const documentDataModel = this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_DOC);
|
|
673
|
+
documentDataModel === null || documentDataModel === void 0 || documentDataModel.resetDrawing({}, []);
|
|
674
|
+
this._docDrawingService.removeDrawingDataForUnit(unitId);
|
|
675
|
+
this._drawingManagerService.removeDrawingDataForUnit(unitId);
|
|
676
|
+
}
|
|
569
677
|
_setDrawingDataForUnit(unitId, drawingMapItem) {
|
|
570
678
|
const documentDataModel = this._univerInstanceService.getUnit(unitId);
|
|
571
679
|
if (documentDataModel == null) return;
|
|
@@ -576,17 +684,28 @@ let DocDrawingController = class DocDrawingController extends Disposable {
|
|
|
576
684
|
const dataModel = this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_DOC);
|
|
577
685
|
if (!dataModel) return false;
|
|
578
686
|
const subUnitId = unitId;
|
|
579
|
-
const drawingDataModels = dataModel.
|
|
580
|
-
const drawingOrderModel = dataModel.getDrawingsOrder();
|
|
687
|
+
const { drawings: drawingDataModels, drawingsOrder: drawingOrderModel } = collectDocDrawings(dataModel.getSnapshot());
|
|
581
688
|
if (!drawingDataModels || !drawingOrderModel) return false;
|
|
689
|
+
const normalizedDrawingData = {};
|
|
690
|
+
for (const [drawingId, drawing] of Object.entries(drawingDataModels)) normalizedDrawingData[drawingId] = drawing.unitId === unitId && drawing.subUnitId === subUnitId ? drawing : {
|
|
691
|
+
...drawing,
|
|
692
|
+
unitId,
|
|
693
|
+
subUnitId
|
|
694
|
+
};
|
|
582
695
|
const subDrawings = { [subUnitId]: {
|
|
583
696
|
unitId,
|
|
584
697
|
subUnitId,
|
|
585
|
-
data:
|
|
698
|
+
data: normalizedDrawingData,
|
|
586
699
|
order: drawingOrderModel
|
|
587
700
|
} };
|
|
701
|
+
const renderDrawingData = {};
|
|
702
|
+
for (const [drawingId, drawing] of Object.entries(normalizedDrawingData)) renderDrawingData[drawingId] = {
|
|
703
|
+
...drawing,
|
|
704
|
+
hidden: true
|
|
705
|
+
};
|
|
588
706
|
const renderSubDrawings = { [subUnitId]: {
|
|
589
707
|
...subDrawings[subUnitId],
|
|
708
|
+
data: renderDrawingData,
|
|
590
709
|
order: getDocDrawingRenderOrder(drawingOrderModel, drawingDataModels)
|
|
591
710
|
} };
|
|
592
711
|
this._docDrawingService.registerDrawingData(unitId, subDrawings);
|
|
@@ -614,7 +733,7 @@ DocDrawingController = __decorate([
|
|
|
614
733
|
//#endregion
|
|
615
734
|
//#region package.json
|
|
616
735
|
var name = "@univerjs/docs-drawing";
|
|
617
|
-
var version = "1.0.0-
|
|
736
|
+
var version = "1.0.0-rc.0";
|
|
618
737
|
|
|
619
738
|
//#endregion
|
|
620
739
|
//#region src/config/config.ts
|
|
@@ -670,4 +789,4 @@ UniverDocsDrawingPlugin = __decorate([
|
|
|
670
789
|
], UniverDocsDrawingPlugin);
|
|
671
790
|
|
|
672
791
|
//#endregion
|
|
673
|
-
export { DOCS_DRAWING_PLUGIN, DocDrawingAdapterService, DocDrawingController, DocDrawingService, IDocDrawingAdapterService, IDocDrawingService, InsertDocDrawingCommand, RemoveDocDrawingCommand, SetDocDrawingArrangeCommand, TextWrappingStyle, UniverDocsDrawingPlugin, UpdateDocDrawingWrappingStyleCommand, UpdateDrawingDocTransformCommand, WRAPPING_STYLE_TO_LAYOUT_TYPE, getDocDrawingRenderOrder };
|
|
792
|
+
export { DOCS_DRAWING_PLUGIN, DocDrawingAdapterService, DocDrawingController, DocDrawingService, IDocDrawingAdapterService, IDocDrawingService, InsertDocDrawingCommand, RemoveDocDrawingCommand, SetDocDrawingArrangeCommand, TextWrappingStyle, UniverDocsDrawingPlugin, UpdateDocDrawingWrappingStyleCommand, UpdateDrawingDocTransformCommand, WRAPPING_STYLE_TO_LAYOUT_TYPE, collectDocDrawings, findDocDrawing, getDocDrawingRenderOrder };
|
package/lib/facade.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { ArrangeTypeEnum, BooleanNumber, DrawingTypeEnum, ICommandService, IImageIoService, IURLImageService, ImageSourceType, ObjectRelativeFromH, ObjectRelativeFromV, WrapTextType, generateRandomId } from "@univerjs/core";
|
|
2
2
|
import { buildDocTransform, docDrawingPositionToTransform } from "@univerjs/docs";
|
|
3
|
-
import { InsertDocDrawingCommand, RemoveDocDrawingCommand, SetDocDrawingArrangeCommand, TextWrappingStyle, UpdateDocDrawingWrappingStyleCommand, UpdateDrawingDocTransformCommand, WRAPPING_STYLE_TO_LAYOUT_TYPE } from "@univerjs/docs-drawing";
|
|
3
|
+
import { InsertDocDrawingCommand, RemoveDocDrawingCommand, SetDocDrawingArrangeCommand, TextWrappingStyle, UpdateDocDrawingWrappingStyleCommand, UpdateDrawingDocTransformCommand, WRAPPING_STYLE_TO_LAYOUT_TYPE, collectDocDrawings, findDocDrawing } from "@univerjs/docs-drawing";
|
|
4
4
|
import { FDocument } from "@univerjs/docs/facade";
|
|
5
5
|
import { DRAWING_IMAGE_HEIGHT_LIMIT, DRAWING_IMAGE_WIDTH_LIMIT, getImageSize } from "@univerjs/drawing";
|
|
6
|
-
import { FEnum } from "@univerjs/core/facade";
|
|
6
|
+
import { FBase, FEnum } from "@univerjs/core/facade";
|
|
7
7
|
|
|
8
8
|
//#region src/facade/f-document-image.ts
|
|
9
9
|
/**
|
|
10
10
|
* Facade API for an image in a document.
|
|
11
11
|
* @hideconstructor
|
|
12
12
|
*/
|
|
13
|
-
var FDocumentImage = class {
|
|
13
|
+
var FDocumentImage = class extends FBase {
|
|
14
14
|
constructor(_document, _imageId, _injector) {
|
|
15
|
+
super();
|
|
15
16
|
this._document = _document;
|
|
16
17
|
this._imageId = _imageId;
|
|
17
18
|
this._injector = _injector;
|
|
@@ -164,8 +165,8 @@ var FDocumentImage = class {
|
|
|
164
165
|
* ```
|
|
165
166
|
*/
|
|
166
167
|
getImageData() {
|
|
167
|
-
var
|
|
168
|
-
const drawing = (
|
|
168
|
+
var _findDocDrawing;
|
|
169
|
+
const drawing = (_findDocDrawing = findDocDrawing(this._document.getDocumentDataModel().getSnapshot(), this._imageId)) === null || _findDocDrawing === void 0 ? void 0 : _findDocDrawing.drawing;
|
|
169
170
|
if (!drawing || drawing.drawingType !== DrawingTypeEnum.DRAWING_IMAGE) return null;
|
|
170
171
|
return drawing;
|
|
171
172
|
}
|
|
@@ -404,7 +405,7 @@ var FDocumentImage = class {
|
|
|
404
405
|
});
|
|
405
406
|
}
|
|
406
407
|
_getTextRange() {
|
|
407
|
-
const { body, headers = {}, footers = {} } = this._document.getDocumentDataModel().getSnapshot();
|
|
408
|
+
const { body, headers = {}, footers = {}, notes = {} } = this._document.getDocumentDataModel().getSnapshot();
|
|
408
409
|
const segments = [
|
|
409
410
|
{
|
|
410
411
|
segmentId: "",
|
|
@@ -417,6 +418,10 @@ var FDocumentImage = class {
|
|
|
417
418
|
...Object.entries(footers).map(([segmentId, footer]) => ({
|
|
418
419
|
segmentId,
|
|
419
420
|
body: footer.body
|
|
421
|
+
})),
|
|
422
|
+
...Object.entries(notes).map(([segmentId, note]) => ({
|
|
423
|
+
segmentId,
|
|
424
|
+
body: note.body
|
|
420
425
|
}))
|
|
421
426
|
];
|
|
422
427
|
for (const { segmentId, body } of segments) {
|
|
@@ -479,15 +484,14 @@ var FDocumentImageMixin = class extends FDocument {
|
|
|
479
484
|
return this._injector.createInstance(FDocumentImage, this, imageId, this._injector);
|
|
480
485
|
}
|
|
481
486
|
getImage(imageId) {
|
|
482
|
-
var
|
|
483
|
-
const drawing = (
|
|
487
|
+
var _findDocDrawing;
|
|
488
|
+
const drawing = (_findDocDrawing = findDocDrawing(this.getDocumentDataModel().getSnapshot(), imageId)) === null || _findDocDrawing === void 0 ? void 0 : _findDocDrawing.drawing;
|
|
484
489
|
if (!drawing || drawing.drawingType !== DrawingTypeEnum.DRAWING_IMAGE) return null;
|
|
485
490
|
return this._injector.createInstance(FDocumentImage, this, imageId, this._injector);
|
|
486
491
|
}
|
|
487
492
|
getImages() {
|
|
488
|
-
const
|
|
489
|
-
|
|
490
|
-
return (documentDataModel.getDrawingsOrder() ?? Object.keys(drawings)).filter((drawingId) => {
|
|
493
|
+
const { drawings, drawingsOrder: drawingIds } = collectDocDrawings(this.getDocumentDataModel().getSnapshot());
|
|
494
|
+
return drawingIds.filter((drawingId) => {
|
|
491
495
|
var _drawings$drawingId;
|
|
492
496
|
return ((_drawings$drawingId = drawings[drawingId]) === null || _drawings$drawingId === void 0 ? void 0 : _drawings$drawingId.drawingType) === DrawingTypeEnum.DRAWING_IMAGE;
|
|
493
497
|
}).map((drawingId) => this._injector.createInstance(FDocumentImage, this, drawingId, this._injector));
|