@embedpdf/plugin-annotation 2.6.1 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +203 -8
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/actions.d.ts +12 -1
  6. package/dist/lib/annotation-plugin.d.ts +17 -0
  7. package/dist/lib/tools/default-tools.d.ts +2 -0
  8. package/dist/lib/tools/types.d.ts +2 -0
  9. package/dist/lib/types.d.ts +18 -2
  10. package/dist/preact/index.cjs +1 -1
  11. package/dist/preact/index.cjs.map +1 -1
  12. package/dist/preact/index.js +1008 -1058
  13. package/dist/preact/index.js.map +1 -1
  14. package/dist/react/index.cjs +1 -1
  15. package/dist/react/index.cjs.map +1 -1
  16. package/dist/react/index.js +1008 -1058
  17. package/dist/react/index.js.map +1 -1
  18. package/dist/shared/components/annotation-container.d.ts +11 -5
  19. package/dist/shared/components/annotations/circle.d.ts +4 -2
  20. package/dist/shared/components/annotations/free-text.d.ts +4 -1
  21. package/dist/shared/components/annotations/ink.d.ts +3 -1
  22. package/dist/shared/components/annotations/line.d.ts +3 -1
  23. package/dist/shared/components/annotations/polygon.d.ts +3 -2
  24. package/dist/shared/components/annotations/polyline.d.ts +3 -1
  25. package/dist/shared/components/annotations/square.d.ts +4 -2
  26. package/dist/shared/components/annotations.d.ts +0 -1
  27. package/dist/shared/components/appearance-image.d.ts +12 -0
  28. package/dist/shared/components/built-in-renderers.d.ts +2 -0
  29. package/dist/shared/components/text-markup/highlight.d.ts +3 -1
  30. package/dist/shared/components/text-markup/squiggly.d.ts +3 -1
  31. package/dist/shared/components/text-markup/strikeout.d.ts +3 -1
  32. package/dist/shared/components/text-markup/underline.d.ts +3 -1
  33. package/dist/shared/components/types.d.ts +66 -10
  34. package/dist/shared-preact/components/annotation-container.d.ts +11 -5
  35. package/dist/shared-preact/components/annotations/circle.d.ts +4 -2
  36. package/dist/shared-preact/components/annotations/free-text.d.ts +4 -1
  37. package/dist/shared-preact/components/annotations/ink.d.ts +3 -1
  38. package/dist/shared-preact/components/annotations/line.d.ts +3 -1
  39. package/dist/shared-preact/components/annotations/polygon.d.ts +3 -2
  40. package/dist/shared-preact/components/annotations/polyline.d.ts +3 -1
  41. package/dist/shared-preact/components/annotations/square.d.ts +4 -2
  42. package/dist/shared-preact/components/annotations.d.ts +0 -1
  43. package/dist/shared-preact/components/appearance-image.d.ts +12 -0
  44. package/dist/shared-preact/components/built-in-renderers.d.ts +2 -0
  45. package/dist/shared-preact/components/text-markup/highlight.d.ts +3 -1
  46. package/dist/shared-preact/components/text-markup/squiggly.d.ts +3 -1
  47. package/dist/shared-preact/components/text-markup/strikeout.d.ts +3 -1
  48. package/dist/shared-preact/components/text-markup/underline.d.ts +3 -1
  49. package/dist/shared-preact/components/types.d.ts +66 -10
  50. package/dist/shared-react/components/annotation-container.d.ts +11 -5
  51. package/dist/shared-react/components/annotations/circle.d.ts +4 -2
  52. package/dist/shared-react/components/annotations/free-text.d.ts +4 -1
  53. package/dist/shared-react/components/annotations/ink.d.ts +3 -1
  54. package/dist/shared-react/components/annotations/line.d.ts +3 -1
  55. package/dist/shared-react/components/annotations/polygon.d.ts +3 -2
  56. package/dist/shared-react/components/annotations/polyline.d.ts +3 -1
  57. package/dist/shared-react/components/annotations/square.d.ts +4 -2
  58. package/dist/shared-react/components/annotations.d.ts +0 -1
  59. package/dist/shared-react/components/appearance-image.d.ts +12 -0
  60. package/dist/shared-react/components/built-in-renderers.d.ts +2 -0
  61. package/dist/shared-react/components/text-markup/highlight.d.ts +3 -1
  62. package/dist/shared-react/components/text-markup/squiggly.d.ts +3 -1
  63. package/dist/shared-react/components/text-markup/strikeout.d.ts +3 -1
  64. package/dist/shared-react/components/text-markup/underline.d.ts +3 -1
  65. package/dist/shared-react/components/types.d.ts +66 -10
  66. package/dist/svelte/components/Annotations.svelte.d.ts +0 -7
  67. package/dist/svelte/components/AppearanceImage.svelte.d.ts +8 -0
  68. package/dist/svelte/components/annotations/Circle.svelte.d.ts +1 -10
  69. package/dist/svelte/components/annotations/FreeText.svelte.d.ts +1 -0
  70. package/dist/svelte/components/annotations/Ink.svelte.d.ts +1 -1
  71. package/dist/svelte/components/annotations/Line.svelte.d.ts +1 -0
  72. package/dist/svelte/components/annotations/Polygon.svelte.d.ts +1 -0
  73. package/dist/svelte/components/annotations/Polyline.svelte.d.ts +1 -1
  74. package/dist/svelte/components/annotations/Square.svelte.d.ts +1 -0
  75. package/dist/svelte/components/built-in-renderers.d.ts +2 -0
  76. package/dist/svelte/components/renderers/CircleRenderer.svelte.d.ts +5 -0
  77. package/dist/svelte/components/renderers/FreeTextRenderer.svelte.d.ts +5 -0
  78. package/dist/svelte/components/renderers/HighlightRenderer.svelte.d.ts +5 -0
  79. package/dist/svelte/components/renderers/InkRenderer.svelte.d.ts +5 -0
  80. package/dist/svelte/components/renderers/LineRenderer.svelte.d.ts +5 -0
  81. package/dist/svelte/components/renderers/LinkRenderer.svelte.d.ts +5 -0
  82. package/dist/svelte/components/renderers/PolygonRenderer.svelte.d.ts +5 -0
  83. package/dist/svelte/components/renderers/PolylineRenderer.svelte.d.ts +5 -0
  84. package/dist/svelte/components/renderers/SquareRenderer.svelte.d.ts +5 -0
  85. package/dist/svelte/components/renderers/SquigglyRenderer.svelte.d.ts +5 -0
  86. package/dist/svelte/components/renderers/StampRenderer.svelte.d.ts +5 -0
  87. package/dist/svelte/components/renderers/StrikeoutRenderer.svelte.d.ts +5 -0
  88. package/dist/svelte/components/renderers/UnderlineRenderer.svelte.d.ts +5 -0
  89. package/dist/svelte/components/text-markup/Highlight.svelte.d.ts +2 -0
  90. package/dist/svelte/components/text-markup/Squiggly.svelte.d.ts +2 -0
  91. package/dist/svelte/components/text-markup/Strikeout.svelte.d.ts +2 -0
  92. package/dist/svelte/components/text-markup/Underline.svelte.d.ts +2 -0
  93. package/dist/svelte/components/types.d.ts +8 -2
  94. package/dist/svelte/context/renderer-registry.svelte.d.ts +2 -2
  95. package/dist/svelte/context/types.d.ts +63 -2
  96. package/dist/svelte/index.cjs +1 -1
  97. package/dist/svelte/index.cjs.map +1 -1
  98. package/dist/svelte/index.js +2509 -2864
  99. package/dist/svelte/index.js.map +1 -1
  100. package/dist/vue/components/annotation-container.vue.d.ts +8 -3
  101. package/dist/vue/components/annotation-layer.vue.d.ts +1 -20
  102. package/dist/vue/components/annotations/circle.vue.d.ts +18 -5
  103. package/dist/vue/components/annotations/free-text.vue.d.ts +17 -5
  104. package/dist/vue/components/annotations/ink.vue.d.ts +16 -6
  105. package/dist/vue/components/annotations/line.vue.d.ts +20 -5
  106. package/dist/vue/components/annotations/link.vue.d.ts +24 -6
  107. package/dist/vue/components/annotations/polygon.vue.d.ts +21 -5
  108. package/dist/vue/components/annotations/polyline.vue.d.ts +18 -5
  109. package/dist/vue/components/annotations/square.vue.d.ts +18 -5
  110. package/dist/vue/components/annotations/stamp.vue.d.ts +11 -5
  111. package/dist/vue/components/annotations.vue.d.ts +8 -575
  112. package/dist/vue/components/appearance-image.vue.d.ts +9 -0
  113. package/dist/vue/components/built-in-renderers.d.ts +2 -0
  114. package/dist/vue/components/group-selection-box.vue.d.ts +2 -2
  115. package/dist/vue/components/renderers/circle-renderer.vue.d.ts +6 -0
  116. package/dist/vue/components/renderers/free-text-renderer.vue.d.ts +6 -0
  117. package/dist/vue/components/renderers/highlight-renderer.vue.d.ts +6 -0
  118. package/dist/vue/components/renderers/ink-renderer.vue.d.ts +6 -0
  119. package/dist/vue/components/renderers/line-renderer.vue.d.ts +6 -0
  120. package/dist/vue/components/renderers/link-renderer.vue.d.ts +6 -0
  121. package/dist/vue/components/renderers/polygon-renderer.vue.d.ts +6 -0
  122. package/dist/vue/components/renderers/polyline-renderer.vue.d.ts +6 -0
  123. package/dist/vue/components/renderers/square-renderer.vue.d.ts +6 -0
  124. package/dist/vue/components/renderers/squiggly-renderer.vue.d.ts +6 -0
  125. package/dist/vue/components/renderers/stamp-renderer.vue.d.ts +6 -0
  126. package/dist/vue/components/renderers/strikeout-renderer.vue.d.ts +6 -0
  127. package/dist/vue/components/renderers/underline-renderer.vue.d.ts +6 -0
  128. package/dist/vue/components/text-markup/highlight.vue.d.ts +17 -5
  129. package/dist/vue/components/text-markup/squiggly.vue.d.ts +17 -5
  130. package/dist/vue/components/text-markup/strikeout.vue.d.ts +17 -5
  131. package/dist/vue/components/text-markup/underline.vue.d.ts +17 -5
  132. package/dist/vue/context/renderer-registry.d.ts +2 -2
  133. package/dist/vue/context/types.d.ts +63 -2
  134. package/dist/vue/index.cjs +1 -1
  135. package/dist/vue/index.cjs.map +1 -1
  136. package/dist/vue/index.js +1651 -1278
  137. package/dist/vue/index.js.map +1 -1
  138. package/package.json +10 -10
package/dist/index.js CHANGED
@@ -28,6 +28,7 @@ const SET_SELECTION = "ANNOTATION/SET_SELECTION";
28
28
  const SET_ACTIVE_TOOL_ID = "ANNOTATION/SET_ACTIVE_TOOL_ID";
29
29
  const CREATE_ANNOTATION = "ANNOTATION/CREATE_ANNOTATION";
30
30
  const PATCH_ANNOTATION = "ANNOTATION/PATCH_ANNOTATION";
31
+ const MOVE_ANNOTATION = "ANNOTATION/MOVE_ANNOTATION";
31
32
  const DELETE_ANNOTATION = "ANNOTATION/DELETE_ANNOTATION";
32
33
  const COMMIT_PENDING_CHANGES = "ANNOTATION/COMMIT";
33
34
  const PURGE_ANNOTATION = "ANNOTATION/PURGE_ANNOTATION";
@@ -76,6 +77,10 @@ const patchAnnotation = (documentId, pageIndex, id, patch) => ({
76
77
  type: PATCH_ANNOTATION,
77
78
  payload: { documentId, pageIndex, id, patch }
78
79
  });
80
+ const moveAnnotation = (documentId, pageIndex, id, patch) => ({
81
+ type: MOVE_ANNOTATION,
82
+ payload: { documentId, pageIndex, id, patch }
83
+ });
79
84
  const deleteAnnotation = (documentId, pageIndex, id) => ({
80
85
  type: DELETE_ANNOTATION,
81
86
  payload: { documentId, pageIndex, id }
@@ -681,7 +686,8 @@ const defaultTools = [
681
686
  // No imageSrc by default, which tells the UI to open a file picker
682
687
  },
683
688
  behavior: {
684
- insertUpright: true
689
+ insertUpright: true,
690
+ useAppearanceStream: false
685
691
  }
686
692
  }
687
693
  ];
@@ -715,7 +721,25 @@ const patchAnno = (docState, uid, patch) => {
715
721
  ...docState.byUid,
716
722
  [uid]: {
717
723
  ...prev,
718
- commitState: prev.commitState === "synced" ? "dirty" : prev.commitState,
724
+ commitState: prev.commitState === "synced" || prev.commitState === "moved" ? "dirty" : prev.commitState,
725
+ object: { ...prev.object, ...patch },
726
+ dictMode: true
727
+ }
728
+ },
729
+ hasPendingChanges: true
730
+ };
731
+ };
732
+ const moveAnno = (docState, uid, patch) => {
733
+ const prev = docState.byUid[uid];
734
+ if (!prev) return docState;
735
+ return {
736
+ ...docState,
737
+ byUid: {
738
+ ...docState.byUid,
739
+ [uid]: {
740
+ ...prev,
741
+ // synced -> moved, moved -> moved, dirty stays dirty, new stays new
742
+ commitState: prev.commitState === "synced" ? "moved" : prev.commitState,
719
743
  object: { ...prev.object, ...patch }
720
744
  }
721
745
  },
@@ -970,6 +994,18 @@ const reducer = (state, action) => {
970
994
  }
971
995
  };
972
996
  }
997
+ case MOVE_ANNOTATION: {
998
+ const { documentId, id, patch } = action.payload;
999
+ const docState = state.documents[documentId];
1000
+ if (!docState) return state;
1001
+ return {
1002
+ ...state,
1003
+ documents: {
1004
+ ...state.documents,
1005
+ [documentId]: moveAnno(docState, id, patch)
1006
+ }
1007
+ };
1008
+ }
973
1009
  case COMMIT_PENDING_CHANGES: {
974
1010
  const { documentId, committedUids } = action.payload;
975
1011
  const docState = state.documents[documentId];
@@ -981,11 +1017,11 @@ const reducer = (state, action) => {
981
1017
  if (committedSet.has(uid)) {
982
1018
  cleaned[uid] = {
983
1019
  ...ta,
984
- commitState: ta.commitState === "dirty" || ta.commitState === "new" ? "synced" : ta.commitState
1020
+ commitState: ta.commitState === "dirty" || ta.commitState === "new" || ta.commitState === "moved" ? "synced" : ta.commitState
985
1021
  };
986
1022
  } else {
987
1023
  cleaned[uid] = ta;
988
- if (ta.commitState === "new" || ta.commitState === "dirty" || ta.commitState === "deleted") {
1024
+ if (ta.commitState === "new" || ta.commitState === "dirty" || ta.commitState === "moved" || ta.commitState === "deleted") {
989
1025
  stillHasPending = true;
990
1026
  }
991
1027
  }
@@ -2849,6 +2885,7 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
2849
2885
  this.events$ = createBehaviorEmitter();
2850
2886
  this.toolsChange$ = createBehaviorEmitter();
2851
2887
  this.patchRegistry = new PatchRegistry();
2888
+ this.appearanceCache = /* @__PURE__ */ new Map();
2852
2889
  this.unifiedDragStates = /* @__PURE__ */ new Map();
2853
2890
  this.unifiedDrag$ = createBehaviorEmitter();
2854
2891
  this.unifiedResizeStates = /* @__PURE__ */ new Map();
@@ -2898,6 +2935,7 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
2898
2935
  this.pendingContexts.delete(documentId);
2899
2936
  this.isInitialLoadComplete.delete(documentId);
2900
2937
  this.importQueue.delete(documentId);
2938
+ this.appearanceCache.delete(documentId);
2901
2939
  this.logger.debug(
2902
2940
  "AnnotationPlugin",
2903
2941
  "DocumentClosed",
@@ -3034,10 +3072,13 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
3034
3072
  createAnnotation: (pageIndex, anno, ctx) => this.createAnnotation(pageIndex, anno, ctx),
3035
3073
  updateAnnotation: (pageIndex, id, patch) => this.updateAnnotation(pageIndex, id, patch),
3036
3074
  updateAnnotations: (patches) => this.updateAnnotationsMethod(patches),
3075
+ moveAnnotation: (pageIndex, id, position, mode, documentId) => this.moveAnnotationMethod(pageIndex, id, position, mode, documentId),
3037
3076
  deleteAnnotation: (pageIndex, id) => this.deleteAnnotation(pageIndex, id),
3038
3077
  deleteAnnotations: (annotations, documentId) => this.deleteAnnotationsMethod(annotations, documentId),
3039
3078
  purgeAnnotation: (pageIndex, id, documentId) => this.purgeAnnotationMethod(pageIndex, id, documentId),
3040
3079
  renderAnnotation: (options) => this.renderAnnotation(options),
3080
+ getPageAppearances: (pageIndex, options, documentId) => this.getPageAppearances(pageIndex, options, documentId),
3081
+ invalidatePageAppearances: (pageIndex, documentId) => this.invalidatePageAppearances(pageIndex, documentId),
3041
3082
  commit: () => this.commit(),
3042
3083
  // Attached links (IRT link children)
3043
3084
  getAttachedLinks: (id, documentId) => this.getAttachedLinksMethod(id, documentId),
@@ -3094,10 +3135,13 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
3094
3135
  createAnnotation: (pageIndex, anno, ctx) => this.createAnnotation(pageIndex, anno, ctx, documentId),
3095
3136
  updateAnnotation: (pageIndex, id, patch) => this.updateAnnotation(pageIndex, id, patch, documentId),
3096
3137
  updateAnnotations: (patches) => this.updateAnnotationsMethod(patches, documentId),
3138
+ moveAnnotation: (pageIndex, id, position, mode) => this.moveAnnotationMethod(pageIndex, id, position, mode, documentId),
3097
3139
  deleteAnnotation: (pageIndex, id) => this.deleteAnnotation(pageIndex, id, documentId),
3098
3140
  deleteAnnotations: (annotations) => this.deleteAnnotationsMethod(annotations, documentId),
3099
3141
  purgeAnnotation: (pageIndex, id) => this.purgeAnnotationMethod(pageIndex, id, documentId),
3100
3142
  renderAnnotation: (options) => this.renderAnnotation(options, documentId),
3143
+ getPageAppearances: (pageIndex, options) => this.getPageAppearances(pageIndex, options, documentId),
3144
+ invalidatePageAppearances: (pageIndex) => this.invalidatePageAppearances(pageIndex, documentId),
3101
3145
  commit: () => this.commit(documentId),
3102
3146
  getAttachedLinks: (id) => this.getAttachedLinksMethod(id, documentId),
3103
3147
  hasAttachedLinks: (id) => this.hasAttachedLinksMethod(id, documentId),
@@ -3269,6 +3313,67 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
3269
3313
  }
3270
3314
  return this.engine.renderPageAnnotation(doc, page, annotation, options);
3271
3315
  }
3316
+ /**
3317
+ * Batch-fetch rendered appearance stream images for all annotations on a page.
3318
+ * Results are cached per document + page. Call invalidatePageAppearances to clear.
3319
+ */
3320
+ getPageAppearances(pageIndex, options, documentId) {
3321
+ const id = documentId ?? this.getActiveDocumentId();
3322
+ const docState = this.getCoreDocument(id);
3323
+ const doc = docState == null ? void 0 : docState.document;
3324
+ if (!doc) {
3325
+ return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: "Document not found" });
3326
+ }
3327
+ const page = doc.pages.find((p) => p.index === pageIndex);
3328
+ if (!page) {
3329
+ return PdfTaskHelper.reject({ code: PdfErrorCode.NotFound, message: "Page not found" });
3330
+ }
3331
+ let docCache = this.appearanceCache.get(id);
3332
+ if (!docCache) {
3333
+ docCache = /* @__PURE__ */ new Map();
3334
+ this.appearanceCache.set(id, docCache);
3335
+ }
3336
+ const cached = docCache.get(pageIndex);
3337
+ if (cached && !options) {
3338
+ const task = new Task();
3339
+ task.resolve(cached);
3340
+ return task;
3341
+ }
3342
+ const engineTask = this.engine.renderPageAnnotations(doc, page, options);
3343
+ const resultTask = new Task();
3344
+ engineTask.wait(
3345
+ (result) => {
3346
+ docCache.set(pageIndex, result);
3347
+ resultTask.resolve(result);
3348
+ },
3349
+ (error) => {
3350
+ resultTask.fail(error);
3351
+ }
3352
+ );
3353
+ return resultTask;
3354
+ }
3355
+ /**
3356
+ * Clear cached appearances for a specific page (e.g. on zoom change).
3357
+ */
3358
+ invalidatePageAppearances(pageIndex, documentId) {
3359
+ const id = documentId ?? this.getActiveDocumentId();
3360
+ const docCache = this.appearanceCache.get(id);
3361
+ if (docCache) {
3362
+ docCache.delete(pageIndex);
3363
+ }
3364
+ }
3365
+ /**
3366
+ * Remove a single annotation's entry from the page appearance cache.
3367
+ * Used after committing changes that regenerate the annotation's appearance.
3368
+ */
3369
+ invalidateAnnotationAppearance(annotId, pageIndex, documentId) {
3370
+ const id = documentId ?? this.getActiveDocumentId();
3371
+ const docCache = this.appearanceCache.get(id);
3372
+ if (!docCache) return;
3373
+ const pageMap = docCache.get(pageIndex);
3374
+ if (!pageMap) return;
3375
+ delete pageMap[annotId];
3376
+ }
3272
3377
  importAnnotations(items, documentId) {
3273
3378
  const id = documentId ?? this.getActiveDocumentId();
3274
3379
  if (!this.isInitialLoadComplete.get(id)) {
@@ -3840,7 +3945,7 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
3840
3945
  patches.push({ pageIndex: ta.object.pageIndex, id, patch });
3841
3946
  }
3842
3947
  if (patches.length > 0) {
3843
- this.updateAnnotationsMethod(patches, documentId);
3948
+ this.moveAnnotationsMethod(patches, documentId);
3844
3949
  }
3845
3950
  }
3846
3951
  const endPatches = this.computeDragPreviewPatches(state, documentId);
@@ -4424,6 +4529,87 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
4424
4529
  const historyScope = this.history.forDocument(docId);
4425
4530
  historyScope.register(command, this.ANNOTATION_HISTORY_TOPIC);
4426
4531
  }
4532
+ moveAnnotationsMethod(patches, documentId) {
4533
+ const docId = documentId ?? this.getActiveDocumentId();
4534
+ if (!this.checkPermission(docId, PdfPermissionFlag.ModifyAnnotations)) {
4535
+ this.logger.debug(
4536
+ "AnnotationPlugin",
4537
+ "MoveAnnotations",
4538
+ `Cannot move annotations: document ${docId} lacks ModifyAnnotations permission`
4539
+ );
4540
+ return;
4541
+ }
4542
+ const docState = this.getDocumentState(docId);
4543
+ const moveData = patches.map(({ pageIndex, id, patch }) => {
4544
+ var _a;
4545
+ const originalObject = (_a = docState.byUid[id]) == null ? void 0 : _a.object;
4546
+ if (!originalObject) return null;
4547
+ return { pageIndex, id, patch, originalObject };
4548
+ }).filter((p) => p !== null);
4549
+ if (moveData.length === 0) return;
4550
+ const execute = () => {
4551
+ for (const { pageIndex, id, patch, originalObject } of moveData) {
4552
+ this.dispatch(moveAnnotation(docId, pageIndex, id, patch));
4553
+ this.events$.emit({
4554
+ type: "update",
4555
+ documentId: docId,
4556
+ annotation: originalObject,
4557
+ pageIndex,
4558
+ patch,
4559
+ committed: false
4560
+ });
4561
+ }
4562
+ };
4563
+ if (!this.history) {
4564
+ execute();
4565
+ if (this.config.autoCommit !== false) {
4566
+ this.commit(docId);
4567
+ }
4568
+ return;
4569
+ }
4570
+ const undoData = moveData.map(({ pageIndex, id, patch, originalObject }) => ({
4571
+ pageIndex,
4572
+ id,
4573
+ originalPatch: Object.fromEntries(
4574
+ Object.keys(patch).map((key) => [key, originalObject[key]])
4575
+ ),
4576
+ originalObject
4577
+ }));
4578
+ const command = {
4579
+ execute,
4580
+ undo: () => {
4581
+ for (const { pageIndex, id, originalPatch, originalObject } of undoData) {
4582
+ this.dispatch(moveAnnotation(docId, pageIndex, id, originalPatch));
4583
+ this.events$.emit({
4584
+ type: "update",
4585
+ documentId: docId,
4586
+ annotation: originalObject,
4587
+ pageIndex,
4588
+ patch: originalPatch,
4589
+ committed: false
4590
+ });
4591
+ }
4592
+ },
4593
+ metadata: { annotationIds: moveData.map((p) => p.id) }
4594
+ };
4595
+ const historyScope = this.history.forDocument(docId);
4596
+ historyScope.register(command, this.ANNOTATION_HISTORY_TOPIC);
4597
+ }
4598
+ moveAnnotationMethod(pageIndex, annotationId, position, mode = "delta", documentId) {
4599
+ const docId = documentId ?? this.getActiveDocumentId();
4600
+ const ta = this.getAnnotationById(annotationId, docId);
4601
+ if (!ta) return;
4602
+ const currentRect = ta.object.rect;
4603
+ const newRect = {
4604
+ ...currentRect,
4605
+ origin: mode === "absolute" ? { x: position.x, y: position.y } : { x: currentRect.origin.x + position.x, y: currentRect.origin.y + position.y }
4606
+ };
4607
+ const patch = this.transformAnnotation(ta.object, {
4608
+ type: "move",
4609
+ changes: { rect: newRect }
4610
+ });
4611
+ this.moveAnnotationsMethod([{ pageIndex, id: annotationId, patch }], docId);
4612
+ }
4427
4613
  getActiveTool(documentId) {
4428
4614
  const docState = this.getDocumentState(documentId);
4429
4615
  if (!docState.activeToolId) return null;
@@ -4493,6 +4679,9 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
4493
4679
  ctx: contexts == null ? void 0 : contexts.get(ta.object.id)
4494
4680
  });
4495
4681
  break;
4682
+ case "moved":
4683
+ batch.updates.push({ uid, ta, moved: true });
4684
+ break;
4496
4685
  case "dirty":
4497
4686
  batch.updates.push({ uid, ta });
4498
4687
  break;
@@ -4517,11 +4706,11 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
4517
4706
  const createTask = this.engine.createPageAnnotation(doc, page, ta.object, ctx);
4518
4707
  pendingOps.push({ type: "create", task: createTask, ta, uid, ctx });
4519
4708
  }
4520
- for (const { uid, ta } of batch.updates) {
4709
+ for (const { uid, ta, moved } of batch.updates) {
4521
4710
  const page = doc.pages.find((p) => p.index === ta.object.pageIndex);
4522
4711
  if (!page) continue;
4523
- const updateTask = this.engine.updatePageAnnotation(doc, page, ta.object);
4524
- pendingOps.push({ type: "update", task: updateTask, ta, uid });
4712
+ const updateTask = moved ? this.engine.updatePageAnnotation(doc, page, ta.object, { regenerateAppearance: false }) : this.engine.updatePageAnnotation(doc, page, ta.object);
4713
+ pendingOps.push({ type: "update", task: updateTask, ta, uid, moved });
4525
4714
  }
4526
4715
  for (const { uid, ta } of batch.deletions) {
4527
4716
  const page = doc.pages.find((p) => p.index === ta.object.pageIndex);
@@ -4539,6 +4728,12 @@ const _AnnotationPlugin = class _AnnotationPlugin extends BasePlugin {
4539
4728
  Task.allSettled(allTasks).wait(
4540
4729
  () => {
4541
4730
  this.emitCommitEvents(docId, pendingOps, contexts);
4731
+ for (const op of pendingOps) {
4732
+ if (op.type === "update" && op.moved) continue;
4733
+ if (op.type === "create" || op.type === "update" || op.type === "delete") {
4734
+ this.invalidateAnnotationAppearance(op.ta.object.id, op.ta.object.pageIndex, docId);
4735
+ }
4736
+ }
4542
4737
  this.dispatch(commitPendingChanges(docId, batch.committedUids));
4543
4738
  task.resolve(true);
4544
4739
  },