From 94ae22017443ff931897e77f7ad93268fdcde55c Mon Sep 17 00:00:00 2001 From: isUnknown Date: Thu, 19 Dec 2024 16:03:20 +0100 Subject: [PATCH 1/3] create store for comment draft --- ...6-demonstrateurs-recharge-en-forme.pdf.txt | 69 +++++++++++++++++++ public/site/plugins/classes/Position.php | 14 ++-- .../site/plugins/comments/routes/create.php | 5 +- src/components/comments/Comments.vue | 56 ++++++++++----- src/components/project/PdfViewer.vue | 26 ++----- .../project/virtual-sample/StaticView.vue | 2 +- src/stores/dialog.js | 37 +++++++++- 7 files changed, 162 insertions(+), 47 deletions(-) diff --git a/public/content/projects/2_projet-recharge-en-forme/2_extended-brief/wip-20240916-demonstrateurs-recharge-en-forme.pdf.txt b/public/content/projects/2_projet-recharge-en-forme/2_extended-brief/wip-20240916-demonstrateurs-recharge-en-forme.pdf.txt index fec48c0..3ae77dd 100644 --- a/public/content/projects/2_projet-recharge-en-forme/2_extended-brief/wip-20240916-demonstrateurs-recharge-en-forme.pdf.txt +++ b/public/content/projects/2_projet-recharge-en-forme/2_extended-brief/wip-20240916-demonstrateurs-recharge-en-forme.pdf.txt @@ -1,7 +1,76 @@ +Comments: + +- + location: + page: + uri: > + projects/projet-recharge-en-forme/extended-brief + title: Brief enrichi + project: + title: Projet Recharge en forme + uri: projects/projet-recharge-en-forme + dialogUri: > + /projects/projet-recharge-en-forme?dialog=extended-brief + file: + uuid: file://7Bqr3iCH8ltDrdGi + url: > + http://localhost:8888/media/pages/projects/projet-recharge-en-forme/extended-brief/d44de3da29-1733319278/wip-20240916-demonstrateurs-recharge-en-forme.pdf + position: + pageIndex: 1 + x: "64.385025360981" + y: "48.295454545455" + text: test + author: + name: Adrien Payet + email: adrien.payet@outlook.com + uuid: user://WWjXgPWk + role: admin + date: 2024-12-19T16:02:45+01:00 + id: ee0c6c8d-4d0f-4262-b4b7-d6c5230b2802 + type: comment + replies: + - + location: + page: + uri: > + projects/projet-recharge-en-forme/extended-brief + title: Brief enrichi + project: + title: Projet Recharge en forme + uri: projects/projet-recharge-en-forme + dialogUri: > + /projects/projet-recharge-en-forme?dialog=extended-brief + file: + uuid: file://7Bqr3iCH8ltDrdGi + url: > + http://localhost:8888/media/pages/projects/projet-recharge-en-forme/extended-brief/d44de3da29-1733319278/wip-20240916-demonstrateurs-recharge-en-forme.pdf + parent: + author: + name: Adrien Payet + email: adrien.payet@outlook.com + id: ee0c6c8d-4d0f-4262-b4b7-d6c5230b2802 + position: + pageIndex: 1 + text: test + author: + name: Adrien Payet + email: adrien.payet@outlook.com + uuid: user://WWjXgPWk + role: admin + date: 2024-12-19T16:02:52+01:00 + id: 3ddd2679-4c67-4efa-8492-a325fda425fb + type: comment-reply + +---- + Cover: ---- +Label: + +---- + Uuid: 7Bqr3iCH8ltDrdGi ---- diff --git a/public/site/plugins/classes/Position.php b/public/site/plugins/classes/Position.php index b85b596..29c8dca 100644 --- a/public/site/plugins/classes/Position.php +++ b/public/site/plugins/classes/Position.php @@ -4,13 +4,15 @@ namespace adrienpayet\D2P\data; class Position { - public int $pageIndex; + public ?int $pageIndex = null; public ?float $x = null; public ?float $y = null; public function __construct(array $data) { - $this->pageIndex = $data['pageIndex']; + if (isset($data["pageIndex"])) { + $this->pageIndex = $data['pageIndex']; + } if (isset($data["x"])) { $this->x = (float) $data['x']; $this->y = (float) $data['y']; @@ -18,9 +20,11 @@ class Position } public function toArray() { - $array = [ - "pageIndex" => $this->pageIndex, - ]; + $array = []; + + if ($this->pageIndex) { + $array["pageIndex"] = $this->pageIndex; + } if ($this->x) { $array["x"] = $this->x; diff --git a/public/site/plugins/comments/routes/create.php b/public/site/plugins/comments/routes/create.php index 695d848..9183c8e 100644 --- a/public/site/plugins/comments/routes/create.php +++ b/public/site/plugins/comments/routes/create.php @@ -31,7 +31,6 @@ return [ "file" => $file ], "position" => [ - "pageIndex" => $data->position->pageIndex, "x" => $data->position->x, "y" => $data->position->y ], @@ -42,6 +41,10 @@ return [ "type" => "comment", ]; + if ($data->position->pageIndex) { + $commentData["position"]["pageIndex"] = $data->position->pageIndex; + } + $newComment = new Comment($commentData); $comments[] = $newComment->toArray(); diff --git a/src/components/comments/Comments.vue b/src/components/comments/Comments.vue index 7fb7d5f..1332104 100644 --- a/src/components/comments/Comments.vue +++ b/src/components/comments/Comments.vue @@ -118,15 +118,12 @@ import { useRoute } from "vue-router"; dayjs.locale("fr"); -const emits = defineEmits(["show-draft-marker"]); - const { user } = useUserStore(); const { page } = usePageStore(); const dialog = useDialogStore(); -const { comments, openedFile } = storeToRefs(useDialogStore()); +const { comments, openedFile, draftComment } = storeToRefs(useDialogStore()); const api = useApiStore(); -const draftComment = ref({}); const openedComment = ref(null); const isAddOpen = ref(false); @@ -150,17 +147,10 @@ watch(isAddOpen, (newVal) => { } }); -watch( - draftComment, - (newVal) => { - if (newVal.position) { - emits("show-draft-marker", newVal); - } - }, - { deep: true } -); - -const viewContainer = document.querySelector(".vpv-pages-inner-container"); +const viewContainer = + openedFile.value.type === "document" + ? document.querySelector(".vpv-pages-inner-container") + : document.querySelector(".track"); window.addEventListener("keydown", (event) => { if ( @@ -171,6 +161,7 @@ window.addEventListener("keydown", (event) => { handleSubmit(); } }); + // Functions function handleSubmit(event = null) { if (event) { @@ -240,8 +231,18 @@ function toggleCommentPositionMode(enable) { } function handleCommentPositionClick(event) { + if (openedFile.value.type === "document") { + prepareDraftCommentInPdf(event); + } else { + prepareDraftCommentInImage(event); + } + isAddOpen.value = true; + toggleCommentPositionMode(false); +} + +function prepareDraftCommentInPdf(event) { const pageContainer = event.target.closest(".page-inner-container"); - if (!pageContainer) return; + if (!pageContainer || !viewContainer) return; const pageLabel = pageContainer .closest(".vpv-page-inner-container") @@ -259,13 +260,30 @@ function handleCommentPositionClick(event) { const relativeX = (x / pageRect.width) * 100; const relativeY = (y / pageRect.height) * 100; + console.log(pageIndex); + draftComment.value.position = { x: relativeX, y: relativeY, pageIndex: parseInt(pageIndex), }; - isAddOpen.value = true; - toggleCommentPositionMode(false); +} + +function prepareDraftCommentInImage(event) { + if (!viewContainer) return; + + const imageRect = viewContainer.getBoundingClientRect(); + + const mouseTop = event.clientY; + const mouseLeft = event.clientX; + + const relativeX = ((mouseLeft - imageRect.left) / imageRect.width) * 100; + const relativeY = ((mouseTop - imageRect.top) / imageRect.height) * 100; + + draftComment.value.position = { + x: relativeX, + y: relativeY, + }; } function openComment(comment) { @@ -366,6 +384,8 @@ function openComment(comment) { flex-grow: 1; } +.track.waiting-comment, +.track.waiting-comment .drag-zone, .vpv-pages-inner-container.waiting-comment .page-inner-container, .vpv-pages-inner-container.waiting-comment .vpv-text-layer-text, .vpv-pages-inner-container.waiting-comment .vpv-text-layer-wrapper { diff --git a/src/components/project/PdfViewer.vue b/src/components/project/PdfViewer.vue index 8c3bca1..53de449 100644 --- a/src/components/project/PdfViewer.vue +++ b/src/components/project/PdfViewer.vue @@ -18,7 +18,7 @@ >{{ isCommentsOpen ? "Masquer" : "Afficher" }} les commentaires - +