@pristy/pristy-libvue 2.21.1 → 2.21.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/{ActivityHistory-BGjkKWml.js → ActivityHistory-CYTsXlFs.js} +2 -2
  2. package/dist/{ActivityHistory-BGjkKWml.js.map → ActivityHistory-CYTsXlFs.js.map} +1 -1
  3. package/dist/{BookmarksComponent-DHIe0ttf.js → BookmarksComponent-BQRGDBtk.js} +2 -2
  4. package/dist/{BookmarksComponent-DHIe0ttf.js.map → BookmarksComponent-BQRGDBtk.js.map} +1 -1
  5. package/dist/{ChartWrapper-Zs8fU_KC.js → ChartWrapper-NLlDKzgW.js} +2 -2
  6. package/dist/{ChartWrapper-Zs8fU_KC.js.map → ChartWrapper-NLlDKzgW.js.map} +1 -1
  7. package/dist/{DisplayFileInDashboardComponent-VTGlXPxP.js → DisplayFileInDashboardComponent-Ba8OoyfR.js} +3 -3
  8. package/dist/{DisplayFileInDashboardComponent-VTGlXPxP.js.map → DisplayFileInDashboardComponent-Ba8OoyfR.js.map} +1 -1
  9. package/dist/{ExternalApps-B2alflcL.js → ExternalApps-cKv9ZUlp.js} +2 -2
  10. package/dist/{ExternalApps-B2alflcL.js.map → ExternalApps-cKv9ZUlp.js.map} +1 -1
  11. package/dist/{FavoriteList-CcY7AFMX.js → FavoriteList-NsYCMz7n.js} +2 -2
  12. package/dist/{FavoriteList-CcY7AFMX.js.map → FavoriteList-NsYCMz7n.js.map} +1 -1
  13. package/dist/{MarkdownComponent-LDoBl43h.js → MarkdownComponent-q21Q073I.js} +2 -2
  14. package/dist/{MarkdownComponent-LDoBl43h.js.map → MarkdownComponent-q21Q073I.js.map} +1 -1
  15. package/dist/{PDFComponent-BXyQNUhl.js → PDFComponent-CUgH5A5P.js} +3 -3
  16. package/dist/{PDFComponent-BXyQNUhl.js.map → PDFComponent-CUgH5A5P.js.map} +1 -1
  17. package/dist/{PdfConfigService-BKVsjC1W.js → PdfConfigService-DZN8iTaP.js} +2 -2
  18. package/dist/{PdfConfigService-BKVsjC1W.js.map → PdfConfigService-DZN8iTaP.js.map} +1 -1
  19. package/dist/{PdfToolsComponent-BC45mg3C.js → PdfToolsComponent-CynQg24K.js} +3 -3
  20. package/dist/{PdfToolsComponent-BC45mg3C.js.map → PdfToolsComponent-CynQg24K.js.map} +1 -1
  21. package/dist/{SearchInput-C3A2rG7G.js → SearchInput-CbErAaEm.js} +2 -2
  22. package/dist/{SearchInput-C3A2rG7G.js.map → SearchInput-CbErAaEm.js.map} +1 -1
  23. package/dist/{UnknownBlockType-CK5rOiTB.js → UnknownBlockType-BhseESPx.js} +2 -2
  24. package/dist/{UnknownBlockType-CK5rOiTB.js.map → UnknownBlockType-BhseESPx.js.map} +1 -1
  25. package/dist/{index-CPjFX5To.js → index-DyssYdtW.js} +4800 -4721
  26. package/dist/index-DyssYdtW.js.map +1 -0
  27. package/dist/pristy-libvue.css +1 -1
  28. package/dist/pristy-libvue.es.js +1 -1
  29. package/dist/pristy-libvue.umd.js +17 -17
  30. package/dist/pristy-libvue.umd.js.map +1 -1
  31. package/dist/src/components/layouts/AppLayout.vue.d.ts +60 -1
  32. package/dist/src/components/layouts/AppLayout.vue.d.ts.map +1 -1
  33. package/dist/src/components/layouts/AppMobileLayout.vue.d.ts +60 -2
  34. package/dist/src/components/layouts/AppMobileLayout.vue.d.ts.map +1 -1
  35. package/dist/src/components/layouts/AppSubmenu.vue.d.ts.map +1 -1
  36. package/dist/src/components/navigation/ContentListView.vue.d.ts.map +1 -1
  37. package/dist/src/services/AlfrescoFileService.d.ts.map +1 -1
  38. package/dist/src/services/IconeService.d.ts.map +1 -1
  39. package/package.json +1 -1
  40. package/dist/index-CPjFX5To.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PDFComponent-BXyQNUhl.js","sources":["../src/services/PdfFormService.js","../src/services/PdfSignatureService.js","../src/services/PdfLinkService.js","../src/components/viewer/PdfSignaturePanel.vue","../src/components/viewer/PDFComponent.vue"],"sourcesContent":["/*\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\nimport { PDFDocument } from \"pdf-lib\";\n\n/**\n * Set or clear the ReadOnly flag (/Ff bit 1) on the form fields of a PDF.\n *\n * The ReadOnly flag is a rendering hint, not a protection: pdf.js turns a\n * read-only widget into a disabled input (`element.disabled = data.readOnly`),\n * and any editor — including this service — can flip it back. It states an\n * intention; it does not enforce it.\n *\n * pdf.js can only write field *values* (`saveDocument()`), so rewriting the\n * AcroForm structure goes through pdf-lib. Metadata is left alone\n * (`updateMetadata: false`): changing the fields' flags is not a reason to\n * rewrite the document's Producer and modification date.\n *\n * ReadOnly may be inherited from a parent field; pdf-lib reads `/Ff` through\n * the inheritance chain but writes it on the terminal field, whose own value\n * then takes precedence — so writing the terminal fields is enough.\n *\n * @param {Uint8Array|ArrayBuffer} pdfBytes the document as loaded\n * @param {boolean} readOnly wanted state of the fields\n * @returns {Promise<{bytes: Uint8Array|null, count: number}>} the rewritten\n * document and the number of fields changed, or null bytes when every field\n * was already in the wanted state\n */\nasync function setFormFieldsReadOnly(pdfBytes, readOnly) {\n const doc = await PDFDocument.load(pdfBytes, {\n ignoreEncryption: true,\n updateMetadata: false,\n });\n\n const fields = doc\n .getForm()\n .getFields()\n .filter((field) => field.isReadOnly() !== readOnly);\n\n if (fields.length === 0) {\n return { bytes: null, count: 0 };\n }\n\n for (const field of fields) {\n if (readOnly) {\n field.enableReadOnly();\n } else {\n field.disableReadOnly();\n }\n }\n\n return { bytes: await doc.save(), count: fields.length };\n}\n\n/**\n * Make every field of a form fillable again.\n *\n * A form whose fields are all flagged ReadOnly looks broken rather than\n * protected — inert inputs, no message — a common accident with forms exported\n * from LibreOffice Writer.\n *\n * @param {Uint8Array|ArrayBuffer} pdfBytes the document as loaded\n * @returns {Promise<{bytes: Uint8Array|null, unlockedCount: number}>} null\n * bytes when no field was locked\n */\nexport async function unlockFormFields(pdfBytes) {\n const { bytes, count } = await setFormFieldsReadOnly(pdfBytes, false);\n return { bytes, unlockedCount: count };\n}\n\n/**\n * Mark every field of a form as read-only, to state that it is final.\n *\n * @param {Uint8Array|ArrayBuffer} pdfBytes the document as loaded, values\n * included — lock the bytes returned by pdf.js `saveDocument()` to keep what\n * was filled in\n * @returns {Promise<{bytes: Uint8Array|null, lockedCount: number}>} null bytes\n * when every field was already read-only\n */\nexport async function lockFormFields(pdfBytes) {\n const { bytes, count } = await setFormFieldsReadOnly(pdfBytes, true);\n return { bytes, lockedCount: count };\n}\n","/*\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\nimport { fromBER } from \"asn1js\";\nimport {\n PDFArray,\n PDFDict,\n PDFDocument,\n PDFHexString,\n PDFName,\n PDFString,\n} from \"pdf-lib\";\nimport { ContentInfo, SignedData, TSTInfo } from \"pkijs\";\n\nconst OID_COMMON_NAME = \"2.5.4.3\";\nconst OID_ORGANIZATION = \"2.5.4.10\";\nconst OID_SIGNATURE_TIMESTAMP = \"1.2.840.113549.1.9.16.2.14\";\n\nconst toHex = (view) =>\n Array.from(view, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\nconst relativeName = (name, oid) => {\n const entry = name?.typesAndValues?.find((item) => item.type === oid);\n return entry ? entry.value.valueBlock.value : null;\n};\n\nconst readSignedData = (value) => {\n const contents = value.lookupMaybe(\n PDFName.of(\"Contents\"),\n PDFHexString,\n PDFString,\n );\n if (!contents) {\n return null;\n }\n try {\n const bytes = contents.asBytes();\n const decoded = fromBER(\n bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength),\n );\n if (decoded.offset === -1) {\n return null;\n }\n const contentInfo = new ContentInfo({ schema: decoded.result });\n return new SignedData({ schema: contentInfo.content });\n } catch {\n return null;\n }\n};\n\nconst signerCertificate = (signedData) => {\n const certificates = (signedData?.certificates ?? []).filter(\n (certificate) => certificate.subject,\n );\n const serial =\n signedData?.signerInfos?.[0]?.sid?.serialNumber?.valueBlock?.valueHexView;\n if (!serial) {\n return certificates[0] ?? null;\n }\n const wanted = toHex(serial);\n return (\n certificates.find(\n (certificate) =>\n toHex(certificate.serialNumber.valueBlock.valueHexView) === wanted,\n ) ??\n certificates[0] ??\n null\n );\n};\n\nconst readTimestampDate = (signedData) => {\n const attribute =\n signedData?.signerInfos?.[0]?.unsignedAttrs?.attributes?.find(\n (entry) => entry.type === OID_SIGNATURE_TIMESTAMP,\n );\n if (!attribute?.values?.length) {\n return null;\n }\n try {\n const token = new SignedData({\n schema: new ContentInfo({ schema: attribute.values[0] }).content,\n });\n const content = token.encapContentInfo?.eContent;\n if (!content) {\n return null;\n }\n const view = content.valueBlock.valueHexView;\n const decoded = fromBER(\n view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength),\n );\n if (decoded.offset === -1) {\n return null;\n }\n return new TSTInfo({ schema: decoded.result }).genTime ?? null;\n } catch {\n return null;\n }\n};\n\nconst describeCertificate = (certificate) => {\n if (!certificate) {\n return null;\n }\n return {\n commonName: relativeName(certificate.subject, OID_COMMON_NAME),\n organization: relativeName(certificate.subject, OID_ORGANIZATION),\n issuerCommonName: relativeName(certificate.issuer, OID_COMMON_NAME),\n serialNumber: toHex(certificate.serialNumber.valueBlock.valueHexView),\n validFrom: certificate.notBefore.value,\n validUntil: certificate.notAfter.value,\n };\n};\n\nconst readText = (dict, key) => {\n const value = dict.lookupMaybe(PDFName.of(key), PDFString, PDFHexString);\n return value ? value.decodeText() : null;\n};\n\nconst STANDARD_BY_SUB_FILTER = {\n \"ETSI.CAdES.detached\": \"PADES\",\n \"ETSI.RFC3161\": \"TIMESTAMP\",\n \"adbe.pkcs7.detached\": \"ADOBE_PKCS7\",\n \"adbe.pkcs7.sha1\": \"ADOBE_PKCS7\",\n \"adbe.x509.rsa_sha1\": \"ADOBE_X509\",\n};\n\nconst readDate = (dict, key) => {\n const value = dict.lookupMaybe(PDFName.of(key), PDFString, PDFHexString);\n if (!value) {\n return null;\n }\n try {\n return value.decodeDate();\n } catch {\n return null;\n }\n};\n\nconst collectFields = (fields, collected = []) => {\n for (let index = 0; index < fields.size(); index += 1) {\n const field = fields.lookupMaybe(index, PDFDict);\n if (!field) {\n continue;\n }\n collected.push(field);\n const kids = field.lookupMaybe(PDFName.of(\"Kids\"), PDFArray);\n if (kids) {\n collectFields(kids, collected);\n }\n }\n return collected;\n};\n\nconst readByteRange = (value) => {\n const range = value.lookupMaybe(PDFName.of(\"ByteRange\"), PDFArray);\n if (!range || range.size() < 4) {\n return null;\n }\n return range.asArray().map((entry) => entry.asNumber());\n};\n\nconst describeSignature = (field, value) => {\n const signedData = readSignedData(value);\n const byteRange = readByteRange(value);\n const coveredUntil = byteRange ? byteRange[2] + byteRange[3] : null;\n const subFilter = value\n .lookupMaybe(PDFName.of(\"SubFilter\"), PDFName)\n ?.asString()\n .replace(/^\\//, \"\");\n return {\n fieldName: readText(field, \"T\"),\n declaredName: readText(value, \"Name\"),\n reason: readText(value, \"Reason\"),\n location: readText(value, \"Location\"),\n contactInfo: readText(value, \"ContactInfo\"),\n declaredDate: readDate(value, \"M\"),\n subFilter: subFilter ?? null,\n standard: STANDARD_BY_SUB_FILTER[subFilter] ?? \"UNKNOWN\",\n byteRange,\n coveredUntil,\n certificate: describeCertificate(signerCertificate(signedData)),\n timestampDate: readTimestampDate(signedData),\n };\n};\n\nconst coverageOf = (signature, lastCovered, totalLength) => {\n if (signature.coveredUntil === null) {\n return \"UNKNOWN\";\n }\n if (signature.coveredUntil === totalLength) {\n return \"COMPLETE\";\n }\n if (signature.coveredUntil < lastCovered) {\n return \"SIGNED_AGAIN\";\n }\n return \"MODIFIED_AFTER\";\n};\n\nconst qualifyCoverage = (signatures, totalLength) => {\n const lastCovered = Math.max(\n ...signatures.map((signature) => signature.coveredUntil ?? 0),\n );\n return signatures.map((signature) => ({\n ...signature,\n coverage: coverageOf(signature, lastCovered, totalLength),\n }));\n};\n\n/**\n * Describe the signatures a PDF document carries.\n *\n * @param {Uint8Array} bytes the document as stored, never re-saved\n * @returns {Promise<Array<object>>} one entry per signature, in document order\n */\nexport const extractSignatures = async (bytes) => {\n if (!bytes || bytes.length === 0) {\n return [];\n }\n let document;\n try {\n document = await PDFDocument.load(bytes, {\n ignoreEncryption: true,\n updateMetadata: false,\n });\n } catch (error) {\n console.error(\"Error reading PDF signatures:\", error);\n return [];\n }\n const acroForm = document.catalog.lookupMaybe(\n PDFName.of(\"AcroForm\"),\n PDFDict,\n );\n const fields = acroForm?.lookupMaybe(PDFName.of(\"Fields\"), PDFArray);\n if (!fields) {\n return [];\n }\n const signatures = [];\n for (const field of collectFields(fields)) {\n const type = field.lookupMaybe(PDFName.of(\"FT\"), PDFName);\n if (type?.asString() !== \"/Sig\") {\n continue;\n }\n const value = field.lookupMaybe(PDFName.of(\"V\"), PDFDict);\n if (!value) {\n continue;\n }\n signatures.push(describeSignature(field, value));\n }\n return qualifyCoverage(signatures, bytes.length);\n};\n","/**\n * Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\n\nexport const LINK_MAILTO = \"mailto\";\nexport const LINK_ROUTE = \"route\";\nexport const LINK_EXTERNAL = \"external\";\n\n/**\n * Decide how a hyperlink found in a PDF is followed.\n *\n * A link pointing at a page of the running application (same origin, under\n * the router base, matching a route) is followed inside the application;\n * anything else is external.\n *\n * @param {string} url - Hyperlink carried by the PDF annotation\n * @param {Object} context\n * @param {string} context.origin - Origin of the running application\n * @param {string} [context.base] - Router history base, e.g. \"/marches\"\n * @param {Function} [context.resolve] - Router resolve function\n * @returns {{type: string, url?: string, location?: Object}}\n */\nexport function resolvePdfLink(url, { origin, base = \"\", resolve } = {}) {\n if (url.startsWith(\"mailto:\")) {\n return { type: LINK_MAILTO, url };\n }\n\n let target;\n try {\n target = new URL(url, origin);\n } catch {\n return { type: LINK_EXTERNAL, url };\n }\n\n const normalizedBase = base.replace(/\\/+$/, \"\");\n const { pathname } = target;\n const isUnderBase =\n normalizedBase === \"\" ||\n pathname === normalizedBase ||\n pathname.startsWith(`${normalizedBase}/`);\n\n if (!resolve || target.origin !== origin || !isUnderBase) {\n return { type: LINK_EXTERNAL, url };\n }\n\n const appPath = pathname.slice(normalizedBase.length) || \"/\";\n const location = resolve(`${appPath}${target.search}${target.hash}`);\n if (!location?.matched?.length) {\n return { type: LINK_EXTERNAL, url };\n }\n return { type: LINK_ROUTE, location };\n}\n\n/**\n * Page number requested by a route query, clamped to the document.\n *\n * @param {*} value - Raw `page` query value\n * @param {number} pageCount - Number of pages of the document\n * @returns {number|null} null when the value is not a number\n */\nexport function clampPage(value, pageCount) {\n const page = parseInt(value, 10);\n if (isNaN(page)) {\n return null;\n }\n return Math.min(Math.max(page, 1), pageCount);\n}\n","<!--\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n-->\n\n<template>\n <ul class=\"pdf-signature-list\">\n <li\n v-for=\"(signature, index) in signatures\"\n :key=\"index\"\n class=\"pdf-signature-entry\"\n >\n <div class=\"pdf-signature-header\">\n <p class=\"pdf-signature-name\">{{ signerName(signature) }}</p>\n <PrimeTag\n :value=\"t(`pdf.signature.standard.${signature.standard}`)\"\n :severity=\"signature.standard === 'PADES' ? 'info' : 'secondary'\"\n />\n </div>\n <p\n v-if=\"signature.coverage === 'MODIFIED_AFTER'\"\n class=\"pdf-signature-warning\"\n >\n <i class=\"ri-error-warning-line\" aria-hidden=\"true\" />\n {{ t(\"pdf.signature.modifiedAfter\") }}\n </p>\n <p\n v-else-if=\"signature.coverage === 'SIGNED_AGAIN'\"\n class=\"pdf-signature-note\"\n >\n {{ t(\"pdf.signature.signedAgain\") }}\n </p>\n <dl class=\"pdf-signature-details\">\n <template v-if=\"signature.declaredDate\">\n <dt>{{ t(\"pdf.signature.declaredDate\") }}</dt>\n <dd>{{ formatDate(signature.declaredDate) }}</dd>\n </template>\n <template v-if=\"signature.timestampDate\">\n <dt class=\"pdf-signature-timestamp\">\n {{ t(\"pdf.signature.timestampDate\") }}\n </dt>\n <dd>{{ formatDate(signature.timestampDate) }}</dd>\n </template>\n <template v-if=\"signature.reason\">\n <dt>{{ t(\"pdf.signature.reason\") }}</dt>\n <dd>{{ signature.reason }}</dd>\n </template>\n <template v-if=\"signature.location\">\n <dt>{{ t(\"pdf.signature.location\") }}</dt>\n <dd>{{ signature.location }}</dd>\n </template>\n <template v-if=\"signature.certificate?.organization\">\n <dt>{{ t(\"pdf.signature.organization\") }}</dt>\n <dd>{{ signature.certificate.organization }}</dd>\n </template>\n <template v-if=\"signature.certificate?.issuerCommonName\">\n <dt>{{ t(\"pdf.signature.issuer\") }}</dt>\n <dd>{{ signature.certificate.issuerCommonName }}</dd>\n </template>\n <template v-if=\"signature.certificate?.validUntil\">\n <dt>{{ t(\"pdf.signature.certificateValidity\") }}</dt>\n <dd>\n {{\n t(\"pdf.signature.certificateValidityValue\", {\n from: formatDate(signature.certificate.validFrom),\n until: formatDate(signature.certificate.validUntil),\n })\n }}\n </dd>\n </template>\n </dl>\n </li>\n </ul>\n <p class=\"pdf-signature-disclaimer\">\n <i class=\"ri-information-line\" aria-hidden=\"true\" />\n {{ t(\"pdf.signature.notVerified\") }}\n </p>\n</template>\n\n<script setup>\nimport { useI18n } from \"vue-i18n\";\nimport PrimeTag from \"primevue/tag\";\n\ndefineProps({\n signatures: {\n type: Array,\n default: () => [],\n },\n});\n\nconst { t } = useI18n();\n\nconst formatDate = (date) => (date ? date.toLocaleString() : null);\n\nconst signerName = (signature) =>\n signature.declaredName ||\n signature.certificate?.commonName ||\n t(\"pdf.signature.unknownSigner\");\n</script>\n\n<style scoped>\n.pdf-signature-list {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.pdf-signature-entry {\n border-bottom: 1px solid var(--p-content-border-color);\n padding: 0.75rem 0;\n}\n\n.pdf-signature-entry:last-child {\n border-bottom: none;\n}\n\n.pdf-signature-header {\n align-items: center;\n display: flex;\n gap: 0.5rem;\n justify-content: space-between;\n}\n\n.pdf-signature-name {\n font-weight: 600;\n margin: 0;\n}\n\n.pdf-signature-warning {\n align-items: center;\n color: var(--p-orange-600);\n display: flex;\n gap: 0.25rem;\n margin: 0.25rem 0 0;\n}\n\n.pdf-signature-note {\n color: var(--p-text-muted-color);\n margin: 0.25rem 0 0;\n}\n\n.pdf-signature-details {\n display: grid;\n grid-template-columns: minmax(8rem, auto) 1fr;\n gap: 0.125rem 1rem;\n margin: 0.5rem 0 0;\n}\n\n.pdf-signature-details dt {\n color: var(--p-text-muted-color);\n}\n\n.pdf-signature-details dd {\n margin: 0;\n}\n\n.pdf-signature-disclaimer {\n align-items: center;\n color: var(--p-text-muted-color);\n display: flex;\n gap: 0.25rem;\n margin: 1rem 0 0;\n}\n</style>\n","<!--\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n-->\n\n<template>\n <div\n ref=\"pdfComponent\"\n class=\"pdf-component-root\"\n :class=\"{\n 'outline-none': isPdfConsultationPage,\n }\"\n tabindex=\"0\"\n >\n <PrimeProgressSpinner\n v-if=\"!pdf\"\n class=\"loadingRendition\"\n aria-label=\"Loading\"\n />\n <div v-else>\n <div class=\"pdf-toolbar\" :class=\"{ 'pdf-toolbar--small': isSmallScreen }\">\n <div v-if=\"isSinglePageDisplayed\" class=\"pdf-toolbar-group\">\n <PrimeButton\n v-tooltip=\"$t('pdf.previousPage')\"\n :aria-label=\"$t('pdf.previousPage')\"\n icon=\"ri-arrow-left-line\"\n class=\"pdf-toolbar-btn\"\n :disabled=\"isLeftButtonDisable\"\n @click=\"previousPage()\"\n />\n <span class=\"pdf-page-indicator\">\n <PrimeInputNumber\n v-model=\"page\"\n :aria-label=\"$t('pdf.changePage')\"\n fluid\n :min=\"1\"\n :max=\"pages\"\n :disabled=\"pages === 1\"\n class=\"pageInputNumber\"\n />\n {{ $t(\"pdf.on\") }} {{ pages }}\n </span>\n <PrimeButton\n v-tooltip=\"$t('pdf.nextPage')\"\n :aria-label=\"$t('pdf.nextPage')\"\n icon=\"ri-arrow-right-line\"\n class=\"pdf-toolbar-btn\"\n :disabled=\"isRightButtonDisable\"\n @click=\"nextPage()\"\n />\n </div>\n <PrimeDivider\n v-if=\"pages > 1\"\n layout=\"vertical\"\n class=\"pdfActionDivider\"\n />\n <div v-if=\"pages > 1\" class=\"pdf-toolbar-section\">\n <div class=\"pdf-toolbar-group\">\n <div>\n <PrimeButton\n v-if=\"isSinglePageDisplayed\"\n v-tooltip.top=\"$t('pdf.showAllPages')\"\n :aria-label=\"$t('pdf.showAllPages')\"\n icon=\"ri-file-copy-2-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"changePdfDisplay()\"\n />\n <PrimeButton\n v-else\n v-tooltip.top=\"$t('pdf.showPageByPage')\"\n :aria-label=\"$t('pdf.showPageByPage')\"\n icon=\"ri-file-list-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"changePdfDisplay()\"\n />\n </div>\n </div>\n </div>\n <PrimeDivider layout=\"vertical\" class=\"pdfActionDivider\" />\n <div class=\"pdf-toolbar-section\">\n <div class=\"pdf-toolbar-group\">\n <PrimeButton\n v-tooltip=\"$t('pdf.rotationLeft')\"\n :aria-label=\"$t('pdf.rotationLeft')\"\n icon=\"ri-arrow-go-back-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"rotation = rotation - 90\"\n />\n <PrimeButton\n v-tooltip=\"$t('pdf.rotationRigth')\"\n :aria-label=\"$t('pdf.rotationRigth')\"\n icon=\"ri-arrow-go-forward-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"rotation = rotation + 90\"\n />\n </div>\n </div>\n <PrimeDivider layout=\"vertical\" class=\"pdfActionDivider\" />\n <div class=\"pdf-toolbar-section\">\n <div class=\"pdf-toolbar-group\">\n <PrimeButton\n v-tooltip=\"$t('pdf.dezoom')\"\n :aria-label=\"$t('pdf.dezoom')\"\n icon=\"ri-zoom-out-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"zoomOut\"\n />\n <PrimeButton\n v-tooltip=\"$t('pdf.zoom')\"\n :aria-label=\"$t('pdf.zoom')\"\n icon=\"ri-zoom-in-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"zoomIn\"\n />\n </div>\n </div>\n <PrimeDivider layout=\"vertical\" class=\"pdfActionDivider\" />\n <div class=\"pdf-toolbar-section\">\n <div class=\"pdf-toolbar-group\">\n <PrimeButton\n v-tooltip.left=\"$t('pdf.adaptToPage')\"\n :aria-label=\"$t('pdf.adaptToPage')\"\n icon=\"ri-expand-vertical-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"fitAuto()\"\n />\n <PrimeButton\n v-tooltip.left=\"$t('pdf.adaptToWidth')\"\n :aria-label=\"$t('pdf.adaptToWidth')\"\n icon=\"ri-expand-horizontal-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"fitWidthAuto()\"\n />\n </div>\n </div>\n <template v-if=\"hasSignatures\">\n <PrimeDivider layout=\"vertical\" class=\"pdfActionDivider\" />\n <div class=\"pdf-toolbar-section\">\n <div class=\"pdf-toolbar-group\">\n <PrimeButton\n v-tooltip=\"$t('pdf.showSignatures')\"\n :aria-label=\"$t('pdf.showSignatures')\"\n icon=\"ri-certificate-2-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"showSignaturesDialog = true\"\n />\n </div>\n </div>\n </template>\n <template v-if=\"hasFormFields && !hideForms\">\n <PrimeDivider layout=\"vertical\" class=\"pdfActionDivider\" />\n <div class=\"flex flex-column align-items-center\">\n <div class=\"flex gap-1 m-2\">\n <!--\n The icon shows the state of the document, the tooltip and the\n accessible name state what the click does: a closed padlock\n means the fields are locked, and clicking it unlocks them.\n -->\n <PrimeButton\n v-if=\"canSaveForm && hasReadOnlyFields\"\n v-tooltip=\"\n isFormDirty\n ? $t('pdf.unlockFormBlocked')\n : $t('pdf.unlockForm')\n \"\n :aria-label=\"$t('pdf.unlockForm')\"\n icon=\"ri-lock-line\"\n severity=\"warning\"\n class=\"text-xl p-1\"\n :disabled=\"isFormDirty || isUnlocking\"\n :loading=\"isUnlocking\"\n @click=\"unlockForm()\"\n />\n <PrimeButton\n v-if=\"canSaveForm && !hasReadOnlyFields\"\n v-tooltip=\"$t('pdf.lockForm')\"\n :aria-label=\"$t('pdf.lockForm')\"\n icon=\"ri-lock-unlock-line\"\n class=\"text-xl p-1\"\n :disabled=\"isLocking || isSaving\"\n :loading=\"isLocking\"\n @click=\"$emit('lockForm')\"\n />\n <PrimeButton\n v-if=\"canSaveForm\"\n v-tooltip=\"$t('pdf.saveForm')\"\n :aria-label=\"$t('pdf.saveForm')\"\n icon=\"ri-save-line\"\n severity=\"info\"\n class=\"text-xl p-1\"\n :disabled=\"!isFormDirty || isSaving\"\n :loading=\"isSaving\"\n @click=\"$emit('saveForm')\"\n />\n <PrimeButton\n v-tooltip=\"$t('pdf.cancelForm')\"\n :aria-label=\"$t('pdf.cancelForm')\"\n icon=\"ri-close-line\"\n class=\"text-xl p-1\"\n :disabled=\"!isFormDirty\"\n @click=\"cancelForm()\"\n />\n <PrimeButton\n v-tooltip=\"$t('pdf.formFieldsInfo')\"\n :aria-label=\"$t('pdf.formFieldsInfo')\"\n icon=\"ri-information-line\"\n class=\"text-xl p-1\"\n @click=\"showFormFieldsInfo()\"\n />\n </div>\n </div>\n </template>\n </div>\n <div class=\"pdf-header\">\n <div v-if=\"isPdfConsultationPage\" class=\"pdf-title-container\">\n <h3 class=\"consultation-title\">\n {{ getFileName }}\n </h3>\n <PrimeTag\n v-if=\"$route.params.versionId\"\n class=\"pdf-version-tag\"\n :value=\"getVersionNumber\"\n />\n </div>\n </div>\n <div v-if=\"isSinglePageDisplayed\" class=\"pdf-single-page\">\n <VuePDF\n class=\"pdf-canvas\"\n :pdf=\"pdf\"\n :page=\"page\"\n :rotation=\"rotation\"\n :scale=\"scale\"\n :text-layer=\"textLayer\"\n :annotation-layer=\"annotationLayer\"\n :hide-forms=\"hideForms\"\n @annotation=\"onAnnotation\"\n />\n </div>\n <div v-else class=\"pdf-all-pages\">\n <div v-for=\"pageItem in pages\" :key=\"pageItem\" class=\"pdf-page-item\">\n <VuePDF\n :pdf=\"pdf\"\n :page=\"pageItem\"\n :rotation=\"rotation\"\n :scale=\"scale\"\n :text-layer=\"textLayer\"\n :annotation-layer=\"annotationLayer\"\n :hide-forms=\"hideForms\"\n @annotation=\"onAnnotation\"\n />\n <span class=\"pdf-page-number\">\n {{\n $t(\"pdf.currentPagination\", { page: pageItem, pages: pages })\n }}</span\n >\n </div>\n </div>\n </div>\n <PrimeDialog\n v-model:visible=\"showFormFieldsDialog\"\n :header=\"$t('pdf.formFieldsInfoTitle')\"\n modal\n class=\"w-8\"\n >\n <PrimeDataTable :value=\"formFieldsData\" striped-rows>\n <PrimeColumn field=\"name\" :header=\"$t('pdf.formFieldName')\" sortable />\n <PrimeColumn field=\"type\" :header=\"$t('pdf.formFieldType')\" sortable />\n <PrimeColumn\n field=\"value\"\n :header=\"$t('pdf.formFieldValue')\"\n sortable\n />\n </PrimeDataTable>\n </PrimeDialog>\n <PrimeDialog\n v-model:visible=\"showSignaturesDialog\"\n :header=\"$t('pdf.signaturePanelTitle')\"\n modal\n :style=\"{ width: '95vw', maxWidth: '40rem' }\"\n >\n <PdfSignaturePanel :signatures=\"signatures\" />\n </PrimeDialog>\n </div>\n</template>\n<script>\nimport { usePDF, VuePDF } from \"@tato30/vue-pdf\";\nimport \"@tato30/vue-pdf/style.css\";\nimport { buildPdfSource } from \"@/services/PdfConfigService.js\";\nimport { lockFormFields, unlockFormFields } from \"@/services/PdfFormService.js\";\nimport { extractSignatures } from \"@/services/PdfSignatureService.js\";\nimport {\n LINK_MAILTO,\n LINK_ROUTE,\n clampPage,\n resolvePdfLink,\n} from \"@/services/PdfLinkService.js\";\nimport PdfSignaturePanel from \"@/components/viewer/PdfSignaturePanel.vue\";\nimport { useSelectionStore } from \"@/stores/selection.js\";\nimport Tooltip from \"primevue/tooltip\";\nimport Button from \"primevue/button\";\nimport ProgressSpinner from \"primevue/progressspinner\";\nimport Divider from \"primevue/divider\";\nimport Tag from \"primevue/tag\";\nimport InputNumber from \"primevue/inputnumber\";\nimport Dialog from \"primevue/dialog\";\nimport DataTable from \"primevue/datatable\";\nimport Column from \"primevue/column\";\n\nexport default {\n name: \"PDFComponent\",\n components: {\n VuePDF,\n PdfSignaturePanel,\n PrimeButton: Button,\n PrimeProgressSpinner: ProgressSpinner,\n PrimeDivider: Divider,\n PrimeTag: Tag,\n PrimeInputNumber: InputNumber,\n PrimeDialog: Dialog,\n PrimeDataTable: DataTable,\n PrimeColumn: Column,\n },\n directives: {\n tooltip: Tooltip,\n },\n emits: [\n \"formDirtyChange\",\n \"saveForm\",\n \"lockForm\",\n \"formUnlocked\",\n \"formUnlockError\",\n ],\n props: {\n url: {\n type: String,\n default: null,\n },\n textLayer: {\n type: Boolean,\n default: false,\n },\n annotationLayer: {\n type: Boolean,\n default: false,\n },\n hideForms: {\n type: Boolean,\n default: false,\n },\n canSaveForm: {\n type: Boolean,\n default: false,\n },\n },\n data() {\n return {\n pdf: null,\n pages: null,\n page: 1,\n rotation: 0,\n scale: 1,\n defaultViewport: {\n width: 0,\n height: 0,\n },\n isSinglePageDisplayed: true,\n isFormDirty: false,\n isSaving: false,\n isUnlocking: false,\n isLocking: false,\n hasFormFields: false,\n hasReadOnlyFields: false,\n unlockedFormBytes: null,\n showFormFieldsDialog: false,\n formFieldsData: [],\n formFieldValues: {},\n signatures: [],\n showSignaturesDialog: false,\n };\n },\n computed: {\n getVersionNumber() {\n return `Version ${this.$route.params.versionId}`;\n },\n getFileName() {\n const selectionStore = useSelectionStore();\n if (selectionStore.files.length > 0) {\n return selectionStore.files[0].name;\n } else {\n return \"\";\n }\n },\n isLeftButtonDisable() {\n return this.page === 1;\n },\n isRightButtonDisable() {\n return this.page === this.pages;\n },\n isPdfConsultationPage() {\n return this.$route.name.startsWith(\"consultation-pdf\");\n },\n isSmallScreen() {\n return window.innerWidth <= 920;\n },\n hasSignatures() {\n return this.signatures.length > 0;\n },\n },\n watch: {\n pages(newValue) {\n if (this.isPdfConsultationPage) {\n const wantedPage = parseInt(this.$route.query.page) || 1;\n this.page =\n wantedPage > newValue ? newValue : wantedPage < 1 ? 1 : wantedPage;\n this.changePageUrl(this.page);\n }\n if (newValue) {\n this.checkFormFields();\n this.checkSignatures();\n }\n },\n page(newValue) {\n if (this.isPdfConsultationPage) {\n this.changePageUrl(newValue);\n }\n },\n },\n mounted() {\n this.focusOnPDFComponent();\n this.loadPDF();\n this.setDefaultViewport();\n this.fitAuto();\n },\n unmounted() {\n if (this.pdf) {\n this.pdf.destroy();\n if (this.pdf) {\n delete this.pdf;\n }\n }\n },\n methods: {\n changePdfDisplay() {\n this.loadPDF();\n this.isSinglePageDisplayed = !this.isSinglePageDisplayed;\n if (this.isPdfConsultationPage) {\n const url = new URL(window.location.href);\n if (this.isSinglePageDisplayed) {\n this.changePageUrl(this.page);\n } else {\n url.searchParams.delete(\"page\");\n window.history.replaceState(history.state, \"\", url.toString());\n }\n }\n if (this.isSinglePageDisplayed) {\n this.focusOnPDFComponent();\n }\n },\n setDefaultViewport() {\n if (this.isSmallScreen) {\n this.defaultViewport.width = 300;\n this.defaultViewport.height = 200;\n } else {\n if (this.$route.name === \"consultation-pdf\") {\n this.defaultViewport.width = 700;\n this.defaultViewport.height = 500;\n } else {\n this.defaultViewport.width = 900;\n this.defaultViewport.height = 700;\n }\n }\n },\n\n menuDiff() {\n const SM_SIZE = 640;\n const MD_SIZE = 768;\n const LG_SIZE = 1024;\n\n const SM_MENU_SIZE = 200;\n const MD_MENU_SIZE = 250;\n const LG_MENU_SIZE = 300;\n const XL_MENU_SIZE = 350;\n\n let menuDiff;\n if (window.innerWidth <= SM_SIZE) {\n menuDiff = SM_MENU_SIZE;\n } else if (window.innerWidth <= MD_SIZE) {\n menuDiff = MD_MENU_SIZE;\n } else if (window.innerWidth <= LG_SIZE) {\n menuDiff = LG_MENU_SIZE;\n } else {\n menuDiff = XL_MENU_SIZE;\n }\n return menuDiff;\n },\n\n pageWidthScale() {\n if (!this.defaultViewport.width) {\n return 1;\n }\n let availableSize = window.innerWidth - this.menuDiff();\n return availableSize / this.defaultViewport.width;\n },\n\n pageHeightScale() {\n if (!this.defaultViewport.height) {\n return 1;\n }\n let availableSize = window.innerHeight - this.menuDiff();\n return (availableSize / this.defaultViewport.height) * 0.8;\n },\n zoomIn() {\n this.scale = this.scale < 2 ? this.scale + 0.25 : this.scale;\n },\n zoomOut() {\n this.scale = this.scale > 0.25 ? this.scale - 0.25 : this.scale;\n },\n fitAuto() {\n const widthScale = this.pageWidthScale();\n const heightScale = this.pageHeightScale();\n this.scale = Math.min(widthScale, heightScale);\n },\n fitWidthAuto() {\n this.scale = this.pageWidthScale();\n },\n previousPage() {\n if (!this.isLeftButtonDisable) {\n this.page = this.page > 1 ? this.page - 1 : this.page;\n }\n },\n nextPage() {\n if (!this.isRightButtonDisable) {\n this.page = this.page < this.pages ? this.page + 1 : this.page;\n }\n },\n /**\n * Source handed to pdf.js: the node URL, or the in-memory bytes produced by\n * unlockForm(). pdf.js transfers the `data` buffer to its worker, which\n * detaches it, so every load gets its own copy — otherwise a second load\n * (cancelForm, changePdfDisplay) would fail on a detached ArrayBuffer.\n *\n * @returns {string|{data: Uint8Array}}\n */\n currentPdfSource() {\n return this.unlockedFormBytes\n ? { data: this.unlockedFormBytes.slice() }\n : this.url;\n },\n loadPDF() {\n if (!this.url) {\n console.error(\"URL is not defined\");\n return;\n }\n this.hasFormFields = false;\n this.hasReadOnlyFields = false;\n this.formFieldValues = {};\n this.signatures = [];\n\n const document = usePDF(buildPdfSource(this.currentPdfSource()));\n this.pdf = document.pdf;\n this.pages = document.pages;\n // this.info = document.info\n },\n changePageUrl(pageValue) {\n if (pageValue !== 0) {\n const pageNumber = parseInt(pageValue, 10);\n if (!isNaN(pageNumber)) {\n const newQuery = new URLSearchParams(window.location.search);\n newQuery.set(\"page\", pageNumber);\n window.history.replaceState(\n history.state,\n \"\",\n `${window.location.pathname}?${newQuery.toString()}`,\n );\n }\n }\n },\n focusOnPDFComponent() {\n if (this.$refs.pdfComponent) {\n this.$refs.pdfComponent.focus();\n }\n },\n async getFormBytes() {\n if (!this.pdf) {\n return null;\n }\n const pdfDoc = await this.pdf.promise;\n try {\n return await pdfDoc.saveDocument();\n } catch (error) {\n console.error(\"Error saving PDF document:\", error);\n return await pdfDoc.getData();\n }\n },\n resetFormDirty() {\n this.isFormDirty = false;\n this.$emit(\"formDirtyChange\", false);\n },\n setSaving(value) {\n this.isSaving = value;\n },\n setLocking(value) {\n this.isLocking = value;\n },\n /**\n * Bytes of the form with the values typed in the viewer kept and every\n * field flagged read-only, ready to be stored as a new version.\n *\n * @returns {Promise<Uint8Array|null>} null when the document is not loaded\n */\n async getLockedFormBytes() {\n const bytes = await this.getFormBytes();\n if (!bytes) {\n return null;\n }\n // No field left to flag: keep the filled bytes, so saving still records\n // what the user typed.\n const { bytes: locked } = await lockFormFields(bytes);\n return locked ?? bytes;\n },\n onAnnotation(value) {\n if (!value) {\n return;\n }\n switch (value.type) {\n case \"link\":\n this.followLink(value.data.url);\n break;\n case \"internal-link\":\n this.goToPage(value.data.referencedPage);\n break;\n case \"form-text\":\n this.formFieldValues[value.data.fieldName] = value.data.value;\n if (!this.isFormDirty) {\n this.isFormDirty = true;\n this.$emit(\"formDirtyChange\", true);\n }\n break;\n case \"form-checkbox\":\n this.formFieldValues[value.data.fieldName] = value.data.checked;\n if (!this.isFormDirty) {\n this.isFormDirty = true;\n this.$emit(\"formDirtyChange\", true);\n }\n break;\n case \"form-select\":\n this.formFieldValues[value.data.fieldName] = value.data.value;\n if (!this.isFormDirty) {\n this.isFormDirty = true;\n this.$emit(\"formDirtyChange\", true);\n }\n break;\n case \"form-radio\":\n this.formFieldValues[value.data.fieldName] = value.data.value;\n if (!this.isFormDirty) {\n this.isFormDirty = true;\n this.$emit(\"formDirtyChange\", true);\n }\n break;\n case \"form-button\":\n default:\n console.log(\"Annotation Event \", value);\n }\n },\n followLink(url) {\n const link = resolvePdfLink(url, {\n origin: window.location.origin,\n base: this.$router?.options.history.base,\n resolve: this.$router ? (path) => this.$router.resolve(path) : null,\n });\n switch (link.type) {\n case LINK_MAILTO:\n window.location.href = link.url;\n break;\n case LINK_ROUTE:\n if (link.location.path === this.$route.path) {\n this.goToPage(link.location.query.page);\n } else {\n this.$router.push(link.location.fullPath);\n }\n break;\n default:\n window.open(link.url, \"_blank\", \"noreferrer\");\n }\n },\n goToPage(value) {\n const page = clampPage(value, this.pages);\n if (page === null) {\n return;\n }\n this.page = page;\n if (!this.isSinglePageDisplayed) {\n this.$el\n .querySelectorAll(\".pdf-page-item\")\n [page - 1]?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n },\n async checkSignatures() {\n if (!this.pdf) {\n this.signatures = [];\n return;\n }\n try {\n const pdfDoc = await this.pdf.promise;\n this.signatures = await extractSignatures(await pdfDoc.getData());\n } catch (error) {\n console.error(\"Error reading signatures:\", error);\n this.signatures = [];\n }\n },\n async checkFormFields() {\n if (!this.pdf) {\n this.hasFormFields = false;\n this.hasReadOnlyFields = false;\n return;\n }\n try {\n const pdfDoc = await this.pdf.promise;\n const fields = await pdfDoc.getFieldObjects();\n this.hasFormFields = fields !== null && Object.keys(fields).length > 0;\n // pdf.js exposes the ReadOnly flag as `editable: !readOnly`, and renders\n // a read-only widget as a disabled input. A form entirely made of such\n // fields looks broken rather than protected, hence the unlock action.\n // Signature widgets carry no `editable` and are left out.\n this.hasReadOnlyFields = Object.values(fields ?? {})\n .flat()\n .some((field) => field.editable === false);\n } catch (error) {\n console.error(\"Error checking form fields:\", error);\n this.hasFormFields = false;\n this.hasReadOnlyFields = false;\n }\n },\n /**\n * Drop the ReadOnly flags of the form so its fields become fillable.\n *\n * The change stays local: the viewer is reloaded from the rewritten bytes\n * and nothing is sent to the repository. The unlocked structure reaches\n * Alfresco only if the user then saves the filled form, through the regular\n * save path.\n */\n async unlockForm() {\n if (!this.pdf || this.isUnlocking) {\n return;\n }\n this.isUnlocking = true;\n try {\n const pdfDoc = await this.pdf.promise;\n // getData() returns the document as loaded, without the values typed in\n // the viewer — which is why unlocking is barred once the form is dirty.\n const { bytes, unlockedCount } = await unlockFormFields(\n await pdfDoc.getData(),\n );\n if (!bytes) {\n this.hasReadOnlyFields = false;\n return;\n }\n this.unlockedFormBytes = bytes;\n this.loadPDF();\n this.$emit(\"formUnlocked\", unlockedCount);\n } catch (error) {\n console.error(\"Error unlocking PDF form fields:\", error);\n this.$emit(\"formUnlockError\", error);\n } finally {\n this.isUnlocking = false;\n }\n },\n cancelForm() {\n this.loadPDF();\n this.resetFormDirty();\n },\n async showFormFieldsInfo() {\n if (!this.pdf) {\n return;\n }\n try {\n const pdfDoc = await this.pdf.promise;\n const fieldObjects = await pdfDoc.getFieldObjects();\n if (!fieldObjects) {\n this.formFieldsData = [];\n } else {\n const data = [];\n for (const [name, fields] of Object.entries(fieldObjects)) {\n for (const field of fields) {\n const trackedValue = this.formFieldValues[name];\n data.push({\n name: name,\n type: field.type,\n value:\n trackedValue !== undefined\n ? trackedValue\n : (field.value ?? \"\"),\n });\n }\n }\n this.formFieldsData = data;\n }\n this.showFormFieldsDialog = true;\n } catch (error) {\n console.error(\"Error getting form fields info:\", error);\n }\n },\n },\n};\n</script>\n<style lang=\"css\" scoped>\n.pdf-component-root {\n flex-grow: 1;\n overflow: visible;\n}\n\n.loadingRendition {\n display: flex;\n margin: 0.5rem auto 0;\n}\n\n.pdf-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 0.25rem;\n}\n\n.pdf-toolbar--small {\n padding-right: 1.5rem;\n}\n\n.pdf-toolbar-group {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n margin: 0.5rem;\n}\n\n.pdf-toolbar-section {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.pdf-toolbar-btn {\n font-size: 1.25rem;\n padding: 0.25rem;\n}\n\n.pdf-page-indicator {\n display: flex;\n align-items: center;\n margin: 0 0.5rem;\n gap: 0.25rem;\n}\n\n.pdfActionDivider {\n margin: 0 0.5rem !important;\n}\n\n.pdf-header {\n display: flex;\n}\n\n.pdf-title-container {\n display: flex;\n margin: 0 auto;\n gap: 0.75rem;\n margin-bottom: 0.75rem;\n}\n\n.pdf-version-tag {\n margin: 0 auto;\n font-size: 1.25rem;\n}\n\n.pdf-single-page {\n display: flex;\n justify-content: center;\n}\n\n.pdf-canvas {\n overflow-y: hidden;\n}\n\n.pdf-all-pages {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 1rem;\n}\n\n.pdf-page-item {\n display: flex;\n flex-direction: column;\n}\n\n.pdf-page-number {\n display: flex;\n justify-content: center;\n padding: 1rem;\n}\n\n.pageInputNumber {\n width: 4rem;\n}\n\n/* pdf.js points its annotation icons at a relative path, which resolves to\n nothing here, so the built-in image never loads. Draw a Remixicon glyph\n instead, in line with the icon set used across the interface. */\n:deep(.annotationLayer .textAnnotation) {\n display: flex;\n align-items: center;\n justify-content: center;\n /* Lets the glyph follow the annotation size, which varies with the zoom */\n container-type: size;\n}\n:deep(.annotationLayer .textAnnotation img) {\n display: none;\n}\n:deep(.annotationLayer .textAnnotation)::before {\n /* ri-chat-3-fill */\n content: \"\";\n font-family: remixicon;\n /* Fallback for browsers without container query units */\n font-size: 1rem;\n font-size: 100cqh;\n line-height: 1;\n color: #f5a623;\n}\n</style>\n"],"names":["setFormFieldsReadOnly","pdfBytes","readOnly","doc","PDFDocument","fields","field","unlockFormFields","bytes","count","lockFormFields","OID_COMMON_NAME","OID_ORGANIZATION","OID_SIGNATURE_TIMESTAMP","toHex","view","byte","relativeName","name","oid","entry","item","readSignedData","value","contents","PDFName","PDFHexString","PDFString","decoded","fromBER","contentInfo","ContentInfo","SignedData","signerCertificate","signedData","certificates","certificate","serial","wanted","readTimestampDate","attribute","content","TSTInfo","describeCertificate","readText","dict","key","STANDARD_BY_SUB_FILTER","readDate","collectFields","collected","index","PDFDict","kids","PDFArray","readByteRange","range","describeSignature","byteRange","coveredUntil","subFilter","coverageOf","signature","lastCovered","totalLength","qualifyCoverage","signatures","extractSignatures","document","error","LINK_MAILTO","LINK_ROUTE","LINK_EXTERNAL","resolvePdfLink","url","origin","base","resolve","target","normalizedBase","pathname","isUnderBase","appPath","location","clampPage","pageCount","page","useI18n","formatDate","date","signerName","_createElementVNode","_hoisted_1","_openBlock","_createElementBlock","_Fragment","_renderList","__props","_hoisted_2","_hoisted_3","_toDisplayString","_createVNode","_unref","PrimeTag","_hoisted_4","_createTextVNode","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_sfc_main","VuePDF","PdfSignaturePanel","Button","ProgressSpinner","Divider","Tag","InputNumber","Dialog","DataTable","Column","Tooltip","selectionStore","useSelectionStore","newValue","wantedPage","menuDiff","widthScale","heightScale","usePDF","buildPdfSource","pageValue","pageNumber","newQuery","pdfDoc","locked","link","path","unlockedCount","fieldObjects","data","trackedValue","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_18","_hoisted_21","$options","$data","_normalizeClass","_component_PrimeButton","_ctx","_component_PrimeInputNumber","$event","_createBlock","_component_PrimeDivider","_cache","$props","_hoisted_17","_component_PrimeTag","_hoisted_19","_component_VuePDF","_hoisted_20","pageItem","_component_PrimeProgressSpinner","_component_PrimeDialog","_component_PrimeDataTable","_component_PrimeColumn","_component_PdfSignaturePanel"],"mappings":"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"}
1
+ {"version":3,"file":"PDFComponent-CUgH5A5P.js","sources":["../src/services/PdfFormService.js","../src/services/PdfSignatureService.js","../src/services/PdfLinkService.js","../src/components/viewer/PdfSignaturePanel.vue","../src/components/viewer/PDFComponent.vue"],"sourcesContent":["/*\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\nimport { PDFDocument } from \"pdf-lib\";\n\n/**\n * Set or clear the ReadOnly flag (/Ff bit 1) on the form fields of a PDF.\n *\n * The ReadOnly flag is a rendering hint, not a protection: pdf.js turns a\n * read-only widget into a disabled input (`element.disabled = data.readOnly`),\n * and any editor — including this service — can flip it back. It states an\n * intention; it does not enforce it.\n *\n * pdf.js can only write field *values* (`saveDocument()`), so rewriting the\n * AcroForm structure goes through pdf-lib. Metadata is left alone\n * (`updateMetadata: false`): changing the fields' flags is not a reason to\n * rewrite the document's Producer and modification date.\n *\n * ReadOnly may be inherited from a parent field; pdf-lib reads `/Ff` through\n * the inheritance chain but writes it on the terminal field, whose own value\n * then takes precedence — so writing the terminal fields is enough.\n *\n * @param {Uint8Array|ArrayBuffer} pdfBytes the document as loaded\n * @param {boolean} readOnly wanted state of the fields\n * @returns {Promise<{bytes: Uint8Array|null, count: number}>} the rewritten\n * document and the number of fields changed, or null bytes when every field\n * was already in the wanted state\n */\nasync function setFormFieldsReadOnly(pdfBytes, readOnly) {\n const doc = await PDFDocument.load(pdfBytes, {\n ignoreEncryption: true,\n updateMetadata: false,\n });\n\n const fields = doc\n .getForm()\n .getFields()\n .filter((field) => field.isReadOnly() !== readOnly);\n\n if (fields.length === 0) {\n return { bytes: null, count: 0 };\n }\n\n for (const field of fields) {\n if (readOnly) {\n field.enableReadOnly();\n } else {\n field.disableReadOnly();\n }\n }\n\n return { bytes: await doc.save(), count: fields.length };\n}\n\n/**\n * Make every field of a form fillable again.\n *\n * A form whose fields are all flagged ReadOnly looks broken rather than\n * protected — inert inputs, no message — a common accident with forms exported\n * from LibreOffice Writer.\n *\n * @param {Uint8Array|ArrayBuffer} pdfBytes the document as loaded\n * @returns {Promise<{bytes: Uint8Array|null, unlockedCount: number}>} null\n * bytes when no field was locked\n */\nexport async function unlockFormFields(pdfBytes) {\n const { bytes, count } = await setFormFieldsReadOnly(pdfBytes, false);\n return { bytes, unlockedCount: count };\n}\n\n/**\n * Mark every field of a form as read-only, to state that it is final.\n *\n * @param {Uint8Array|ArrayBuffer} pdfBytes the document as loaded, values\n * included — lock the bytes returned by pdf.js `saveDocument()` to keep what\n * was filled in\n * @returns {Promise<{bytes: Uint8Array|null, lockedCount: number}>} null bytes\n * when every field was already read-only\n */\nexport async function lockFormFields(pdfBytes) {\n const { bytes, count } = await setFormFieldsReadOnly(pdfBytes, true);\n return { bytes, lockedCount: count };\n}\n","/*\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\nimport { fromBER } from \"asn1js\";\nimport {\n PDFArray,\n PDFDict,\n PDFDocument,\n PDFHexString,\n PDFName,\n PDFString,\n} from \"pdf-lib\";\nimport { ContentInfo, SignedData, TSTInfo } from \"pkijs\";\n\nconst OID_COMMON_NAME = \"2.5.4.3\";\nconst OID_ORGANIZATION = \"2.5.4.10\";\nconst OID_SIGNATURE_TIMESTAMP = \"1.2.840.113549.1.9.16.2.14\";\n\nconst toHex = (view) =>\n Array.from(view, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\nconst relativeName = (name, oid) => {\n const entry = name?.typesAndValues?.find((item) => item.type === oid);\n return entry ? entry.value.valueBlock.value : null;\n};\n\nconst readSignedData = (value) => {\n const contents = value.lookupMaybe(\n PDFName.of(\"Contents\"),\n PDFHexString,\n PDFString,\n );\n if (!contents) {\n return null;\n }\n try {\n const bytes = contents.asBytes();\n const decoded = fromBER(\n bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength),\n );\n if (decoded.offset === -1) {\n return null;\n }\n const contentInfo = new ContentInfo({ schema: decoded.result });\n return new SignedData({ schema: contentInfo.content });\n } catch {\n return null;\n }\n};\n\nconst signerCertificate = (signedData) => {\n const certificates = (signedData?.certificates ?? []).filter(\n (certificate) => certificate.subject,\n );\n const serial =\n signedData?.signerInfos?.[0]?.sid?.serialNumber?.valueBlock?.valueHexView;\n if (!serial) {\n return certificates[0] ?? null;\n }\n const wanted = toHex(serial);\n return (\n certificates.find(\n (certificate) =>\n toHex(certificate.serialNumber.valueBlock.valueHexView) === wanted,\n ) ??\n certificates[0] ??\n null\n );\n};\n\nconst readTimestampDate = (signedData) => {\n const attribute =\n signedData?.signerInfos?.[0]?.unsignedAttrs?.attributes?.find(\n (entry) => entry.type === OID_SIGNATURE_TIMESTAMP,\n );\n if (!attribute?.values?.length) {\n return null;\n }\n try {\n const token = new SignedData({\n schema: new ContentInfo({ schema: attribute.values[0] }).content,\n });\n const content = token.encapContentInfo?.eContent;\n if (!content) {\n return null;\n }\n const view = content.valueBlock.valueHexView;\n const decoded = fromBER(\n view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength),\n );\n if (decoded.offset === -1) {\n return null;\n }\n return new TSTInfo({ schema: decoded.result }).genTime ?? null;\n } catch {\n return null;\n }\n};\n\nconst describeCertificate = (certificate) => {\n if (!certificate) {\n return null;\n }\n return {\n commonName: relativeName(certificate.subject, OID_COMMON_NAME),\n organization: relativeName(certificate.subject, OID_ORGANIZATION),\n issuerCommonName: relativeName(certificate.issuer, OID_COMMON_NAME),\n serialNumber: toHex(certificate.serialNumber.valueBlock.valueHexView),\n validFrom: certificate.notBefore.value,\n validUntil: certificate.notAfter.value,\n };\n};\n\nconst readText = (dict, key) => {\n const value = dict.lookupMaybe(PDFName.of(key), PDFString, PDFHexString);\n return value ? value.decodeText() : null;\n};\n\nconst STANDARD_BY_SUB_FILTER = {\n \"ETSI.CAdES.detached\": \"PADES\",\n \"ETSI.RFC3161\": \"TIMESTAMP\",\n \"adbe.pkcs7.detached\": \"ADOBE_PKCS7\",\n \"adbe.pkcs7.sha1\": \"ADOBE_PKCS7\",\n \"adbe.x509.rsa_sha1\": \"ADOBE_X509\",\n};\n\nconst readDate = (dict, key) => {\n const value = dict.lookupMaybe(PDFName.of(key), PDFString, PDFHexString);\n if (!value) {\n return null;\n }\n try {\n return value.decodeDate();\n } catch {\n return null;\n }\n};\n\nconst collectFields = (fields, collected = []) => {\n for (let index = 0; index < fields.size(); index += 1) {\n const field = fields.lookupMaybe(index, PDFDict);\n if (!field) {\n continue;\n }\n collected.push(field);\n const kids = field.lookupMaybe(PDFName.of(\"Kids\"), PDFArray);\n if (kids) {\n collectFields(kids, collected);\n }\n }\n return collected;\n};\n\nconst readByteRange = (value) => {\n const range = value.lookupMaybe(PDFName.of(\"ByteRange\"), PDFArray);\n if (!range || range.size() < 4) {\n return null;\n }\n return range.asArray().map((entry) => entry.asNumber());\n};\n\nconst describeSignature = (field, value) => {\n const signedData = readSignedData(value);\n const byteRange = readByteRange(value);\n const coveredUntil = byteRange ? byteRange[2] + byteRange[3] : null;\n const subFilter = value\n .lookupMaybe(PDFName.of(\"SubFilter\"), PDFName)\n ?.asString()\n .replace(/^\\//, \"\");\n return {\n fieldName: readText(field, \"T\"),\n declaredName: readText(value, \"Name\"),\n reason: readText(value, \"Reason\"),\n location: readText(value, \"Location\"),\n contactInfo: readText(value, \"ContactInfo\"),\n declaredDate: readDate(value, \"M\"),\n subFilter: subFilter ?? null,\n standard: STANDARD_BY_SUB_FILTER[subFilter] ?? \"UNKNOWN\",\n byteRange,\n coveredUntil,\n certificate: describeCertificate(signerCertificate(signedData)),\n timestampDate: readTimestampDate(signedData),\n };\n};\n\nconst coverageOf = (signature, lastCovered, totalLength) => {\n if (signature.coveredUntil === null) {\n return \"UNKNOWN\";\n }\n if (signature.coveredUntil === totalLength) {\n return \"COMPLETE\";\n }\n if (signature.coveredUntil < lastCovered) {\n return \"SIGNED_AGAIN\";\n }\n return \"MODIFIED_AFTER\";\n};\n\nconst qualifyCoverage = (signatures, totalLength) => {\n const lastCovered = Math.max(\n ...signatures.map((signature) => signature.coveredUntil ?? 0),\n );\n return signatures.map((signature) => ({\n ...signature,\n coverage: coverageOf(signature, lastCovered, totalLength),\n }));\n};\n\n/**\n * Describe the signatures a PDF document carries.\n *\n * @param {Uint8Array} bytes the document as stored, never re-saved\n * @returns {Promise<Array<object>>} one entry per signature, in document order\n */\nexport const extractSignatures = async (bytes) => {\n if (!bytes || bytes.length === 0) {\n return [];\n }\n let document;\n try {\n document = await PDFDocument.load(bytes, {\n ignoreEncryption: true,\n updateMetadata: false,\n });\n } catch (error) {\n console.error(\"Error reading PDF signatures:\", error);\n return [];\n }\n const acroForm = document.catalog.lookupMaybe(\n PDFName.of(\"AcroForm\"),\n PDFDict,\n );\n const fields = acroForm?.lookupMaybe(PDFName.of(\"Fields\"), PDFArray);\n if (!fields) {\n return [];\n }\n const signatures = [];\n for (const field of collectFields(fields)) {\n const type = field.lookupMaybe(PDFName.of(\"FT\"), PDFName);\n if (type?.asString() !== \"/Sig\") {\n continue;\n }\n const value = field.lookupMaybe(PDFName.of(\"V\"), PDFDict);\n if (!value) {\n continue;\n }\n signatures.push(describeSignature(field, value));\n }\n return qualifyCoverage(signatures, bytes.length);\n};\n","/**\n * Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\n\nexport const LINK_MAILTO = \"mailto\";\nexport const LINK_ROUTE = \"route\";\nexport const LINK_EXTERNAL = \"external\";\n\n/**\n * Decide how a hyperlink found in a PDF is followed.\n *\n * A link pointing at a page of the running application (same origin, under\n * the router base, matching a route) is followed inside the application;\n * anything else is external.\n *\n * @param {string} url - Hyperlink carried by the PDF annotation\n * @param {Object} context\n * @param {string} context.origin - Origin of the running application\n * @param {string} [context.base] - Router history base, e.g. \"/marches\"\n * @param {Function} [context.resolve] - Router resolve function\n * @returns {{type: string, url?: string, location?: Object}}\n */\nexport function resolvePdfLink(url, { origin, base = \"\", resolve } = {}) {\n if (url.startsWith(\"mailto:\")) {\n return { type: LINK_MAILTO, url };\n }\n\n let target;\n try {\n target = new URL(url, origin);\n } catch {\n return { type: LINK_EXTERNAL, url };\n }\n\n const normalizedBase = base.replace(/\\/+$/, \"\");\n const { pathname } = target;\n const isUnderBase =\n normalizedBase === \"\" ||\n pathname === normalizedBase ||\n pathname.startsWith(`${normalizedBase}/`);\n\n if (!resolve || target.origin !== origin || !isUnderBase) {\n return { type: LINK_EXTERNAL, url };\n }\n\n const appPath = pathname.slice(normalizedBase.length) || \"/\";\n const location = resolve(`${appPath}${target.search}${target.hash}`);\n if (!location?.matched?.length) {\n return { type: LINK_EXTERNAL, url };\n }\n return { type: LINK_ROUTE, location };\n}\n\n/**\n * Page number requested by a route query, clamped to the document.\n *\n * @param {*} value - Raw `page` query value\n * @param {number} pageCount - Number of pages of the document\n * @returns {number|null} null when the value is not a number\n */\nexport function clampPage(value, pageCount) {\n const page = parseInt(value, 10);\n if (isNaN(page)) {\n return null;\n }\n return Math.min(Math.max(page, 1), pageCount);\n}\n","<!--\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n-->\n\n<template>\n <ul class=\"pdf-signature-list\">\n <li\n v-for=\"(signature, index) in signatures\"\n :key=\"index\"\n class=\"pdf-signature-entry\"\n >\n <div class=\"pdf-signature-header\">\n <p class=\"pdf-signature-name\">{{ signerName(signature) }}</p>\n <PrimeTag\n :value=\"t(`pdf.signature.standard.${signature.standard}`)\"\n :severity=\"signature.standard === 'PADES' ? 'info' : 'secondary'\"\n />\n </div>\n <p\n v-if=\"signature.coverage === 'MODIFIED_AFTER'\"\n class=\"pdf-signature-warning\"\n >\n <i class=\"ri-error-warning-line\" aria-hidden=\"true\" />\n {{ t(\"pdf.signature.modifiedAfter\") }}\n </p>\n <p\n v-else-if=\"signature.coverage === 'SIGNED_AGAIN'\"\n class=\"pdf-signature-note\"\n >\n {{ t(\"pdf.signature.signedAgain\") }}\n </p>\n <dl class=\"pdf-signature-details\">\n <template v-if=\"signature.declaredDate\">\n <dt>{{ t(\"pdf.signature.declaredDate\") }}</dt>\n <dd>{{ formatDate(signature.declaredDate) }}</dd>\n </template>\n <template v-if=\"signature.timestampDate\">\n <dt class=\"pdf-signature-timestamp\">\n {{ t(\"pdf.signature.timestampDate\") }}\n </dt>\n <dd>{{ formatDate(signature.timestampDate) }}</dd>\n </template>\n <template v-if=\"signature.reason\">\n <dt>{{ t(\"pdf.signature.reason\") }}</dt>\n <dd>{{ signature.reason }}</dd>\n </template>\n <template v-if=\"signature.location\">\n <dt>{{ t(\"pdf.signature.location\") }}</dt>\n <dd>{{ signature.location }}</dd>\n </template>\n <template v-if=\"signature.certificate?.organization\">\n <dt>{{ t(\"pdf.signature.organization\") }}</dt>\n <dd>{{ signature.certificate.organization }}</dd>\n </template>\n <template v-if=\"signature.certificate?.issuerCommonName\">\n <dt>{{ t(\"pdf.signature.issuer\") }}</dt>\n <dd>{{ signature.certificate.issuerCommonName }}</dd>\n </template>\n <template v-if=\"signature.certificate?.validUntil\">\n <dt>{{ t(\"pdf.signature.certificateValidity\") }}</dt>\n <dd>\n {{\n t(\"pdf.signature.certificateValidityValue\", {\n from: formatDate(signature.certificate.validFrom),\n until: formatDate(signature.certificate.validUntil),\n })\n }}\n </dd>\n </template>\n </dl>\n </li>\n </ul>\n <p class=\"pdf-signature-disclaimer\">\n <i class=\"ri-information-line\" aria-hidden=\"true\" />\n {{ t(\"pdf.signature.notVerified\") }}\n </p>\n</template>\n\n<script setup>\nimport { useI18n } from \"vue-i18n\";\nimport PrimeTag from \"primevue/tag\";\n\ndefineProps({\n signatures: {\n type: Array,\n default: () => [],\n },\n});\n\nconst { t } = useI18n();\n\nconst formatDate = (date) => (date ? date.toLocaleString() : null);\n\nconst signerName = (signature) =>\n signature.declaredName ||\n signature.certificate?.commonName ||\n t(\"pdf.signature.unknownSigner\");\n</script>\n\n<style scoped>\n.pdf-signature-list {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.pdf-signature-entry {\n border-bottom: 1px solid var(--p-content-border-color);\n padding: 0.75rem 0;\n}\n\n.pdf-signature-entry:last-child {\n border-bottom: none;\n}\n\n.pdf-signature-header {\n align-items: center;\n display: flex;\n gap: 0.5rem;\n justify-content: space-between;\n}\n\n.pdf-signature-name {\n font-weight: 600;\n margin: 0;\n}\n\n.pdf-signature-warning {\n align-items: center;\n color: var(--p-orange-600);\n display: flex;\n gap: 0.25rem;\n margin: 0.25rem 0 0;\n}\n\n.pdf-signature-note {\n color: var(--p-text-muted-color);\n margin: 0.25rem 0 0;\n}\n\n.pdf-signature-details {\n display: grid;\n grid-template-columns: minmax(8rem, auto) 1fr;\n gap: 0.125rem 1rem;\n margin: 0.5rem 0 0;\n}\n\n.pdf-signature-details dt {\n color: var(--p-text-muted-color);\n}\n\n.pdf-signature-details dd {\n margin: 0;\n}\n\n.pdf-signature-disclaimer {\n align-items: center;\n color: var(--p-text-muted-color);\n display: flex;\n gap: 0.25rem;\n margin: 1rem 0 0;\n}\n</style>\n","<!--\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n-->\n\n<template>\n <div\n ref=\"pdfComponent\"\n class=\"pdf-component-root\"\n :class=\"{\n 'outline-none': isPdfConsultationPage,\n }\"\n tabindex=\"0\"\n >\n <PrimeProgressSpinner\n v-if=\"!pdf\"\n class=\"loadingRendition\"\n aria-label=\"Loading\"\n />\n <div v-else>\n <div class=\"pdf-toolbar\" :class=\"{ 'pdf-toolbar--small': isSmallScreen }\">\n <div v-if=\"isSinglePageDisplayed\" class=\"pdf-toolbar-group\">\n <PrimeButton\n v-tooltip=\"$t('pdf.previousPage')\"\n :aria-label=\"$t('pdf.previousPage')\"\n icon=\"ri-arrow-left-line\"\n class=\"pdf-toolbar-btn\"\n :disabled=\"isLeftButtonDisable\"\n @click=\"previousPage()\"\n />\n <span class=\"pdf-page-indicator\">\n <PrimeInputNumber\n v-model=\"page\"\n :aria-label=\"$t('pdf.changePage')\"\n fluid\n :min=\"1\"\n :max=\"pages\"\n :disabled=\"pages === 1\"\n class=\"pageInputNumber\"\n />\n {{ $t(\"pdf.on\") }} {{ pages }}\n </span>\n <PrimeButton\n v-tooltip=\"$t('pdf.nextPage')\"\n :aria-label=\"$t('pdf.nextPage')\"\n icon=\"ri-arrow-right-line\"\n class=\"pdf-toolbar-btn\"\n :disabled=\"isRightButtonDisable\"\n @click=\"nextPage()\"\n />\n </div>\n <PrimeDivider\n v-if=\"pages > 1\"\n layout=\"vertical\"\n class=\"pdfActionDivider\"\n />\n <div v-if=\"pages > 1\" class=\"pdf-toolbar-section\">\n <div class=\"pdf-toolbar-group\">\n <div>\n <PrimeButton\n v-if=\"isSinglePageDisplayed\"\n v-tooltip.top=\"$t('pdf.showAllPages')\"\n :aria-label=\"$t('pdf.showAllPages')\"\n icon=\"ri-file-copy-2-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"changePdfDisplay()\"\n />\n <PrimeButton\n v-else\n v-tooltip.top=\"$t('pdf.showPageByPage')\"\n :aria-label=\"$t('pdf.showPageByPage')\"\n icon=\"ri-file-list-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"changePdfDisplay()\"\n />\n </div>\n </div>\n </div>\n <PrimeDivider layout=\"vertical\" class=\"pdfActionDivider\" />\n <div class=\"pdf-toolbar-section\">\n <div class=\"pdf-toolbar-group\">\n <PrimeButton\n v-tooltip=\"$t('pdf.rotationLeft')\"\n :aria-label=\"$t('pdf.rotationLeft')\"\n icon=\"ri-arrow-go-back-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"rotation = rotation - 90\"\n />\n <PrimeButton\n v-tooltip=\"$t('pdf.rotationRigth')\"\n :aria-label=\"$t('pdf.rotationRigth')\"\n icon=\"ri-arrow-go-forward-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"rotation = rotation + 90\"\n />\n </div>\n </div>\n <PrimeDivider layout=\"vertical\" class=\"pdfActionDivider\" />\n <div class=\"pdf-toolbar-section\">\n <div class=\"pdf-toolbar-group\">\n <PrimeButton\n v-tooltip=\"$t('pdf.dezoom')\"\n :aria-label=\"$t('pdf.dezoom')\"\n icon=\"ri-zoom-out-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"zoomOut\"\n />\n <PrimeButton\n v-tooltip=\"$t('pdf.zoom')\"\n :aria-label=\"$t('pdf.zoom')\"\n icon=\"ri-zoom-in-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"zoomIn\"\n />\n </div>\n </div>\n <PrimeDivider layout=\"vertical\" class=\"pdfActionDivider\" />\n <div class=\"pdf-toolbar-section\">\n <div class=\"pdf-toolbar-group\">\n <PrimeButton\n v-tooltip.left=\"$t('pdf.adaptToPage')\"\n :aria-label=\"$t('pdf.adaptToPage')\"\n icon=\"ri-expand-vertical-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"fitAuto()\"\n />\n <PrimeButton\n v-tooltip.left=\"$t('pdf.adaptToWidth')\"\n :aria-label=\"$t('pdf.adaptToWidth')\"\n icon=\"ri-expand-horizontal-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"fitWidthAuto()\"\n />\n </div>\n </div>\n <template v-if=\"hasSignatures\">\n <PrimeDivider layout=\"vertical\" class=\"pdfActionDivider\" />\n <div class=\"pdf-toolbar-section\">\n <div class=\"pdf-toolbar-group\">\n <PrimeButton\n v-tooltip=\"$t('pdf.showSignatures')\"\n :aria-label=\"$t('pdf.showSignatures')\"\n icon=\"ri-certificate-2-line\"\n class=\"pdf-toolbar-btn\"\n @click=\"showSignaturesDialog = true\"\n />\n </div>\n </div>\n </template>\n <template v-if=\"hasFormFields && !hideForms\">\n <PrimeDivider layout=\"vertical\" class=\"pdfActionDivider\" />\n <div class=\"flex flex-column align-items-center\">\n <div class=\"flex gap-1 m-2\">\n <!--\n The icon shows the state of the document, the tooltip and the\n accessible name state what the click does: a closed padlock\n means the fields are locked, and clicking it unlocks them.\n -->\n <PrimeButton\n v-if=\"canSaveForm && hasReadOnlyFields\"\n v-tooltip=\"\n isFormDirty\n ? $t('pdf.unlockFormBlocked')\n : $t('pdf.unlockForm')\n \"\n :aria-label=\"$t('pdf.unlockForm')\"\n icon=\"ri-lock-line\"\n severity=\"warning\"\n class=\"text-xl p-1\"\n :disabled=\"isFormDirty || isUnlocking\"\n :loading=\"isUnlocking\"\n @click=\"unlockForm()\"\n />\n <PrimeButton\n v-if=\"canSaveForm && !hasReadOnlyFields\"\n v-tooltip=\"$t('pdf.lockForm')\"\n :aria-label=\"$t('pdf.lockForm')\"\n icon=\"ri-lock-unlock-line\"\n class=\"text-xl p-1\"\n :disabled=\"isLocking || isSaving\"\n :loading=\"isLocking\"\n @click=\"$emit('lockForm')\"\n />\n <PrimeButton\n v-if=\"canSaveForm\"\n v-tooltip=\"$t('pdf.saveForm')\"\n :aria-label=\"$t('pdf.saveForm')\"\n icon=\"ri-save-line\"\n severity=\"info\"\n class=\"text-xl p-1\"\n :disabled=\"!isFormDirty || isSaving\"\n :loading=\"isSaving\"\n @click=\"$emit('saveForm')\"\n />\n <PrimeButton\n v-tooltip=\"$t('pdf.cancelForm')\"\n :aria-label=\"$t('pdf.cancelForm')\"\n icon=\"ri-close-line\"\n class=\"text-xl p-1\"\n :disabled=\"!isFormDirty\"\n @click=\"cancelForm()\"\n />\n <PrimeButton\n v-tooltip=\"$t('pdf.formFieldsInfo')\"\n :aria-label=\"$t('pdf.formFieldsInfo')\"\n icon=\"ri-information-line\"\n class=\"text-xl p-1\"\n @click=\"showFormFieldsInfo()\"\n />\n </div>\n </div>\n </template>\n </div>\n <div class=\"pdf-header\">\n <div v-if=\"isPdfConsultationPage\" class=\"pdf-title-container\">\n <h3 class=\"consultation-title\">\n {{ getFileName }}\n </h3>\n <PrimeTag\n v-if=\"$route.params.versionId\"\n class=\"pdf-version-tag\"\n :value=\"getVersionNumber\"\n />\n </div>\n </div>\n <div v-if=\"isSinglePageDisplayed\" class=\"pdf-single-page\">\n <VuePDF\n class=\"pdf-canvas\"\n :pdf=\"pdf\"\n :page=\"page\"\n :rotation=\"rotation\"\n :scale=\"scale\"\n :text-layer=\"textLayer\"\n :annotation-layer=\"annotationLayer\"\n :hide-forms=\"hideForms\"\n @annotation=\"onAnnotation\"\n />\n </div>\n <div v-else class=\"pdf-all-pages\">\n <div v-for=\"pageItem in pages\" :key=\"pageItem\" class=\"pdf-page-item\">\n <VuePDF\n :pdf=\"pdf\"\n :page=\"pageItem\"\n :rotation=\"rotation\"\n :scale=\"scale\"\n :text-layer=\"textLayer\"\n :annotation-layer=\"annotationLayer\"\n :hide-forms=\"hideForms\"\n @annotation=\"onAnnotation\"\n />\n <span class=\"pdf-page-number\">\n {{\n $t(\"pdf.currentPagination\", { page: pageItem, pages: pages })\n }}</span\n >\n </div>\n </div>\n </div>\n <PrimeDialog\n v-model:visible=\"showFormFieldsDialog\"\n :header=\"$t('pdf.formFieldsInfoTitle')\"\n modal\n class=\"w-8\"\n >\n <PrimeDataTable :value=\"formFieldsData\" striped-rows>\n <PrimeColumn field=\"name\" :header=\"$t('pdf.formFieldName')\" sortable />\n <PrimeColumn field=\"type\" :header=\"$t('pdf.formFieldType')\" sortable />\n <PrimeColumn\n field=\"value\"\n :header=\"$t('pdf.formFieldValue')\"\n sortable\n />\n </PrimeDataTable>\n </PrimeDialog>\n <PrimeDialog\n v-model:visible=\"showSignaturesDialog\"\n :header=\"$t('pdf.signaturePanelTitle')\"\n modal\n :style=\"{ width: '95vw', maxWidth: '40rem' }\"\n >\n <PdfSignaturePanel :signatures=\"signatures\" />\n </PrimeDialog>\n </div>\n</template>\n<script>\nimport { usePDF, VuePDF } from \"@tato30/vue-pdf\";\nimport \"@tato30/vue-pdf/style.css\";\nimport { buildPdfSource } from \"@/services/PdfConfigService.js\";\nimport { lockFormFields, unlockFormFields } from \"@/services/PdfFormService.js\";\nimport { extractSignatures } from \"@/services/PdfSignatureService.js\";\nimport {\n LINK_MAILTO,\n LINK_ROUTE,\n clampPage,\n resolvePdfLink,\n} from \"@/services/PdfLinkService.js\";\nimport PdfSignaturePanel from \"@/components/viewer/PdfSignaturePanel.vue\";\nimport { useSelectionStore } from \"@/stores/selection.js\";\nimport Tooltip from \"primevue/tooltip\";\nimport Button from \"primevue/button\";\nimport ProgressSpinner from \"primevue/progressspinner\";\nimport Divider from \"primevue/divider\";\nimport Tag from \"primevue/tag\";\nimport InputNumber from \"primevue/inputnumber\";\nimport Dialog from \"primevue/dialog\";\nimport DataTable from \"primevue/datatable\";\nimport Column from \"primevue/column\";\n\nexport default {\n name: \"PDFComponent\",\n components: {\n VuePDF,\n PdfSignaturePanel,\n PrimeButton: Button,\n PrimeProgressSpinner: ProgressSpinner,\n PrimeDivider: Divider,\n PrimeTag: Tag,\n PrimeInputNumber: InputNumber,\n PrimeDialog: Dialog,\n PrimeDataTable: DataTable,\n PrimeColumn: Column,\n },\n directives: {\n tooltip: Tooltip,\n },\n emits: [\n \"formDirtyChange\",\n \"saveForm\",\n \"lockForm\",\n \"formUnlocked\",\n \"formUnlockError\",\n ],\n props: {\n url: {\n type: String,\n default: null,\n },\n textLayer: {\n type: Boolean,\n default: false,\n },\n annotationLayer: {\n type: Boolean,\n default: false,\n },\n hideForms: {\n type: Boolean,\n default: false,\n },\n canSaveForm: {\n type: Boolean,\n default: false,\n },\n },\n data() {\n return {\n pdf: null,\n pages: null,\n page: 1,\n rotation: 0,\n scale: 1,\n defaultViewport: {\n width: 0,\n height: 0,\n },\n isSinglePageDisplayed: true,\n isFormDirty: false,\n isSaving: false,\n isUnlocking: false,\n isLocking: false,\n hasFormFields: false,\n hasReadOnlyFields: false,\n unlockedFormBytes: null,\n showFormFieldsDialog: false,\n formFieldsData: [],\n formFieldValues: {},\n signatures: [],\n showSignaturesDialog: false,\n };\n },\n computed: {\n getVersionNumber() {\n return `Version ${this.$route.params.versionId}`;\n },\n getFileName() {\n const selectionStore = useSelectionStore();\n if (selectionStore.files.length > 0) {\n return selectionStore.files[0].name;\n } else {\n return \"\";\n }\n },\n isLeftButtonDisable() {\n return this.page === 1;\n },\n isRightButtonDisable() {\n return this.page === this.pages;\n },\n isPdfConsultationPage() {\n return this.$route.name.startsWith(\"consultation-pdf\");\n },\n isSmallScreen() {\n return window.innerWidth <= 920;\n },\n hasSignatures() {\n return this.signatures.length > 0;\n },\n },\n watch: {\n pages(newValue) {\n if (this.isPdfConsultationPage) {\n const wantedPage = parseInt(this.$route.query.page) || 1;\n this.page =\n wantedPage > newValue ? newValue : wantedPage < 1 ? 1 : wantedPage;\n this.changePageUrl(this.page);\n }\n if (newValue) {\n this.checkFormFields();\n this.checkSignatures();\n }\n },\n page(newValue) {\n if (this.isPdfConsultationPage) {\n this.changePageUrl(newValue);\n }\n },\n },\n mounted() {\n this.focusOnPDFComponent();\n this.loadPDF();\n this.setDefaultViewport();\n this.fitAuto();\n },\n unmounted() {\n if (this.pdf) {\n this.pdf.destroy();\n if (this.pdf) {\n delete this.pdf;\n }\n }\n },\n methods: {\n changePdfDisplay() {\n this.loadPDF();\n this.isSinglePageDisplayed = !this.isSinglePageDisplayed;\n if (this.isPdfConsultationPage) {\n const url = new URL(window.location.href);\n if (this.isSinglePageDisplayed) {\n this.changePageUrl(this.page);\n } else {\n url.searchParams.delete(\"page\");\n window.history.replaceState(history.state, \"\", url.toString());\n }\n }\n if (this.isSinglePageDisplayed) {\n this.focusOnPDFComponent();\n }\n },\n setDefaultViewport() {\n if (this.isSmallScreen) {\n this.defaultViewport.width = 300;\n this.defaultViewport.height = 200;\n } else {\n if (this.$route.name === \"consultation-pdf\") {\n this.defaultViewport.width = 700;\n this.defaultViewport.height = 500;\n } else {\n this.defaultViewport.width = 900;\n this.defaultViewport.height = 700;\n }\n }\n },\n\n menuDiff() {\n const SM_SIZE = 640;\n const MD_SIZE = 768;\n const LG_SIZE = 1024;\n\n const SM_MENU_SIZE = 200;\n const MD_MENU_SIZE = 250;\n const LG_MENU_SIZE = 300;\n const XL_MENU_SIZE = 350;\n\n let menuDiff;\n if (window.innerWidth <= SM_SIZE) {\n menuDiff = SM_MENU_SIZE;\n } else if (window.innerWidth <= MD_SIZE) {\n menuDiff = MD_MENU_SIZE;\n } else if (window.innerWidth <= LG_SIZE) {\n menuDiff = LG_MENU_SIZE;\n } else {\n menuDiff = XL_MENU_SIZE;\n }\n return menuDiff;\n },\n\n pageWidthScale() {\n if (!this.defaultViewport.width) {\n return 1;\n }\n let availableSize = window.innerWidth - this.menuDiff();\n return availableSize / this.defaultViewport.width;\n },\n\n pageHeightScale() {\n if (!this.defaultViewport.height) {\n return 1;\n }\n let availableSize = window.innerHeight - this.menuDiff();\n return (availableSize / this.defaultViewport.height) * 0.8;\n },\n zoomIn() {\n this.scale = this.scale < 2 ? this.scale + 0.25 : this.scale;\n },\n zoomOut() {\n this.scale = this.scale > 0.25 ? this.scale - 0.25 : this.scale;\n },\n fitAuto() {\n const widthScale = this.pageWidthScale();\n const heightScale = this.pageHeightScale();\n this.scale = Math.min(widthScale, heightScale);\n },\n fitWidthAuto() {\n this.scale = this.pageWidthScale();\n },\n previousPage() {\n if (!this.isLeftButtonDisable) {\n this.page = this.page > 1 ? this.page - 1 : this.page;\n }\n },\n nextPage() {\n if (!this.isRightButtonDisable) {\n this.page = this.page < this.pages ? this.page + 1 : this.page;\n }\n },\n /**\n * Source handed to pdf.js: the node URL, or the in-memory bytes produced by\n * unlockForm(). pdf.js transfers the `data` buffer to its worker, which\n * detaches it, so every load gets its own copy — otherwise a second load\n * (cancelForm, changePdfDisplay) would fail on a detached ArrayBuffer.\n *\n * @returns {string|{data: Uint8Array}}\n */\n currentPdfSource() {\n return this.unlockedFormBytes\n ? { data: this.unlockedFormBytes.slice() }\n : this.url;\n },\n loadPDF() {\n if (!this.url) {\n console.error(\"URL is not defined\");\n return;\n }\n this.hasFormFields = false;\n this.hasReadOnlyFields = false;\n this.formFieldValues = {};\n this.signatures = [];\n\n const document = usePDF(buildPdfSource(this.currentPdfSource()));\n this.pdf = document.pdf;\n this.pages = document.pages;\n // this.info = document.info\n },\n changePageUrl(pageValue) {\n if (pageValue !== 0) {\n const pageNumber = parseInt(pageValue, 10);\n if (!isNaN(pageNumber)) {\n const newQuery = new URLSearchParams(window.location.search);\n newQuery.set(\"page\", pageNumber);\n window.history.replaceState(\n history.state,\n \"\",\n `${window.location.pathname}?${newQuery.toString()}`,\n );\n }\n }\n },\n focusOnPDFComponent() {\n if (this.$refs.pdfComponent) {\n this.$refs.pdfComponent.focus();\n }\n },\n async getFormBytes() {\n if (!this.pdf) {\n return null;\n }\n const pdfDoc = await this.pdf.promise;\n try {\n return await pdfDoc.saveDocument();\n } catch (error) {\n console.error(\"Error saving PDF document:\", error);\n return await pdfDoc.getData();\n }\n },\n resetFormDirty() {\n this.isFormDirty = false;\n this.$emit(\"formDirtyChange\", false);\n },\n setSaving(value) {\n this.isSaving = value;\n },\n setLocking(value) {\n this.isLocking = value;\n },\n /**\n * Bytes of the form with the values typed in the viewer kept and every\n * field flagged read-only, ready to be stored as a new version.\n *\n * @returns {Promise<Uint8Array|null>} null when the document is not loaded\n */\n async getLockedFormBytes() {\n const bytes = await this.getFormBytes();\n if (!bytes) {\n return null;\n }\n // No field left to flag: keep the filled bytes, so saving still records\n // what the user typed.\n const { bytes: locked } = await lockFormFields(bytes);\n return locked ?? bytes;\n },\n onAnnotation(value) {\n if (!value) {\n return;\n }\n switch (value.type) {\n case \"link\":\n this.followLink(value.data.url);\n break;\n case \"internal-link\":\n this.goToPage(value.data.referencedPage);\n break;\n case \"form-text\":\n this.formFieldValues[value.data.fieldName] = value.data.value;\n if (!this.isFormDirty) {\n this.isFormDirty = true;\n this.$emit(\"formDirtyChange\", true);\n }\n break;\n case \"form-checkbox\":\n this.formFieldValues[value.data.fieldName] = value.data.checked;\n if (!this.isFormDirty) {\n this.isFormDirty = true;\n this.$emit(\"formDirtyChange\", true);\n }\n break;\n case \"form-select\":\n this.formFieldValues[value.data.fieldName] = value.data.value;\n if (!this.isFormDirty) {\n this.isFormDirty = true;\n this.$emit(\"formDirtyChange\", true);\n }\n break;\n case \"form-radio\":\n this.formFieldValues[value.data.fieldName] = value.data.value;\n if (!this.isFormDirty) {\n this.isFormDirty = true;\n this.$emit(\"formDirtyChange\", true);\n }\n break;\n case \"form-button\":\n default:\n console.log(\"Annotation Event \", value);\n }\n },\n followLink(url) {\n const link = resolvePdfLink(url, {\n origin: window.location.origin,\n base: this.$router?.options.history.base,\n resolve: this.$router ? (path) => this.$router.resolve(path) : null,\n });\n switch (link.type) {\n case LINK_MAILTO:\n window.location.href = link.url;\n break;\n case LINK_ROUTE:\n if (link.location.path === this.$route.path) {\n this.goToPage(link.location.query.page);\n } else {\n this.$router.push(link.location.fullPath);\n }\n break;\n default:\n window.open(link.url, \"_blank\", \"noreferrer\");\n }\n },\n goToPage(value) {\n const page = clampPage(value, this.pages);\n if (page === null) {\n return;\n }\n this.page = page;\n if (!this.isSinglePageDisplayed) {\n this.$el\n .querySelectorAll(\".pdf-page-item\")\n [page - 1]?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n },\n async checkSignatures() {\n if (!this.pdf) {\n this.signatures = [];\n return;\n }\n try {\n const pdfDoc = await this.pdf.promise;\n this.signatures = await extractSignatures(await pdfDoc.getData());\n } catch (error) {\n console.error(\"Error reading signatures:\", error);\n this.signatures = [];\n }\n },\n async checkFormFields() {\n if (!this.pdf) {\n this.hasFormFields = false;\n this.hasReadOnlyFields = false;\n return;\n }\n try {\n const pdfDoc = await this.pdf.promise;\n const fields = await pdfDoc.getFieldObjects();\n this.hasFormFields = fields !== null && Object.keys(fields).length > 0;\n // pdf.js exposes the ReadOnly flag as `editable: !readOnly`, and renders\n // a read-only widget as a disabled input. A form entirely made of such\n // fields looks broken rather than protected, hence the unlock action.\n // Signature widgets carry no `editable` and are left out.\n this.hasReadOnlyFields = Object.values(fields ?? {})\n .flat()\n .some((field) => field.editable === false);\n } catch (error) {\n console.error(\"Error checking form fields:\", error);\n this.hasFormFields = false;\n this.hasReadOnlyFields = false;\n }\n },\n /**\n * Drop the ReadOnly flags of the form so its fields become fillable.\n *\n * The change stays local: the viewer is reloaded from the rewritten bytes\n * and nothing is sent to the repository. The unlocked structure reaches\n * Alfresco only if the user then saves the filled form, through the regular\n * save path.\n */\n async unlockForm() {\n if (!this.pdf || this.isUnlocking) {\n return;\n }\n this.isUnlocking = true;\n try {\n const pdfDoc = await this.pdf.promise;\n // getData() returns the document as loaded, without the values typed in\n // the viewer — which is why unlocking is barred once the form is dirty.\n const { bytes, unlockedCount } = await unlockFormFields(\n await pdfDoc.getData(),\n );\n if (!bytes) {\n this.hasReadOnlyFields = false;\n return;\n }\n this.unlockedFormBytes = bytes;\n this.loadPDF();\n this.$emit(\"formUnlocked\", unlockedCount);\n } catch (error) {\n console.error(\"Error unlocking PDF form fields:\", error);\n this.$emit(\"formUnlockError\", error);\n } finally {\n this.isUnlocking = false;\n }\n },\n cancelForm() {\n this.loadPDF();\n this.resetFormDirty();\n },\n async showFormFieldsInfo() {\n if (!this.pdf) {\n return;\n }\n try {\n const pdfDoc = await this.pdf.promise;\n const fieldObjects = await pdfDoc.getFieldObjects();\n if (!fieldObjects) {\n this.formFieldsData = [];\n } else {\n const data = [];\n for (const [name, fields] of Object.entries(fieldObjects)) {\n for (const field of fields) {\n const trackedValue = this.formFieldValues[name];\n data.push({\n name: name,\n type: field.type,\n value:\n trackedValue !== undefined\n ? trackedValue\n : (field.value ?? \"\"),\n });\n }\n }\n this.formFieldsData = data;\n }\n this.showFormFieldsDialog = true;\n } catch (error) {\n console.error(\"Error getting form fields info:\", error);\n }\n },\n },\n};\n</script>\n<style lang=\"css\" scoped>\n.pdf-component-root {\n flex-grow: 1;\n overflow: visible;\n}\n\n.loadingRendition {\n display: flex;\n margin: 0.5rem auto 0;\n}\n\n.pdf-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 0.25rem;\n}\n\n.pdf-toolbar--small {\n padding-right: 1.5rem;\n}\n\n.pdf-toolbar-group {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n margin: 0.5rem;\n}\n\n.pdf-toolbar-section {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.pdf-toolbar-btn {\n font-size: 1.25rem;\n padding: 0.25rem;\n}\n\n.pdf-page-indicator {\n display: flex;\n align-items: center;\n margin: 0 0.5rem;\n gap: 0.25rem;\n}\n\n.pdfActionDivider {\n margin: 0 0.5rem !important;\n}\n\n.pdf-header {\n display: flex;\n}\n\n.pdf-title-container {\n display: flex;\n margin: 0 auto;\n gap: 0.75rem;\n margin-bottom: 0.75rem;\n}\n\n.pdf-version-tag {\n margin: 0 auto;\n font-size: 1.25rem;\n}\n\n.pdf-single-page {\n display: flex;\n justify-content: center;\n}\n\n.pdf-canvas {\n overflow-y: hidden;\n}\n\n.pdf-all-pages {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 1rem;\n}\n\n.pdf-page-item {\n display: flex;\n flex-direction: column;\n}\n\n.pdf-page-number {\n display: flex;\n justify-content: center;\n padding: 1rem;\n}\n\n.pageInputNumber {\n width: 4rem;\n}\n\n/* pdf.js points its annotation icons at a relative path, which resolves to\n nothing here, so the built-in image never loads. Draw a Remixicon glyph\n instead, in line with the icon set used across the interface. */\n:deep(.annotationLayer .textAnnotation) {\n display: flex;\n align-items: center;\n justify-content: center;\n /* Lets the glyph follow the annotation size, which varies with the zoom */\n container-type: size;\n}\n:deep(.annotationLayer .textAnnotation img) {\n display: none;\n}\n:deep(.annotationLayer .textAnnotation)::before {\n /* ri-chat-3-fill */\n content: \"\";\n font-family: remixicon;\n /* Fallback for browsers without container query units */\n font-size: 1rem;\n font-size: 100cqh;\n line-height: 1;\n color: #f5a623;\n}\n</style>\n"],"names":["setFormFieldsReadOnly","pdfBytes","readOnly","doc","PDFDocument","fields","field","unlockFormFields","bytes","count","lockFormFields","OID_COMMON_NAME","OID_ORGANIZATION","OID_SIGNATURE_TIMESTAMP","toHex","view","byte","relativeName","name","oid","entry","item","readSignedData","value","contents","PDFName","PDFHexString","PDFString","decoded","fromBER","contentInfo","ContentInfo","SignedData","signerCertificate","signedData","certificates","certificate","serial","wanted","readTimestampDate","attribute","content","TSTInfo","describeCertificate","readText","dict","key","STANDARD_BY_SUB_FILTER","readDate","collectFields","collected","index","PDFDict","kids","PDFArray","readByteRange","range","describeSignature","byteRange","coveredUntil","subFilter","coverageOf","signature","lastCovered","totalLength","qualifyCoverage","signatures","extractSignatures","document","error","LINK_MAILTO","LINK_ROUTE","LINK_EXTERNAL","resolvePdfLink","url","origin","base","resolve","target","normalizedBase","pathname","isUnderBase","appPath","location","clampPage","pageCount","page","useI18n","formatDate","date","signerName","_createElementVNode","_hoisted_1","_openBlock","_createElementBlock","_Fragment","_renderList","__props","_hoisted_2","_hoisted_3","_toDisplayString","_createVNode","_unref","PrimeTag","_hoisted_4","_createTextVNode","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_sfc_main","VuePDF","PdfSignaturePanel","Button","ProgressSpinner","Divider","Tag","InputNumber","Dialog","DataTable","Column","Tooltip","selectionStore","useSelectionStore","newValue","wantedPage","menuDiff","widthScale","heightScale","usePDF","buildPdfSource","pageValue","pageNumber","newQuery","pdfDoc","locked","link","path","unlockedCount","fieldObjects","data","trackedValue","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_18","_hoisted_21","$options","$data","_normalizeClass","_component_PrimeButton","_ctx","_component_PrimeInputNumber","$event","_createBlock","_component_PrimeDivider","_cache","$props","_hoisted_17","_component_PrimeTag","_hoisted_19","_component_VuePDF","_hoisted_20","pageItem","_component_PrimeProgressSpinner","_component_PrimeDialog","_component_PrimeDataTable","_component_PrimeColumn","_component_PdfSignaturePanel"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { computed as e, unref as u } from "vue";
2
- import { f } from "./index-CPjFX5To.js";
2
+ import { f } from "./index-DyssYdtW.js";
3
3
  function s(o) {
4
4
  const n = f().BASE_URL || "/", t = typeof o == "string" ? { url: o } : { ...o };
5
5
  return t.wasmUrl = `${n}pdfjs/wasm/`, t;
@@ -14,4 +14,4 @@ export {
14
14
  c as a,
15
15
  s as b
16
16
  };
17
- //# sourceMappingURL=PdfConfigService-BKVsjC1W.js.map
17
+ //# sourceMappingURL=PdfConfigService-DZN8iTaP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PdfConfigService-BKVsjC1W.js","sources":["../src/services/PdfConfigService.js"],"sourcesContent":["/*\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\nimport { computed, unref } from \"vue\";\nimport { useConfigStore } from \"@/stores/config.js\";\n\n/**\n * Build the parameters passed to pdf.js getDocument (via usePDF).\n *\n * Since pdf.js 5.x, JPEG2000 (and JBIG2 / ICC color) images are decoded by\n * WASM modules (openjpeg.wasm, qcms_bg.wasm) that pdf.js fetches at runtime\n * from `wasmUrl`. When wasmUrl is left undefined it defaults to null, so the\n * worker tries to fetch \"nullopenjpeg.wasm\", fails, and JPEG2000 images are\n * not rendered (the rest of the page still renders). We therefore point\n * wasmUrl at \"<BASE_URL>pdfjs/wasm/\", where vite-plugin-static-copy serves the\n * pdfjs-dist/wasm/* files in the consuming app.\n *\n * BASE_URL is the consuming app's Vite base (e.g. \"/media/\"). It is read from\n * the ConfigStore at runtime because this library is consumed as a pre-built\n * bundle, so import.meta.env.BASE_URL would be frozen to the library's own\n * base instead of the app's.\n *\n * @param {string|object} src - A PDF URL or a DocumentInitParameters object.\n * @returns {object} DocumentInitParameters including wasmUrl.\n */\nexport function buildPdfSource(src) {\n const configStore = useConfigStore();\n const base = configStore.BASE_URL || \"/\";\n const params = typeof src === \"string\" ? { url: src } : { ...src };\n params.wasmUrl = `${base}pdfjs/wasm/`;\n return params;\n}\n\n/**\n * Reactive variant of buildPdfSource for callsites that pass a ref to usePDF\n * (so pdf.js reloads when the URL changes). Returns a computed that yields the\n * enriched parameters when the source has a value, or null otherwise so that\n * usePDF skips loading.\n *\n * @param {import('vue').Ref<string|object|null>} srcRef - Reactive PDF source.\n * @returns {import('vue').ComputedRef<object|null>}\n */\nexport function buildPdfSourceRef(srcRef) {\n return computed(() => {\n const value = unref(srcRef);\n return value ? buildPdfSource(value) : null;\n });\n}\n"],"names":["buildPdfSource","src","base","useConfigStore","params","buildPdfSourceRef","srcRef","computed","value","unref"],"mappings":";;AAsCO,SAASA,EAAeC,GAAK;AAElC,QAAMC,IADcC,EAAA,EACK,YAAY,KAC/BC,IAAS,OAAOH,KAAQ,WAAW,EAAE,KAAKA,EAAA,IAAQ,EAAE,GAAGA,EAAA;AAC7D,SAAAG,EAAO,UAAU,GAAGF,CAAI,eACjBE;AACT;AAWO,SAASC,EAAkBC,GAAQ;AACxC,SAAOC,EAAS,MAAM;AACpB,UAAMC,IAAQC,EAAMH,CAAM;AAC1B,WAAOE,IAAQR,EAAeQ,CAAK,IAAI;AAAA,EACzC,CAAC;AACH;"}
1
+ {"version":3,"file":"PdfConfigService-DZN8iTaP.js","sources":["../src/services/PdfConfigService.js"],"sourcesContent":["/*\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\nimport { computed, unref } from \"vue\";\nimport { useConfigStore } from \"@/stores/config.js\";\n\n/**\n * Build the parameters passed to pdf.js getDocument (via usePDF).\n *\n * Since pdf.js 5.x, JPEG2000 (and JBIG2 / ICC color) images are decoded by\n * WASM modules (openjpeg.wasm, qcms_bg.wasm) that pdf.js fetches at runtime\n * from `wasmUrl`. When wasmUrl is left undefined it defaults to null, so the\n * worker tries to fetch \"nullopenjpeg.wasm\", fails, and JPEG2000 images are\n * not rendered (the rest of the page still renders). We therefore point\n * wasmUrl at \"<BASE_URL>pdfjs/wasm/\", where vite-plugin-static-copy serves the\n * pdfjs-dist/wasm/* files in the consuming app.\n *\n * BASE_URL is the consuming app's Vite base (e.g. \"/media/\"). It is read from\n * the ConfigStore at runtime because this library is consumed as a pre-built\n * bundle, so import.meta.env.BASE_URL would be frozen to the library's own\n * base instead of the app's.\n *\n * @param {string|object} src - A PDF URL or a DocumentInitParameters object.\n * @returns {object} DocumentInitParameters including wasmUrl.\n */\nexport function buildPdfSource(src) {\n const configStore = useConfigStore();\n const base = configStore.BASE_URL || \"/\";\n const params = typeof src === \"string\" ? { url: src } : { ...src };\n params.wasmUrl = `${base}pdfjs/wasm/`;\n return params;\n}\n\n/**\n * Reactive variant of buildPdfSource for callsites that pass a ref to usePDF\n * (so pdf.js reloads when the URL changes). Returns a computed that yields the\n * enriched parameters when the source has a value, or null otherwise so that\n * usePDF skips loading.\n *\n * @param {import('vue').Ref<string|object|null>} srcRef - Reactive PDF source.\n * @returns {import('vue').ComputedRef<object|null>}\n */\nexport function buildPdfSourceRef(srcRef) {\n return computed(() => {\n const value = unref(srcRef);\n return value ? buildPdfSource(value) : null;\n });\n}\n"],"names":["buildPdfSource","src","base","useConfigStore","params","buildPdfSourceRef","srcRef","computed","value","unref"],"mappings":";;AAsCO,SAASA,EAAeC,GAAK;AAElC,QAAMC,IADcC,EAAA,EACK,YAAY,KAC/BC,IAAS,OAAOH,KAAQ,WAAW,EAAE,KAAKA,EAAA,IAAQ,EAAE,GAAGA,EAAA;AAC7D,SAAAG,EAAO,UAAU,GAAGF,CAAI,eACjBE;AACT;AAWO,SAASC,EAAkBC,GAAQ;AACxC,SAAOC,EAAS,MAAM;AACpB,UAAMC,IAAQC,EAAMH,CAAM;AAC1B,WAAOE,IAAQR,EAAeQ,CAAK,IAAI;AAAA,EACzC,CAAC;AACH;"}
@@ -1,7 +1,7 @@
1
1
  import { ref as v, openBlock as g, createBlock as tl, unref as r, withCtx as $, createElementVNode as s, toDisplayString as f, createVNode as i, createElementBlock as h, createCommentVNode as U, computed as Te, onMounted as wo, watch as xe, onUnmounted as To, resolveDirective as xo, createTextVNode as le, Fragment as Je, renderList as Ze, withModifiers as ue, normalizeClass as q, normalizeStyle as st, withDirectives as De, vModelText as nt, withKeys as rt, nextTick as it } from "vue";
2
2
  import { PDFName as Pe, PDFHexString as ct, PDFDocument as O, degrees as Eo, rgb as xl, RotationTypes as Po, StandardFonts as El } from "pdf-lib";
3
3
  import { usePDF as dt, VuePDF as Qe } from "@tato30/vue-pdf";
4
- import { a as ut } from "./PdfConfigService-BKVsjC1W.js";
4
+ import { a as ut } from "./PdfConfigService-DZN8iTaP.js";
5
5
  /* empty css */
6
6
  import { VueDraggableNext as Co } from "vue-draggable-next";
7
7
  import { useI18n as gt } from "vue-i18n";
@@ -21,7 +21,7 @@ import _o from "primevue/tablist";
21
21
  import el from "primevue/tab";
22
22
  import Mo from "primevue/tabpanels";
23
23
  import ll from "primevue/tabpanel";
24
- import { _ as yt, T as ht, a as Ee, b as Pl, c as Fo, d as No } from "./index-CPjFX5To.js";
24
+ import { _ as yt, T as ht, a as Ee, b as Pl, c as Fo, d as No } from "./index-DyssYdtW.js";
25
25
  const Ro = { class: "save-as-form" }, Lo = { class: "form-field" }, Do = { for: "filename" }, Uo = { class: "form-field" }, Ho = { for: "location" }, Bo = { class: "input-group" }, Oo = {
26
26
  key: 0,
27
27
  class: "explorer-container"
@@ -1967,4 +1967,4 @@ const Ro = { class: "save-as-form" }, Lo = { class: "form-field" }, Do = { for:
1967
1967
  export {
1968
1968
  sn as default
1969
1969
  };
1970
- //# sourceMappingURL=PdfToolsComponent-BC45mg3C.js.map
1970
+ //# sourceMappingURL=PdfToolsComponent-CynQg24K.js.map