@embedpdf/plugin-annotation 2.6.2 → 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.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +203 -8
- package/dist/index.js.map +1 -1
- package/dist/lib/actions.d.ts +12 -1
- package/dist/lib/annotation-plugin.d.ts +17 -0
- package/dist/lib/tools/default-tools.d.ts +2 -0
- package/dist/lib/tools/types.d.ts +2 -0
- package/dist/lib/types.d.ts +18 -2
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +1008 -1058
- package/dist/preact/index.js.map +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +1008 -1058
- package/dist/react/index.js.map +1 -1
- package/dist/shared/components/annotation-container.d.ts +11 -5
- package/dist/shared/components/annotations/circle.d.ts +4 -2
- package/dist/shared/components/annotations/free-text.d.ts +4 -1
- package/dist/shared/components/annotations/ink.d.ts +3 -1
- package/dist/shared/components/annotations/line.d.ts +3 -1
- package/dist/shared/components/annotations/polygon.d.ts +3 -2
- package/dist/shared/components/annotations/polyline.d.ts +3 -1
- package/dist/shared/components/annotations/square.d.ts +4 -2
- package/dist/shared/components/annotations.d.ts +0 -1
- package/dist/shared/components/appearance-image.d.ts +12 -0
- package/dist/shared/components/built-in-renderers.d.ts +2 -0
- package/dist/shared/components/text-markup/highlight.d.ts +3 -1
- package/dist/shared/components/text-markup/squiggly.d.ts +3 -1
- package/dist/shared/components/text-markup/strikeout.d.ts +3 -1
- package/dist/shared/components/text-markup/underline.d.ts +3 -1
- package/dist/shared/components/types.d.ts +66 -10
- package/dist/shared-preact/components/annotation-container.d.ts +11 -5
- package/dist/shared-preact/components/annotations/circle.d.ts +4 -2
- package/dist/shared-preact/components/annotations/free-text.d.ts +4 -1
- package/dist/shared-preact/components/annotations/ink.d.ts +3 -1
- package/dist/shared-preact/components/annotations/line.d.ts +3 -1
- package/dist/shared-preact/components/annotations/polygon.d.ts +3 -2
- package/dist/shared-preact/components/annotations/polyline.d.ts +3 -1
- package/dist/shared-preact/components/annotations/square.d.ts +4 -2
- package/dist/shared-preact/components/annotations.d.ts +0 -1
- package/dist/shared-preact/components/appearance-image.d.ts +12 -0
- package/dist/shared-preact/components/built-in-renderers.d.ts +2 -0
- package/dist/shared-preact/components/text-markup/highlight.d.ts +3 -1
- package/dist/shared-preact/components/text-markup/squiggly.d.ts +3 -1
- package/dist/shared-preact/components/text-markup/strikeout.d.ts +3 -1
- package/dist/shared-preact/components/text-markup/underline.d.ts +3 -1
- package/dist/shared-preact/components/types.d.ts +66 -10
- package/dist/shared-react/components/annotation-container.d.ts +11 -5
- package/dist/shared-react/components/annotations/circle.d.ts +4 -2
- package/dist/shared-react/components/annotations/free-text.d.ts +4 -1
- package/dist/shared-react/components/annotations/ink.d.ts +3 -1
- package/dist/shared-react/components/annotations/line.d.ts +3 -1
- package/dist/shared-react/components/annotations/polygon.d.ts +3 -2
- package/dist/shared-react/components/annotations/polyline.d.ts +3 -1
- package/dist/shared-react/components/annotations/square.d.ts +4 -2
- package/dist/shared-react/components/annotations.d.ts +0 -1
- package/dist/shared-react/components/appearance-image.d.ts +12 -0
- package/dist/shared-react/components/built-in-renderers.d.ts +2 -0
- package/dist/shared-react/components/text-markup/highlight.d.ts +3 -1
- package/dist/shared-react/components/text-markup/squiggly.d.ts +3 -1
- package/dist/shared-react/components/text-markup/strikeout.d.ts +3 -1
- package/dist/shared-react/components/text-markup/underline.d.ts +3 -1
- package/dist/shared-react/components/types.d.ts +66 -10
- package/dist/svelte/components/Annotations.svelte.d.ts +0 -7
- package/dist/svelte/components/AppearanceImage.svelte.d.ts +8 -0
- package/dist/svelte/components/annotations/Circle.svelte.d.ts +1 -10
- package/dist/svelte/components/annotations/FreeText.svelte.d.ts +1 -0
- package/dist/svelte/components/annotations/Ink.svelte.d.ts +1 -1
- package/dist/svelte/components/annotations/Line.svelte.d.ts +1 -0
- package/dist/svelte/components/annotations/Polygon.svelte.d.ts +1 -0
- package/dist/svelte/components/annotations/Polyline.svelte.d.ts +1 -1
- package/dist/svelte/components/annotations/Square.svelte.d.ts +1 -0
- package/dist/svelte/components/built-in-renderers.d.ts +2 -0
- package/dist/svelte/components/renderers/CircleRenderer.svelte.d.ts +5 -0
- package/dist/svelte/components/renderers/FreeTextRenderer.svelte.d.ts +5 -0
- package/dist/svelte/components/renderers/HighlightRenderer.svelte.d.ts +5 -0
- package/dist/svelte/components/renderers/InkRenderer.svelte.d.ts +5 -0
- package/dist/svelte/components/renderers/LineRenderer.svelte.d.ts +5 -0
- package/dist/svelte/components/renderers/LinkRenderer.svelte.d.ts +5 -0
- package/dist/svelte/components/renderers/PolygonRenderer.svelte.d.ts +5 -0
- package/dist/svelte/components/renderers/PolylineRenderer.svelte.d.ts +5 -0
- package/dist/svelte/components/renderers/SquareRenderer.svelte.d.ts +5 -0
- package/dist/svelte/components/renderers/SquigglyRenderer.svelte.d.ts +5 -0
- package/dist/svelte/components/renderers/StampRenderer.svelte.d.ts +5 -0
- package/dist/svelte/components/renderers/StrikeoutRenderer.svelte.d.ts +5 -0
- package/dist/svelte/components/renderers/UnderlineRenderer.svelte.d.ts +5 -0
- package/dist/svelte/components/text-markup/Highlight.svelte.d.ts +2 -0
- package/dist/svelte/components/text-markup/Squiggly.svelte.d.ts +2 -0
- package/dist/svelte/components/text-markup/Strikeout.svelte.d.ts +2 -0
- package/dist/svelte/components/text-markup/Underline.svelte.d.ts +2 -0
- package/dist/svelte/components/types.d.ts +8 -2
- package/dist/svelte/context/renderer-registry.svelte.d.ts +2 -2
- package/dist/svelte/context/types.d.ts +63 -2
- package/dist/svelte/index.cjs +1 -1
- package/dist/svelte/index.cjs.map +1 -1
- package/dist/svelte/index.js +2509 -2864
- package/dist/svelte/index.js.map +1 -1
- package/dist/vue/components/annotation-container.vue.d.ts +8 -3
- package/dist/vue/components/annotation-layer.vue.d.ts +1 -20
- package/dist/vue/components/annotations/circle.vue.d.ts +18 -5
- package/dist/vue/components/annotations/free-text.vue.d.ts +17 -5
- package/dist/vue/components/annotations/ink.vue.d.ts +16 -6
- package/dist/vue/components/annotations/line.vue.d.ts +20 -5
- package/dist/vue/components/annotations/link.vue.d.ts +24 -6
- package/dist/vue/components/annotations/polygon.vue.d.ts +21 -5
- package/dist/vue/components/annotations/polyline.vue.d.ts +18 -5
- package/dist/vue/components/annotations/square.vue.d.ts +18 -5
- package/dist/vue/components/annotations/stamp.vue.d.ts +11 -5
- package/dist/vue/components/annotations.vue.d.ts +8 -575
- package/dist/vue/components/appearance-image.vue.d.ts +9 -0
- package/dist/vue/components/built-in-renderers.d.ts +2 -0
- package/dist/vue/components/group-selection-box.vue.d.ts +2 -2
- package/dist/vue/components/renderers/circle-renderer.vue.d.ts +6 -0
- package/dist/vue/components/renderers/free-text-renderer.vue.d.ts +6 -0
- package/dist/vue/components/renderers/highlight-renderer.vue.d.ts +6 -0
- package/dist/vue/components/renderers/ink-renderer.vue.d.ts +6 -0
- package/dist/vue/components/renderers/line-renderer.vue.d.ts +6 -0
- package/dist/vue/components/renderers/link-renderer.vue.d.ts +6 -0
- package/dist/vue/components/renderers/polygon-renderer.vue.d.ts +6 -0
- package/dist/vue/components/renderers/polyline-renderer.vue.d.ts +6 -0
- package/dist/vue/components/renderers/square-renderer.vue.d.ts +6 -0
- package/dist/vue/components/renderers/squiggly-renderer.vue.d.ts +6 -0
- package/dist/vue/components/renderers/stamp-renderer.vue.d.ts +6 -0
- package/dist/vue/components/renderers/strikeout-renderer.vue.d.ts +6 -0
- package/dist/vue/components/renderers/underline-renderer.vue.d.ts +6 -0
- package/dist/vue/components/text-markup/highlight.vue.d.ts +17 -5
- package/dist/vue/components/text-markup/squiggly.vue.d.ts +17 -5
- package/dist/vue/components/text-markup/strikeout.vue.d.ts +17 -5
- package/dist/vue/components/text-markup/underline.vue.d.ts +17 -5
- package/dist/vue/context/renderer-registry.d.ts +2 -2
- package/dist/vue/context/types.d.ts +63 -2
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.js +1651 -1278
- package/dist/vue/index.js.map +1 -1
- 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.
|
|
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
|
},
|