diff --git a/package-lock.json b/package-lock.json index 4d0ffbf..7090208 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,13 @@ { - "name": "cronogramas-primeng", - "version": "0.0.0", + "name": "cronogramas", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "cronogramas-primeng", - "version": "0.0.0", + "name": "cronogramas", + "version": "0.1.0", + "hasInstallScript": true, "dependencies": { "@angular/common": "^19.2.0", "@angular/compiler": "^19.2.0", @@ -19,6 +20,7 @@ "animate.css": "^4.1.1", "exceljs": "^4.4.0", "file-saver": "^2.0.5", + "pdfmake": "^0.2.19", "primeflex": "^4.0.0", "primeicons": "^7.0.0", "primeng": "^19.1.0", @@ -32,6 +34,7 @@ "@angular/compiler-cli": "^19.2.0", "@types/file-saver": "^2.0.7", "@types/jasmine": "~5.1.0", + "@types/pdfmake": "^0.2.11", "@types/xlsx": "^0.0.35", "jasmine-core": "~5.6.0", "karma": "~6.4.0", @@ -2869,6 +2872,57 @@ "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", "license": "MIT" }, + "node_modules/@foliojs-fork/fontkit": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.2.tgz", + "integrity": "sha512-IfB5EiIb+GZk+77TRB86AHroVaqfq8JRFlUbz0WEwsInyCG0epX2tCPOy+UfaWPju30DeVoUAXfzWXmhn753KA==", + "license": "MIT", + "dependencies": { + "@foliojs-fork/restructure": "^2.0.2", + "brotli": "^1.2.0", + "clone": "^1.0.4", + "deep-equal": "^1.0.0", + "dfa": "^1.2.0", + "tiny-inflate": "^1.0.2", + "unicode-properties": "^1.2.2", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/@foliojs-fork/linebreak": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.2.tgz", + "integrity": "sha512-ZPohpxxbuKNE0l/5iBJnOAfUaMACwvUIKCvqtWGKIMv1lPYoNjYXRfhi9FeeV9McBkBLxsMFWTVVhHJA8cyzvg==", + "license": "MIT", + "dependencies": { + "base64-js": "1.3.1", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/@foliojs-fork/linebreak/node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "license": "MIT" + }, + "node_modules/@foliojs-fork/pdfkit": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.15.3.tgz", + "integrity": "sha512-Obc0Wmy3bm7BINFVvPhcl2rnSSK61DQrlHU8aXnAqDk9LCjWdUOPwhgD8Ywz5VtuFjRxmVOM/kQ/XLIBjDvltw==", + "license": "MIT", + "dependencies": { + "@foliojs-fork/fontkit": "^1.9.2", + "@foliojs-fork/linebreak": "^1.1.1", + "crypto-js": "^4.2.0", + "jpeg-exif": "^1.1.4", + "png-js": "^1.0.0" + } + }, + "node_modules/@foliojs-fork/restructure": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz", + "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==", + "license": "MIT" + }, "node_modules/@inquirer/checkbox": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.5.tgz", @@ -5261,6 +5315,27 @@ "@types/node": "*" } }, + "node_modules/@types/pdfkit": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/@types/pdfkit/-/pdfkit-0.13.9.tgz", + "integrity": "sha512-RDG8Yb1zT7I01FfpwK7nMSA433XWpblMqSCtA5vJlSyavWZb303HUYPCel6JTiDDFqwGLvtAnYbH8N/e0Cb89g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/pdfmake": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@types/pdfmake/-/pdfmake-0.2.11.tgz", + "integrity": "sha512-gglgMQhnG6C2kco13DJlvokqTxL+XKxHwCejElH8fSCNF9ZCkRK6Mzo011jQ0zuug+YlIgn6BpcpZrARyWdW3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/pdfkit": "*" + } + }, "node_modules/@types/qs": { "version": "6.9.18", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", @@ -6177,6 +6252,15 @@ "node": ">=8" } }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.1.2" + } + }, "node_modules/browserslist": { "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", @@ -6425,11 +6509,28 @@ "node": ">=18" } }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -6443,7 +6544,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -6707,7 +6807,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8" @@ -7107,6 +7206,12 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, "node_modules/css-loader": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", @@ -7227,6 +7332,26 @@ } } }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "license": "MIT", + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/default-browser": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", @@ -7270,6 +7395,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -7283,6 +7425,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -7322,6 +7481,12 @@ "dev": true, "license": "MIT" }, + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "license": "MIT" + }, "node_modules/di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", @@ -7418,7 +7583,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -7700,7 +7864,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7710,7 +7873,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7727,7 +7889,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -8446,7 +8607,15 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8489,7 +8658,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -8514,7 +8682,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -8600,7 +8767,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8632,11 +8798,22 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8649,7 +8826,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -8665,7 +8841,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -9099,6 +9274,22 @@ "node": ">= 10" } }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -9135,6 +9326,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-docker": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", @@ -9266,7 +9473,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -9498,6 +9704,12 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jpeg-exif": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz", + "integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==", + "license": "MIT" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10591,7 +10803,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -11425,6 +11636,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -11925,6 +12161,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pdfmake": { + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.19.tgz", + "integrity": "sha512-jVUILxOqAgcquxbGCz3Bo1/sGEuVLcReGYvo61oJ2EkkyfrlREd7TfLRF6jdF85aEQjxOj/6BD9uj0p+UfXNkw==", + "license": "MIT", + "dependencies": { + "@foliojs-fork/linebreak": "^1.1.2", + "@foliojs-fork/pdfkit": "^0.15.3", + "iconv-lite": "^0.6.3", + "xmldoc": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/pdfmake/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -11982,6 +12245,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/png-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", + "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==" + }, "node_modules/postcss": { "version": "8.5.2", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", @@ -12426,6 +12694,26 @@ "dev": true, "license": "MIT" }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpu-core": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", @@ -12766,7 +13054,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, "license": "MIT" }, "node_modules/sass": { @@ -12835,9 +13122,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true, - "license": "ISC", - "optional": true + "license": "ISC" }, "node_modules/saxes": { "version": "5.0.1", @@ -13100,6 +13385,38 @@ "node": ">= 0.8" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -14011,6 +14328,12 @@ "dev": true, "license": "MIT" }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", @@ -14237,6 +14560,16 @@ "node": ">=4" } }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", @@ -14247,6 +14580,22 @@ "node": ">=4" } }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" + }, "node_modules/unicorn-magic": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", @@ -15455,6 +15804,18 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "license": "MIT" }, + "node_modules/xmldoc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-2.0.1.tgz", + "integrity": "sha512-sOOqgsjl3PU6iBw+fBUGAkTCE+JFK+sBaOL3pnZgzqk2/yvOD7RlFmZtDRJAEBzdpOYxSXyOQH4mjubdfs3MSg==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index b756ac1..fe0bd42 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "animate.css": "^4.1.1", "exceljs": "^4.4.0", "file-saver": "^2.0.5", + "pdfmake": "^0.2.19", "primeflex": "^4.0.0", "primeicons": "^7.0.0", "primeng": "^19.1.0", @@ -44,5 +45,6 @@ "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", "typescript": "~5.7.2" - } -} \ No newline at end of file + }, + "description": "cronogramas - Proyecto generado desde template" +} diff --git a/src/app/components/layout/layout.component.html b/src/app/components/layout/layout.component.html index 6031043..282f954 100644 --- a/src/app/components/layout/layout.component.html +++ b/src/app/components/layout/layout.component.html @@ -1,4 +1,7 @@ +
+ + diff --git a/src/app/components/layout/layout.component.ts b/src/app/components/layout/layout.component.ts index 66b89c0..35bb0df 100644 --- a/src/app/components/layout/layout.component.ts +++ b/src/app/components/layout/layout.component.ts @@ -5,6 +5,8 @@ import { NavbarComponent } from '../navbar/navbar.component'; import { SidebarComponent } from '../sidebar/sidebar.component'; import { FooterComponent } from "../footer/footer.component"; import { RouteAnimationsComponent } from '../route-animations/route-animations.component'; +import { ToastModule } from 'primeng/toast'; +import { MessageService } from 'primeng/api'; @Component({ selector: 'app-layout', @@ -14,11 +16,13 @@ import { RouteAnimationsComponent } from '../route-animations/route-animations.c NavbarComponent, SidebarComponent, FooterComponent, - RouteAnimationsComponent + RouteAnimationsComponent, + ToastModule ], templateUrl: './layout.component.html', styleUrl: './layout.component.scss', standalone: true, + providers : [MessageService] }) export class LayoutComponent implements OnInit { isSidebarVisible: boolean = true; diff --git a/src/app/components/visor-pdf/visor-pdf.component.html b/src/app/components/visor-pdf/visor-pdf.component.html new file mode 100644 index 0000000..ebd17c8 --- /dev/null +++ b/src/app/components/visor-pdf/visor-pdf.component.html @@ -0,0 +1,15 @@ +
+
+ +
+
+ + +
+
\ No newline at end of file diff --git a/src/app/components/visor-pdf/visor-pdf.component.scss b/src/app/components/visor-pdf/visor-pdf.component.scss new file mode 100644 index 0000000..5e1956f --- /dev/null +++ b/src/app/components/visor-pdf/visor-pdf.component.scss @@ -0,0 +1,22 @@ +.pdf-container { + display: flex; + flex-direction: column; + height: 100%; + } + + .toolbar { + display: flex; + justify-content: flex-end; + margin-top: 10px; + gap: 10px; + } + + .pdf-viewer { + flex: 1; + border: 1px solid #ccc; + background-color: #f5f5f5; + } + + iframe { + border: none; + } \ No newline at end of file diff --git a/src/app/components/visor-pdf/visor-pdf.component.spec.ts b/src/app/components/visor-pdf/visor-pdf.component.spec.ts new file mode 100644 index 0000000..254e7bc --- /dev/null +++ b/src/app/components/visor-pdf/visor-pdf.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VisorPdfComponent } from './visor-pdf.component'; + +describe('VisorPdfComponent', () => { + let component: VisorPdfComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VisorPdfComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(VisorPdfComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/visor-pdf/visor-pdf.component.ts b/src/app/components/visor-pdf/visor-pdf.component.ts new file mode 100644 index 0000000..fab43a1 --- /dev/null +++ b/src/app/components/visor-pdf/visor-pdf.component.ts @@ -0,0 +1,229 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { DynamicDialogRef, DynamicDialogConfig } from 'primeng/dynamicdialog'; +import { SafePipe } from '../../../pipes/safe.pipe'; + +import pdfMake from 'pdfmake/build/pdfmake'; +import pdfFonts from 'pdfmake/build/vfs_fonts'; +import { TDocumentDefinitions } from 'pdfmake/interfaces'; +import { MessageService } from 'primeng/api'; +pdfMake.vfs = pdfFonts.vfs; + + +@Component({ + selector: 'app-visor-pdf', + standalone: true, + imports: [CommonModule, SafePipe], + templateUrl: './visor-pdf.component.html', + styleUrls: ['./visor-pdf.component.scss'], + providers: [MessageService] +}) +export class VisorPdfComponent implements OnInit { + product: any; + pdfSrc: string = ''; + enviando: boolean = false; + + // Inyectar servicios usando la nueva sintaxis de Angular + private dialogRef = inject(DynamicDialogRef); + private config = inject(DynamicDialogConfig); + private messageService = inject(MessageService); + + docDefinition: TDocumentDefinitions = { + content: [ + // Encabezado con información de empresa y cronograma + { + columns: [ + { + width: '50%', + text: 'Empresa: Constructora Los Andes S.A.', + margin: [0, 0, 0, 5] + }, + { + width: '50%', + text: [ + { text: 'Cronograma: SC-23-45\n' }, + { text: 'Nombre sistema: Terminal Portuario Norte' } + ], + alignment: 'right', + margin: [0, 0, 0, 5] + } + ] + }, + + // Título y subtítulo + { + text: 'CRONOGRAMA BASE DE OBRAS E INVERSIONES', + alignment: 'center', + bold: true, + fontSize: 12, + margin: [0, 10, 0, 0] + }, + { + text: 'ACTUALIZACIÓN PLAN DE DESARROLLO O NUEVA CONCESIÓN', + alignment: 'center', + bold: true, + fontSize: 11, + margin: [0, 0, 0, 10] + }, + + // Tabla principal + { + table: { + headerRows: 1, + widths: ['10%', '12%', '23%', '12%', '10%', '10%', '10%', '13%'], + body: [ + [ + { text: 'ETAPA', style: 'tableHeader', alignment: 'center' }, + { text: 'CÓDIGO GLOSA', style: 'tableHeader', alignment: 'center' }, + { text: 'DESCRIPCIÓN GLOSA', style: 'tableHeader', alignment: 'center' }, + { text: 'MONTO INVERSIÓN UF', style: 'tableHeader', alignment: 'center' }, + { text: 'AÑO INICIO', style: 'tableHeader', alignment: 'center' }, + { text: 'AÑO TERMINO', style: 'tableHeader', alignment: 'center' }, + { text: 'MES TERMINO', style: 'tableHeader', alignment: 'center' }, + { text: 'NOTA', style: 'tableHeader', alignment: 'center' } + ], + [ + { text: '1', alignment: 'center' }, + { text: 'INF-001', alignment: 'center' }, + { text: 'Estudios preliminares', alignment: 'left' }, + { text: '2,500', alignment: 'right' }, + { text: '2025', alignment: 'center' }, + { text: '2025', alignment: 'center' }, + { text: 'Julio', alignment: 'center' }, + { text: 'Fase inicial', alignment: 'left' } + ], + [ + { text: '2', alignment: 'center' }, + { text: 'MOV-102', alignment: 'center' }, + { text: 'Movimiento de tierras', alignment: 'left' }, + { text: '15,750', alignment: 'right' }, + { text: '2025', alignment: 'center' }, + { text: '2026', alignment: 'center' }, + { text: 'Enero', alignment: 'center' }, + { text: 'En terreno', alignment: 'left' } + ], + [ + { text: '3', alignment: 'center' }, + { text: 'CIM-203', alignment: 'center' }, + { text: 'Construcción de cimientos', alignment: 'left' }, + { text: '32,800', alignment: 'right' }, + { text: '2026', alignment: 'center' }, + { text: '2026', alignment: 'center' }, + { text: 'Mayo', alignment: 'center' }, + { text: 'Crítico', alignment: 'left' } + ], + [ + { text: '4', alignment: 'center' }, + { text: 'EST-304', alignment: 'center' }, + { text: 'Estructura principal', alignment: 'left' }, + { text: '65,420', alignment: 'right' }, + { text: '2026', alignment: 'center' }, + { text: '2027', alignment: 'center' }, + { text: 'Febrero', alignment: 'center' }, + { text: 'Alta inversión', alignment: 'left' } + ], + [ + { text: '5', alignment: 'center' }, + { text: 'TER-405', alignment: 'center' }, + { text: 'Terminaciones y acabados', alignment: 'left' }, + { text: '18,300', alignment: 'right' }, + { text: '2027', alignment: 'center' }, + { text: '2027', alignment: 'center' }, + { text: 'Octubre', alignment: 'center' }, + { text: 'Etapa final', alignment: 'left' } + ] + ] + } + }, + + // Total + { + columns: [ + { + width: '80%', + text: 'TOTAL:', + alignment: 'right', + bold: true, + margin: [0, 15, 10, 20] + }, + { + width: '20%', + text: '134,770 UF', + alignment: 'left', + bold: true, + margin: [0, 15, 0, 20] + } + ] + }, + + // Firma + { + text: 'X', + alignment: 'center', + bold: true, + fontSize: 14, + margin: [0, 15, 0, 0] + }, + { + text: 'Firma SSS', + alignment: 'center', + fontSize: 10, + margin: [0, 0, 0, 10] + } + ], + + // Estilos + styles: { + tableHeader: { + bold: true, + fontSize: 10, + fillColor: '#f2f2f2' + } + }, + + // Definiciones de página + pageSize: 'A4', + pageOrientation: 'portrait', + pageMargins: [40, 40, 40, 40] + }; + + ngOnInit() { + // Obtener el producto pasado a través del servicio de diálogo + this.product = this.config.data?.product; + + // Generar el PDF + this.generarPDF(); + } + + generarPDF() { + const pdfDocGenerator = pdfMake.createPdf(this.docDefinition); + pdfDocGenerator.getDataUrl((dataUrl) => { + this.pdfSrc = dataUrl; + }); + } + + descargarPDF() { + pdfMake.createPdf(this.docDefinition).download('cronogramaspdf'); + } + enviarPDF() { + this.enviando = true; + console.log('Enviando PDF...'); + + setTimeout(() => { + this.enviando = false; + console.log('Mostrando mensaje de envio...') + + this.messageService.add({ + severity: 'success', + summary: '¡Enviado con éxito!', + detail: 'El cronograma ha sido enviado correctamente', + life: 30000, + }); + }, 2000); + } + + + cerrar() { + this.dialogRef.close(); + } +} \ No newline at end of file diff --git a/src/app/pages/resumen/resumen.component.html b/src/app/pages/resumen/resumen.component.html index 78626b9..cb5681c 100644 --- a/src/app/pages/resumen/resumen.component.html +++ b/src/app/pages/resumen/resumen.component.html @@ -1,66 +1,87 @@
- -
Cronogramas aprobados:
- +
Cronogramas aprobados:
+ - - - Empresa - Código de cronograma - Nombre sistema - Tipo - - - - - {{ product.empresa }} - {{ product.codigoCronograma }} - {{ product.codigoCronogramaAjuste }} - {{ product.tipoCarga }} - - - - - - + [rowsPerPageOptions]="[5, 10, 20]" + > + + + Empresa + + Código de cronograma + + Nombre sistema + Tipo + + + + + {{ product.empresa }} + {{ product.codigoCronograma }} + {{ product.codigoCronogramaAjuste }} + {{ product.tipoCarga }} + + + + + +
-
Cronogramas rechazados:
- Cronogramas rechazados:
+ - - - Empresa - Código de cronograma - Nombre sistema - Tipo - - - - - {{ product.empresa }} - {{ product.codigoCronograma }} - {{ product.codigoCronogramaAjuste }} - {{ product.tipoCarga }} - - - - - - + [rowsPerPageOptions]="[5, 10, 20]" + > + + + Empresa + + Código de cronograma + + Nombre sistema + Tipo + + + + + {{ product.empresa }} + {{ product.codigoCronograma }} + {{ product.codigoCronogramaAjuste }} + {{ product.tipoCarga }} + + + + + +
diff --git a/src/app/pages/resumen/resumen.component.ts b/src/app/pages/resumen/resumen.component.ts index 3586be3..cc628e8 100644 --- a/src/app/pages/resumen/resumen.component.ts +++ b/src/app/pages/resumen/resumen.component.ts @@ -3,14 +3,21 @@ import { FormsModule } from '@angular/forms'; import { TableModule } from 'primeng/table'; import { InputTextModule } from 'primeng/inputtext'; import { TooltipModule } from 'primeng/tooltip'; +import { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog'; +import { VisorPdfComponent } from '../../components/visor-pdf/visor-pdf.component'; @Component({ selector: 'app-resumen', imports: [FormsModule, TableModule, InputTextModule, TooltipModule], templateUrl: './resumen.component.html', - styleUrl: './resumen.component.scss' + styleUrl: './resumen.component.scss', + providers: [DialogService] }) export class ResumenComponent { + + constructor(public dialogService: DialogService) { } + + ref: DynamicDialogRef products: any[] = [ { empresa: 'Empresa A', @@ -38,4 +45,24 @@ export class ResumenComponent { }, ]; + firma(product: any): void { + console.log('Firma digital del producto:', product); + this.ref = this.dialogService.open(VisorPdfComponent, { + header: 'Visor PDF', + width: '80vw', + height: '80vh', + modal: true, + closable: true, + maximizable: true, + data:{ + product: product + }, + breakpoints: { + '960px': '75vw', + '640px': '90vw' + }, + }); + + } + } diff --git a/src/pipes/safe.pipe.ts b/src/pipes/safe.pipe.ts new file mode 100644 index 0000000..2f2a405 --- /dev/null +++ b/src/pipes/safe.pipe.ts @@ -0,0 +1,14 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; + +@Pipe({ + name: 'safe', + standalone: true +}) +export class SafePipe implements PipeTransform { + constructor(private sanitizer: DomSanitizer) {} + + transform(url: string): SafeResourceUrl { + return this.sanitizer.bypassSecurityTrustResourceUrl(url); + } +} \ No newline at end of file