Skip to content

Commit 780d9ae

Browse files
authored
Merge pull request #28 from LibreSign/fix/element-click-event
feat: element click event
2 parents b6982aa + a3c874a commit 780d9ae

2 files changed

Lines changed: 49 additions & 1 deletion

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@libresign/pdf-elements",
33
"description": "PDF viewer with draggable and resizable element overlays for Vue 2",
4-
"version": "0.3.1",
4+
"version": "0.4.0",
55
"author": "LibreCode <contact@librecode.coop>",
66
"private": false,
77
"main": "dist/pdf-elements.umd.js",

src/components/PDFElements.vue

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ SPDX-License-Identifier: AGPL-3.0-or-later
2525
class="overlay"
2626
@mousemove="handleMouseMove"
2727
@touchmove="handleMouseMove"
28+
@click="handleOverlayClick(docIndex, pIndex, $event)"
29+
@touchend="handleOverlayClick(docIndex, pIndex, $event)"
2830
>
2931
<div
3032
v-if="isAddingMode && previewPageDocIndex === docIndex && previewPageIndex === pIndex && previewElement && previewVisible"
@@ -194,6 +196,10 @@ export default {
194196
type: Boolean,
195197
default: false,
196198
},
199+
emitObjectClick: {
200+
type: Boolean,
201+
default: false,
202+
},
197203
ignoreClickOutsideSelectors: {
198204
type: Array,
199205
default: () => [],
@@ -651,6 +657,48 @@ export default {
651657
this.previewVisible = true
652658
})
653659
},
660+
handleOverlayClick(docIndex, pageIndex, event) {
661+
if (!this.emitObjectClick) return
662+
663+
const { x: clientX, y: clientY } = this.getPointerPosition(event)
664+
if (!Number.isFinite(clientX) || !Number.isFinite(clientY)) return
665+
666+
this.cachePageBoundsForPage(docIndex, pageIndex)
667+
const pageRect = this.getPageRect(docIndex, pageIndex)
668+
if (!pageRect) return
669+
670+
const pagesScale = this.getDisplayedPageScale(docIndex, pageIndex) || 1
671+
const relX = (clientX - pageRect.left) / pagesScale
672+
const relY = (clientY - pageRect.top) / pagesScale
673+
674+
const doc = this.pdfDocuments?.[docIndex]
675+
const pageObjects = doc?.allObjects?.[pageIndex] || []
676+
let hitObject = null
677+
678+
for (let i = pageObjects.length - 1; i >= 0; i--) {
679+
const object = pageObjects[i]
680+
const x = Number(object.x)
681+
const y = Number(object.y)
682+
const width = Number(object.width)
683+
const height = Number(object.height)
684+
if (![x, y, width, height].every(Number.isFinite)) {
685+
continue
686+
}
687+
if (relX >= x && relX <= x + width && relY >= y && relY <= y + height) {
688+
hitObject = object
689+
break
690+
}
691+
}
692+
693+
if (!hitObject) return
694+
695+
this.$emit('pdf-elements:object-click', {
696+
docIndex,
697+
pageIndex,
698+
object: hitObject,
699+
event,
700+
})
701+
},
654702
655703
handleKeyDown(event) {
656704
if (event.key === 'Escape' && this.isAddingMode) {

0 commit comments

Comments
 (0)