@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/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 _this$_document$getDo;
168
- const drawing = (_this$_document$getDo = this._document.getDocumentDataModel().getDrawings()) === null || _this$_document$getDo === void 0 ? void 0 : _this$_document$getDo[this._imageId];
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 _this$getDocumentData;
483
- const drawing = (_this$getDocumentData = this.getDocumentDataModel().getDrawings()) === null || _this$getDocumentData === void 0 ? void 0 : _this$getDocumentData[imageId];
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 documentDataModel = this.getDocumentDataModel();
489
- const drawings = documentDataModel.getDrawings() ?? {};
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 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) => ({
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 segmentId = (contentInsertRange === null || contentInsertRange === void 0 ? void 0 : contentInsertRange.segmentId) ?? (activeTextRange === null || activeTextRange === void 0 ? void 0 : activeTextRange.segmentId) ?? "";
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 = documentDataModel.getDrawings() ?? {};
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
- for (const block of removeCustomBlocks) {
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 = documentDataModel.getDrawingsOrder().indexOf(blockId);
231
- rawActions.push(jsonX.removeOp(["drawings", blockId], drawings[blockId]));
232
- rawActions.push(jsonX.removeOp(["drawingsOrder", drawingIndex], blockId));
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, arrangeType } = params;
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 oldDrawings = documentDataModel.getSnapshot().drawings ?? {};
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 _oldDrawings$drawingI;
346
- const oldValue = (_oldDrawings$drawingI = oldDrawings[drawingId]) === null || _oldDrawings$drawingI === void 0 || (_oldDrawings$drawingI = _oldDrawings$drawingI.docTransform) === null || _oldDrawings$drawingI === void 0 ? void 0 : _oldDrawings$drawingI[key];
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
- "drawings",
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 oldDrawings = documentDataModel.getDrawings() ?? {};
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 oldDrawing = oldDrawings[drawing.drawingId];
432
- if (!oldDrawing) continue;
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
- "drawings",
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 (err) {
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._setDrawingDataForUnit(unitId, {
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.getDrawings();
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: drawingDataModels,
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-insiders.20260809-70eefdd";
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 _this$_document$getDo;
168
- const drawing = (_this$_document$getDo = this._document.getDocumentDataModel().getDrawings()) === null || _this$_document$getDo === void 0 ? void 0 : _this$_document$getDo[this._imageId];
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 _this$getDocumentData;
483
- const drawing = (_this$getDocumentData = this.getDocumentDataModel().getDrawings()) === null || _this$getDocumentData === void 0 ? void 0 : _this$getDocumentData[imageId];
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 documentDataModel = this.getDocumentDataModel();
489
- const drawings = documentDataModel.getDrawings() ?? {};
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));