From a3fd10159a9bcbe76214857913480924a432244c Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:25:56 -0300 Subject: [PATCH 01/11] refactor: replace selectedId with selectedNodeId in files store - Rename selectedId to selectedNodeId in the files store state - Replace all references to selectedId with selectedNodeId throughout files.js - Update selectFile() method to use nodeId parameter - Add getNodeIdByFileId() helper method to map file IDs to node IDs - Remove unused slugfy() helper function - Update async addFile() to handle file hydration properly - Update removeFilesFromEnvelope() to use only fileIds parameter - Fix getAllFiles() and updateAllFiles() to work with nodeId - Ensure backward compatibility with file.id property - Update sign.js to use selectedNodeId from files store Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- src/store/files.js | 158 +++++++++++++++++++++++---------------------- src/store/sign.js | 3 +- 2 files changed, 82 insertions(+), 79 deletions(-) diff --git a/src/store/files.js b/src/store/files.js index 66ff08bb8d..e59d9eb10e 100644 --- a/src/store/files.js +++ b/src/store/files.js @@ -19,25 +19,13 @@ import { useIdentificationDocumentStore } from './identificationDocument.js' import { useSidebarStore } from './sidebar.js' import { useSignStore } from './sign.js' -// from https://gist.github.com/codeguy/6684588 -const slugfy = (val) => - val - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - .replace(/[^a-z0-9 -]/g, '') // remove invalid chars - .replace(/\s+/g, '-') // collapse whitespace and replace by - - .replace(/-+/g, '-') // collapse dashes - .replace(/^-+/, '') // trim - from start of text - .replace(/-+$/, '') - export const useFilesStore = function(...args) { const emptyFile = { signers: [] } const store = defineStore('files', { state: () => { return { files: {}, - selectedId: 0, + selectedNodeId: 0, identifyingSigner: false, loading: false, canRequestSign: loadState('libresign', 'can_request_sign', false), @@ -48,16 +36,37 @@ export const useFilesStore = function(...args) { }, actions: { - addFile(file) { - set(this.files, file.id, file) - this.hydrateFile(file.id) - if (!this.ordered.includes(file.id)) { - this.ordered.push(file.id) + async addFile(file) { + if (!file.nodeId) { + console.warn('[LibreSign] File must have nodeId:', file) + return + } + + const nodeId = file.nodeId + let fileData = file + + if (!file.uuid) { + const filter = file.id + ? { file_id: file.id, force_fetch: true } + : { 'nodeIds[]': [nodeId], force_fetch: true } + + const fetchedFiles = await this.getAllFiles(filter) + fileData = fetchedFiles[nodeId] || { ...file, signers: [] } + } + + if (fileData.signers) { + this.addUniqueIdentifierToAllSigners(fileData.signers) + } + + set(this.files, nodeId, fileData) + + if (!this.ordered.includes(nodeId)) { + this.ordered.push(nodeId) } }, - selectFile(fileId) { - this.selectedId = fileId ?? 0 - if (this.selectedId === 0) { + selectFile(nodeId) { + this.selectedNodeId = nodeId ?? 0 + if (this.selectedNodeId === 0) { const signStore = useSignStore() signStore.reset() return @@ -65,17 +74,26 @@ export const useFilesStore = function(...args) { const sidebarStore = useSidebarStore() sidebarStore.activeRequestSignatureTab() }, + getNodeIdByFileId(fileId) { + if (!fileId) return null + for (const [nodeId, file] of Object.entries(this.files)) { + if (file.id === fileId) { + return parseInt(nodeId) + } + } + return null + }, getFile(file) { if (typeof file === 'object' && file !== null) { return file } - return this.files[this.selectedId] || emptyFile + return this.files[this.selectedNodeId] || emptyFile }, async flushSelectedFile() { const files = await this.getAllFiles({ - 'nodeIds[]': [this.selectedId], + 'nodeIds[]': [this.selectedNodeId], }) - this.addFile(files[this.selectedId]) + this.addFile(files[this.selectedNodeId]) }, async addFilesToEnvelope(envelopeUuid, formData, options = {}) { return await axios.post( @@ -92,10 +110,9 @@ export const useFilesStore = function(...args) { .then(({ data }) => { const addedFiles = data.ocs.data.files || [] const newFilesCount = data.ocs.data.filesCount || 0 - const fileId = data.ocs.data.id - if (this.files[fileId]) { - set(this.files[fileId], 'filesCount', newFilesCount) + if (this.selectedNodeId && this.files[this.selectedNodeId]) { + set(this.files[this.selectedNodeId], 'filesCount', newFilesCount) } return { @@ -121,10 +138,8 @@ export const useFilesStore = function(...args) { } }) }, - async removeFilesFromEnvelope(envelopeId, fileIds) { - const ids = Array.isArray(fileIds) ? fileIds : [fileIds] - - const deletePromises = ids.map(id => + async removeFilesFromEnvelope(fileIds) { + const deletePromises = fileIds.map(id => axios.delete( generateOcsUrl('/apps/libresign/api/v1/file/file_id/{fileId}', { fileId: id }), ), @@ -132,17 +147,17 @@ export const useFilesStore = function(...args) { return await Promise.all(deletePromises) .then(() => { - if (this.files[envelopeId] && this.files[envelopeId].filesCount) { - const newCount = Math.max(0, this.files[envelopeId].filesCount - ids.length) - set(this.files[envelopeId], 'filesCount', newCount) + if (this.files[this.selectedNodeId] && this.files[this.selectedNodeId].filesCount) { + const newCount = Math.max(0, this.files[this.selectedNodeId].filesCount - fileIds.length) + set(this.files[this.selectedNodeId], 'filesCount', newCount) } - const isSingle = ids.length === 1 + const isSingle = fileIds.length === 1 return { success: true, message: isSingle ? 'File removed from envelope' : 'Files removed from envelope', - removedCount: ids.length, - removedIds: ids, + removedCount: fileIds.length, + removedIds: fileIds, } }) .catch((error) => { @@ -162,7 +177,7 @@ export const useFilesStore = function(...args) { }, hasSigners(file) { file = this.getFile(file) - if (this.selectedId === 0) { + if (this.selectedNodeId === 0) { return false } if (!Object.hasOwn(file, 'signers')) { @@ -239,7 +254,7 @@ export const useFilesStore = function(...args) { && file?.signers?.length > 0 }, getSubtitle() { - if (this.selectedId === 0) { + if (this.selectedNodeId === 0) { return '' } const file = this.getFile() @@ -251,22 +266,6 @@ export const useFilesStore = function(...args) { date: Moment(Date.parse(file.created_at)).format('LL LTS'), }) }, - async hydrateFile(fileId) { - this.addUniqueIdentifierToAllSigners(this.files[fileId].signers) - if (Object.hasOwn(this.files[fileId], 'uuid')) { - return - } - await axios.get(generateOcsUrl('/apps/libresign/api/v1/file/validate/file_id/{fileId}', { - fileId: fileId, - })) - .then((response) => { - set(this.files, fileId, response.data.ocs.data) - this.addUniqueIdentifierToAllSigners(this.files[fileId].signers) - }) - .catch(() => { - set(this.files[fileId], 'signers', []) - }) - }, addUniqueIdentifierToAllSigners(signers) { if (signers === undefined) { return @@ -306,7 +305,7 @@ export const useFilesStore = function(...args) { signer.signingOrder = maxOrder + 1 } this.getFile().signers.push(signer) - const selected = this.selectedId + const selected = this.selectedNodeId this.selectFile(-1) // to force reactivity this.selectFile(selected) // to force reactivity }, @@ -314,19 +313,19 @@ export const useFilesStore = function(...args) { if (!isNaN(signer.signRequestId)) { await axios.delete(generateOcsUrl('/apps/libresign/api/{apiVersion}/sign/file_id/{fileId}/{signRequestId}', { apiVersion: 'v1', - fileId: this.selectedId, + fileId: this.getFile().id, signRequestId: signer.signRequestId, })) } set( - this.files[this.selectedId], + this.files[this.selectedNodeId], 'signers', - this.files[this.selectedId].signers.filter((i) => i.identify !== signer.identify), + this.files[this.selectedNodeId].signers.filter((i) => i.identify !== signer.identify), ) if (this.getFile().signatureFlow === 'ordered_numeric' && signer.signingOrder) { - this.files[this.selectedId].signers.forEach((s) => { + this.files[this.selectedNodeId].signers.forEach((s) => { if (s.signingOrder && s.signingOrder > signer.signingOrder) { s.signingOrder -= 1 } @@ -343,13 +342,14 @@ export const useFilesStore = function(...args) { fileId: file.id, })) .then(() => { - if (this.selectedId === file.id) { + if (this.selectedNodeId === file.nodeId) { const sidebarStore = useSidebarStore() sidebarStore.hideSidebar() - this.selectedId = 0 + this.selectedNodeId = 0 } - del(this.files, file.id) - const index = this.ordered.indexOf(file.id) + del(this.nodeIdToFileId, file.nodeId) + del(this.files, file.nodeId) + const index = this.ordered.indexOf(file.nodeId) if (index > -1) { this.ordered.splice(index, 1) } @@ -357,10 +357,10 @@ export const useFilesStore = function(...args) { } }, - async deleteMultiple(fileIds, deleteFile) { + async deleteMultiple(nodeIds, deleteFile) { this.loading = true - for (const fileId of fileIds) { - await this.delete(this.files[fileId], deleteFile) + for (const nodeId of nodeIds) { + await this.delete(this.files[nodeId], deleteFile) } this.loading = false }, @@ -413,7 +413,7 @@ export const useFilesStore = function(...args) { const fileData = data.ocs.data this.addFile(fileData) - return fileData.id + return fileData.nodeId }, async getAllFiles(filter) { if (this.loading || this.loadedAll) { @@ -487,10 +487,10 @@ export const useFilesStore = function(...args) { identificationDocumentStore.setWaitingApproval(response.data.ocs.data.settings.identificationDocumentsWaitingApproval) } - if (this.selectedId && !this.files[this.selectedId]) { + if (this.selectedNodeId && !this.files[this.selectedNodeId]) { const sidebarStore = useSidebarStore() sidebarStore.hideSidebar() - this.selectedId = 0 + this.selectedNodeId = 0 } this.loading = false @@ -531,15 +531,16 @@ export const useFilesStore = function(...args) { config.data.uuid = uuid || file.uuid } else { config.data.file = { - fileId: fileId || this.selectedId, + fileId: fileId || this.getFile().id, } } const { data } = await axios(config) const responseFile = data.ocs.data.data - if (responseFile.id && this.files[responseFile.id]) { - set(this.files, responseFile.id, responseFile) - this.addUniqueIdentifierToAllSigners(this.files[responseFile.id].signers) + if (responseFile.nodeId) { + const nodeId = responseFile.nodeId + set(this.files, nodeId, responseFile) + this.addUniqueIdentifierToAllSigners(this.files[nodeId].signers) } else { this.addFile(responseFile) } @@ -570,16 +571,17 @@ export const useFilesStore = function(...args) { config.data.uuid = uuid || file.uuid } else { config.data.file = { - fileId: fileId || this.selectedId, + fileId: fileId || this.getFile().id, } } const { data } = await axios(config) // Only update the existing file, don't trigger full reload via addFile const responseFile = data.ocs.data.data - if (responseFile.id && this.files[responseFile.id]) { + if (responseFile.nodeId && this.files[responseFile.nodeId]) { + const nodeId = responseFile.nodeId // Update existing file in-place to avoid triggering side effects - set(this.files, responseFile.id, responseFile) - this.addUniqueIdentifierToAllSigners(this.files[responseFile.id].signers) + set(this.files, nodeId, responseFile) + this.addUniqueIdentifierToAllSigners(this.files[nodeId].signers) } else { // Only add to store if it's a new file this.addFile(responseFile) diff --git a/src/store/sign.js b/src/store/sign.js index bb71976287..2cb13d617e 100644 --- a/src/store/sign.js +++ b/src/store/sign.js @@ -38,6 +38,7 @@ export const useSignStore = defineStore('sign', { const file = { id: loadState('libresign', 'id', 0), + nodeId: loadState('libresign', 'nodeId', 0), name: loadState('libresign', 'filename', ''), description: loadState('libresign', 'description', ''), status: loadState('libresign', 'status', ''), @@ -50,7 +51,7 @@ export const useSignStore = defineStore('sign', { this.setFileToSign(file) const filesStore = useFilesStore() filesStore.addFile(file) - filesStore.selectedId = file.id + filesStore.selectedNodeId = file.nodeId }, setFileToSign(file) { if (file) { From 7854fab7ce8c56f5361aaf740b47fcdccd1897c2 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:26:08 -0300 Subject: [PATCH 02/11] refactor: update File component to use nodeId instead of fileId - Replace prop 'fileId' with 'nodeId' - Rename computed property 'currentFileId' to 'currentNodeId' - Add new computed property 'currentFile' for cleaner access - Update template to use currentFile instead of inline store access - Simplify DOM binding by using currentFile computed property - Remove unnecessary store property access in template - Fix previewUrl to use currentFile consistently Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- src/Components/File/File.vue | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/Components/File/File.vue b/src/Components/File/File.vue index ecb01e4ef1..87d8926c09 100644 --- a/src/Components/File/File.vue +++ b/src/Components/File/File.vue @@ -3,7 +3,7 @@ - SPDX-License-Identifier: AGPL-3.0-or-later --> @@ -35,7 +35,7 @@ export default { FileIcon, }, props: { - fileId: { + nodeId: { type: Number, default: 0, required: false, @@ -53,30 +53,32 @@ export default { } }, computed: { - currentFileId() { - if (this.fileId) { - return this.fileId + currentNodeId() { + if (this.nodeId) { + return this.nodeId } - return this.filesStore.selectedId + return this.filesStore.selectedNodeId + }, + currentFile() { + return this.filesStore.files[this.currentNodeId] }, previewUrl() { if (this.backgroundFailed === true) { return null } - const file = this.filesStore.files[this.currentFileId] - if (!file) { + if (!this.currentFile) { return null } let previewUrl = '' - if (file.nodeId) { + if (this.currentFile.nodeId) { previewUrl = generateOcsUrl('/apps/libresign/api/v1/file/thumbnail/{nodeId}', { - nodeId: file.nodeId, + nodeId: this.currentFile.nodeId, }) } else { previewUrl = window.location.origin + generateUrl('/core/preview?fileId={fileid}', { - fileid: this.currentFileId, + fileid: this.currentFile.id, }) } @@ -89,12 +91,12 @@ export default { // Handle cropping url.searchParams.set('a', this.cropPreviews === true ? '0' : '1') - return url + return url.toString() }, }, methods: { openSidebar() { - this.filesStore.selectFile(this.currentFileId) + this.filesStore.selectFile(this.currentNodeId) }, statusToClass(status) { switch (Number(status)) { From 26f2d4aa105bb13cd77b4522da3078c0c3051cd3 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:26:28 -0300 Subject: [PATCH 03/11] refactor: update RequestPicker to use nodeId parameter naming - Replace fileId parameter with nodeId in promise handlers - Update selectFile() calls to receive nodeId instead of fileId - Ensure consistency with new store API Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- src/Components/Request/RequestPicker.vue | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Components/Request/RequestPicker.vue b/src/Components/Request/RequestPicker.vue index c495cd68f7..29c7982d12 100644 --- a/src/Components/Request/RequestPicker.vue +++ b/src/Components/Request/RequestPicker.vue @@ -312,8 +312,8 @@ export default { url: this.pdfUrl, }, }) - .then((fileId) => { - this.filesStore.selectFile(fileId) + .then((nodeId) => { + this.filesStore.selectFile(nodeId) this.closeModalUploadFromUrl() }) .catch(({ response }) => { @@ -347,8 +347,8 @@ export default { files: filesPayload, name: envelopeName.trim(), }) - .then((fileId) => { - this.filesStore.selectFile(fileId) + .then((nodeId) => { + this.filesStore.selectFile(nodeId) }) .catch(({ response }) => { showError(response?.data?.ocs?.data?.message || this.t('libresign', 'Upload failed')) @@ -369,8 +369,8 @@ export default { }, name: path.match(/([^/]*?)(?:\.[^.]*)?$/)[1] ?? '', }) - .then((fileId) => { - this.filesStore.selectFile(fileId) + .then((nodeId) => { + this.filesStore.selectFile(nodeId) }) .catch(({ response }) => { showError(response.data.ocs.data.message) From 0b9e82013e60c954faf3685cc22feac695c52ca5 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:26:34 -0300 Subject: [PATCH 04/11] refactor: update AppFilesTab to use selectedNodeId from store - Replace selectedId with selectedNodeId in the comparison - Ensure consistency with updated store structure Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- src/Components/RightSidebar/AppFilesTab.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/RightSidebar/AppFilesTab.vue b/src/Components/RightSidebar/AppFilesTab.vue index 04719a1149..fe097a67ca 100644 --- a/src/Components/RightSidebar/AppFilesTab.vue +++ b/src/Components/RightSidebar/AppFilesTab.vue @@ -93,7 +93,7 @@ export default { this.disconnectTitleObserver() - if (this.filesStore.selectedId === fileInfo.id) { + if (this.filesStore.selectedNodeId === fileInfo.id) { return } From ed9a049685e3e40e30e3ef8b2ca1dffce324dbbd Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:26:47 -0300 Subject: [PATCH 05/11] refactor: simplify EnvelopeFilesList by removing redundant computed properties - Remove envelopeUuid computed property - Remove envelopeId computed property - Replace all references to use envelope directly from getFile() - Simplify envelope.id and envelope.uuid access - Remove unnecessary envelope property cache - Update removeFilesFromEnvelope() calls to pass only fileIds - Remove redundant file count updates in addFilesToEnvelope - Use consistent nodeId/file.id property naming Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .../RightSidebar/EnvelopeFilesList.vue | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/Components/RightSidebar/EnvelopeFilesList.vue b/src/Components/RightSidebar/EnvelopeFilesList.vue index 7951971c77..dc85e70c07 100644 --- a/src/Components/RightSidebar/EnvelopeFilesList.vue +++ b/src/Components/RightSidebar/EnvelopeFilesList.vue @@ -206,12 +206,6 @@ export default { envelope() { return this.filesStore.getFile() }, - envelopeUuid() { - return this.envelope.uuid - }, - envelopeId() { - return this.envelope.id - }, canDelete() { return this.envelope?.status === SIGN_STATUS.DRAFT && this.files.length >= 1 }, @@ -276,7 +270,7 @@ export default { }, methods: { async loadFiles(page = 1) { - if (!this.envelopeId) { + if (!this.envelope?.id) { return } @@ -291,7 +285,7 @@ export default { const params = new URLSearchParams({ page: page, length: 50, - parentFileId: this.envelopeId, + parentFileId: this.envelope.id, }) await axios.get(`${url}?${params.toString()}`) @@ -368,7 +362,7 @@ export default { source: fileUrl, basename: file.name, mime: 'application/pdf', - fileid: file.nodeId, + fileid: file.id, } OCA.Viewer.open({ fileInfo, @@ -410,7 +404,7 @@ export default { this.hasLoading = true const fileIds = [...this.selectedFiles] - const result = await this.filesStore.removeFilesFromEnvelope(this.envelopeId, fileIds) + const result = await this.filesStore.removeFilesFromEnvelope(fileIds) if (result.success) { // Remover arquivos da lista local @@ -453,7 +447,7 @@ export default { const abortController = new AbortController() this.uploadAbortController = abortController - const result = await this.filesStore.addFilesToEnvelope(this.envelopeUuid, formData, { + const result = await this.filesStore.addFilesToEnvelope(this.envelope.uuid, formData, { signal: abortController.signal, onUploadProgress: (progressEvent) => { if (progressEvent.total) { @@ -467,9 +461,6 @@ export default { this.showSuccess(this.t('libresign', result.message)) this.files.push(...result.files) this.totalFiles = result.filesCount - if (this.envelopeId && this.filesStore.files[this.envelopeId]) { - this.filesStore.files[this.envelopeId].filesCount = result.filesCount - } } else { if (result.message !== 'Upload cancelled') { this.showError(this.t('libresign', result.message)) @@ -558,7 +549,7 @@ export default { async confirmDelete(file) { this.hasLoading = true - const result = await this.filesStore.removeFilesFromEnvelope(this.envelopeId, file.id) + const result = await this.filesStore.removeFilesFromEnvelope([file.id]) if (result.success) { this.showSuccess(this.t('libresign', result.message)) From 575039eace48b3e9b644fd4200a16e0b58ede5e9 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:26:58 -0300 Subject: [PATCH 06/11] refactor: update RequestSignatureTab to use selectedNodeId from store - Rename data property 'lastSyncedFileId' to 'lastSyncedNodeId' - Update watcher from 'filesStore.selectedId' to 'filesStore.selectedNodeId' - Update handler to work with newNodeId and oldNodeId parameters - Replace fileId parameter with nodeId in sendNotify method - Use getFile().id to get the current file ID when needed Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .../RightSidebar/RequestSignatureTab.vue | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Components/RightSidebar/RequestSignatureTab.vue b/src/Components/RightSidebar/RequestSignatureTab.vue index b0cf288865..d41e2febc1 100644 --- a/src/Components/RightSidebar/RequestSignatureTab.vue +++ b/src/Components/RightSidebar/RequestSignatureTab.vue @@ -375,7 +375,7 @@ export default { showEnvelopeFilesDialog: false, infoIcon: svgInfo, adminSignatureFlow: '', - lastSyncedFileId: null, + lastSyncedNodeId: null, } }, computed: { @@ -594,11 +594,11 @@ export default { signers(signers) { this.init(signers) }, - 'filesStore.selectedId': { - handler(newFileId, oldFileId) { - if (newFileId && newFileId !== this.lastSyncedFileId) { + 'filesStore.selectedNodeId': { + handler(newNodeId, oldNodeId) { + if (newNodeId && newNodeId !== this.lastSyncedNodeId) { this.syncPreserveOrderWithFile() - this.lastSyncedFileId = newFileId + this.lastSyncedNodeId = newNodeId } }, immediate: true, @@ -684,7 +684,7 @@ export default { const flow = file.signatureFlow - this.lastSyncedFileId = this.filesStore.selectedId + this.lastSyncedNodeId = this.filesStore.selectedNodeId if ((flow === 'ordered_numeric' || flow === 2) && !this.isAdminFlowForced) { this.preserveOrder = true @@ -845,7 +845,7 @@ export default { }, async sendNotify(signer) { const body = { - fileId: this.filesStore.selectedId, + fileId: this.filesStore.getFile().id, signRequestId: signer.signRequestId, } From 953fb37caa38a50a4db780e2a05792226986026b Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:27:07 -0300 Subject: [PATCH 07/11] refactor: update FileEntryActions to use nodeId for file access - Update file computed property to use source.nodeId instead of source.id - Replace all source.id references with source.nodeId - Update selectFile() calls to pass nodeId Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- src/views/FilesList/FileEntry/FileEntryActions.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/views/FilesList/FileEntry/FileEntryActions.vue b/src/views/FilesList/FileEntry/FileEntryActions.vue index 1b1e851fa5..cfeb433cf6 100644 --- a/src/views/FilesList/FileEntry/FileEntryActions.vue +++ b/src/views/FilesList/FileEntry/FileEntryActions.vue @@ -141,7 +141,7 @@ export default { return this.enabledMenuActions.filter(action => this.visibleIf(action)) }, file() { - return this.filesStore.files[this.source.id] + return this.filesStore.files[this.source.nodeId] }, boundariesElement() { return document.querySelector('.app-content > .files-list') @@ -208,14 +208,14 @@ export default { signer_uuid: signUuid, force_fetch: true, }) - this.signStore.setFileToSign(files[this.source.id]) + this.signStore.setFileToSign(files[this.source.nodeId]) this.$router.push({ name: 'SignPDF', params: { uuid: signUuid, }, }) - this.filesStore.selectFile(this.source.id) + this.filesStore.selectFile(this.source.nodeId) } else if (action.id === 'validate') { this.$router.push({ name: 'ValidationFile', From 1221b29e66659bbd2cbe7fc6d8b1ca86bb065c30 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:27:20 -0300 Subject: [PATCH 08/11] refactor: update FileEntryCheckbox to use nodeId consistently - Replace fileId variable with nodeId in selection filter logic - Update selection logic to use source.nodeId instead of source.id - Remove debug log statement for shift key selection - Ensure consistency with store API Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- src/views/FilesList/FileEntry/FileEntryCheckbox.vue | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/views/FilesList/FileEntry/FileEntryCheckbox.vue b/src/views/FilesList/FileEntry/FileEntryCheckbox.vue index 2dc2ee975f..68a452bc32 100644 --- a/src/views/FilesList/FileEntry/FileEntryCheckbox.vue +++ b/src/views/FilesList/FileEntry/FileEntryCheckbox.vue @@ -88,17 +88,15 @@ export default { // If already selected, update the new selection _without_ the current file const selection = [...new Set([...lastSelection, ...filesToSelect])] - .filter(fileId => !isAlreadySelected || fileId !== this.source.id) - - logger.debug('Shift key pressed, selecting all files in between', { start, end, filesToSelect, isAlreadySelected }) + .filter(nodeId => !isAlreadySelected || nodeId !== this.source.nodeId) // Keep previous lastSelectedIndex to be use for further shift selections this.selectionStore.set(selection) return } const selection = selected - ? [...this.selectedFiles, this.source.id] - : this.selectedFiles.filter(fileId => fileId !== this.source.id) + ? [...this.selectedFiles, this.source.nodeId] + : this.selectedFiles.filter(nodeId => nodeId !== this.source.nodeId) logger.debug('Updating selection', { selection }) this.selectionStore.set(selection) From bc1cfd7c8f3c3c5efc1274d84ce6e4d49f5be493 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:27:35 -0300 Subject: [PATCH 09/11] refactor: update FilesListTableHeaderActions to use nodeId in forEach loop - Replace fileId with nodeId in changeLoadingStatusOfSelectedFiles method - Update variable naming for consistency Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- src/views/FilesList/FilesListTableHeaderActions.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/FilesList/FilesListTableHeaderActions.vue b/src/views/FilesList/FilesListTableHeaderActions.vue index 49d2599336..6f3841a69e 100644 --- a/src/views/FilesList/FilesListTableHeaderActions.vue +++ b/src/views/FilesList/FilesListTableHeaderActions.vue @@ -176,8 +176,8 @@ export default { } }, changeLoadingStatusOfSelectedFiles(status) { - this.selectionStore.selected.forEach(fileId => { - this.filesStore.files[fileId].loading = status + this.selectionStore.selected.forEach(nodeId => { + this.filesStore.files[nodeId].loading = status }) }, }, From feeca5fb983ce2b76806cfe5ffc62fcc3eb745ab Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:27:42 -0300 Subject: [PATCH 10/11] refactor: update Request view to use selectedNodeId - Replace filesStore.selectedId with filesStore.selectedNodeId - Ensure consistency with updated store API Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- src/views/Request.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/Request.vue b/src/views/Request.vue index eec2486f0f..98176c47ff 100644 --- a/src/views/Request.vue +++ b/src/views/Request.vue @@ -12,7 +12,7 @@

- Date: Mon, 5 Jan 2026 10:27:50 -0300 Subject: [PATCH 11/11] refactor: update SignPDF view to use selectedNodeId from store - Replace fileId/id with nodeId in initialization loops - Update selectedId with selectedNodeId in store assignments - Fix nodeId parameter usage in file lookups Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- src/views/SignPDF/SignPDF.vue | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/views/SignPDF/SignPDF.vue b/src/views/SignPDF/SignPDF.vue index 3d09d46892..0d6234487c 100644 --- a/src/views/SignPDF/SignPDF.vue +++ b/src/views/SignPDF/SignPDF.vue @@ -114,11 +114,11 @@ export default { const files = await this.fileStore.getAllFiles({ signer_uuid: this.$route.params.uuid, }) - for (const fileId in files) { - const signer = files[fileId].signers.find(row => row.me) || {} + for (const nodeId in files) { + const signer = files[nodeId].signers.find(row => row.me) || {} if (Object.keys(signer).length > 0) { - this.signStore.setFileToSign(files[fileId]) - this.fileStore.selectedId = parseInt(fileId) + this.signStore.setFileToSign(files[nodeId]) + this.fileStore.selectedNodeId = parseInt(nodeId) return } } @@ -128,7 +128,7 @@ export default { generateOcsUrl('/apps/libresign/api/v1/file/validate/uuid/{uuid}', { uuid: this.$route.params.uuid }) ) this.signStore.setFileToSign(response.data.ocs.data) - this.fileStore.selectedId = response.data.ocs.data.id + this.fileStore.selectedNodeId = response.data.ocs.data.nodeId }, async handleInitialStatePdfs(urls) { if (!Array.isArray(urls) || urls.length === 0) {