@@ -60,6 +60,7 @@ SPDX-License-Identifier: AGPL-3.0-or-later
6060 :read-only =" readOnly"
6161 :on-update =" (payload) => updateObject(docIndex, object.id, payload)"
6262 :on-delete =" () => deleteObject(docIndex, object.id)"
63+ :on-duplicate =" () => duplicateObject(docIndex, object.id)"
6364 :on-drag-start =" (mouseX, mouseY, pointerOffset, dragShift) => startDraggingElement(docIndex, pIndex, object, mouseX, mouseY, pointerOffset, dragShift)"
6465 :on-drag-move =" updateDraggingPosition"
6566 :on-drag-end =" stopDraggingElement"
@@ -71,6 +72,7 @@ SPDX-License-Identifier: AGPL-3.0-or-later
7172 :global-drag-page-index =" draggingPageIndex"
7273 :show-selection-ui =" showSelectionHandles && !hideSelectionUI && object.resizable !== false"
7374 :show-default-actions =" showElementActions && !hideSelectionUI"
75+ :ignore-click-outside-selectors =" ignoreClickOutsideSelectors"
7476 >
7577 <template #default =" slotProps " >
7678 <slot
@@ -92,6 +94,7 @@ SPDX-License-Identifier: AGPL-3.0-or-later
9294 name =" actions"
9395 :object =" slotProps.object"
9496 :onDelete =" slotProps.onDelete"
97+ :onDuplicate =" slotProps.onDuplicate"
9598 />
9699 </template >
97100 </DraggableElement >
@@ -191,6 +194,10 @@ export default {
191194 type: Boolean ,
192195 default: false ,
193196 },
197+ ignoreClickOutsideSelectors: {
198+ type: Array ,
199+ default : () => [],
200+ },
194201 pageCountFormat: {
195202 type: String ,
196203 default: ' {currentPage} of {totalPages}' ,
@@ -940,6 +947,64 @@ export default {
940947 })
941948 }
942949 },
950+ duplicateObject (docIndex , objectId ) {
951+ if (docIndex < 0 || docIndex >= this .pdfDocuments .length ) return
952+ const doc = this .pdfDocuments [docIndex]
953+
954+ const cacheKey = ` ${ docIndex} -${ objectId} `
955+ let pageIndex = this .objectIndexCache [cacheKey]
956+
957+ if (pageIndex === undefined ) {
958+ pageIndex = findObjectPageIndex (doc, objectId)
959+ if (pageIndex !== undefined ) {
960+ this .objectIndexCache [cacheKey] = pageIndex
961+ }
962+ }
963+
964+ if (pageIndex === undefined ) return
965+
966+ const sourceObject = doc .allObjects [pageIndex]? .find (o => o .id === objectId)
967+ if (! sourceObject) return
968+
969+ const { width: pageWidth , height: pageHeight } = this .getPageSize (docIndex, pageIndex)
970+ const offset = 12
971+ const { x , y } = clampPosition (
972+ sourceObject .x + offset,
973+ sourceObject .y + offset,
974+ sourceObject .width ,
975+ sourceObject .height ,
976+ pageWidth,
977+ pageHeight,
978+ )
979+
980+ let duplicatedSigner = sourceObject .signer
981+ if (duplicatedSigner? .element && Object .prototype .hasOwnProperty .call (duplicatedSigner .element , ' elementId' )) {
982+ duplicatedSigner = {
983+ ... duplicatedSigner,
984+ element: { ... duplicatedSigner .element },
985+ }
986+ delete duplicatedSigner .element .elementId
987+ }
988+
989+ const duplicatedObject = {
990+ ... sourceObject,
991+ id: this .generateObjectId (),
992+ x,
993+ y,
994+ signer: duplicatedSigner,
995+ }
996+
997+ doc .allObjects [pageIndex].push (duplicatedObject)
998+ this .objectIndexCache [` ${ docIndex} -${ duplicatedObject .id } ` ] = pageIndex
999+
1000+ this .$nextTick (() => {
1001+ const refKey = ` draggable${ docIndex} -${ pageIndex} -${ duplicatedObject .id } `
1002+ const draggableRefs = this .$refs [refKey]
1003+ if (draggableRefs && Array .isArray (draggableRefs) && draggableRefs[0 ]) {
1004+ draggableRefs[0 ].isSelected = true
1005+ }
1006+ })
1007+ },
9431008
9441009 checkAndMoveObjectPage (docIndex , objectId , mouseX , mouseY ) {
9451010 if (docIndex < 0 || docIndex >= this .pdfDocuments .length ) return undefined
0 commit comments