Skip to content

Commit 91fd490

Browse files
committed
feat: revert element-clicked event emission from DraggableElement
This change reverts the element-clicked event emission to avoid modifying the external pdf-elements component directly. The event handling logic is now implemented at the consumer side in LibreSign, using event delegation instead. The DraggableElement component remains unchanged and clean, following the principle of minimal modifications to external dependencies. Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
1 parent b6982aa commit 91fd490

1 file changed

Lines changed: 48 additions & 0 deletions

File tree

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)