@univerjs/docs-drawing 1.0.0-alpha.6 → 1.0.0-alpha.8

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/cjs/facade.js CHANGED
@@ -258,6 +258,11 @@ var FDocumentImage = class {
258
258
  }
259
259
  /**
260
260
  * Sets the image wrapping style.
261
+ *
262
+ * Use `INLINE` to place the image in the text flow, `WRAP_SQUARE` to flow text beside it, or
263
+ * `WRAP_TOP_AND_BOTTOM` to keep text above and below it. `BEHIND_TEXT` and `IN_FRONT_OF_TEXT` do not reserve space
264
+ * in the text layout and can overlap text.
265
+ *
261
266
  * When switching from inline to a floating style in a UI environment, the current visual position is preserved.
262
267
  * @param {TextWrappingStyle} wrappingStyle The wrapping style to apply.
263
268
  * @returns {boolean} `true` when the update command succeeds; otherwise, `false`.
@@ -267,6 +272,7 @@ var FDocumentImage = class {
267
272
  * const image = fDocument.getImages()[0];
268
273
  *
269
274
  * if (image) {
275
+ * // Float the image beside body text without covering it.
270
276
  * const success = image.setWrappingStyle(univerAPI.Enum.DocsImageWrappingStyle.WRAP_SQUARE);
271
277
  * console.log(success);
272
278
  * }
@@ -435,7 +441,10 @@ var FDocumentImageMixin = class extends _univerjs_docs_facade.FDocument {
435
441
  var _options$wrappingStyl, _options$angle, _options$positionH, _options$positionV;
436
442
  const unitId = this.getId();
437
443
  const imageId = (0, _univerjs_core.generateRandomId)(6);
438
- const size = resolveImageSize(await this._getIntrinsicSize(options.source, options.imageSourceType), options);
444
+ const size = options.width != null && options.height != null ? {
445
+ width: options.width,
446
+ height: options.height
447
+ } : resolveImageSize(await this._getIntrinsicSize(options.source, options.imageSourceType), options);
439
448
  const defaultTransform = (0, _univerjs_docs.buildDocTransform)(size.width, size.height);
440
449
  const wrappingStyle = (_options$wrappingStyl = options.wrappingStyle) !== null && _options$wrappingStyl !== void 0 ? _options$wrappingStyl : _univerjs_docs_drawing.TextWrappingStyle.INLINE;
441
450
  const docTransform = {
package/lib/cjs/index.js CHANGED
@@ -117,7 +117,7 @@ function resolveDocDrawingInsertTextRange(accessor, unitId, textRange) {
117
117
  }
118
118
 
119
119
  //#endregion
120
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/typeof.js
120
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/typeof.js
121
121
  function _typeof(o) {
122
122
  "@babel/helpers - typeof";
123
123
  return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
@@ -128,7 +128,7 @@ function _typeof(o) {
128
128
  }
129
129
 
130
130
  //#endregion
131
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/toPrimitive.js
131
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/toPrimitive.js
132
132
  function toPrimitive(t, r) {
133
133
  if ("object" != _typeof(t) || !t) return t;
134
134
  var e = t[Symbol.toPrimitive];
@@ -141,14 +141,14 @@ function toPrimitive(t, r) {
141
141
  }
142
142
 
143
143
  //#endregion
144
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/toPropertyKey.js
144
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/toPropertyKey.js
145
145
  function toPropertyKey(t) {
146
146
  var i = toPrimitive(t, "string");
147
147
  return "symbol" == _typeof(i) ? i : i + "";
148
148
  }
149
149
 
150
150
  //#endregion
151
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/defineProperty.js
151
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/defineProperty.js
152
152
  function _defineProperty(e, r, t) {
153
153
  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
154
154
  value: t,
@@ -320,13 +320,47 @@ function executeMutations(mutations, commandService) {
320
320
  return true;
321
321
  }
322
322
 
323
- //#endregion
324
- //#region src/services/doc-drawing.service.ts
325
- var DocDrawingService = class extends _univerjs_drawing.UnitDrawingService {};
326
- const IDocDrawingService = (0, _univerjs_core.createIdentifier)("univer.doc.plugin.doc-drawing.service");
327
-
328
323
  //#endregion
329
324
  //#region src/commands/commands/set-drawing-arrange.command.ts
325
+ const DRAWINGS_ORDER_KEY = "drawingsOrder";
326
+ /**
327
+ * Calculates the target model order. Adjacent moves treat selected drawings as a group,
328
+ * so selected drawings keep their relative order instead of crossing each other.
329
+ */
330
+ function getArrangedDrawingOrder(drawingOrder, drawingIds, arrangeType) {
331
+ const selectedDrawingIds = new Set(drawingIds.filter((drawingId) => drawingOrder.includes(drawingId)));
332
+ const arrangedDrawingOrder = [...drawingOrder];
333
+ if (selectedDrawingIds.size === 0) return arrangedDrawingOrder;
334
+ if (arrangeType === _univerjs_core.ArrangeTypeEnum.forward) {
335
+ for (let index = arrangedDrawingOrder.length - 2; index >= 0; index--) if (selectedDrawingIds.has(arrangedDrawingOrder[index]) && !selectedDrawingIds.has(arrangedDrawingOrder[index + 1])) [arrangedDrawingOrder[index], arrangedDrawingOrder[index + 1]] = [arrangedDrawingOrder[index + 1], arrangedDrawingOrder[index]];
336
+ } else if (arrangeType === _univerjs_core.ArrangeTypeEnum.backward) {
337
+ for (let index = 1; index < arrangedDrawingOrder.length; index++) if (selectedDrawingIds.has(arrangedDrawingOrder[index]) && !selectedDrawingIds.has(arrangedDrawingOrder[index - 1])) [arrangedDrawingOrder[index], arrangedDrawingOrder[index - 1]] = [arrangedDrawingOrder[index - 1], arrangedDrawingOrder[index]];
338
+ } else if (arrangeType === _univerjs_core.ArrangeTypeEnum.front || arrangeType === _univerjs_core.ArrangeTypeEnum.back) {
339
+ const selected = arrangedDrawingOrder.filter((drawingId) => selectedDrawingIds.has(drawingId));
340
+ const unselected = arrangedDrawingOrder.filter((drawingId) => !selectedDrawingIds.has(drawingId));
341
+ return arrangeType === _univerjs_core.ArrangeTypeEnum.front ? [...unselected, ...selected] : [...selected, ...unselected];
342
+ }
343
+ return arrangedDrawingOrder;
344
+ }
345
+ /**
346
+ * Converts the target order into granular JSONX move operations. This avoids replacing
347
+ * the entire drawingsOrder array and keeps collaboration conflicts scoped to moved items.
348
+ */
349
+ function createDrawingOrderActions(drawingOrder, arrangedDrawingOrder) {
350
+ const jsonX = _univerjs_core.JSONX.getInstance();
351
+ const workingDrawingOrder = [...drawingOrder];
352
+ const rawActions = [];
353
+ for (let targetIndex = 0; targetIndex < arrangedDrawingOrder.length; targetIndex++) {
354
+ const drawingId = arrangedDrawingOrder[targetIndex];
355
+ const currentIndex = workingDrawingOrder.indexOf(drawingId);
356
+ if (currentIndex < 0 || currentIndex === targetIndex) continue;
357
+ const action = jsonX.moveOp([DRAWINGS_ORDER_KEY, currentIndex], [DRAWINGS_ORDER_KEY, targetIndex]);
358
+ if (action) rawActions.push(action);
359
+ workingDrawingOrder.splice(currentIndex, 1);
360
+ workingDrawingOrder.splice(targetIndex, 0, drawingId);
361
+ }
362
+ return rawActions.reduce((actions, action) => _univerjs_core.JSONX.compose(actions, action), null);
363
+ }
330
364
  /**
331
365
  * The command to arrange drawings.
332
366
  */
@@ -335,39 +369,18 @@ const SetDocDrawingArrangeCommand = {
335
369
  type: _univerjs_core.CommandType.COMMAND,
336
370
  handler: (accessor, params) => {
337
371
  const commandService = accessor.get(_univerjs_core.ICommandService);
338
- const docDrawingService = accessor.get(IDocDrawingService);
339
372
  if (params == null) return false;
340
- const { unitId, subUnitId, drawingIds, arrangeType } = params;
341
- const drawingOrderMapParam = {
373
+ const { unitId, drawingIds, arrangeType } = params;
374
+ const documentDataModel = accessor.get(_univerjs_core.IUniverInstanceService).getUnit(unitId, _univerjs_core.UniverInstanceType.UNIVER_DOC);
375
+ const drawingOrder = documentDataModel === null || documentDataModel === void 0 ? void 0 : documentDataModel.getDrawingsOrder();
376
+ if (!drawingOrder) return false;
377
+ const actions = createDrawingOrderActions(drawingOrder, getArrangedDrawingOrder(drawingOrder, drawingIds, arrangeType));
378
+ if (_univerjs_core.JSONX.isNoop(actions)) return false;
379
+ const result = commandService.syncExecuteCommand(_univerjs_docs.RichTextEditingMutation.id, {
342
380
  unitId,
343
- subUnitId,
344
- drawingIds
345
- };
346
- let jsonOp;
347
- if (arrangeType === _univerjs_core.ArrangeTypeEnum.forward) jsonOp = docDrawingService.getForwardDrawingsOp(drawingOrderMapParam);
348
- else if (arrangeType === _univerjs_core.ArrangeTypeEnum.backward) jsonOp = docDrawingService.getBackwardDrawingOp(drawingOrderMapParam);
349
- else if (arrangeType === _univerjs_core.ArrangeTypeEnum.front) jsonOp = docDrawingService.getFrontDrawingsOp(drawingOrderMapParam);
350
- else if (arrangeType === _univerjs_core.ArrangeTypeEnum.back) jsonOp = docDrawingService.getBackDrawingsOp(drawingOrderMapParam);
351
- if (jsonOp == null) return false;
352
- const { redo } = jsonOp;
353
- if (redo == null) return false;
354
- const rawActions = [];
355
- let redoCopy = _univerjs_core.Tools.deepClone(redo);
356
- redoCopy = redoCopy.slice(3);
357
- redoCopy.unshift("drawingsOrder");
358
- rawActions.push(redoCopy);
359
- const doMutation = {
360
- id: _univerjs_docs.RichTextEditingMutation.id,
361
- params: {
362
- unitId,
363
- actions: [],
364
- textRanges: null
365
- }
366
- };
367
- doMutation.params.actions = rawActions.reduce((acc, cur) => {
368
- return _univerjs_core.JSONX.compose(acc, cur);
369
- }, null);
370
- const result = commandService.syncExecuteCommand(doMutation.id, doMutation.params);
381
+ actions,
382
+ textRanges: null
383
+ });
371
384
  return Boolean(result);
372
385
  }
373
386
  };
@@ -412,11 +425,43 @@ const UpdateDrawingDocTransformCommand = {
412
425
 
413
426
  //#endregion
414
427
  //#region src/commands/commands/update-doc-drawing-wrapping-style.command.ts
428
+ /**
429
+ * Controls how a document drawing participates in text layout.
430
+ *
431
+ * `INLINE`, `WRAP_SQUARE`, and `WRAP_TOP_AND_BOTTOM` participate in text layout and can cause text to reflow.
432
+ * `BEHIND_TEXT` and `IN_FRONT_OF_TEXT` are overlay styles and do not cause text to reflow.
433
+ */
415
434
  let TextWrappingStyle = /* @__PURE__ */ function(TextWrappingStyle) {
435
+ /**
436
+ * Places the drawing in the text flow like a character.
437
+ *
438
+ * The drawing occupies layout space and does not overlap surrounding text. Its position is determined by its
439
+ * document range, so floating position settings have no visible effect.
440
+ */
416
441
  TextWrappingStyle["INLINE"] = "inline";
442
+ /**
443
+ * Floats the drawing behind document text without causing the text to reflow.
444
+ *
445
+ * Use this style for backgrounds or watermarks. Text can overlap the drawing, so ensure that it remains readable.
446
+ */
417
447
  TextWrappingStyle["BEHIND_TEXT"] = "behindText";
448
+ /**
449
+ * Floats the drawing in front of document text without causing the text to reflow.
450
+ *
451
+ * The drawing can cover overlapping text. Use this style only when an overlay is intentional.
452
+ */
418
453
  TextWrappingStyle["IN_FRONT_OF_TEXT"] = "inFrontOfText";
454
+ /**
455
+ * Floats the drawing and wraps text around its rectangular bounds.
456
+ *
457
+ * Use this style for images that should appear beside body text, such as portraits or illustrations.
458
+ */
419
459
  TextWrappingStyle["WRAP_SQUARE"] = "wrapSquare";
460
+ /**
461
+ * Floats the drawing in a horizontal band, with text only above and below it.
462
+ *
463
+ * Use this style for wide figures or standalone illustrations that should not have text beside them.
464
+ */
420
465
  TextWrappingStyle["WRAP_TOP_AND_BOTTOM"] = "wrapTopAndBottom";
421
466
  return TextWrappingStyle;
422
467
  }({});
@@ -485,7 +530,12 @@ const UpdateDocDrawingWrappingStyleCommand = {
485
530
  };
486
531
 
487
532
  //#endregion
488
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/decorateParam.js
533
+ //#region src/services/doc-drawing.service.ts
534
+ var DocDrawingService = class extends _univerjs_drawing.UnitDrawingService {};
535
+ const IDocDrawingService = (0, _univerjs_core.createIdentifier)("univer.doc.plugin.doc-drawing.service");
536
+
537
+ //#endregion
538
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/decorateParam.js
489
539
  function __decorateParam(paramIndex, decorator) {
490
540
  return function(target, key) {
491
541
  decorator(target, key, paramIndex);
@@ -493,7 +543,7 @@ function __decorateParam(paramIndex, decorator) {
493
543
  }
494
544
 
495
545
  //#endregion
496
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/decorate.js
546
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/decorate.js
497
547
  function __decorate(decorators, target, key, desc) {
498
548
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
499
549
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -626,7 +676,7 @@ DocDrawingController = __decorate([
626
676
  //#endregion
627
677
  //#region package.json
628
678
  var name = "@univerjs/docs-drawing";
629
- var version = "1.0.0-alpha.6";
679
+ var version = "1.0.0-alpha.8";
630
680
 
631
681
  //#endregion
632
682
  //#region src/config/config.ts
@@ -675,7 +725,11 @@ _defineProperty(UniverDocsDrawingPlugin, "pluginName", DOCS_DRAWING_PLUGIN);
675
725
  _defineProperty(UniverDocsDrawingPlugin, "packageName", name);
676
726
  _defineProperty(UniverDocsDrawingPlugin, "version", version);
677
727
  _defineProperty(UniverDocsDrawingPlugin, "type", _univerjs_core.UniverInstanceType.UNIVER_DOC);
678
- UniverDocsDrawingPlugin = __decorate([__decorateParam(1, (0, _univerjs_core.Inject)(_univerjs_core.Injector)), __decorateParam(2, _univerjs_core.IConfigService)], UniverDocsDrawingPlugin);
728
+ UniverDocsDrawingPlugin = __decorate([
729
+ (0, _univerjs_core.DependentOn)(_univerjs_docs.UniverDocsPlugin, _univerjs_drawing.UniverDrawingPlugin),
730
+ __decorateParam(1, (0, _univerjs_core.Inject)(_univerjs_core.Injector)),
731
+ __decorateParam(2, _univerjs_core.IConfigService)
732
+ ], UniverDocsDrawingPlugin);
679
733
 
680
734
  //#endregion
681
735
  exports.DOCS_DRAWING_PLUGIN = DOCS_DRAWING_PLUGIN;
package/lib/es/facade.js CHANGED
@@ -257,6 +257,11 @@ var FDocumentImage = class {
257
257
  }
258
258
  /**
259
259
  * Sets the image wrapping style.
260
+ *
261
+ * Use `INLINE` to place the image in the text flow, `WRAP_SQUARE` to flow text beside it, or
262
+ * `WRAP_TOP_AND_BOTTOM` to keep text above and below it. `BEHIND_TEXT` and `IN_FRONT_OF_TEXT` do not reserve space
263
+ * in the text layout and can overlap text.
264
+ *
260
265
  * When switching from inline to a floating style in a UI environment, the current visual position is preserved.
261
266
  * @param {TextWrappingStyle} wrappingStyle The wrapping style to apply.
262
267
  * @returns {boolean} `true` when the update command succeeds; otherwise, `false`.
@@ -266,6 +271,7 @@ var FDocumentImage = class {
266
271
  * const image = fDocument.getImages()[0];
267
272
  *
268
273
  * if (image) {
274
+ * // Float the image beside body text without covering it.
269
275
  * const success = image.setWrappingStyle(univerAPI.Enum.DocsImageWrappingStyle.WRAP_SQUARE);
270
276
  * console.log(success);
271
277
  * }
@@ -434,7 +440,10 @@ var FDocumentImageMixin = class extends FDocument {
434
440
  var _options$wrappingStyl, _options$angle, _options$positionH, _options$positionV;
435
441
  const unitId = this.getId();
436
442
  const imageId = generateRandomId(6);
437
- const size = resolveImageSize(await this._getIntrinsicSize(options.source, options.imageSourceType), options);
443
+ const size = options.width != null && options.height != null ? {
444
+ width: options.width,
445
+ height: options.height
446
+ } : resolveImageSize(await this._getIntrinsicSize(options.source, options.imageSourceType), options);
438
447
  const defaultTransform = buildDocTransform(size.width, size.height);
439
448
  const wrappingStyle = (_options$wrappingStyl = options.wrappingStyle) !== null && _options$wrappingStyl !== void 0 ? _options$wrappingStyl : TextWrappingStyle.INLINE;
440
449
  const docTransform = {
package/lib/es/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { ArrangeTypeEnum, BooleanNumber, BuildTextUtils, CommandType, 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";
2
- import { DocSelectionManagerService, RichTextEditingMutation, getContentInsertRange, normalizeTextRange } from "@univerjs/docs";
3
- import { IDrawingManagerService, UnitDrawingService } from "@univerjs/drawing";
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";
2
+ import { DocSelectionManagerService, RichTextEditingMutation, UniverDocsPlugin, getContentInsertRange, normalizeTextRange } from "@univerjs/docs";
3
+ import { IDrawingManagerService, UnitDrawingService, UniverDrawingPlugin } from "@univerjs/drawing";
4
4
 
5
5
  //#region src/commands/commands/insert-doc-drawing.command.ts
6
6
  /**
@@ -116,7 +116,7 @@ function resolveDocDrawingInsertTextRange(accessor, unitId, textRange) {
116
116
  }
117
117
 
118
118
  //#endregion
119
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/typeof.js
119
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/typeof.js
120
120
  function _typeof(o) {
121
121
  "@babel/helpers - typeof";
122
122
  return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
@@ -127,7 +127,7 @@ function _typeof(o) {
127
127
  }
128
128
 
129
129
  //#endregion
130
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/toPrimitive.js
130
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/toPrimitive.js
131
131
  function toPrimitive(t, r) {
132
132
  if ("object" != _typeof(t) || !t) return t;
133
133
  var e = t[Symbol.toPrimitive];
@@ -140,14 +140,14 @@ function toPrimitive(t, r) {
140
140
  }
141
141
 
142
142
  //#endregion
143
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/toPropertyKey.js
143
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/toPropertyKey.js
144
144
  function toPropertyKey(t) {
145
145
  var i = toPrimitive(t, "string");
146
146
  return "symbol" == _typeof(i) ? i : i + "";
147
147
  }
148
148
 
149
149
  //#endregion
150
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/defineProperty.js
150
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/defineProperty.js
151
151
  function _defineProperty(e, r, t) {
152
152
  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
153
153
  value: t,
@@ -319,13 +319,47 @@ function executeMutations(mutations, commandService) {
319
319
  return true;
320
320
  }
321
321
 
322
- //#endregion
323
- //#region src/services/doc-drawing.service.ts
324
- var DocDrawingService = class extends UnitDrawingService {};
325
- const IDocDrawingService = createIdentifier("univer.doc.plugin.doc-drawing.service");
326
-
327
322
  //#endregion
328
323
  //#region src/commands/commands/set-drawing-arrange.command.ts
324
+ const DRAWINGS_ORDER_KEY = "drawingsOrder";
325
+ /**
326
+ * Calculates the target model order. Adjacent moves treat selected drawings as a group,
327
+ * so selected drawings keep their relative order instead of crossing each other.
328
+ */
329
+ function getArrangedDrawingOrder(drawingOrder, drawingIds, arrangeType) {
330
+ const selectedDrawingIds = new Set(drawingIds.filter((drawingId) => drawingOrder.includes(drawingId)));
331
+ const arrangedDrawingOrder = [...drawingOrder];
332
+ if (selectedDrawingIds.size === 0) return arrangedDrawingOrder;
333
+ if (arrangeType === ArrangeTypeEnum.forward) {
334
+ for (let index = arrangedDrawingOrder.length - 2; index >= 0; index--) if (selectedDrawingIds.has(arrangedDrawingOrder[index]) && !selectedDrawingIds.has(arrangedDrawingOrder[index + 1])) [arrangedDrawingOrder[index], arrangedDrawingOrder[index + 1]] = [arrangedDrawingOrder[index + 1], arrangedDrawingOrder[index]];
335
+ } else if (arrangeType === ArrangeTypeEnum.backward) {
336
+ for (let index = 1; index < arrangedDrawingOrder.length; index++) if (selectedDrawingIds.has(arrangedDrawingOrder[index]) && !selectedDrawingIds.has(arrangedDrawingOrder[index - 1])) [arrangedDrawingOrder[index], arrangedDrawingOrder[index - 1]] = [arrangedDrawingOrder[index - 1], arrangedDrawingOrder[index]];
337
+ } else if (arrangeType === ArrangeTypeEnum.front || arrangeType === ArrangeTypeEnum.back) {
338
+ const selected = arrangedDrawingOrder.filter((drawingId) => selectedDrawingIds.has(drawingId));
339
+ const unselected = arrangedDrawingOrder.filter((drawingId) => !selectedDrawingIds.has(drawingId));
340
+ return arrangeType === ArrangeTypeEnum.front ? [...unselected, ...selected] : [...selected, ...unselected];
341
+ }
342
+ return arrangedDrawingOrder;
343
+ }
344
+ /**
345
+ * Converts the target order into granular JSONX move operations. This avoids replacing
346
+ * the entire drawingsOrder array and keeps collaboration conflicts scoped to moved items.
347
+ */
348
+ function createDrawingOrderActions(drawingOrder, arrangedDrawingOrder) {
349
+ const jsonX = JSONX.getInstance();
350
+ const workingDrawingOrder = [...drawingOrder];
351
+ const rawActions = [];
352
+ for (let targetIndex = 0; targetIndex < arrangedDrawingOrder.length; targetIndex++) {
353
+ const drawingId = arrangedDrawingOrder[targetIndex];
354
+ const currentIndex = workingDrawingOrder.indexOf(drawingId);
355
+ if (currentIndex < 0 || currentIndex === targetIndex) continue;
356
+ const action = jsonX.moveOp([DRAWINGS_ORDER_KEY, currentIndex], [DRAWINGS_ORDER_KEY, targetIndex]);
357
+ if (action) rawActions.push(action);
358
+ workingDrawingOrder.splice(currentIndex, 1);
359
+ workingDrawingOrder.splice(targetIndex, 0, drawingId);
360
+ }
361
+ return rawActions.reduce((actions, action) => JSONX.compose(actions, action), null);
362
+ }
329
363
  /**
330
364
  * The command to arrange drawings.
331
365
  */
@@ -334,39 +368,18 @@ const SetDocDrawingArrangeCommand = {
334
368
  type: CommandType.COMMAND,
335
369
  handler: (accessor, params) => {
336
370
  const commandService = accessor.get(ICommandService);
337
- const docDrawingService = accessor.get(IDocDrawingService);
338
371
  if (params == null) return false;
339
- const { unitId, subUnitId, drawingIds, arrangeType } = params;
340
- const drawingOrderMapParam = {
372
+ const { unitId, drawingIds, arrangeType } = params;
373
+ const documentDataModel = accessor.get(IUniverInstanceService).getUnit(unitId, UniverInstanceType.UNIVER_DOC);
374
+ const drawingOrder = documentDataModel === null || documentDataModel === void 0 ? void 0 : documentDataModel.getDrawingsOrder();
375
+ if (!drawingOrder) return false;
376
+ const actions = createDrawingOrderActions(drawingOrder, getArrangedDrawingOrder(drawingOrder, drawingIds, arrangeType));
377
+ if (JSONX.isNoop(actions)) return false;
378
+ const result = commandService.syncExecuteCommand(RichTextEditingMutation.id, {
341
379
  unitId,
342
- subUnitId,
343
- drawingIds
344
- };
345
- let jsonOp;
346
- if (arrangeType === ArrangeTypeEnum.forward) jsonOp = docDrawingService.getForwardDrawingsOp(drawingOrderMapParam);
347
- else if (arrangeType === ArrangeTypeEnum.backward) jsonOp = docDrawingService.getBackwardDrawingOp(drawingOrderMapParam);
348
- else if (arrangeType === ArrangeTypeEnum.front) jsonOp = docDrawingService.getFrontDrawingsOp(drawingOrderMapParam);
349
- else if (arrangeType === ArrangeTypeEnum.back) jsonOp = docDrawingService.getBackDrawingsOp(drawingOrderMapParam);
350
- if (jsonOp == null) return false;
351
- const { redo } = jsonOp;
352
- if (redo == null) return false;
353
- const rawActions = [];
354
- let redoCopy = Tools.deepClone(redo);
355
- redoCopy = redoCopy.slice(3);
356
- redoCopy.unshift("drawingsOrder");
357
- rawActions.push(redoCopy);
358
- const doMutation = {
359
- id: RichTextEditingMutation.id,
360
- params: {
361
- unitId,
362
- actions: [],
363
- textRanges: null
364
- }
365
- };
366
- doMutation.params.actions = rawActions.reduce((acc, cur) => {
367
- return JSONX.compose(acc, cur);
368
- }, null);
369
- const result = commandService.syncExecuteCommand(doMutation.id, doMutation.params);
380
+ actions,
381
+ textRanges: null
382
+ });
370
383
  return Boolean(result);
371
384
  }
372
385
  };
@@ -411,11 +424,43 @@ const UpdateDrawingDocTransformCommand = {
411
424
 
412
425
  //#endregion
413
426
  //#region src/commands/commands/update-doc-drawing-wrapping-style.command.ts
427
+ /**
428
+ * Controls how a document drawing participates in text layout.
429
+ *
430
+ * `INLINE`, `WRAP_SQUARE`, and `WRAP_TOP_AND_BOTTOM` participate in text layout and can cause text to reflow.
431
+ * `BEHIND_TEXT` and `IN_FRONT_OF_TEXT` are overlay styles and do not cause text to reflow.
432
+ */
414
433
  let TextWrappingStyle = /* @__PURE__ */ function(TextWrappingStyle) {
434
+ /**
435
+ * Places the drawing in the text flow like a character.
436
+ *
437
+ * The drawing occupies layout space and does not overlap surrounding text. Its position is determined by its
438
+ * document range, so floating position settings have no visible effect.
439
+ */
415
440
  TextWrappingStyle["INLINE"] = "inline";
441
+ /**
442
+ * Floats the drawing behind document text without causing the text to reflow.
443
+ *
444
+ * Use this style for backgrounds or watermarks. Text can overlap the drawing, so ensure that it remains readable.
445
+ */
416
446
  TextWrappingStyle["BEHIND_TEXT"] = "behindText";
447
+ /**
448
+ * Floats the drawing in front of document text without causing the text to reflow.
449
+ *
450
+ * The drawing can cover overlapping text. Use this style only when an overlay is intentional.
451
+ */
417
452
  TextWrappingStyle["IN_FRONT_OF_TEXT"] = "inFrontOfText";
453
+ /**
454
+ * Floats the drawing and wraps text around its rectangular bounds.
455
+ *
456
+ * Use this style for images that should appear beside body text, such as portraits or illustrations.
457
+ */
418
458
  TextWrappingStyle["WRAP_SQUARE"] = "wrapSquare";
459
+ /**
460
+ * Floats the drawing in a horizontal band, with text only above and below it.
461
+ *
462
+ * Use this style for wide figures or standalone illustrations that should not have text beside them.
463
+ */
419
464
  TextWrappingStyle["WRAP_TOP_AND_BOTTOM"] = "wrapTopAndBottom";
420
465
  return TextWrappingStyle;
421
466
  }({});
@@ -484,7 +529,12 @@ const UpdateDocDrawingWrappingStyleCommand = {
484
529
  };
485
530
 
486
531
  //#endregion
487
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/decorateParam.js
532
+ //#region src/services/doc-drawing.service.ts
533
+ var DocDrawingService = class extends UnitDrawingService {};
534
+ const IDocDrawingService = createIdentifier("univer.doc.plugin.doc-drawing.service");
535
+
536
+ //#endregion
537
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/decorateParam.js
488
538
  function __decorateParam(paramIndex, decorator) {
489
539
  return function(target, key) {
490
540
  decorator(target, key, paramIndex);
@@ -492,7 +542,7 @@ function __decorateParam(paramIndex, decorator) {
492
542
  }
493
543
 
494
544
  //#endregion
495
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/decorate.js
545
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/decorate.js
496
546
  function __decorate(decorators, target, key, desc) {
497
547
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
498
548
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -625,7 +675,7 @@ DocDrawingController = __decorate([
625
675
  //#endregion
626
676
  //#region package.json
627
677
  var name = "@univerjs/docs-drawing";
628
- var version = "1.0.0-alpha.6";
678
+ var version = "1.0.0-alpha.8";
629
679
 
630
680
  //#endregion
631
681
  //#region src/config/config.ts
@@ -674,7 +724,11 @@ _defineProperty(UniverDocsDrawingPlugin, "pluginName", DOCS_DRAWING_PLUGIN);
674
724
  _defineProperty(UniverDocsDrawingPlugin, "packageName", name);
675
725
  _defineProperty(UniverDocsDrawingPlugin, "version", version);
676
726
  _defineProperty(UniverDocsDrawingPlugin, "type", UniverInstanceType.UNIVER_DOC);
677
- UniverDocsDrawingPlugin = __decorate([__decorateParam(1, Inject(Injector)), __decorateParam(2, IConfigService)], UniverDocsDrawingPlugin);
727
+ UniverDocsDrawingPlugin = __decorate([
728
+ DependentOn(UniverDocsPlugin, UniverDrawingPlugin),
729
+ __decorateParam(1, Inject(Injector)),
730
+ __decorateParam(2, IConfigService)
731
+ ], UniverDocsDrawingPlugin);
678
732
 
679
733
  //#endregion
680
734
  export { DOCS_DRAWING_PLUGIN, DocDrawingAdapterService, DocDrawingController, DocDrawingService, IDocDrawingAdapterService, IDocDrawingService, InsertDocDrawingCommand, RemoveDocDrawingCommand, SetDocDrawingArrangeCommand, TextWrappingStyle, UniverDocsDrawingPlugin, UpdateDocDrawingWrappingStyleCommand, UpdateDrawingDocTransformCommand, WRAPPING_STYLE_TO_LAYOUT_TYPE, getDocDrawingRenderOrder };
package/lib/facade.js CHANGED
@@ -257,6 +257,11 @@ var FDocumentImage = class {
257
257
  }
258
258
  /**
259
259
  * Sets the image wrapping style.
260
+ *
261
+ * Use `INLINE` to place the image in the text flow, `WRAP_SQUARE` to flow text beside it, or
262
+ * `WRAP_TOP_AND_BOTTOM` to keep text above and below it. `BEHIND_TEXT` and `IN_FRONT_OF_TEXT` do not reserve space
263
+ * in the text layout and can overlap text.
264
+ *
260
265
  * When switching from inline to a floating style in a UI environment, the current visual position is preserved.
261
266
  * @param {TextWrappingStyle} wrappingStyle The wrapping style to apply.
262
267
  * @returns {boolean} `true` when the update command succeeds; otherwise, `false`.
@@ -266,6 +271,7 @@ var FDocumentImage = class {
266
271
  * const image = fDocument.getImages()[0];
267
272
  *
268
273
  * if (image) {
274
+ * // Float the image beside body text without covering it.
269
275
  * const success = image.setWrappingStyle(univerAPI.Enum.DocsImageWrappingStyle.WRAP_SQUARE);
270
276
  * console.log(success);
271
277
  * }
@@ -434,7 +440,10 @@ var FDocumentImageMixin = class extends FDocument {
434
440
  var _options$wrappingStyl, _options$angle, _options$positionH, _options$positionV;
435
441
  const unitId = this.getId();
436
442
  const imageId = generateRandomId(6);
437
- const size = resolveImageSize(await this._getIntrinsicSize(options.source, options.imageSourceType), options);
443
+ const size = options.width != null && options.height != null ? {
444
+ width: options.width,
445
+ height: options.height
446
+ } : resolveImageSize(await this._getIntrinsicSize(options.source, options.imageSourceType), options);
438
447
  const defaultTransform = buildDocTransform(size.width, size.height);
439
448
  const wrappingStyle = (_options$wrappingStyl = options.wrappingStyle) !== null && _options$wrappingStyl !== void 0 ? _options$wrappingStyl : TextWrappingStyle.INLINE;
440
449
  const docTransform = {
package/lib/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { ArrangeTypeEnum, BooleanNumber, BuildTextUtils, CommandType, 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";
2
- import { DocSelectionManagerService, RichTextEditingMutation, getContentInsertRange, normalizeTextRange } from "@univerjs/docs";
3
- import { IDrawingManagerService, UnitDrawingService } from "@univerjs/drawing";
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";
2
+ import { DocSelectionManagerService, RichTextEditingMutation, UniverDocsPlugin, getContentInsertRange, normalizeTextRange } from "@univerjs/docs";
3
+ import { IDrawingManagerService, UnitDrawingService, UniverDrawingPlugin } from "@univerjs/drawing";
4
4
 
5
5
  //#region src/commands/commands/insert-doc-drawing.command.ts
6
6
  /**
@@ -116,7 +116,7 @@ function resolveDocDrawingInsertTextRange(accessor, unitId, textRange) {
116
116
  }
117
117
 
118
118
  //#endregion
119
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/typeof.js
119
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/typeof.js
120
120
  function _typeof(o) {
121
121
  "@babel/helpers - typeof";
122
122
  return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
@@ -127,7 +127,7 @@ function _typeof(o) {
127
127
  }
128
128
 
129
129
  //#endregion
130
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/toPrimitive.js
130
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/toPrimitive.js
131
131
  function toPrimitive(t, r) {
132
132
  if ("object" != _typeof(t) || !t) return t;
133
133
  var e = t[Symbol.toPrimitive];
@@ -140,14 +140,14 @@ function toPrimitive(t, r) {
140
140
  }
141
141
 
142
142
  //#endregion
143
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/toPropertyKey.js
143
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/toPropertyKey.js
144
144
  function toPropertyKey(t) {
145
145
  var i = toPrimitive(t, "string");
146
146
  return "symbol" == _typeof(i) ? i : i + "";
147
147
  }
148
148
 
149
149
  //#endregion
150
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/defineProperty.js
150
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/defineProperty.js
151
151
  function _defineProperty(e, r, t) {
152
152
  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
153
153
  value: t,
@@ -319,13 +319,47 @@ function executeMutations(mutations, commandService) {
319
319
  return true;
320
320
  }
321
321
 
322
- //#endregion
323
- //#region src/services/doc-drawing.service.ts
324
- var DocDrawingService = class extends UnitDrawingService {};
325
- const IDocDrawingService = createIdentifier("univer.doc.plugin.doc-drawing.service");
326
-
327
322
  //#endregion
328
323
  //#region src/commands/commands/set-drawing-arrange.command.ts
324
+ const DRAWINGS_ORDER_KEY = "drawingsOrder";
325
+ /**
326
+ * Calculates the target model order. Adjacent moves treat selected drawings as a group,
327
+ * so selected drawings keep their relative order instead of crossing each other.
328
+ */
329
+ function getArrangedDrawingOrder(drawingOrder, drawingIds, arrangeType) {
330
+ const selectedDrawingIds = new Set(drawingIds.filter((drawingId) => drawingOrder.includes(drawingId)));
331
+ const arrangedDrawingOrder = [...drawingOrder];
332
+ if (selectedDrawingIds.size === 0) return arrangedDrawingOrder;
333
+ if (arrangeType === ArrangeTypeEnum.forward) {
334
+ for (let index = arrangedDrawingOrder.length - 2; index >= 0; index--) if (selectedDrawingIds.has(arrangedDrawingOrder[index]) && !selectedDrawingIds.has(arrangedDrawingOrder[index + 1])) [arrangedDrawingOrder[index], arrangedDrawingOrder[index + 1]] = [arrangedDrawingOrder[index + 1], arrangedDrawingOrder[index]];
335
+ } else if (arrangeType === ArrangeTypeEnum.backward) {
336
+ for (let index = 1; index < arrangedDrawingOrder.length; index++) if (selectedDrawingIds.has(arrangedDrawingOrder[index]) && !selectedDrawingIds.has(arrangedDrawingOrder[index - 1])) [arrangedDrawingOrder[index], arrangedDrawingOrder[index - 1]] = [arrangedDrawingOrder[index - 1], arrangedDrawingOrder[index]];
337
+ } else if (arrangeType === ArrangeTypeEnum.front || arrangeType === ArrangeTypeEnum.back) {
338
+ const selected = arrangedDrawingOrder.filter((drawingId) => selectedDrawingIds.has(drawingId));
339
+ const unselected = arrangedDrawingOrder.filter((drawingId) => !selectedDrawingIds.has(drawingId));
340
+ return arrangeType === ArrangeTypeEnum.front ? [...unselected, ...selected] : [...selected, ...unselected];
341
+ }
342
+ return arrangedDrawingOrder;
343
+ }
344
+ /**
345
+ * Converts the target order into granular JSONX move operations. This avoids replacing
346
+ * the entire drawingsOrder array and keeps collaboration conflicts scoped to moved items.
347
+ */
348
+ function createDrawingOrderActions(drawingOrder, arrangedDrawingOrder) {
349
+ const jsonX = JSONX.getInstance();
350
+ const workingDrawingOrder = [...drawingOrder];
351
+ const rawActions = [];
352
+ for (let targetIndex = 0; targetIndex < arrangedDrawingOrder.length; targetIndex++) {
353
+ const drawingId = arrangedDrawingOrder[targetIndex];
354
+ const currentIndex = workingDrawingOrder.indexOf(drawingId);
355
+ if (currentIndex < 0 || currentIndex === targetIndex) continue;
356
+ const action = jsonX.moveOp([DRAWINGS_ORDER_KEY, currentIndex], [DRAWINGS_ORDER_KEY, targetIndex]);
357
+ if (action) rawActions.push(action);
358
+ workingDrawingOrder.splice(currentIndex, 1);
359
+ workingDrawingOrder.splice(targetIndex, 0, drawingId);
360
+ }
361
+ return rawActions.reduce((actions, action) => JSONX.compose(actions, action), null);
362
+ }
329
363
  /**
330
364
  * The command to arrange drawings.
331
365
  */
@@ -334,39 +368,18 @@ const SetDocDrawingArrangeCommand = {
334
368
  type: CommandType.COMMAND,
335
369
  handler: (accessor, params) => {
336
370
  const commandService = accessor.get(ICommandService);
337
- const docDrawingService = accessor.get(IDocDrawingService);
338
371
  if (params == null) return false;
339
- const { unitId, subUnitId, drawingIds, arrangeType } = params;
340
- const drawingOrderMapParam = {
372
+ const { unitId, drawingIds, arrangeType } = params;
373
+ const documentDataModel = accessor.get(IUniverInstanceService).getUnit(unitId, UniverInstanceType.UNIVER_DOC);
374
+ const drawingOrder = documentDataModel === null || documentDataModel === void 0 ? void 0 : documentDataModel.getDrawingsOrder();
375
+ if (!drawingOrder) return false;
376
+ const actions = createDrawingOrderActions(drawingOrder, getArrangedDrawingOrder(drawingOrder, drawingIds, arrangeType));
377
+ if (JSONX.isNoop(actions)) return false;
378
+ const result = commandService.syncExecuteCommand(RichTextEditingMutation.id, {
341
379
  unitId,
342
- subUnitId,
343
- drawingIds
344
- };
345
- let jsonOp;
346
- if (arrangeType === ArrangeTypeEnum.forward) jsonOp = docDrawingService.getForwardDrawingsOp(drawingOrderMapParam);
347
- else if (arrangeType === ArrangeTypeEnum.backward) jsonOp = docDrawingService.getBackwardDrawingOp(drawingOrderMapParam);
348
- else if (arrangeType === ArrangeTypeEnum.front) jsonOp = docDrawingService.getFrontDrawingsOp(drawingOrderMapParam);
349
- else if (arrangeType === ArrangeTypeEnum.back) jsonOp = docDrawingService.getBackDrawingsOp(drawingOrderMapParam);
350
- if (jsonOp == null) return false;
351
- const { redo } = jsonOp;
352
- if (redo == null) return false;
353
- const rawActions = [];
354
- let redoCopy = Tools.deepClone(redo);
355
- redoCopy = redoCopy.slice(3);
356
- redoCopy.unshift("drawingsOrder");
357
- rawActions.push(redoCopy);
358
- const doMutation = {
359
- id: RichTextEditingMutation.id,
360
- params: {
361
- unitId,
362
- actions: [],
363
- textRanges: null
364
- }
365
- };
366
- doMutation.params.actions = rawActions.reduce((acc, cur) => {
367
- return JSONX.compose(acc, cur);
368
- }, null);
369
- const result = commandService.syncExecuteCommand(doMutation.id, doMutation.params);
380
+ actions,
381
+ textRanges: null
382
+ });
370
383
  return Boolean(result);
371
384
  }
372
385
  };
@@ -411,11 +424,43 @@ const UpdateDrawingDocTransformCommand = {
411
424
 
412
425
  //#endregion
413
426
  //#region src/commands/commands/update-doc-drawing-wrapping-style.command.ts
427
+ /**
428
+ * Controls how a document drawing participates in text layout.
429
+ *
430
+ * `INLINE`, `WRAP_SQUARE`, and `WRAP_TOP_AND_BOTTOM` participate in text layout and can cause text to reflow.
431
+ * `BEHIND_TEXT` and `IN_FRONT_OF_TEXT` are overlay styles and do not cause text to reflow.
432
+ */
414
433
  let TextWrappingStyle = /* @__PURE__ */ function(TextWrappingStyle) {
434
+ /**
435
+ * Places the drawing in the text flow like a character.
436
+ *
437
+ * The drawing occupies layout space and does not overlap surrounding text. Its position is determined by its
438
+ * document range, so floating position settings have no visible effect.
439
+ */
415
440
  TextWrappingStyle["INLINE"] = "inline";
441
+ /**
442
+ * Floats the drawing behind document text without causing the text to reflow.
443
+ *
444
+ * Use this style for backgrounds or watermarks. Text can overlap the drawing, so ensure that it remains readable.
445
+ */
416
446
  TextWrappingStyle["BEHIND_TEXT"] = "behindText";
447
+ /**
448
+ * Floats the drawing in front of document text without causing the text to reflow.
449
+ *
450
+ * The drawing can cover overlapping text. Use this style only when an overlay is intentional.
451
+ */
417
452
  TextWrappingStyle["IN_FRONT_OF_TEXT"] = "inFrontOfText";
453
+ /**
454
+ * Floats the drawing and wraps text around its rectangular bounds.
455
+ *
456
+ * Use this style for images that should appear beside body text, such as portraits or illustrations.
457
+ */
418
458
  TextWrappingStyle["WRAP_SQUARE"] = "wrapSquare";
459
+ /**
460
+ * Floats the drawing in a horizontal band, with text only above and below it.
461
+ *
462
+ * Use this style for wide figures or standalone illustrations that should not have text beside them.
463
+ */
419
464
  TextWrappingStyle["WRAP_TOP_AND_BOTTOM"] = "wrapTopAndBottom";
420
465
  return TextWrappingStyle;
421
466
  }({});
@@ -484,7 +529,12 @@ const UpdateDocDrawingWrappingStyleCommand = {
484
529
  };
485
530
 
486
531
  //#endregion
487
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/decorateParam.js
532
+ //#region src/services/doc-drawing.service.ts
533
+ var DocDrawingService = class extends UnitDrawingService {};
534
+ const IDocDrawingService = createIdentifier("univer.doc.plugin.doc-drawing.service");
535
+
536
+ //#endregion
537
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/decorateParam.js
488
538
  function __decorateParam(paramIndex, decorator) {
489
539
  return function(target, key) {
490
540
  decorator(target, key, paramIndex);
@@ -492,7 +542,7 @@ function __decorateParam(paramIndex, decorator) {
492
542
  }
493
543
 
494
544
  //#endregion
495
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/decorate.js
545
+ //#region \0@oxc-project+runtime@0.140.0/helpers/esm/decorate.js
496
546
  function __decorate(decorators, target, key, desc) {
497
547
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
498
548
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -625,7 +675,7 @@ DocDrawingController = __decorate([
625
675
  //#endregion
626
676
  //#region package.json
627
677
  var name = "@univerjs/docs-drawing";
628
- var version = "1.0.0-alpha.6";
678
+ var version = "1.0.0-alpha.8";
629
679
 
630
680
  //#endregion
631
681
  //#region src/config/config.ts
@@ -674,7 +724,11 @@ _defineProperty(UniverDocsDrawingPlugin, "pluginName", DOCS_DRAWING_PLUGIN);
674
724
  _defineProperty(UniverDocsDrawingPlugin, "packageName", name);
675
725
  _defineProperty(UniverDocsDrawingPlugin, "version", version);
676
726
  _defineProperty(UniverDocsDrawingPlugin, "type", UniverInstanceType.UNIVER_DOC);
677
- UniverDocsDrawingPlugin = __decorate([__decorateParam(1, Inject(Injector)), __decorateParam(2, IConfigService)], UniverDocsDrawingPlugin);
727
+ UniverDocsDrawingPlugin = __decorate([
728
+ DependentOn(UniverDocsPlugin, UniverDrawingPlugin),
729
+ __decorateParam(1, Inject(Injector)),
730
+ __decorateParam(2, IConfigService)
731
+ ], UniverDocsDrawingPlugin);
678
732
 
679
733
  //#endregion
680
734
  export { DOCS_DRAWING_PLUGIN, DocDrawingAdapterService, DocDrawingController, DocDrawingService, IDocDrawingAdapterService, IDocDrawingService, InsertDocDrawingCommand, RemoveDocDrawingCommand, SetDocDrawingArrangeCommand, TextWrappingStyle, UniverDocsDrawingPlugin, UpdateDocDrawingWrappingStyleCommand, UpdateDrawingDocTransformCommand, WRAPPING_STYLE_TO_LAYOUT_TYPE, getDocDrawingRenderOrder };
@@ -16,11 +16,43 @@
16
16
  import type { ICommand } from '@univerjs/core';
17
17
  import type { IDocDrawing } from '../../services/doc-drawing.service';
18
18
  import { PositionedObjectLayoutType } from '@univerjs/core';
19
+ /**
20
+ * Controls how a document drawing participates in text layout.
21
+ *
22
+ * `INLINE`, `WRAP_SQUARE`, and `WRAP_TOP_AND_BOTTOM` participate in text layout and can cause text to reflow.
23
+ * `BEHIND_TEXT` and `IN_FRONT_OF_TEXT` are overlay styles and do not cause text to reflow.
24
+ */
19
25
  export declare enum TextWrappingStyle {
26
+ /**
27
+ * Places the drawing in the text flow like a character.
28
+ *
29
+ * The drawing occupies layout space and does not overlap surrounding text. Its position is determined by its
30
+ * document range, so floating position settings have no visible effect.
31
+ */
20
32
  INLINE = "inline",
33
+ /**
34
+ * Floats the drawing behind document text without causing the text to reflow.
35
+ *
36
+ * Use this style for backgrounds or watermarks. Text can overlap the drawing, so ensure that it remains readable.
37
+ */
21
38
  BEHIND_TEXT = "behindText",
39
+ /**
40
+ * Floats the drawing in front of document text without causing the text to reflow.
41
+ *
42
+ * The drawing can cover overlapping text. Use this style only when an overlay is intentional.
43
+ */
22
44
  IN_FRONT_OF_TEXT = "inFrontOfText",
45
+ /**
46
+ * Floats the drawing and wraps text around its rectangular bounds.
47
+ *
48
+ * Use this style for images that should appear beside body text, such as portraits or illustrations.
49
+ */
23
50
  WRAP_SQUARE = "wrapSquare",
51
+ /**
52
+ * Floats the drawing in a horizontal band, with text only above and below it.
53
+ *
54
+ * Use this style for wide figures or standalone illustrations that should not have text beside them.
55
+ */
24
56
  WRAP_TOP_AND_BOTTOM = "wrapTopAndBottom"
25
57
  }
26
58
  export declare const WRAPPING_STYLE_TO_LAYOUT_TYPE: Record<TextWrappingStyle, PositionedObjectLayoutType>;
@@ -228,6 +228,11 @@ export declare class FDocumentImage {
228
228
  setPositionV(positionV: IObjectPositionV): boolean;
229
229
  /**
230
230
  * Sets the image wrapping style.
231
+ *
232
+ * Use `INLINE` to place the image in the text flow, `WRAP_SQUARE` to flow text beside it, or
233
+ * `WRAP_TOP_AND_BOTTOM` to keep text above and below it. `BEHIND_TEXT` and `IN_FRONT_OF_TEXT` do not reserve space
234
+ * in the text layout and can overlap text.
235
+ *
231
236
  * When switching from inline to a floating style in a UI environment, the current visual position is preserved.
232
237
  * @param {TextWrappingStyle} wrappingStyle The wrapping style to apply.
233
238
  * @returns {boolean} `true` when the update command succeeds; otherwise, `false`.
@@ -237,6 +242,7 @@ export declare class FDocumentImage {
237
242
  * const image = fDocument.getImages()[0];
238
243
  *
239
244
  * if (image) {
245
+ * // Float the image beside body text without covering it.
240
246
  * const success = image.setWrappingStyle(univerAPI.Enum.DocsImageWrappingStyle.WRAP_SQUARE);
241
247
  * console.log(success);
242
248
  * }
@@ -40,7 +40,13 @@ export interface IFDocumentInsertImageOptions {
40
40
  * It has a visible positioning effect only when `wrappingStyle` is not `INLINE`.
41
41
  */
42
42
  positionV?: IObjectPositionV;
43
- /** The image wrapping style. Defaults to `TextWrappingStyle.INLINE`. */
43
+ /**
44
+ * The image wrapping style. Defaults to `TextWrappingStyle.INLINE`.
45
+ *
46
+ * Use `INLINE` to place the image in the text flow, `WRAP_SQUARE` to flow text beside it, or
47
+ * `WRAP_TOP_AND_BOTTOM` to keep text above and below it. `BEHIND_TEXT` and `IN_FRONT_OF_TEXT` are overlay styles:
48
+ * they do not reserve space in the text layout, so text and the image can overlap.
49
+ */
44
50
  wrappingStyle?: TextWrappingStyle;
45
51
  /** The document range at which to insert the image. The current selection is used when omitted. */
46
52
  textRange?: ITextRangeParam;
@@ -51,6 +57,9 @@ export interface IFDocumentImageMixin {
51
57
  * Inserts an image into the document.
52
58
  *
53
59
  * When width and height are both omitted, the intrinsic size is proportionally limited to 500 by 500 pixels.
60
+ * For ordinary content, prefer `INLINE`, `WRAP_SQUARE`, or `WRAP_TOP_AND_BOTTOM`. Use `BEHIND_TEXT` for
61
+ * backgrounds or watermarks and `IN_FRONT_OF_TEXT` only for intentional overlays, because these two styles do not
62
+ * cause text to reflow.
54
63
  *
55
64
  * @param {IFDocumentInsertImageOptions} options The image source, optional transform, and insertion range.
56
65
  * @returns {Promise<FDocumentImage | null>} The inserted image facade, or `null` when the insertion command fails.
@@ -61,6 +70,8 @@ export interface IFDocumentImageMixin {
61
70
  * source: 'https://avatars.githubusercontent.com/u/61444807?s=48&v=4',
62
71
  * imageSourceType: univerAPI.Enum.ImageSourceType.URL,
63
72
  * width: 320,
73
+ * // Keep the image in the text flow so it cannot cover surrounding text.
74
+ * wrappingStyle: univerAPI.Enum.DocsImageWrappingStyle.INLINE,
64
75
  * textRange: {
65
76
  * startOffset: 30,
66
77
  * },
@@ -75,6 +86,7 @@ export interface IFDocumentImageMixin {
75
86
  * source: 'https://avatars.githubusercontent.com/u/61444807?s=48&v=4',
76
87
  * imageSourceType: univerAPI.Enum.ImageSourceType.URL,
77
88
  * width: 320,
89
+ * // Float the image and let body text flow beside its rectangular bounds.
78
90
  * wrappingStyle: univerAPI.Enum.DocsImageWrappingStyle.WRAP_SQUARE,
79
91
  * textRange: {
80
92
  * startOffset: 30,
@@ -22,6 +22,9 @@ import { TextWrappingStyle } from '@univerjs/docs-drawing';
22
22
  export interface IFDocumentImageEnumMixin {
23
23
  /**
24
24
  * Represents the wrapping styles used by docs image operations.
25
+ *
26
+ * Prefer `INLINE`, `WRAP_SQUARE`, or `WRAP_TOP_AND_BOTTOM` for ordinary document content.
27
+ * `BEHIND_TEXT` and `IN_FRONT_OF_TEXT` are overlay styles that do not cause text to reflow.
25
28
  * @example
26
29
  * ```ts
27
30
  * const fDocument = univerAPI.getActiveDocument();
@@ -29,6 +32,7 @@ export interface IFDocumentImageEnumMixin {
29
32
  * source: 'https://avatars.githubusercontent.com/u/61444807?s=48&v=4',
30
33
  * imageSourceType: univerAPI.Enum.ImageSourceType.URL,
31
34
  * width: 320,
35
+ * // Float the image and wrap body text around its rectangular bounds.
32
36
  * wrappingStyle: univerAPI.Enum.DocsImageWrappingStyle.WRAP_SQUARE,
33
37
  * textRange: {
34
38
  * startOffset: 30,
package/lib/umd/facade.js CHANGED
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("@univerjs/core"),require("@univerjs/docs"),require("@univerjs/docs-drawing"),require("@univerjs/docs/facade"),require("@univerjs/drawing"),require("@univerjs/core/facade")):typeof define==`function`&&define.amd?define([`exports`,`@univerjs/core`,`@univerjs/docs`,`@univerjs/docs-drawing`,`@univerjs/docs/facade`,`@univerjs/drawing`,`@univerjs/core/facade`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.UniverDocsDrawingFacade={},e.UniverCore,e.UniverDocs,e.UniverDocsDrawing,e.UniverDocsFacade,e.UniverDrawing,e.UniverCoreFacade))})(this,function(e,t,n,r,i,a,o){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var s=class{constructor(e,t,n){this._document=e,this._imageId=t,this._injector=n}getUnitId(){return this._document.getId()}getId(){return this._imageId}getSource(){var e;return(e=this.getImageData())==null?void 0:e.source}getSourceType(){var e;return(e=this.getImageData())==null?void 0:e.imageSourceType}getSize(){var e,t;return(e=(t=this.getImageData())==null?void 0:t.docTransform.size)==null?null:e}getAngle(){var e;return(e=this.getImageData())==null?void 0:e.docTransform.angle}getPositionH(){var e,t;return(e=(t=this.getImageData())==null?void 0:t.docTransform.positionH)==null?null:e}getPositionV(){var e,t;return(e=(t=this.getImageData())==null?void 0:t.docTransform.positionV)==null?null:e}getImageData(){var e;let n=(e=this._document.getDocumentDataModel().getDrawings())==null?void 0:e[this._imageId];return!n||n.drawingType!==t.DrawingTypeEnum.DRAWING_IMAGE?null:n}setSize(e,t){return this._updateTransform(`size`,{width:e,height:t})}setRotate(e){return this._updateTransform(`angle`,e)}setPositionH(e){return this._updateTransform(`positionH`,e)}setPositionV(e){return this._updateTransform(`positionV`,e)}setWrappingStyle(e){let n=this.getImageData();return n?this._injector.get(t.ICommandService).syncExecuteCommand(r.UpdateDocDrawingWrappingStyleCommand.id,{unitId:this.getUnitId(),subUnitId:this.getUnitId(),drawings:[n],wrappingStyle:e}):!1}setForward(){return this._arrange(t.ArrangeTypeEnum.forward)}setBackward(){return this._arrange(t.ArrangeTypeEnum.backward)}setBack(){return this._arrange(t.ArrangeTypeEnum.back)}setFront(){return this._arrange(t.ArrangeTypeEnum.front)}remove(){let e=this.getImageData(),n=this._getTextRange();return!e||!n?!1:this._injector.get(t.ICommandService).syncExecuteCommand(r.RemoveDocDrawingCommand.id,{unitId:this.getUnitId(),drawings:[{unitId:this.getUnitId(),subUnitId:this.getUnitId(),drawingId:this._imageId,drawingType:t.DrawingTypeEnum.DRAWING_IMAGE}],textRange:n})}_updateTransform(e,n){return this._injector.get(t.ICommandService).syncExecuteCommand(r.UpdateDrawingDocTransformCommand.id,{unitId:this.getUnitId(),subUnitId:this.getUnitId(),drawings:[{drawingId:this._imageId,key:e,value:n}]})}_arrange(e){return this._injector.get(t.ICommandService).syncExecuteCommand(r.SetDocDrawingArrangeCommand.id,{unitId:this.getUnitId(),subUnitId:this.getUnitId(),drawingIds:[this._imageId],arrangeType:e})}_getTextRange(){let{body:e,headers:t={},footers:n={}}=this._document.getDocumentDataModel().getSnapshot(),r=[{segmentId:``,body:e},...Object.entries(t).map(([e,t])=>({segmentId:e,body:t.body})),...Object.entries(n).map(([e,t])=>({segmentId:e,body:t.body}))];for(let{segmentId:e,body:t}of r){var i;let n=t==null||(i=t.customBlocks)==null?void 0:i.find(e=>e.blockId===this._imageId);if(n)return{startOffset:n.startIndex,endOffset:n.startIndex,collapsed:!0,segmentId:e}}return null}},c=class extends i.FDocument{async insertImage(e){var i,a,o,c;let u=this.getId(),d=(0,t.generateRandomId)(6),f=l(await this._getIntrinsicSize(e.source,e.imageSourceType),e),p=(0,n.buildDocTransform)(f.width,f.height),m=(i=e.wrappingStyle)==null?r.TextWrappingStyle.INLINE:i,h={...p,angle:(a=e.angle)==null?p.angle:a,positionH:(o=e.positionH)==null?p.positionH:o,positionV:(c=e.positionV)==null?p.positionV:c},g=(0,n.docDrawingPositionToTransform)(h),_={unitId:u,subUnitId:u,drawingId:d,drawingType:t.DrawingTypeEnum.DRAWING_IMAGE,imageSourceType:e.imageSourceType,source:e.source,transform:g,docTransform:h,behindDoc:m===r.TextWrappingStyle.BEHIND_TEXT?t.BooleanNumber.TRUE:t.BooleanNumber.FALSE,title:``,description:``,layoutType:r.WRAPPING_STYLE_TO_LAYOUT_TYPE[m],wrapText:t.WrapTextType.BOTH_SIDES,distB:0,distL:0,distR:0,distT:0};return this._injector.get(t.ICommandService).syncExecuteCommand(r.InsertDocDrawingCommand.id,{unitId:u,drawings:[_],textRange:e.textRange})?this._injector.createInstance(s,this,d,this._injector):null}getImage(e){var n;let r=(n=this.getDocumentDataModel().getDrawings())==null?void 0:n[e];return!r||r.drawingType!==t.DrawingTypeEnum.DRAWING_IMAGE?null:this._injector.createInstance(s,this,e,this._injector)}getImages(){var e,n;let r=this.getDocumentDataModel(),i=(e=r.getDrawings())==null?{}:e;return((n=r.getDrawingsOrder())==null?Object.keys(i):n).filter(e=>{var n;return((n=i[e])==null?void 0:n.drawingType)===t.DrawingTypeEnum.DRAWING_IMAGE}).map(e=>this._injector.createInstance(s,this,e,this._injector))}async _getIntrinsicSize(e,n){let r=this._injector.has(t.IImageIoService)?this._injector.get(t.IImageIoService):null,i=e;if(n===t.ImageSourceType.UUID&&r)i=await r.getImage(e);else if(n===t.ImageSourceType.URL&&this._injector.has(t.IURLImageService))try{i=await this._injector.get(t.IURLImageService).getImage(e)}catch{i=e}let{width:o,height:s,image:c}=await(0,a.getImageSize)(i);return r==null||r.addImageSourceCache(e,n,c),{width:o,height:s}}};function l(e,t){let{width:n,height:r}=e;if(t.width!=null&&t.height!=null)return{width:t.width,height:t.height};if(t.width!=null)return{width:t.width,height:r*t.width/n};if(t.height!=null)return{width:n*t.height/r,height:t.height};let i=Math.min(1,a.DRAWING_IMAGE_WIDTH_LIMIT/n,a.DRAWING_IMAGE_HEIGHT_LIMIT/r);return{width:n*i,height:r*i}}i.FDocument.extend(c);var u=class extends o.FEnum{get DocsImageWrappingStyle(){return r.TextWrappingStyle}get DocsImageRelativeFromH(){return t.ObjectRelativeFromH}get DocsImageRelativeFromV(){return t.ObjectRelativeFromV}};o.FEnum.extend(u),e.FDocumentImage=s});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("@univerjs/core"),require("@univerjs/docs"),require("@univerjs/docs-drawing"),require("@univerjs/docs/facade"),require("@univerjs/drawing"),require("@univerjs/core/facade")):typeof define==`function`&&define.amd?define([`exports`,`@univerjs/core`,`@univerjs/docs`,`@univerjs/docs-drawing`,`@univerjs/docs/facade`,`@univerjs/drawing`,`@univerjs/core/facade`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.UniverDocsDrawingFacade={},e.UniverCore,e.UniverDocs,e.UniverDocsDrawing,e.UniverDocsFacade,e.UniverDrawing,e.UniverCoreFacade))})(this,function(e,t,n,r,i,a,o){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var s=class{constructor(e,t,n){this._document=e,this._imageId=t,this._injector=n}getUnitId(){return this._document.getId()}getId(){return this._imageId}getSource(){var e;return(e=this.getImageData())==null?void 0:e.source}getSourceType(){var e;return(e=this.getImageData())==null?void 0:e.imageSourceType}getSize(){var e,t;return(e=(t=this.getImageData())==null?void 0:t.docTransform.size)==null?null:e}getAngle(){var e;return(e=this.getImageData())==null?void 0:e.docTransform.angle}getPositionH(){var e,t;return(e=(t=this.getImageData())==null?void 0:t.docTransform.positionH)==null?null:e}getPositionV(){var e,t;return(e=(t=this.getImageData())==null?void 0:t.docTransform.positionV)==null?null:e}getImageData(){var e;let n=(e=this._document.getDocumentDataModel().getDrawings())==null?void 0:e[this._imageId];return!n||n.drawingType!==t.DrawingTypeEnum.DRAWING_IMAGE?null:n}setSize(e,t){return this._updateTransform(`size`,{width:e,height:t})}setRotate(e){return this._updateTransform(`angle`,e)}setPositionH(e){return this._updateTransform(`positionH`,e)}setPositionV(e){return this._updateTransform(`positionV`,e)}setWrappingStyle(e){let n=this.getImageData();return n?this._injector.get(t.ICommandService).syncExecuteCommand(r.UpdateDocDrawingWrappingStyleCommand.id,{unitId:this.getUnitId(),subUnitId:this.getUnitId(),drawings:[n],wrappingStyle:e}):!1}setForward(){return this._arrange(t.ArrangeTypeEnum.forward)}setBackward(){return this._arrange(t.ArrangeTypeEnum.backward)}setBack(){return this._arrange(t.ArrangeTypeEnum.back)}setFront(){return this._arrange(t.ArrangeTypeEnum.front)}remove(){let e=this.getImageData(),n=this._getTextRange();return!e||!n?!1:this._injector.get(t.ICommandService).syncExecuteCommand(r.RemoveDocDrawingCommand.id,{unitId:this.getUnitId(),drawings:[{unitId:this.getUnitId(),subUnitId:this.getUnitId(),drawingId:this._imageId,drawingType:t.DrawingTypeEnum.DRAWING_IMAGE}],textRange:n})}_updateTransform(e,n){return this._injector.get(t.ICommandService).syncExecuteCommand(r.UpdateDrawingDocTransformCommand.id,{unitId:this.getUnitId(),subUnitId:this.getUnitId(),drawings:[{drawingId:this._imageId,key:e,value:n}]})}_arrange(e){return this._injector.get(t.ICommandService).syncExecuteCommand(r.SetDocDrawingArrangeCommand.id,{unitId:this.getUnitId(),subUnitId:this.getUnitId(),drawingIds:[this._imageId],arrangeType:e})}_getTextRange(){let{body:e,headers:t={},footers:n={}}=this._document.getDocumentDataModel().getSnapshot(),r=[{segmentId:``,body:e},...Object.entries(t).map(([e,t])=>({segmentId:e,body:t.body})),...Object.entries(n).map(([e,t])=>({segmentId:e,body:t.body}))];for(let{segmentId:e,body:t}of r){var i;let n=t==null||(i=t.customBlocks)==null?void 0:i.find(e=>e.blockId===this._imageId);if(n)return{startOffset:n.startIndex,endOffset:n.startIndex,collapsed:!0,segmentId:e}}return null}},c=class extends i.FDocument{async insertImage(e){var i,a,o,c;let u=this.getId(),d=(0,t.generateRandomId)(6),f=e.width!=null&&e.height!=null?{width:e.width,height:e.height}:l(await this._getIntrinsicSize(e.source,e.imageSourceType),e),p=(0,n.buildDocTransform)(f.width,f.height),m=(i=e.wrappingStyle)==null?r.TextWrappingStyle.INLINE:i,h={...p,angle:(a=e.angle)==null?p.angle:a,positionH:(o=e.positionH)==null?p.positionH:o,positionV:(c=e.positionV)==null?p.positionV:c},g=(0,n.docDrawingPositionToTransform)(h),_={unitId:u,subUnitId:u,drawingId:d,drawingType:t.DrawingTypeEnum.DRAWING_IMAGE,imageSourceType:e.imageSourceType,source:e.source,transform:g,docTransform:h,behindDoc:m===r.TextWrappingStyle.BEHIND_TEXT?t.BooleanNumber.TRUE:t.BooleanNumber.FALSE,title:``,description:``,layoutType:r.WRAPPING_STYLE_TO_LAYOUT_TYPE[m],wrapText:t.WrapTextType.BOTH_SIDES,distB:0,distL:0,distR:0,distT:0};return this._injector.get(t.ICommandService).syncExecuteCommand(r.InsertDocDrawingCommand.id,{unitId:u,drawings:[_],textRange:e.textRange})?this._injector.createInstance(s,this,d,this._injector):null}getImage(e){var n;let r=(n=this.getDocumentDataModel().getDrawings())==null?void 0:n[e];return!r||r.drawingType!==t.DrawingTypeEnum.DRAWING_IMAGE?null:this._injector.createInstance(s,this,e,this._injector)}getImages(){var e,n;let r=this.getDocumentDataModel(),i=(e=r.getDrawings())==null?{}:e;return((n=r.getDrawingsOrder())==null?Object.keys(i):n).filter(e=>{var n;return((n=i[e])==null?void 0:n.drawingType)===t.DrawingTypeEnum.DRAWING_IMAGE}).map(e=>this._injector.createInstance(s,this,e,this._injector))}async _getIntrinsicSize(e,n){let r=this._injector.has(t.IImageIoService)?this._injector.get(t.IImageIoService):null,i=e;if(n===t.ImageSourceType.UUID&&r)i=await r.getImage(e);else if(n===t.ImageSourceType.URL&&this._injector.has(t.IURLImageService))try{i=await this._injector.get(t.IURLImageService).getImage(e)}catch{i=e}let{width:o,height:s,image:c}=await(0,a.getImageSize)(i);return r==null||r.addImageSourceCache(e,n,c),{width:o,height:s}}};function l(e,t){let{width:n,height:r}=e;if(t.width!=null&&t.height!=null)return{width:t.width,height:t.height};if(t.width!=null)return{width:t.width,height:r*t.width/n};if(t.height!=null)return{width:n*t.height/r,height:t.height};let i=Math.min(1,a.DRAWING_IMAGE_WIDTH_LIMIT/n,a.DRAWING_IMAGE_HEIGHT_LIMIT/r);return{width:n*i,height:r*i}}i.FDocument.extend(c);var u=class extends o.FEnum{get DocsImageWrappingStyle(){return r.TextWrappingStyle}get DocsImageRelativeFromH(){return t.ObjectRelativeFromH}get DocsImageRelativeFromV(){return t.ObjectRelativeFromV}};o.FEnum.extend(u),e.FDocumentImage=s});
package/lib/umd/index.js CHANGED
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("@univerjs/core"),require("@univerjs/docs"),require("@univerjs/drawing")):typeof define==`function`&&define.amd?define([`exports`,`@univerjs/core`,`@univerjs/docs`,`@univerjs/drawing`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.UniverDocsDrawing={},e.UniverCore,e.UniverDocs,e.UniverDrawing))})(this,function(e,t,n,r){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let i={id:`doc.command.insert-doc-image`,type:t.CommandType.COMMAND,handler:(e,r)=>{var i,o,s,c,l;if(!r)return!1;let u=e.get(t.ICommandService),d=e.get(t.IUniverInstanceService),{unitId:f,drawings:p,textRange:m}=r,h=d.getUnit(f,t.UniverInstanceType.UNIVER_DOC);if(!h)return!1;let g=a(e,f,m);if(!g)return!1;let{collapsed:_,startOffset:v,segmentId:y=``}=g,b=(i=h.getSelfOrHeaderFooterModel(y))==null?void 0:i.getBody();if(!b)return!1;let x=new t.TextX,S=t.JSONX.getInstance(),C=[],w=h.getSnapshot(),T=(o=w.headers)!=null&&o[y]||(s=w.footers)!=null&&s[y]?p.map(e=>{var n;return{...e,isMultiTransform:t.BooleanNumber.TRUE,transforms:(n=e.transforms)==null?e.transform?[e.transform]:null:n}}):p,E=(c=(l=w.drawingsOrder)==null?void 0:l.length)==null?0:c,D=0;if(_)v>0&&x.push({t:t.TextXActionType.RETAIN,len:v});else{var O,k;let e=t.BuildTextUtils.selection.delete([g],b,0,null,!1);x.push(...e);let n=(0,t.getCustomBlockIdsInSelections)(b,[g]),r=(O=h.getDrawings())==null?{}:O,i=(k=h.getDrawingsOrder())==null?[]:k,a=n.sort((e,t)=>i.indexOf(e)>i.indexOf(t)?-1:+(i.indexOf(e)<i.indexOf(t)));if(a.length>0)for(let e of a){let t=r[e],n=i.indexOf(e);if(t==null||n<0)continue;let a=S.removeOp([`drawings`,e],t),o=S.removeOp([`drawingsOrder`,n],e);C.push(a),C.push(o),D++}}x.push({t:t.TextXActionType.INSERT,body:{dataStream:`\b`.repeat(T.length),customBlocks:T.map((e,t)=>({startIndex:t,blockId:e.drawingId}))},len:T.length});let A=(0,t.getRichTextEditPath)(h,y),j=S.editOp(x.serialize(),A);C.push(j);for(let e of T){let{drawingId:t}=e,n=S.insertOp([`drawings`,t],e),r=S.insertOp([`drawingsOrder`,E-D],t);C.push(n),C.push(r)}let M={id:n.RichTextEditingMutation.id,params:{unitId:f,actions:[],textRanges:[]}};return M.params.actions=C.reduce((e,n)=>t.JSONX.compose(e,n),null),!!u.syncExecuteCommand(M.id,M.params)}};function a(e,t,r){var i,a;let o=e.get(n.DocSelectionManagerService).getActiveTextRange(),s=r?(0,n.normalizeTextRange)(r):null,c=s==null?(0,n.getContentInsertRange)(e,t):s;return c?{...o,startOffset:c.startOffset,endOffset:c.endOffset,collapsed:c.startOffset===c.endOffset,segmentId:(i=(a=c.segmentId)==null?o==null?void 0:o.segmentId:a)==null?``:i}:o==null?null:o}function o(e){"@babel/helpers - typeof";return o=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},o(e)}function s(e,t){if(o(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(o(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function c(e){var t=s(e,`string`);return o(t)==`symbol`?t:t+``}function l(e,t,n){return(t=c(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}let u=(0,t.createIdentifier)(`doc.drawing-adapter.service`);var d=class{constructor(){l(this,`_adapters`,[])}registerAdapter(e){return this._adapters.push(e),(0,t.toDisposable)(()=>{let t=this._adapters.indexOf(e);t>=0&&this._adapters.splice(t,1)})}getRemoveDrawingMutationInfos(e){let t={redoMutations:[],undoMutations:[]};for(let r of this._adapters){var n;let i=(n=r.getRemoveDrawingMutationInfos)==null?void 0:n.call(r,e);i&&(t.redoMutations.push(...i.redoMutations),t.undoMutations.push(...i.undoMutations))}return t}getEditDrawingCommandInfo(e){for(let n of this._adapters){var t;let r=(t=n.getEditDrawingCommandInfo)==null?void 0:t.call(n,e);if(r)return r}return null}};let f={id:`doc.command.remove-doc-image`,type:t.CommandType.COMMAND,handler:(e,r)=>{var i,a,o,s,c;if(!r)return!1;let l=e.get(t.ICommandService),d=e.get(t.IUndoRedoService),f=e.get(u),m=e.get(t.IUniverInstanceService),h=e.get(n.DocSelectionManagerService),{unitId:g,drawings:_,textRange:v}=r,y=m.getUnit(g,t.UniverInstanceType.UNIVER_DOC);if(!y||_.length===0)return!1;let b=h.getActiveTextRange(),x=v?(0,n.normalizeTextRange)(v):null,S=x==null?(0,n.getContentInsertRange)(e,g):x,C=(i=(a=S==null?void 0:S.segmentId)==null?b==null?void 0:b.segmentId:a)==null?``:i,w=new t.TextX,T=t.JSONX.getInstance(),E=(o=(s=y.getSelfOrHeaderFooterModel(C))==null||(s=s.getBody())==null?void 0:s.customBlocks)==null?[]:o,D=_.map(e=>E.find(t=>t.blockId===e.drawingId)).filter(e=>!!e).sort((e,t)=>e.startIndex>t.startIndex?1:-1);if(D.length===0)return!1;let O=(c=y.getDrawings())==null?{}:c,k=new Map(_.map(e=>[e.drawingId,e])),A=D.map(e=>O[e.blockId]).filter(e=>e!=null),j=[],M=[],N=[];for(let e of D){var P;let{blockId:t}=e,n=O[t];if(n==null)continue;let r=k.get(t),i=f.getRemoveDrawingMutationInfos({unitId:g,subUnitId:(P=r==null?void 0:r.subUnitId)==null?g:P,drawing:n,removeDrawings:A});i.redoMutations.length===0&&i.undoMutations.length===0||(j.push(...i.redoMutations),M.push(...i.undoMutations),N.push(i))}if(!p(N,l))return!1;let F=`doc-drawing-remove-resource:${g}:${D.map(e=>e.blockId).join(`,`)}`,I=null;(j.length>0||M.length>0)&&(I=d.__tempBatchingUndoRedo(g),d.pushUndoRedo({unitID:g,redoMutations:j,undoMutations:M,id:F}));let L=new t.MemoryCursor,R=D[0].startIndex,z=[{startOffset:R,endOffset:R}],B={id:n.RichTextEditingMutation.id,params:{unitId:g,actions:[],textRanges:z}},V=[];for(let e of D){let{startIndex:n}=e;n>L.cursor&&w.push({t:t.TextXActionType.RETAIN,len:n-L.cursor}),w.push({t:t.TextXActionType.DELETE,len:1}),L.moveCursorTo(n+1)}V.push(T.editOp(w.serialize(),(0,t.getRichTextEditPath)(y,C)));for(let e of D){let{blockId:t}=e,n=y.getDrawingsOrder().indexOf(t);V.push(T.removeOp([`drawings`,t],O[t])),V.push(T.removeOp([`drawingsOrder`,n],t))}B.params.actions=V.reduce((e,n)=>t.JSONX.compose(e,n),null);let H=l.syncExecuteCommand(B.id,B.params);return!H&&I!=null?(I.dispose(),d.rollback(F,g),!1):(I==null||I.dispose(),!!H)}};function p(e,t){let n=[];for(let r of e){if(!h(r.redoMutations,t))return m([...n].reverse(),t),!1;n.push(r.undoMutations)}return!0}function m(e,t){e.forEach(e=>h(e,t))}function h(e,t){for(let n of e)if(!t.syncExecuteCommand(n.id,n.params))return!1;return!0}var g=class extends r.UnitDrawingService{};let _=(0,t.createIdentifier)(`univer.doc.plugin.doc-drawing.service`),v={id:`doc.command.set-drawing-arrange`,type:t.CommandType.COMMAND,handler:(e,r)=>{let i=e.get(t.ICommandService),a=e.get(_);if(r==null)return!1;let{unitId:o,subUnitId:s,drawingIds:c,arrangeType:l}=r,u={unitId:o,subUnitId:s,drawingIds:c},d;if(l===t.ArrangeTypeEnum.forward?d=a.getForwardDrawingsOp(u):l===t.ArrangeTypeEnum.backward?d=a.getBackwardDrawingOp(u):l===t.ArrangeTypeEnum.front?d=a.getFrontDrawingsOp(u):l===t.ArrangeTypeEnum.back&&(d=a.getBackDrawingsOp(u)),d==null)return!1;let{redo:f}=d;if(f==null)return!1;let p=[],m=t.Tools.deepClone(f);m=m.slice(3),m.unshift(`drawingsOrder`),p.push(m);let h={id:n.RichTextEditingMutation.id,params:{unitId:o,actions:[],textRanges:null}};return h.params.actions=p.reduce((e,n)=>t.JSONX.compose(e,n),null),!!i.syncExecuteCommand(h.id,h.params)}},y={id:`doc.command.update-drawing-doc-transform`,type:t.CommandType.COMMAND,handler:(e,r)=>{var i;if(!r)return!1;let a=e.get(t.ICommandService),o=e.get(t.IUniverInstanceService),{unitId:s,drawings:c}=r,l=o.getUnit(s,t.UniverInstanceType.UNIVER_DOC);if(!l)return!1;let u=(i=l.getSnapshot().drawings)==null?{}:i,d=t.JSONX.getInstance(),f=[];for(let{drawingId:e,key:n,value:r}of c){var p;let i=(p=u[e])==null||(p=p.docTransform)==null?void 0:p[n];if(!t.Tools.diffValue(i,r)){let t=[`drawings`,e,`docTransform`,n];f.push(i===void 0?d.insertOp(t,r):d.replaceOp(t,i,r))}}return!!a.syncExecuteCommand(n.RichTextEditingMutation.id,{unitId:s,actions:f.reduce((e,n)=>t.JSONX.compose(e,n),null),textRanges:null,debounce:!0})}},b=function(e){return e.INLINE=`inline`,e.BEHIND_TEXT=`behindText`,e.IN_FRONT_OF_TEXT=`inFrontOfText`,e.WRAP_SQUARE=`wrapSquare`,e.WRAP_TOP_AND_BOTTOM=`wrapTopAndBottom`,e}({}),x={inline:t.PositionedObjectLayoutType.INLINE,wrapSquare:t.PositionedObjectLayoutType.WRAP_SQUARE,wrapTopAndBottom:t.PositionedObjectLayoutType.WRAP_TOP_AND_BOTTOM,inFrontOfText:t.PositionedObjectLayoutType.WRAP_NONE,behindText:t.PositionedObjectLayoutType.WRAP_NONE},S={id:`doc.command.update-doc-drawing-wrapping-style`,type:t.CommandType.COMMAND,handler:(e,r)=>{var i;if(!r)return!1;let{drawings:a,wrappingStyle:o,unitId:s}=r,c=e.get(t.ICommandService),l=e.get(t.IUniverInstanceService).getUnit(s,t.UniverInstanceType.UNIVER_DOC);if(!l)return!1;let u=(i=l.getDrawings())==null?{}:i,d=t.JSONX.getInstance(),f=[];for(let e of a){let n=u[e.drawingId];if(!n)continue;let r=x[o];if(n.layoutType!==r&&f.push(d.replaceOp([`drawings`,e.drawingId,`layoutType`],n.layoutType,r)),o===`behindText`||o===`inFrontOfText`){let r=o===`behindText`?t.BooleanNumber.TRUE:t.BooleanNumber.FALSE;n.behindDoc!==r&&f.push(d.replaceOp([`drawings`,e.drawingId,`behindDoc`],n.behindDoc,r))}if(o!==`inline`)for(let r of[`positionH`,`positionV`]){var p;let i=(p=e.docTransform)==null?void 0:p[r],a=n.docTransform[r];i&&!t.Tools.diffValue(a,i)&&f.push(d.replaceOp([`drawings`,e.drawingId,`docTransform`,r],a,i))}}let m={id:n.RichTextEditingMutation.id,params:{unitId:s,actions:f.reduce((e,n)=>t.JSONX.compose(e,n),null),textRanges:null}};return!!c.syncExecuteCommand(m.id,m.params)}};function C(e,t){return function(n,r){t(n,r,e)}}function w(e,t,n,r){var i=arguments.length,a=i<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,o;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}let T=`DOC_DRAWING_PLUGIN`;function E(e,t={}){return e.map((e,t)=>({drawingId:e,index:t})).sort((e,n)=>{let r=D(t[e.drawingId]);return r===D(t[n.drawingId])?e.index-n.index:r?-1:1}).map(({drawingId:e})=>e)}function D(e){return(e==null?void 0:e.layoutType)===t.PositionedObjectLayoutType.WRAP_NONE&&e.behindDoc===t.BooleanNumber.TRUE}let O=class extends t.Disposable{constructor(e,t,n,r,i){super(),this._docDrawingService=e,this._drawingManagerService=t,this._resourceManagerService=n,this._univerInstanceService=r,this._commandService=i,this._init()}_init(){this._initSnapshot(),this._initCommands()}_initSnapshot(){let e=e=>{let n=this._univerInstanceService.getUnit(e,t.UniverInstanceType.UNIVER_DOC);if(n){let e=n.getSnapshot().drawings,t=n.getSnapshot().drawingsOrder;return JSON.stringify({data:e==null?{}:e,order:t==null?[]:t})}return``},n=e=>{if(!e)return{data:{},order:[]};try{return JSON.parse(e)}catch{return{data:{},order:[]}}};this.disposeWithMe(this._resourceManagerService.registerPluginResource({pluginName:T,businesses:[t.UniverInstanceType.UNIVER_DOC],toJson:t=>e(t),parseJson:e=>n(e),onUnLoad:e=>{this._setDrawingDataForUnit(e,{data:{},order:[]})},onLoad:(e,t)=>{var n,r;this._setDrawingDataForUnit(e,{data:(n=t.data)==null?{}:n,order:(r=t.order)==null?[]:r})}}))}_setDrawingDataForUnit(e,t){let n=this._univerInstanceService.getUnit(e);n!=null&&(n.resetDrawing(t.data,t.order),this.loadDrawingDataForUnit(e))}loadDrawingDataForUnit(e){let n=this._univerInstanceService.getUnit(e,t.UniverInstanceType.UNIVER_DOC);if(!n)return!1;let r=e,i=n.getDrawings(),a=n.getDrawingsOrder();if(!i||!a)return!1;let o={[r]:{unitId:e,subUnitId:r,data:i,order:a}},s={[r]:{...o[r],order:E(a,i)}};return this._docDrawingService.registerDrawingData(e,o),this._drawingManagerService.registerDrawingData(e,s),!0}_initCommands(){[i,f,y,S,v].forEach(e=>this.disposeWithMe(this._commandService.registerCommand(e)))}};O=w([C(0,_),C(1,r.IDrawingManagerService),C(2,t.IResourceManagerService),C(3,t.IUniverInstanceService),C(4,t.ICommandService)],O);var k=`@univerjs/docs-drawing`,A=`1.0.0-alpha.6`;let j={},M=class extends t.Plugin{constructor(e=j,n,r){super(),this._config=e,this._injector=n,this._configService=r;let{...i}=(0,t.merge)({},j,this._config);this._configService.setConfig(`docs-drawing.config`,i)}onStarting(){[[O],[d],[u,{useClass:d}],[g],[_,{useClass:g}]].forEach(e=>this._injector.add(e)),(0,t.touchDependencies)(this._injector,[[O]])}};l(M,`pluginName`,T),l(M,`packageName`,k),l(M,`version`,A),l(M,`type`,t.UniverInstanceType.UNIVER_DOC),M=w([C(1,(0,t.Inject)(t.Injector)),C(2,t.IConfigService)],M),e.DOCS_DRAWING_PLUGIN=T,e.DocDrawingAdapterService=d,Object.defineProperty(e,"DocDrawingController",{enumerable:!0,get:function(){return O}}),e.DocDrawingService=g,e.IDocDrawingAdapterService=u,e.IDocDrawingService=_,e.InsertDocDrawingCommand=i,e.RemoveDocDrawingCommand=f,e.SetDocDrawingArrangeCommand=v,e.TextWrappingStyle=b,Object.defineProperty(e,"UniverDocsDrawingPlugin",{enumerable:!0,get:function(){return M}}),e.UpdateDocDrawingWrappingStyleCommand=S,e.UpdateDrawingDocTransformCommand=y,e.WRAPPING_STYLE_TO_LAYOUT_TYPE=x,e.getDocDrawingRenderOrder=E});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("@univerjs/core"),require("@univerjs/docs"),require("@univerjs/drawing")):typeof define==`function`&&define.amd?define([`exports`,`@univerjs/core`,`@univerjs/docs`,`@univerjs/drawing`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.UniverDocsDrawing={},e.UniverCore,e.UniverDocs,e.UniverDrawing))})(this,function(e,t,n,r){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let i={id:`doc.command.insert-doc-image`,type:t.CommandType.COMMAND,handler:(e,r)=>{var i,o,s,c,l;if(!r)return!1;let u=e.get(t.ICommandService),d=e.get(t.IUniverInstanceService),{unitId:f,drawings:p,textRange:m}=r,h=d.getUnit(f,t.UniverInstanceType.UNIVER_DOC);if(!h)return!1;let g=a(e,f,m);if(!g)return!1;let{collapsed:_,startOffset:v,segmentId:y=``}=g,b=(i=h.getSelfOrHeaderFooterModel(y))==null?void 0:i.getBody();if(!b)return!1;let x=new t.TextX,S=t.JSONX.getInstance(),C=[],w=h.getSnapshot(),T=(o=w.headers)!=null&&o[y]||(s=w.footers)!=null&&s[y]?p.map(e=>{var n;return{...e,isMultiTransform:t.BooleanNumber.TRUE,transforms:(n=e.transforms)==null?e.transform?[e.transform]:null:n}}):p,E=(c=(l=w.drawingsOrder)==null?void 0:l.length)==null?0:c,D=0;if(_)v>0&&x.push({t:t.TextXActionType.RETAIN,len:v});else{var O,k;let e=t.BuildTextUtils.selection.delete([g],b,0,null,!1);x.push(...e);let n=(0,t.getCustomBlockIdsInSelections)(b,[g]),r=(O=h.getDrawings())==null?{}:O,i=(k=h.getDrawingsOrder())==null?[]:k,a=n.sort((e,t)=>i.indexOf(e)>i.indexOf(t)?-1:+(i.indexOf(e)<i.indexOf(t)));if(a.length>0)for(let e of a){let t=r[e],n=i.indexOf(e);if(t==null||n<0)continue;let a=S.removeOp([`drawings`,e],t),o=S.removeOp([`drawingsOrder`,n],e);C.push(a),C.push(o),D++}}x.push({t:t.TextXActionType.INSERT,body:{dataStream:`\b`.repeat(T.length),customBlocks:T.map((e,t)=>({startIndex:t,blockId:e.drawingId}))},len:T.length});let A=(0,t.getRichTextEditPath)(h,y),j=S.editOp(x.serialize(),A);C.push(j);for(let e of T){let{drawingId:t}=e,n=S.insertOp([`drawings`,t],e),r=S.insertOp([`drawingsOrder`,E-D],t);C.push(n),C.push(r)}let M={id:n.RichTextEditingMutation.id,params:{unitId:f,actions:[],textRanges:[]}};return M.params.actions=C.reduce((e,n)=>t.JSONX.compose(e,n),null),!!u.syncExecuteCommand(M.id,M.params)}};function a(e,t,r){var i,a;let o=e.get(n.DocSelectionManagerService).getActiveTextRange(),s=r?(0,n.normalizeTextRange)(r):null,c=s==null?(0,n.getContentInsertRange)(e,t):s;return c?{...o,startOffset:c.startOffset,endOffset:c.endOffset,collapsed:c.startOffset===c.endOffset,segmentId:(i=(a=c.segmentId)==null?o==null?void 0:o.segmentId:a)==null?``:i}:o==null?null:o}function o(e){"@babel/helpers - typeof";return o=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},o(e)}function s(e,t){if(o(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(o(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function c(e){var t=s(e,`string`);return o(t)==`symbol`?t:t+``}function l(e,t,n){return(t=c(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}let u=(0,t.createIdentifier)(`doc.drawing-adapter.service`);var d=class{constructor(){l(this,`_adapters`,[])}registerAdapter(e){return this._adapters.push(e),(0,t.toDisposable)(()=>{let t=this._adapters.indexOf(e);t>=0&&this._adapters.splice(t,1)})}getRemoveDrawingMutationInfos(e){let t={redoMutations:[],undoMutations:[]};for(let r of this._adapters){var n;let i=(n=r.getRemoveDrawingMutationInfos)==null?void 0:n.call(r,e);i&&(t.redoMutations.push(...i.redoMutations),t.undoMutations.push(...i.undoMutations))}return t}getEditDrawingCommandInfo(e){for(let n of this._adapters){var t;let r=(t=n.getEditDrawingCommandInfo)==null?void 0:t.call(n,e);if(r)return r}return null}};let f={id:`doc.command.remove-doc-image`,type:t.CommandType.COMMAND,handler:(e,r)=>{var i,a,o,s,c;if(!r)return!1;let l=e.get(t.ICommandService),d=e.get(t.IUndoRedoService),f=e.get(u),m=e.get(t.IUniverInstanceService),h=e.get(n.DocSelectionManagerService),{unitId:g,drawings:_,textRange:v}=r,y=m.getUnit(g,t.UniverInstanceType.UNIVER_DOC);if(!y||_.length===0)return!1;let b=h.getActiveTextRange(),x=v?(0,n.normalizeTextRange)(v):null,S=x==null?(0,n.getContentInsertRange)(e,g):x,C=(i=(a=S==null?void 0:S.segmentId)==null?b==null?void 0:b.segmentId:a)==null?``:i,w=new t.TextX,T=t.JSONX.getInstance(),E=(o=(s=y.getSelfOrHeaderFooterModel(C))==null||(s=s.getBody())==null?void 0:s.customBlocks)==null?[]:o,D=_.map(e=>E.find(t=>t.blockId===e.drawingId)).filter(e=>!!e).sort((e,t)=>e.startIndex>t.startIndex?1:-1);if(D.length===0)return!1;let O=(c=y.getDrawings())==null?{}:c,k=new Map(_.map(e=>[e.drawingId,e])),A=D.map(e=>O[e.blockId]).filter(e=>e!=null),j=[],M=[],N=[];for(let e of D){var P;let{blockId:t}=e,n=O[t];if(n==null)continue;let r=k.get(t),i=f.getRemoveDrawingMutationInfos({unitId:g,subUnitId:(P=r==null?void 0:r.subUnitId)==null?g:P,drawing:n,removeDrawings:A});(i.redoMutations.length!==0||i.undoMutations.length!==0)&&(j.push(...i.redoMutations),M.push(...i.undoMutations),N.push(i))}if(!p(N,l))return!1;let F=`doc-drawing-remove-resource:${g}:${D.map(e=>e.blockId).join(`,`)}`,I=null;(j.length>0||M.length>0)&&(I=d.__tempBatchingUndoRedo(g),d.pushUndoRedo({unitID:g,redoMutations:j,undoMutations:M,id:F}));let L=new t.MemoryCursor,R=D[0].startIndex,z=[{startOffset:R,endOffset:R}],B={id:n.RichTextEditingMutation.id,params:{unitId:g,actions:[],textRanges:z}},V=[];for(let e of D){let{startIndex:n}=e;n>L.cursor&&w.push({t:t.TextXActionType.RETAIN,len:n-L.cursor}),w.push({t:t.TextXActionType.DELETE,len:1}),L.moveCursorTo(n+1)}V.push(T.editOp(w.serialize(),(0,t.getRichTextEditPath)(y,C)));for(let e of D){let{blockId:t}=e,n=y.getDrawingsOrder().indexOf(t);V.push(T.removeOp([`drawings`,t],O[t])),V.push(T.removeOp([`drawingsOrder`,n],t))}B.params.actions=V.reduce((e,n)=>t.JSONX.compose(e,n),null);let H=l.syncExecuteCommand(B.id,B.params);return!H&&I!=null?(I.dispose(),d.rollback(F,g),!1):(I==null||I.dispose(),!!H)}};function p(e,t){let n=[];for(let r of e){if(!h(r.redoMutations,t))return m([...n].reverse(),t),!1;n.push(r.undoMutations)}return!0}function m(e,t){e.forEach(e=>h(e,t))}function h(e,t){for(let n of e)if(!t.syncExecuteCommand(n.id,n.params))return!1;return!0}let g=`drawingsOrder`;function _(e,n,r){let i=new Set(n.filter(t=>e.includes(t))),a=[...e];if(i.size===0)return a;if(r===t.ArrangeTypeEnum.forward)for(let e=a.length-2;e>=0;e--)i.has(a[e])&&!i.has(a[e+1])&&([a[e],a[e+1]]=[a[e+1],a[e]]);else if(r===t.ArrangeTypeEnum.backward)for(let e=1;e<a.length;e++)i.has(a[e])&&!i.has(a[e-1])&&([a[e],a[e-1]]=[a[e-1],a[e]]);else if(r===t.ArrangeTypeEnum.front||r===t.ArrangeTypeEnum.back){let e=a.filter(e=>i.has(e)),n=a.filter(e=>!i.has(e));return r===t.ArrangeTypeEnum.front?[...n,...e]:[...e,...n]}return a}function v(e,n){let r=t.JSONX.getInstance(),i=[...e],a=[];for(let e=0;e<n.length;e++){let t=n[e],o=i.indexOf(t);if(o<0||o===e)continue;let s=r.moveOp([g,o],[g,e]);s&&a.push(s),i.splice(o,1),i.splice(e,0,t)}return a.reduce((e,n)=>t.JSONX.compose(e,n),null)}let y={id:`doc.command.set-drawing-arrange`,type:t.CommandType.COMMAND,handler:(e,r)=>{let i=e.get(t.ICommandService);if(r==null)return!1;let{unitId:a,drawingIds:o,arrangeType:s}=r,c=e.get(t.IUniverInstanceService).getUnit(a,t.UniverInstanceType.UNIVER_DOC),l=c==null?void 0:c.getDrawingsOrder();if(!l)return!1;let u=v(l,_(l,o,s));return!t.JSONX.isNoop(u)&&!!i.syncExecuteCommand(n.RichTextEditingMutation.id,{unitId:a,actions:u,textRanges:null})}},b={id:`doc.command.update-drawing-doc-transform`,type:t.CommandType.COMMAND,handler:(e,r)=>{var i;if(!r)return!1;let a=e.get(t.ICommandService),o=e.get(t.IUniverInstanceService),{unitId:s,drawings:c}=r,l=o.getUnit(s,t.UniverInstanceType.UNIVER_DOC);if(!l)return!1;let u=(i=l.getSnapshot().drawings)==null?{}:i,d=t.JSONX.getInstance(),f=[];for(let{drawingId:e,key:n,value:r}of c){var p;let i=(p=u[e])==null||(p=p.docTransform)==null?void 0:p[n];if(!t.Tools.diffValue(i,r)){let t=[`drawings`,e,`docTransform`,n];f.push(i===void 0?d.insertOp(t,r):d.replaceOp(t,i,r))}}return!!a.syncExecuteCommand(n.RichTextEditingMutation.id,{unitId:s,actions:f.reduce((e,n)=>t.JSONX.compose(e,n),null),textRanges:null,debounce:!0})}},x=function(e){return e.INLINE=`inline`,e.BEHIND_TEXT=`behindText`,e.IN_FRONT_OF_TEXT=`inFrontOfText`,e.WRAP_SQUARE=`wrapSquare`,e.WRAP_TOP_AND_BOTTOM=`wrapTopAndBottom`,e}({}),S={inline:t.PositionedObjectLayoutType.INLINE,wrapSquare:t.PositionedObjectLayoutType.WRAP_SQUARE,wrapTopAndBottom:t.PositionedObjectLayoutType.WRAP_TOP_AND_BOTTOM,inFrontOfText:t.PositionedObjectLayoutType.WRAP_NONE,behindText:t.PositionedObjectLayoutType.WRAP_NONE},C={id:`doc.command.update-doc-drawing-wrapping-style`,type:t.CommandType.COMMAND,handler:(e,r)=>{var i;if(!r)return!1;let{drawings:a,wrappingStyle:o,unitId:s}=r,c=e.get(t.ICommandService),l=e.get(t.IUniverInstanceService).getUnit(s,t.UniverInstanceType.UNIVER_DOC);if(!l)return!1;let u=(i=l.getDrawings())==null?{}:i,d=t.JSONX.getInstance(),f=[];for(let e of a){let n=u[e.drawingId];if(!n)continue;let r=S[o];if(n.layoutType!==r&&f.push(d.replaceOp([`drawings`,e.drawingId,`layoutType`],n.layoutType,r)),o===`behindText`||o===`inFrontOfText`){let r=o===`behindText`?t.BooleanNumber.TRUE:t.BooleanNumber.FALSE;n.behindDoc!==r&&f.push(d.replaceOp([`drawings`,e.drawingId,`behindDoc`],n.behindDoc,r))}if(o!==`inline`)for(let r of[`positionH`,`positionV`]){var p;let i=(p=e.docTransform)==null?void 0:p[r],a=n.docTransform[r];i&&!t.Tools.diffValue(a,i)&&f.push(d.replaceOp([`drawings`,e.drawingId,`docTransform`,r],a,i))}}let m={id:n.RichTextEditingMutation.id,params:{unitId:s,actions:f.reduce((e,n)=>t.JSONX.compose(e,n),null),textRanges:null}};return!!c.syncExecuteCommand(m.id,m.params)}};var w=class extends r.UnitDrawingService{};let T=(0,t.createIdentifier)(`univer.doc.plugin.doc-drawing.service`);function E(e,t){return function(n,r){t(n,r,e)}}function D(e,t,n,r){var i=arguments.length,a=i<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,o;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}let O=`DOC_DRAWING_PLUGIN`;function k(e,t={}){return e.map((e,t)=>({drawingId:e,index:t})).sort((e,n)=>{let r=A(t[e.drawingId]);return r===A(t[n.drawingId])?e.index-n.index:r?-1:1}).map(({drawingId:e})=>e)}function A(e){return(e==null?void 0:e.layoutType)===t.PositionedObjectLayoutType.WRAP_NONE&&e.behindDoc===t.BooleanNumber.TRUE}let j=class extends t.Disposable{constructor(e,t,n,r,i){super(),this._docDrawingService=e,this._drawingManagerService=t,this._resourceManagerService=n,this._univerInstanceService=r,this._commandService=i,this._init()}_init(){this._initSnapshot(),this._initCommands()}_initSnapshot(){let e=e=>{let n=this._univerInstanceService.getUnit(e,t.UniverInstanceType.UNIVER_DOC);if(n){let e=n.getSnapshot().drawings,t=n.getSnapshot().drawingsOrder;return JSON.stringify({data:e==null?{}:e,order:t==null?[]:t})}return``},n=e=>{if(!e)return{data:{},order:[]};try{return JSON.parse(e)}catch{return{data:{},order:[]}}};this.disposeWithMe(this._resourceManagerService.registerPluginResource({pluginName:O,businesses:[t.UniverInstanceType.UNIVER_DOC],toJson:t=>e(t),parseJson:e=>n(e),onUnLoad:e=>{this._setDrawingDataForUnit(e,{data:{},order:[]})},onLoad:(e,t)=>{var n,r;this._setDrawingDataForUnit(e,{data:(n=t.data)==null?{}:n,order:(r=t.order)==null?[]:r})}}))}_setDrawingDataForUnit(e,t){let n=this._univerInstanceService.getUnit(e);n!=null&&(n.resetDrawing(t.data,t.order),this.loadDrawingDataForUnit(e))}loadDrawingDataForUnit(e){let n=this._univerInstanceService.getUnit(e,t.UniverInstanceType.UNIVER_DOC);if(!n)return!1;let r=e,i=n.getDrawings(),a=n.getDrawingsOrder();if(!i||!a)return!1;let o={[r]:{unitId:e,subUnitId:r,data:i,order:a}},s={[r]:{...o[r],order:k(a,i)}};return this._docDrawingService.registerDrawingData(e,o),this._drawingManagerService.registerDrawingData(e,s),!0}_initCommands(){[i,f,b,C,y].forEach(e=>this.disposeWithMe(this._commandService.registerCommand(e)))}};j=D([E(0,T),E(1,r.IDrawingManagerService),E(2,t.IResourceManagerService),E(3,t.IUniverInstanceService),E(4,t.ICommandService)],j);var M=`@univerjs/docs-drawing`,N=`1.0.0-alpha.8`;let P={},F=class extends t.Plugin{constructor(e=P,n,r){super(),this._config=e,this._injector=n,this._configService=r;let{...i}=(0,t.merge)({},P,this._config);this._configService.setConfig(`docs-drawing.config`,i)}onStarting(){[[j],[d],[u,{useClass:d}],[w],[T,{useClass:w}]].forEach(e=>this._injector.add(e)),(0,t.touchDependencies)(this._injector,[[j]])}};l(F,`pluginName`,O),l(F,`packageName`,M),l(F,`version`,N),l(F,`type`,t.UniverInstanceType.UNIVER_DOC),F=D([(0,t.DependentOn)(n.UniverDocsPlugin,r.UniverDrawingPlugin),E(1,(0,t.Inject)(t.Injector)),E(2,t.IConfigService)],F),e.DOCS_DRAWING_PLUGIN=O,e.DocDrawingAdapterService=d,Object.defineProperty(e,"DocDrawingController",{enumerable:!0,get:function(){return j}}),e.DocDrawingService=w,e.IDocDrawingAdapterService=u,e.IDocDrawingService=T,e.InsertDocDrawingCommand=i,e.RemoveDocDrawingCommand=f,e.SetDocDrawingArrangeCommand=y,e.TextWrappingStyle=x,Object.defineProperty(e,"UniverDocsDrawingPlugin",{enumerable:!0,get:function(){return F}}),e.UpdateDocDrawingWrappingStyleCommand=C,e.UpdateDrawingDocTransformCommand=b,e.WRAPPING_STYLE_TO_LAYOUT_TYPE=S,e.getDocDrawingRenderOrder=k});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@univerjs/docs-drawing",
3
- "version": "1.0.0-alpha.6",
3
+ "version": "1.0.0-alpha.8",
4
4
  "private": false,
5
5
  "description": "Drawing model integration for Univer Docs.",
6
6
  "author": "DreamNum Co., Ltd. <developer@univer.ai>",
@@ -59,15 +59,15 @@
59
59
  "lib"
60
60
  ],
61
61
  "dependencies": {
62
- "@univerjs/core": "1.0.0-alpha.6",
63
- "@univerjs/drawing": "1.0.0-alpha.6",
64
- "@univerjs/docs": "1.0.0-alpha.6"
62
+ "@univerjs/core": "1.0.0-alpha.8",
63
+ "@univerjs/drawing": "1.0.0-alpha.8",
64
+ "@univerjs/docs": "1.0.0-alpha.8"
65
65
  },
66
66
  "devDependencies": {
67
67
  "typescript": "^6.0.3",
68
68
  "vitest": "^4.1.10",
69
- "@univerjs-infra/shared": "1.0.0-alpha.6",
70
- "@univerjs/engine-render": "1.0.0-alpha.6"
69
+ "@univerjs/engine-render": "1.0.0-alpha.8",
70
+ "@univerjs-infra/shared": "1.0.0-alpha.8"
71
71
  },
72
72
  "scripts": {
73
73
  "test": "vitest run",