@univerjs/docs-drawing 1.0.0-alpha.8 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/es/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { ArrangeTypeEnum, BooleanNumber, BuildTextUtils, CommandType, DependentOn, Disposable, ICommandService, IConfigService, IResourceManagerService, IUndoRedoService, IUniverInstanceService, Inject, Injector, JSONX, MemoryCursor, Plugin, PositionedObjectLayoutType, TextX, TextXActionType, Tools, UniverInstanceType, createIdentifier, getCustomBlockIdsInSelections, getRichTextEditPath, merge, toDisposable, touchDependencies } from "@univerjs/core";
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, normalizeDrawingOrderIndex, toDisposable, touchDependencies } from "@univerjs/core";
2
2
  import { DocSelectionManagerService, RichTextEditingMutation, UniverDocsPlugin, getContentInsertRange, normalizeTextRange } from "@univerjs/docs";
3
3
  import { IDrawingManagerService, UnitDrawingService, UniverDrawingPlugin } from "@univerjs/drawing";
4
4
 
@@ -10,81 +10,29 @@ 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, _snapshot$drawingsOrd, _snapshot$drawingsOrd2;
13
+ var _documentDataModel$ge, _snapshot$headers, _snapshot$footers;
14
14
  if (!params) return false;
15
15
  const commandService = accessor.get(ICommandService);
16
16
  const univerInstanceService = accessor.get(IUniverInstanceService);
17
17
  const { unitId, drawings, textRange } = params;
18
18
  const documentDataModel = univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_DOC);
19
19
  if (!documentDataModel) return false;
20
- const targetTextRange = resolveDocDrawingInsertTextRange(accessor, unitId, textRange);
21
- if (!targetTextRange) return false;
22
- const { collapsed, startOffset, segmentId = "" } = targetTextRange;
23
- const body = (_documentDataModel$ge = documentDataModel.getSelfOrHeaderFooterModel(segmentId)) === null || _documentDataModel$ge === void 0 ? void 0 : _documentDataModel$ge.getBody();
24
- if (!body) return false;
25
- const textX = new TextX();
26
- const jsonX = JSONX.getInstance();
27
- const rawActions = [];
20
+ const resolvedTextRange = resolveDocDrawingInsertTextRange(accessor, unitId, textRange);
21
+ if (!resolvedTextRange) return false;
22
+ const { segmentId = "" } = resolvedTextRange;
23
+ if (!((_documentDataModel$ge = documentDataModel.getSelfOrHeaderFooterModel(segmentId)) === null || _documentDataModel$ge === void 0 ? void 0 : _documentDataModel$ge.getBody())) return false;
28
24
  const snapshot = documentDataModel.getSnapshot();
29
- const 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) => {
30
- var _drawing$transforms;
31
- return {
32
- ...drawing,
33
- isMultiTransform: BooleanNumber.TRUE,
34
- transforms: (_drawing$transforms = drawing.transforms) !== null && _drawing$transforms !== void 0 ? _drawing$transforms : drawing.transform ? [drawing.transform] : null
35
- };
36
- }) : drawings;
37
- const drawingOrderLength = (_snapshot$drawingsOrd = (_snapshot$drawingsOrd2 = snapshot.drawingsOrder) === null || _snapshot$drawingsOrd2 === void 0 ? void 0 : _snapshot$drawingsOrd2.length) !== null && _snapshot$drawingsOrd !== void 0 ? _snapshot$drawingsOrd : 0;
38
- let removeDrawingLen = 0;
39
- if (collapsed) {
40
- if (startOffset > 0) textX.push({
41
- t: TextXActionType.RETAIN,
42
- len: startOffset
43
- });
44
- } else {
45
- var _documentDataModel$ge2, _documentDataModel$ge3;
46
- const dos = BuildTextUtils.selection.delete([targetTextRange], body, 0, null, false);
47
- textX.push(...dos);
48
- const removedCustomBlockIds = getCustomBlockIdsInSelections(body, [targetTextRange]);
49
- const drawings = (_documentDataModel$ge2 = documentDataModel.getDrawings()) !== null && _documentDataModel$ge2 !== void 0 ? _documentDataModel$ge2 : {};
50
- const drawingOrder = (_documentDataModel$ge3 = documentDataModel.getDrawingsOrder()) !== null && _documentDataModel$ge3 !== void 0 ? _documentDataModel$ge3 : [];
51
- const sortedRemovedCustomBlockIds = removedCustomBlockIds.sort((a, b) => {
52
- if (drawingOrder.indexOf(a) > drawingOrder.indexOf(b)) return -1;
53
- else if (drawingOrder.indexOf(a) < drawingOrder.indexOf(b)) return 1;
54
- return 0;
55
- });
56
- if (sortedRemovedCustomBlockIds.length > 0) for (const blockId of sortedRemovedCustomBlockIds) {
57
- const drawing = drawings[blockId];
58
- const drawingIndex = drawingOrder.indexOf(blockId);
59
- if (drawing == null || drawingIndex < 0) continue;
60
- const removeDrawingAction = jsonX.removeOp(["drawings", blockId], drawing);
61
- const removeDrawingOrderAction = jsonX.removeOp(["drawingsOrder", drawingIndex], blockId);
62
- rawActions.push(removeDrawingAction);
63
- rawActions.push(removeDrawingOrderAction);
64
- removeDrawingLen++;
65
- }
66
- }
67
- textX.push({
68
- t: TextXActionType.INSERT,
69
- body: {
70
- dataStream: "\b".repeat(targetDrawings.length),
71
- customBlocks: targetDrawings.map((drawing, i) => ({
72
- startIndex: i,
73
- blockId: drawing.drawingId
74
- }))
75
- },
76
- len: targetDrawings.length
25
+ const 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
+ ...drawing,
27
+ isMultiTransform: BooleanNumber.TRUE,
28
+ transforms: drawing.transforms ?? (drawing.transform ? [drawing.transform] : null)
29
+ })) : drawings;
30
+ const actions = BuildTextUtils.drawing.add({
31
+ selection: resolvedTextRange,
32
+ documentDataModel,
33
+ drawings: targetDrawings
77
34
  });
78
- const path = getRichTextEditPath(documentDataModel, segmentId);
79
- const placeHolderAction = jsonX.editOp(textX.serialize(), path);
80
- rawActions.push(placeHolderAction);
81
- for (const drawing of targetDrawings) {
82
- const { drawingId } = drawing;
83
- const addDrawingAction = jsonX.insertOp(["drawings", drawingId], drawing);
84
- const addDrawingOrderAction = jsonX.insertOp(["drawingsOrder", drawingOrderLength - removeDrawingLen], drawingId);
85
- rawActions.push(addDrawingAction);
86
- rawActions.push(addDrawingOrderAction);
87
- }
35
+ if (!actions) return false;
88
36
  const doMutation = {
89
37
  id: RichTextEditingMutation.id,
90
38
  params: {
@@ -93,25 +41,21 @@ const InsertDocDrawingCommand = {
93
41
  textRanges: []
94
42
  }
95
43
  };
96
- doMutation.params.actions = rawActions.reduce((acc, cur) => {
97
- return JSONX.compose(acc, cur);
98
- }, null);
44
+ doMutation.params.actions = actions;
99
45
  const result = commandService.syncExecuteCommand(doMutation.id, doMutation.params);
100
46
  return Boolean(result);
101
47
  }
102
48
  };
103
49
  function resolveDocDrawingInsertTextRange(accessor, unitId, textRange) {
104
- var _ref, _contentInsertRange$s;
105
50
  const activeTextRange = accessor.get(DocSelectionManagerService).getActiveTextRange();
106
- const explicitTextRange = textRange ? normalizeTextRange(textRange) : null;
107
- const contentInsertRange = explicitTextRange !== null && explicitTextRange !== void 0 ? explicitTextRange : getContentInsertRange(accessor, unitId);
108
- if (!contentInsertRange) return activeTextRange !== null && activeTextRange !== void 0 ? activeTextRange : null;
51
+ const contentInsertRange = (textRange ? normalizeTextRange(textRange) : null) ?? getContentInsertRange(accessor, unitId);
52
+ if (!contentInsertRange) return activeTextRange ?? null;
109
53
  return {
110
54
  ...activeTextRange,
111
55
  startOffset: contentInsertRange.startOffset,
112
56
  endOffset: contentInsertRange.endOffset,
113
57
  collapsed: contentInsertRange.startOffset === contentInsertRange.endOffset,
114
- segmentId: (_ref = (_contentInsertRange$s = contentInsertRange.segmentId) !== null && _contentInsertRange$s !== void 0 ? _contentInsertRange$s : activeTextRange === null || activeTextRange === void 0 ? void 0 : activeTextRange.segmentId) !== null && _ref !== void 0 ? _ref : ""
58
+ segmentId: contentInsertRange.segmentId ?? (activeTextRange === null || activeTextRange === void 0 ? void 0 : activeTextRange.segmentId) ?? ""
115
59
  };
116
60
  }
117
61
 
@@ -201,7 +145,7 @@ const RemoveDocDrawingCommand = {
201
145
  id: "doc.command.remove-doc-image",
202
146
  type: CommandType.COMMAND,
203
147
  handler: (accessor, params) => {
204
- var _ref, _contentInsertRange$s, _documentDataModel$ge, _documentDataModel$ge2, _documentDataModel$ge3;
148
+ var _documentDataModel$ge;
205
149
  if (!params) return false;
206
150
  const commandService = accessor.get(ICommandService);
207
151
  const undoRedoService = accessor.get(IUndoRedoService);
@@ -212,29 +156,27 @@ const RemoveDocDrawingCommand = {
212
156
  const documentDataModel = univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_DOC);
213
157
  if (!documentDataModel || removeDrawings.length === 0) return false;
214
158
  const activeTextRange = docSelectionManagerService.getActiveTextRange();
215
- const explicitTextRange = !textRange ? null : normalizeTextRange(textRange);
216
- const contentInsertRange = explicitTextRange !== null && explicitTextRange !== void 0 ? explicitTextRange : getContentInsertRange(accessor, unitId);
217
- const segmentId = (_ref = (_contentInsertRange$s = contentInsertRange === null || contentInsertRange === void 0 ? void 0 : contentInsertRange.segmentId) !== null && _contentInsertRange$s !== void 0 ? _contentInsertRange$s : activeTextRange === null || activeTextRange === void 0 ? void 0 : activeTextRange.segmentId) !== null && _ref !== void 0 ? _ref : "";
159
+ const contentInsertRange = (!textRange ? null : normalizeTextRange(textRange)) ?? getContentInsertRange(accessor, unitId);
160
+ const segmentId = (contentInsertRange === null || contentInsertRange === void 0 ? void 0 : contentInsertRange.segmentId) ?? (activeTextRange === null || activeTextRange === void 0 ? void 0 : activeTextRange.segmentId) ?? "";
218
161
  const textX = new TextX();
219
162
  const jsonX = JSONX.getInstance();
220
- const customBlocks = (_documentDataModel$ge = (_documentDataModel$ge2 = documentDataModel.getSelfOrHeaderFooterModel(segmentId)) === null || _documentDataModel$ge2 === void 0 || (_documentDataModel$ge2 = _documentDataModel$ge2.getBody()) === null || _documentDataModel$ge2 === void 0 ? void 0 : _documentDataModel$ge2.customBlocks) !== null && _documentDataModel$ge !== void 0 ? _documentDataModel$ge : [];
163
+ 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) ?? [];
221
164
  const removeCustomBlocks = removeDrawings.map((drawing) => customBlocks.find((customBlock) => customBlock.blockId === drawing.drawingId)).filter((block) => !!block).sort((a, b) => a.startIndex > b.startIndex ? 1 : -1);
222
165
  if (removeCustomBlocks.length === 0) return false;
223
- const drawings = (_documentDataModel$ge3 = documentDataModel.getDrawings()) !== null && _documentDataModel$ge3 !== void 0 ? _documentDataModel$ge3 : {};
166
+ const drawings = documentDataModel.getDrawings() ?? {};
224
167
  const removeDrawingParamById = new Map(removeDrawings.map((drawing) => [drawing.drawingId, drawing]));
225
168
  const removeDrawingSnapshots = removeCustomBlocks.map((block) => drawings[block.blockId]).filter((drawing) => drawing != null);
226
169
  const resourceRedoMutations = [];
227
170
  const resourceUndoMutations = [];
228
171
  const resourceMutationGroups = [];
229
172
  for (const block of removeCustomBlocks) {
230
- var _removeDrawingParam$s;
231
173
  const { blockId } = block;
232
174
  const drawing = drawings[blockId];
233
175
  if (drawing == null) continue;
234
176
  const removeDrawingParam = removeDrawingParamById.get(blockId);
235
177
  const mutationInfos = drawingAdapterService.getRemoveDrawingMutationInfos({
236
178
  unitId,
237
- subUnitId: (_removeDrawingParam$s = removeDrawingParam === null || removeDrawingParam === void 0 ? void 0 : removeDrawingParam.subUnitId) !== null && _removeDrawingParam$s !== void 0 ? _removeDrawingParam$s : unitId,
179
+ subUnitId: (removeDrawingParam === null || removeDrawingParam === void 0 ? void 0 : removeDrawingParam.subUnitId) ?? unitId,
238
180
  drawing,
239
181
  removeDrawings: removeDrawingSnapshots
240
182
  });
@@ -341,6 +283,16 @@ function getArrangedDrawingOrder(drawingOrder, drawingIds, arrangeType) {
341
283
  }
342
284
  return arrangedDrawingOrder;
343
285
  }
286
+ function getDrawingOrderAtIndex(drawingOrder, drawingIds, zOrder) {
287
+ if (drawingIds.length !== 1) return [...drawingOrder];
288
+ const arrangedDrawingOrder = [...drawingOrder];
289
+ const currentIndex = arrangedDrawingOrder.indexOf(drawingIds[0]);
290
+ if (currentIndex < 0) return arrangedDrawingOrder;
291
+ const [drawingId] = arrangedDrawingOrder.splice(currentIndex, 1);
292
+ const targetIndex = normalizeDrawingOrderIndex(zOrder, drawingOrder.length);
293
+ arrangedDrawingOrder.splice(targetIndex, 0, drawingId);
294
+ return arrangedDrawingOrder;
295
+ }
344
296
  /**
345
297
  * Converts the target order into granular JSONX move operations. This avoids replacing
346
298
  * the entire drawingsOrder array and keeps collaboration conflicts scoped to moved items.
@@ -369,11 +321,11 @@ const SetDocDrawingArrangeCommand = {
369
321
  handler: (accessor, params) => {
370
322
  const commandService = accessor.get(ICommandService);
371
323
  if (params == null) return false;
372
- const { unitId, drawingIds, arrangeType } = params;
324
+ const { unitId, drawingIds } = params;
373
325
  const documentDataModel = accessor.get(IUniverInstanceService).getUnit(unitId, UniverInstanceType.UNIVER_DOC);
374
326
  const drawingOrder = documentDataModel === null || documentDataModel === void 0 ? void 0 : documentDataModel.getDrawingsOrder();
375
327
  if (!drawingOrder) return false;
376
- const actions = createDrawingOrderActions(drawingOrder, getArrangedDrawingOrder(drawingOrder, drawingIds, arrangeType));
328
+ const actions = createDrawingOrderActions(drawingOrder, params.zOrder !== void 0 ? getDrawingOrderAtIndex(drawingOrder, drawingIds, params.zOrder) : getArrangedDrawingOrder(drawingOrder, drawingIds, params.arrangeType));
377
329
  if (JSONX.isNoop(actions)) return false;
378
330
  const result = commandService.syncExecuteCommand(RichTextEditingMutation.id, {
379
331
  unitId,
@@ -390,14 +342,13 @@ const UpdateDrawingDocTransformCommand = {
390
342
  id: "doc.command.update-drawing-doc-transform",
391
343
  type: CommandType.COMMAND,
392
344
  handler: (accessor, params) => {
393
- var _documentDataModel$ge;
394
345
  if (!params) return false;
395
346
  const commandService = accessor.get(ICommandService);
396
347
  const univerInstanceService = accessor.get(IUniverInstanceService);
397
348
  const { unitId, drawings } = params;
398
349
  const documentDataModel = univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_DOC);
399
350
  if (!documentDataModel) return false;
400
- const oldDrawings = (_documentDataModel$ge = documentDataModel.getSnapshot().drawings) !== null && _documentDataModel$ge !== void 0 ? _documentDataModel$ge : {};
351
+ const oldDrawings = documentDataModel.getSnapshot().drawings ?? {};
401
352
  const jsonX = JSONX.getInstance();
402
353
  const actions = [];
403
354
  for (const { drawingId, key, value } of drawings) {
@@ -478,13 +429,12 @@ const UpdateDocDrawingWrappingStyleCommand = {
478
429
  id: "doc.command.update-doc-drawing-wrapping-style",
479
430
  type: CommandType.COMMAND,
480
431
  handler: (accessor, params) => {
481
- var _documentDataModel$ge;
482
432
  if (!params) return false;
483
433
  const { drawings, wrappingStyle, unitId } = params;
484
434
  const commandService = accessor.get(ICommandService);
485
435
  const documentDataModel = accessor.get(IUniverInstanceService).getUnit(unitId, UniverInstanceType.UNIVER_DOC);
486
436
  if (!documentDataModel) return false;
487
- const oldDrawings = (_documentDataModel$ge = documentDataModel.getDrawings()) !== null && _documentDataModel$ge !== void 0 ? _documentDataModel$ge : {};
437
+ const oldDrawings = documentDataModel.getDrawings() ?? {};
488
438
  const jsonX = JSONX.getInstance();
489
439
  const rawActions = [];
490
440
  for (const drawing of drawings) {
@@ -587,8 +537,8 @@ let DocDrawingController = class DocDrawingController extends Disposable {
587
537
  const drawings = doc.getSnapshot().drawings;
588
538
  const drawingOrder = doc.getSnapshot().drawingsOrder;
589
539
  return JSON.stringify({
590
- data: drawings !== null && drawings !== void 0 ? drawings : {},
591
- order: drawingOrder !== null && drawingOrder !== void 0 ? drawingOrder : []
540
+ data: drawings ?? {},
541
+ order: drawingOrder ?? []
592
542
  });
593
543
  }
594
544
  return "";
@@ -619,10 +569,9 @@ let DocDrawingController = class DocDrawingController extends Disposable {
619
569
  });
620
570
  },
621
571
  onLoad: (unitId, value) => {
622
- var _value$data, _value$order;
623
572
  this._setDrawingDataForUnit(unitId, {
624
- data: (_value$data = value.data) !== null && _value$data !== void 0 ? _value$data : {},
625
- order: (_value$order = value.order) !== null && _value$order !== void 0 ? _value$order : []
573
+ data: value.data ?? {},
574
+ order: value.order ?? []
626
575
  });
627
576
  }
628
577
  }));
@@ -675,7 +624,7 @@ DocDrawingController = __decorate([
675
624
  //#endregion
676
625
  //#region package.json
677
626
  var name = "@univerjs/docs-drawing";
678
- var version = "1.0.0-alpha.8";
627
+ var version = "1.0.0-beta.1";
679
628
 
680
629
  //#endregion
681
630
  //#region src/config/config.ts
package/lib/facade.js CHANGED
@@ -96,8 +96,8 @@ var FDocumentImage = class {
96
96
  * ```
97
97
  */
98
98
  getSize() {
99
- var _this$getImageData$do, _this$getImageData3;
100
- return (_this$getImageData$do = (_this$getImageData3 = this.getImageData()) === null || _this$getImageData3 === void 0 ? void 0 : _this$getImageData3.docTransform.size) !== null && _this$getImageData$do !== void 0 ? _this$getImageData$do : null;
99
+ var _this$getImageData3;
100
+ return ((_this$getImageData3 = this.getImageData()) === null || _this$getImageData3 === void 0 ? void 0 : _this$getImageData3.docTransform.size) ?? null;
101
101
  }
102
102
  /**
103
103
  * Gets the current clockwise rotation angle.
@@ -130,8 +130,8 @@ var FDocumentImage = class {
130
130
  * ```
131
131
  */
132
132
  getPositionH() {
133
- var _this$getImageData$do2, _this$getImageData5;
134
- return (_this$getImageData$do2 = (_this$getImageData5 = this.getImageData()) === null || _this$getImageData5 === void 0 ? void 0 : _this$getImageData5.docTransform.positionH) !== null && _this$getImageData$do2 !== void 0 ? _this$getImageData$do2 : null;
133
+ var _this$getImageData5;
134
+ return ((_this$getImageData5 = this.getImageData()) === null || _this$getImageData5 === void 0 ? void 0 : _this$getImageData5.docTransform.positionH) ?? null;
135
135
  }
136
136
  /**
137
137
  * Gets the current vertical position.
@@ -147,8 +147,8 @@ var FDocumentImage = class {
147
147
  * ```
148
148
  */
149
149
  getPositionV() {
150
- var _this$getImageData$do3, _this$getImageData6;
151
- return (_this$getImageData$do3 = (_this$getImageData6 = this.getImageData()) === null || _this$getImageData6 === void 0 ? void 0 : _this$getImageData6.docTransform.positionV) !== null && _this$getImageData$do3 !== void 0 ? _this$getImageData$do3 : null;
150
+ var _this$getImageData6;
151
+ return ((_this$getImageData6 = this.getImageData()) === null || _this$getImageData6 === void 0 ? void 0 : _this$getImageData6.docTransform.positionV) ?? null;
152
152
  }
153
153
  /**
154
154
  * Gets the current raw document image data.
@@ -272,7 +272,7 @@ var FDocumentImage = class {
272
272
  *
273
273
  * if (image) {
274
274
  * // Float the image beside body text without covering it.
275
- * const success = image.setWrappingStyle(univerAPI.Enum.DocsImageWrappingStyle.WRAP_SQUARE);
275
+ * const success = image.setWrappingStyle(univerAPI.Enum.TextWrappingStyle.WRAP_SQUARE);
276
276
  * console.log(success);
277
277
  * }
278
278
  * ```
@@ -437,7 +437,6 @@ var FDocumentImage = class {
437
437
  //#region src/facade/f-document.ts
438
438
  var FDocumentImageMixin = class extends FDocument {
439
439
  async insertImage(options) {
440
- var _options$wrappingStyl, _options$angle, _options$positionH, _options$positionV;
441
440
  const unitId = this.getId();
442
441
  const imageId = generateRandomId(6);
443
442
  const size = options.width != null && options.height != null ? {
@@ -445,12 +444,12 @@ var FDocumentImageMixin = class extends FDocument {
445
444
  height: options.height
446
445
  } : resolveImageSize(await this._getIntrinsicSize(options.source, options.imageSourceType), options);
447
446
  const defaultTransform = buildDocTransform(size.width, size.height);
448
- const wrappingStyle = (_options$wrappingStyl = options.wrappingStyle) !== null && _options$wrappingStyl !== void 0 ? _options$wrappingStyl : TextWrappingStyle.INLINE;
447
+ const wrappingStyle = options.wrappingStyle ?? TextWrappingStyle.INLINE;
449
448
  const docTransform = {
450
449
  ...defaultTransform,
451
- angle: (_options$angle = options.angle) !== null && _options$angle !== void 0 ? _options$angle : defaultTransform.angle,
452
- positionH: (_options$positionH = options.positionH) !== null && _options$positionH !== void 0 ? _options$positionH : defaultTransform.positionH,
453
- positionV: (_options$positionV = options.positionV) !== null && _options$positionV !== void 0 ? _options$positionV : defaultTransform.positionV
450
+ angle: options.angle ?? defaultTransform.angle,
451
+ positionH: options.positionH ?? defaultTransform.positionH,
452
+ positionV: options.positionV ?? defaultTransform.positionV
454
453
  };
455
454
  const transform = docDrawingPositionToTransform(docTransform);
456
455
  const drawing = {
@@ -486,10 +485,9 @@ var FDocumentImageMixin = class extends FDocument {
486
485
  return this._injector.createInstance(FDocumentImage, this, imageId, this._injector);
487
486
  }
488
487
  getImages() {
489
- var _documentDataModel$ge, _documentDataModel$ge2;
490
488
  const documentDataModel = this.getDocumentDataModel();
491
- const drawings = (_documentDataModel$ge = documentDataModel.getDrawings()) !== null && _documentDataModel$ge !== void 0 ? _documentDataModel$ge : {};
492
- return ((_documentDataModel$ge2 = documentDataModel.getDrawingsOrder()) !== null && _documentDataModel$ge2 !== void 0 ? _documentDataModel$ge2 : Object.keys(drawings)).filter((drawingId) => {
489
+ const drawings = documentDataModel.getDrawings() ?? {};
490
+ return (documentDataModel.getDrawingsOrder() ?? Object.keys(drawings)).filter((drawingId) => {
493
491
  var _drawings$drawingId;
494
492
  return ((_drawings$drawingId = drawings[drawingId]) === null || _drawings$drawingId === void 0 ? void 0 : _drawings$drawingId.drawingType) === DrawingTypeEnum.DRAWING_IMAGE;
495
493
  }).map((drawingId) => this._injector.createInstance(FDocumentImage, this, drawingId, this._injector));
@@ -551,7 +549,7 @@ FDocument.extend(FDocumentImageMixin);
551
549
  * limitations under the License.
552
550
  */
553
551
  var FDocumentImageEnumMixin = class extends FEnum {
554
- get DocsImageWrappingStyle() {
552
+ get TextWrappingStyle() {
555
553
  return TextWrappingStyle;
556
554
  }
557
555
  get DocsImageRelativeFromH() {
package/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { ArrangeTypeEnum, BooleanNumber, BuildTextUtils, CommandType, DependentOn, Disposable, ICommandService, IConfigService, IResourceManagerService, IUndoRedoService, IUniverInstanceService, Inject, Injector, JSONX, MemoryCursor, Plugin, PositionedObjectLayoutType, TextX, TextXActionType, Tools, UniverInstanceType, createIdentifier, getCustomBlockIdsInSelections, getRichTextEditPath, merge, toDisposable, touchDependencies } from "@univerjs/core";
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, normalizeDrawingOrderIndex, toDisposable, touchDependencies } from "@univerjs/core";
2
2
  import { DocSelectionManagerService, RichTextEditingMutation, UniverDocsPlugin, getContentInsertRange, normalizeTextRange } from "@univerjs/docs";
3
3
  import { IDrawingManagerService, UnitDrawingService, UniverDrawingPlugin } from "@univerjs/drawing";
4
4
 
@@ -10,81 +10,29 @@ 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, _snapshot$drawingsOrd, _snapshot$drawingsOrd2;
13
+ var _documentDataModel$ge, _snapshot$headers, _snapshot$footers;
14
14
  if (!params) return false;
15
15
  const commandService = accessor.get(ICommandService);
16
16
  const univerInstanceService = accessor.get(IUniverInstanceService);
17
17
  const { unitId, drawings, textRange } = params;
18
18
  const documentDataModel = univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_DOC);
19
19
  if (!documentDataModel) return false;
20
- const targetTextRange = resolveDocDrawingInsertTextRange(accessor, unitId, textRange);
21
- if (!targetTextRange) return false;
22
- const { collapsed, startOffset, segmentId = "" } = targetTextRange;
23
- const body = (_documentDataModel$ge = documentDataModel.getSelfOrHeaderFooterModel(segmentId)) === null || _documentDataModel$ge === void 0 ? void 0 : _documentDataModel$ge.getBody();
24
- if (!body) return false;
25
- const textX = new TextX();
26
- const jsonX = JSONX.getInstance();
27
- const rawActions = [];
20
+ const resolvedTextRange = resolveDocDrawingInsertTextRange(accessor, unitId, textRange);
21
+ if (!resolvedTextRange) return false;
22
+ const { segmentId = "" } = resolvedTextRange;
23
+ if (!((_documentDataModel$ge = documentDataModel.getSelfOrHeaderFooterModel(segmentId)) === null || _documentDataModel$ge === void 0 ? void 0 : _documentDataModel$ge.getBody())) return false;
28
24
  const snapshot = documentDataModel.getSnapshot();
29
- const 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) => {
30
- var _drawing$transforms;
31
- return {
32
- ...drawing,
33
- isMultiTransform: BooleanNumber.TRUE,
34
- transforms: (_drawing$transforms = drawing.transforms) !== null && _drawing$transforms !== void 0 ? _drawing$transforms : drawing.transform ? [drawing.transform] : null
35
- };
36
- }) : drawings;
37
- const drawingOrderLength = (_snapshot$drawingsOrd = (_snapshot$drawingsOrd2 = snapshot.drawingsOrder) === null || _snapshot$drawingsOrd2 === void 0 ? void 0 : _snapshot$drawingsOrd2.length) !== null && _snapshot$drawingsOrd !== void 0 ? _snapshot$drawingsOrd : 0;
38
- let removeDrawingLen = 0;
39
- if (collapsed) {
40
- if (startOffset > 0) textX.push({
41
- t: TextXActionType.RETAIN,
42
- len: startOffset
43
- });
44
- } else {
45
- var _documentDataModel$ge2, _documentDataModel$ge3;
46
- const dos = BuildTextUtils.selection.delete([targetTextRange], body, 0, null, false);
47
- textX.push(...dos);
48
- const removedCustomBlockIds = getCustomBlockIdsInSelections(body, [targetTextRange]);
49
- const drawings = (_documentDataModel$ge2 = documentDataModel.getDrawings()) !== null && _documentDataModel$ge2 !== void 0 ? _documentDataModel$ge2 : {};
50
- const drawingOrder = (_documentDataModel$ge3 = documentDataModel.getDrawingsOrder()) !== null && _documentDataModel$ge3 !== void 0 ? _documentDataModel$ge3 : [];
51
- const sortedRemovedCustomBlockIds = removedCustomBlockIds.sort((a, b) => {
52
- if (drawingOrder.indexOf(a) > drawingOrder.indexOf(b)) return -1;
53
- else if (drawingOrder.indexOf(a) < drawingOrder.indexOf(b)) return 1;
54
- return 0;
55
- });
56
- if (sortedRemovedCustomBlockIds.length > 0) for (const blockId of sortedRemovedCustomBlockIds) {
57
- const drawing = drawings[blockId];
58
- const drawingIndex = drawingOrder.indexOf(blockId);
59
- if (drawing == null || drawingIndex < 0) continue;
60
- const removeDrawingAction = jsonX.removeOp(["drawings", blockId], drawing);
61
- const removeDrawingOrderAction = jsonX.removeOp(["drawingsOrder", drawingIndex], blockId);
62
- rawActions.push(removeDrawingAction);
63
- rawActions.push(removeDrawingOrderAction);
64
- removeDrawingLen++;
65
- }
66
- }
67
- textX.push({
68
- t: TextXActionType.INSERT,
69
- body: {
70
- dataStream: "\b".repeat(targetDrawings.length),
71
- customBlocks: targetDrawings.map((drawing, i) => ({
72
- startIndex: i,
73
- blockId: drawing.drawingId
74
- }))
75
- },
76
- len: targetDrawings.length
25
+ const 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
+ ...drawing,
27
+ isMultiTransform: BooleanNumber.TRUE,
28
+ transforms: drawing.transforms ?? (drawing.transform ? [drawing.transform] : null)
29
+ })) : drawings;
30
+ const actions = BuildTextUtils.drawing.add({
31
+ selection: resolvedTextRange,
32
+ documentDataModel,
33
+ drawings: targetDrawings
77
34
  });
78
- const path = getRichTextEditPath(documentDataModel, segmentId);
79
- const placeHolderAction = jsonX.editOp(textX.serialize(), path);
80
- rawActions.push(placeHolderAction);
81
- for (const drawing of targetDrawings) {
82
- const { drawingId } = drawing;
83
- const addDrawingAction = jsonX.insertOp(["drawings", drawingId], drawing);
84
- const addDrawingOrderAction = jsonX.insertOp(["drawingsOrder", drawingOrderLength - removeDrawingLen], drawingId);
85
- rawActions.push(addDrawingAction);
86
- rawActions.push(addDrawingOrderAction);
87
- }
35
+ if (!actions) return false;
88
36
  const doMutation = {
89
37
  id: RichTextEditingMutation.id,
90
38
  params: {
@@ -93,25 +41,21 @@ const InsertDocDrawingCommand = {
93
41
  textRanges: []
94
42
  }
95
43
  };
96
- doMutation.params.actions = rawActions.reduce((acc, cur) => {
97
- return JSONX.compose(acc, cur);
98
- }, null);
44
+ doMutation.params.actions = actions;
99
45
  const result = commandService.syncExecuteCommand(doMutation.id, doMutation.params);
100
46
  return Boolean(result);
101
47
  }
102
48
  };
103
49
  function resolveDocDrawingInsertTextRange(accessor, unitId, textRange) {
104
- var _ref, _contentInsertRange$s;
105
50
  const activeTextRange = accessor.get(DocSelectionManagerService).getActiveTextRange();
106
- const explicitTextRange = textRange ? normalizeTextRange(textRange) : null;
107
- const contentInsertRange = explicitTextRange !== null && explicitTextRange !== void 0 ? explicitTextRange : getContentInsertRange(accessor, unitId);
108
- if (!contentInsertRange) return activeTextRange !== null && activeTextRange !== void 0 ? activeTextRange : null;
51
+ const contentInsertRange = (textRange ? normalizeTextRange(textRange) : null) ?? getContentInsertRange(accessor, unitId);
52
+ if (!contentInsertRange) return activeTextRange ?? null;
109
53
  return {
110
54
  ...activeTextRange,
111
55
  startOffset: contentInsertRange.startOffset,
112
56
  endOffset: contentInsertRange.endOffset,
113
57
  collapsed: contentInsertRange.startOffset === contentInsertRange.endOffset,
114
- segmentId: (_ref = (_contentInsertRange$s = contentInsertRange.segmentId) !== null && _contentInsertRange$s !== void 0 ? _contentInsertRange$s : activeTextRange === null || activeTextRange === void 0 ? void 0 : activeTextRange.segmentId) !== null && _ref !== void 0 ? _ref : ""
58
+ segmentId: contentInsertRange.segmentId ?? (activeTextRange === null || activeTextRange === void 0 ? void 0 : activeTextRange.segmentId) ?? ""
115
59
  };
116
60
  }
117
61
 
@@ -201,7 +145,7 @@ const RemoveDocDrawingCommand = {
201
145
  id: "doc.command.remove-doc-image",
202
146
  type: CommandType.COMMAND,
203
147
  handler: (accessor, params) => {
204
- var _ref, _contentInsertRange$s, _documentDataModel$ge, _documentDataModel$ge2, _documentDataModel$ge3;
148
+ var _documentDataModel$ge;
205
149
  if (!params) return false;
206
150
  const commandService = accessor.get(ICommandService);
207
151
  const undoRedoService = accessor.get(IUndoRedoService);
@@ -212,29 +156,27 @@ const RemoveDocDrawingCommand = {
212
156
  const documentDataModel = univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_DOC);
213
157
  if (!documentDataModel || removeDrawings.length === 0) return false;
214
158
  const activeTextRange = docSelectionManagerService.getActiveTextRange();
215
- const explicitTextRange = !textRange ? null : normalizeTextRange(textRange);
216
- const contentInsertRange = explicitTextRange !== null && explicitTextRange !== void 0 ? explicitTextRange : getContentInsertRange(accessor, unitId);
217
- const segmentId = (_ref = (_contentInsertRange$s = contentInsertRange === null || contentInsertRange === void 0 ? void 0 : contentInsertRange.segmentId) !== null && _contentInsertRange$s !== void 0 ? _contentInsertRange$s : activeTextRange === null || activeTextRange === void 0 ? void 0 : activeTextRange.segmentId) !== null && _ref !== void 0 ? _ref : "";
159
+ const contentInsertRange = (!textRange ? null : normalizeTextRange(textRange)) ?? getContentInsertRange(accessor, unitId);
160
+ const segmentId = (contentInsertRange === null || contentInsertRange === void 0 ? void 0 : contentInsertRange.segmentId) ?? (activeTextRange === null || activeTextRange === void 0 ? void 0 : activeTextRange.segmentId) ?? "";
218
161
  const textX = new TextX();
219
162
  const jsonX = JSONX.getInstance();
220
- const customBlocks = (_documentDataModel$ge = (_documentDataModel$ge2 = documentDataModel.getSelfOrHeaderFooterModel(segmentId)) === null || _documentDataModel$ge2 === void 0 || (_documentDataModel$ge2 = _documentDataModel$ge2.getBody()) === null || _documentDataModel$ge2 === void 0 ? void 0 : _documentDataModel$ge2.customBlocks) !== null && _documentDataModel$ge !== void 0 ? _documentDataModel$ge : [];
163
+ 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) ?? [];
221
164
  const removeCustomBlocks = removeDrawings.map((drawing) => customBlocks.find((customBlock) => customBlock.blockId === drawing.drawingId)).filter((block) => !!block).sort((a, b) => a.startIndex > b.startIndex ? 1 : -1);
222
165
  if (removeCustomBlocks.length === 0) return false;
223
- const drawings = (_documentDataModel$ge3 = documentDataModel.getDrawings()) !== null && _documentDataModel$ge3 !== void 0 ? _documentDataModel$ge3 : {};
166
+ const drawings = documentDataModel.getDrawings() ?? {};
224
167
  const removeDrawingParamById = new Map(removeDrawings.map((drawing) => [drawing.drawingId, drawing]));
225
168
  const removeDrawingSnapshots = removeCustomBlocks.map((block) => drawings[block.blockId]).filter((drawing) => drawing != null);
226
169
  const resourceRedoMutations = [];
227
170
  const resourceUndoMutations = [];
228
171
  const resourceMutationGroups = [];
229
172
  for (const block of removeCustomBlocks) {
230
- var _removeDrawingParam$s;
231
173
  const { blockId } = block;
232
174
  const drawing = drawings[blockId];
233
175
  if (drawing == null) continue;
234
176
  const removeDrawingParam = removeDrawingParamById.get(blockId);
235
177
  const mutationInfos = drawingAdapterService.getRemoveDrawingMutationInfos({
236
178
  unitId,
237
- subUnitId: (_removeDrawingParam$s = removeDrawingParam === null || removeDrawingParam === void 0 ? void 0 : removeDrawingParam.subUnitId) !== null && _removeDrawingParam$s !== void 0 ? _removeDrawingParam$s : unitId,
179
+ subUnitId: (removeDrawingParam === null || removeDrawingParam === void 0 ? void 0 : removeDrawingParam.subUnitId) ?? unitId,
238
180
  drawing,
239
181
  removeDrawings: removeDrawingSnapshots
240
182
  });
@@ -341,6 +283,16 @@ function getArrangedDrawingOrder(drawingOrder, drawingIds, arrangeType) {
341
283
  }
342
284
  return arrangedDrawingOrder;
343
285
  }
286
+ function getDrawingOrderAtIndex(drawingOrder, drawingIds, zOrder) {
287
+ if (drawingIds.length !== 1) return [...drawingOrder];
288
+ const arrangedDrawingOrder = [...drawingOrder];
289
+ const currentIndex = arrangedDrawingOrder.indexOf(drawingIds[0]);
290
+ if (currentIndex < 0) return arrangedDrawingOrder;
291
+ const [drawingId] = arrangedDrawingOrder.splice(currentIndex, 1);
292
+ const targetIndex = normalizeDrawingOrderIndex(zOrder, drawingOrder.length);
293
+ arrangedDrawingOrder.splice(targetIndex, 0, drawingId);
294
+ return arrangedDrawingOrder;
295
+ }
344
296
  /**
345
297
  * Converts the target order into granular JSONX move operations. This avoids replacing
346
298
  * the entire drawingsOrder array and keeps collaboration conflicts scoped to moved items.
@@ -369,11 +321,11 @@ const SetDocDrawingArrangeCommand = {
369
321
  handler: (accessor, params) => {
370
322
  const commandService = accessor.get(ICommandService);
371
323
  if (params == null) return false;
372
- const { unitId, drawingIds, arrangeType } = params;
324
+ const { unitId, drawingIds } = params;
373
325
  const documentDataModel = accessor.get(IUniverInstanceService).getUnit(unitId, UniverInstanceType.UNIVER_DOC);
374
326
  const drawingOrder = documentDataModel === null || documentDataModel === void 0 ? void 0 : documentDataModel.getDrawingsOrder();
375
327
  if (!drawingOrder) return false;
376
- const actions = createDrawingOrderActions(drawingOrder, getArrangedDrawingOrder(drawingOrder, drawingIds, arrangeType));
328
+ const actions = createDrawingOrderActions(drawingOrder, params.zOrder !== void 0 ? getDrawingOrderAtIndex(drawingOrder, drawingIds, params.zOrder) : getArrangedDrawingOrder(drawingOrder, drawingIds, params.arrangeType));
377
329
  if (JSONX.isNoop(actions)) return false;
378
330
  const result = commandService.syncExecuteCommand(RichTextEditingMutation.id, {
379
331
  unitId,
@@ -390,14 +342,13 @@ const UpdateDrawingDocTransformCommand = {
390
342
  id: "doc.command.update-drawing-doc-transform",
391
343
  type: CommandType.COMMAND,
392
344
  handler: (accessor, params) => {
393
- var _documentDataModel$ge;
394
345
  if (!params) return false;
395
346
  const commandService = accessor.get(ICommandService);
396
347
  const univerInstanceService = accessor.get(IUniverInstanceService);
397
348
  const { unitId, drawings } = params;
398
349
  const documentDataModel = univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_DOC);
399
350
  if (!documentDataModel) return false;
400
- const oldDrawings = (_documentDataModel$ge = documentDataModel.getSnapshot().drawings) !== null && _documentDataModel$ge !== void 0 ? _documentDataModel$ge : {};
351
+ const oldDrawings = documentDataModel.getSnapshot().drawings ?? {};
401
352
  const jsonX = JSONX.getInstance();
402
353
  const actions = [];
403
354
  for (const { drawingId, key, value } of drawings) {
@@ -478,13 +429,12 @@ const UpdateDocDrawingWrappingStyleCommand = {
478
429
  id: "doc.command.update-doc-drawing-wrapping-style",
479
430
  type: CommandType.COMMAND,
480
431
  handler: (accessor, params) => {
481
- var _documentDataModel$ge;
482
432
  if (!params) return false;
483
433
  const { drawings, wrappingStyle, unitId } = params;
484
434
  const commandService = accessor.get(ICommandService);
485
435
  const documentDataModel = accessor.get(IUniverInstanceService).getUnit(unitId, UniverInstanceType.UNIVER_DOC);
486
436
  if (!documentDataModel) return false;
487
- const oldDrawings = (_documentDataModel$ge = documentDataModel.getDrawings()) !== null && _documentDataModel$ge !== void 0 ? _documentDataModel$ge : {};
437
+ const oldDrawings = documentDataModel.getDrawings() ?? {};
488
438
  const jsonX = JSONX.getInstance();
489
439
  const rawActions = [];
490
440
  for (const drawing of drawings) {
@@ -587,8 +537,8 @@ let DocDrawingController = class DocDrawingController extends Disposable {
587
537
  const drawings = doc.getSnapshot().drawings;
588
538
  const drawingOrder = doc.getSnapshot().drawingsOrder;
589
539
  return JSON.stringify({
590
- data: drawings !== null && drawings !== void 0 ? drawings : {},
591
- order: drawingOrder !== null && drawingOrder !== void 0 ? drawingOrder : []
540
+ data: drawings ?? {},
541
+ order: drawingOrder ?? []
592
542
  });
593
543
  }
594
544
  return "";
@@ -619,10 +569,9 @@ let DocDrawingController = class DocDrawingController extends Disposable {
619
569
  });
620
570
  },
621
571
  onLoad: (unitId, value) => {
622
- var _value$data, _value$order;
623
572
  this._setDrawingDataForUnit(unitId, {
624
- data: (_value$data = value.data) !== null && _value$data !== void 0 ? _value$data : {},
625
- order: (_value$order = value.order) !== null && _value$order !== void 0 ? _value$order : []
573
+ data: value.data ?? {},
574
+ order: value.order ?? []
626
575
  });
627
576
  }
628
577
  }));
@@ -675,7 +624,7 @@ DocDrawingController = __decorate([
675
624
  //#endregion
676
625
  //#region package.json
677
626
  var name = "@univerjs/docs-drawing";
678
- var version = "1.0.0-alpha.8";
627
+ var version = "1.0.0-beta.1";
679
628
 
680
629
  //#endregion
681
630
  //#region src/config/config.ts
@@ -16,9 +16,13 @@
16
16
  import type { ICommand } from '@univerjs/core';
17
17
  import type { IDrawingOrderMapParam } from '@univerjs/drawing';
18
18
  import { ArrangeTypeEnum } from '@univerjs/core';
19
- export interface ISetDocDrawingArrangeCommandParams extends IDrawingOrderMapParam {
19
+ export type ISetDocDrawingArrangeCommandParams = IDrawingOrderMapParam & ({
20
20
  arrangeType: ArrangeTypeEnum;
21
- }
21
+ zOrder?: never;
22
+ } | {
23
+ arrangeType?: never;
24
+ zOrder: number;
25
+ });
22
26
  /**
23
27
  * The command to arrange drawings.
24
28
  */