diff --git a/Api/Models/poam.model.js b/Api/Models/poam.model.js index c84e4418..fbc15ff2 100644 --- a/Api/Models/poam.model.js +++ b/Api/Models/poam.model.js @@ -151,6 +151,10 @@ module.exports = (sequelize, DataTypes) => { extensionJustification: { type: DataTypes.TEXT }, + scanResults: { + type: DataTypes.TEXT, + allowNull: true, + }, }, { freezeTableName: true, timestamps: false, diff --git a/Api/Services/mysql/poamService.js b/Api/Services/mysql/poamService.js index 1a89f188..067d1fb1 100644 --- a/Api/Services/mysql/poamService.js +++ b/Api/Services/mysql/poamService.js @@ -228,14 +228,14 @@ exports.postPoam = async function postPoam(req, res, next) { let sql_query = `INSERT INTO poamtracking.poam (collectionId, vulnerabilitySource, stigTitle, iavmNumber, aaPackage, vulnerabilityId, description, rawSeverity, adjSeverity, scheduledCompletionDate, ownerId, mitigations, requiredResources, residualRisk, businessImpactRating, businessImpactDescription, - notes, status, poamType, vulnIdRestricted, submittedDate) - values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` + notes, status, poamType, vulnIdRestricted, submittedDate, scanResults) + values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` await connection.query(sql_query, [req.body.collectionId, req.body.vulnerabilitySource, req.body.stigTitle, req.body.iavmNumber, req.body.aaPackage, req.body.vulnerabilityId, req.body.description, req.body.rawSeverity, req.body.adjSeverity, req.body.scheduledCompletionDate, req.body.ownerId, req.body.mitigations, req.body.requiredResources, req.body.residualRisk, req.body.businessImpactRating, req.body.businessImpactDescription, req.body.notes, req.body.status, - req.body.poamType, req.body.vulnIdRestricted, req.body.submittedDate]) + req.body.poamType, req.body.vulnIdRestricted, req.body.submittedDate, req.body.scanResults]) let sql = "SELECT * FROM poamtracking.poam WHERE poamId = LAST_INSERT_ID();" let [rowPoam] = await connection.query(sql) @@ -349,14 +349,14 @@ exports.putPoam = async function putPoam(req, res, next) { iavmNumber = ?, aaPackage = ?, vulnerabilityId = ?, description = ?, rawSeverity = ?, adjSeverity = ?, scheduledCompletionDate = ?, ownerId = ?, mitigations = ?, requiredResources = ?, residualRisk = ?, businessImpactRating = ?, businessImpactDescription = ?, notes = ?, status = ?, poamType = ?, - vulnIdRestricted = ?, submittedDate = ? WHERE poamId = ?` + vulnIdRestricted = ?, submittedDate = ?, scanResults = ? WHERE poamId = ?` await connection.query(sql_query, [req.body.collectionId, req.body.vulnerabilitySource, req.body.stigTitle, req.body.iavmNumber, req.body.aaPackage, req.body.vulnerabilityId, req.body.description, req.body.rawSeverity, req.body.adjSeverity, req.body.scheduledCompletionDate, req.body.ownerId, req.body.mitigations, req.body.requiredResources, req.body.residualRisk, req.body.businessImpactRating, req.body.businessImpactDescription, req.body.notes, req.body.status, req.body.poamType, req.body.vulnIdRestricted, - req.body.submittedDate, req.body.poamId]) + req.body.submittedDate, req.body.scanResults, req.body.poamId]) let sql = "SELECT * FROM poamtracking.poam WHERE poamId = ?" let [rowPoam] = await connection.query(sql, [req.body.poamId]) diff --git a/Api/specification/poam-manager.yaml b/Api/specification/poam-manager.yaml index 2193cad7..62466f3c 100644 --- a/Api/specification/poam-manager.yaml +++ b/Api/specification/poam-manager.yaml @@ -3252,6 +3252,8 @@ components: type: string submittedDate: type: string + scanResults: + type: string assets: type: array items: diff --git a/Database/POAM_Tracking_Tool_Data_Model.sql b/Database/POAM_Tracking_Tool_Data_Model.sql index 20ca2829..ad4c6ed1 100644 --- a/Database/POAM_Tracking_Tool_Data_Model.sql +++ b/Database/POAM_Tracking_Tool_Data_Model.sql @@ -188,7 +188,7 @@ CREATE TABLE `poamtracking`.`usertokens` ( `token` VARCHAR(255) NOT NULL, `expiration` DATETIME NOT NULL, PRIMARY KEY (`userName`)); - + DELIMITER $$ diff --git a/Front End/poam-app/package-lock.json b/Front End/poam-app/package-lock.json index 0a1dce3d..e6deddf7 100644 --- a/Front End/poam-app/package-lock.json +++ b/Front End/poam-app/package-lock.json @@ -8,16 +8,16 @@ "name": "cpat-frontend", "version": "0.2.0", "dependencies": { - "@angular/animations": "^17.2.3", + "@angular/animations": "^17.3.0", "@angular/cdk": "<17.1.0", - "@angular/common": "^17.2.3", - "@angular/compiler": "^17.2.3", - "@angular/core": "^17.2.3", - "@angular/forms": "^17.2.3", - "@angular/localize": "^17.2.3", - "@angular/platform-browser": "^17.2.3", - "@angular/platform-browser-dynamic": "^17.2.3", - "@angular/router": "^17.2.3", + "@angular/common": "^17.3.0", + "@angular/compiler": "^17.3.0", + "@angular/core": "^17.3.0", + "@angular/forms": "^17.3.0", + "@angular/localize": "^17.3.0", + "@angular/platform-browser": "^17.3.0", + "@angular/platform-browser-dynamic": "^17.3.0", + "@angular/router": "^17.3.0", "@nebular/auth": "^13.0.0", "@nebular/date-fns": "^13.0.0", "@nebular/eva-icons": "^13.0.0", @@ -25,12 +25,14 @@ "@nebular/theme": "^13.0.0", "@ng-bootstrap/ng-bootstrap": "^16.0.0", "@popperjs/core": "^2.11.8", - "@syncfusion/ej2-angular-treegrid": "^24.2.8", + "@syncfusion/ej2-angular-treegrid": "^24.2.9", "angular2-smart-table": "^3.2.0", "axios": "^1.6.7", "bootstrap": "^5.3.3", "chart.js": "^4.4.2", - "date-fns": "^3.3.1", + "chartjs-plugin-datalabels": "^2.2.0", + "date-fns": "^3.4.0", + "dom-to-image": "^2.6.0", "eva-icons": "^1.1.3", "express": "^4.18.3", "express-jwt": "^8.4.1", @@ -38,7 +40,7 @@ "jsdom": "^24.0.0", "jsonwebtoken": "^9.0.2", "keycloak-angular": "^15.1.0", - "keycloak-js": "^24.0.0", + "keycloak-js": "^24.0.1", "ng2-charts": "^6.0.0", "ngx-infinite-scroll": "^17.0.0", "npm-check-updates": "^16.14.15", @@ -53,10 +55,10 @@ "zone.js": "^0.14.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.2.2", - "@angular/cli": "^17.2.2", - "@angular/compiler-cli": "^17.2.3", - "@schematics/angular": "^17.2.2", + "@angular-devkit/build-angular": "^17.3.0", + "@angular/cli": "^17.3.0", + "@angular/compiler-cli": "^17.3.0", + "@schematics/angular": "^17.3.0", "@types/chart.js": "^2.9.41", "@types/datatables.net": "^1.10.28", "@types/jasmine": "^5.1.4", @@ -68,28 +70,28 @@ "karma-coverage": "^2.2.1", "karma-jasmine": "^5.1.0", "karma-jasmine-html-reporter": "^2.1.0", - "typescript": "^5.3.3" + "typescript": "^5.4.2" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@angular-devkit/architect": { - "version": "0.1702.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1702.2.tgz", - "integrity": "sha512-qBvif8/NquFUqVQgs4U+8wXh/rQZv+YlYwg6eDZly1bIaTd/k9spko/seTtNT1OpK/Be+GLo5IbiQ7i2SON3iQ==", + "version": "0.1703.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.0.tgz", + "integrity": "sha512-2X2cswI4TIwtQxCe5U9f4jeiDjAb8r89XLpU0QwEHyZyWx02uhYHO3FDMJq/NxCS95IUAQOBGBhbD4ey4Hl9cQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.2.2", + "@angular-devkit/core": "17.3.0", "rxjs": "7.8.1" }, "engines": { @@ -99,70 +101,70 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.2.2.tgz", - "integrity": "sha512-K55xBiWBfxD4wmxLR2viOPbBryOk6YaZeNr72IMkp1yIrIy1BES6LDJi7R9fDW7+TprqZdM4B91Tkc+BCwYQzQ==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.0.tgz", + "integrity": "sha512-mC70mZK/liITM4VlGL6hmYPkVsZwAb+X3TxwodBl/g8p/sYijDhK/4QJHzmcHTxLYQQS6nS5CUcr9ARQFkGN2w==", "dev": true, "dependencies": { - "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1702.2", - "@angular-devkit/build-webpack": "0.1702.2", - "@angular-devkit/core": "17.2.2", - "@babel/core": "7.23.9", + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1703.0", + "@angular-devkit/build-webpack": "0.1703.0", + "@angular-devkit/core": "17.3.0", + "@babel/core": "7.24.0", "@babel/generator": "7.23.6", "@babel/helper-annotate-as-pure": "7.22.5", "@babel/helper-split-export-declaration": "7.22.6", "@babel/plugin-transform-async-generator-functions": "7.23.9", "@babel/plugin-transform-async-to-generator": "7.23.3", - "@babel/plugin-transform-runtime": "7.23.9", - "@babel/preset-env": "7.23.9", - "@babel/runtime": "7.23.9", + "@babel/plugin-transform-runtime": "7.24.0", + "@babel/preset-env": "7.24.0", + "@babel/runtime": "7.24.0", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.2.2", + "@ngtools/webpack": "17.3.0", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.17", + "autoprefixer": "10.4.18", "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.21.5", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.20", + "critters": "0.0.22", "css-loader": "6.10.0", - "esbuild-wasm": "0.20.0", + "esbuild-wasm": "0.20.1", "fast-glob": "3.3.2", "http-proxy-middleware": "2.0.6", - "https-proxy-agent": "7.0.2", - "inquirer": "9.2.14", + "https-proxy-agent": "7.0.4", + "inquirer": "9.2.15", "jsonc-parser": "3.2.1", "karma-source-map-support": "1.4.0", "less": "4.2.0", "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "magic-string": "0.30.7", - "mini-css-extract-plugin": "2.8.0", + "magic-string": "0.30.8", + "mini-css-extract-plugin": "2.8.1", "mrmime": "2.0.0", "open": "8.4.2", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.1", - "piscina": "4.3.1", + "piscina": "4.4.0", "postcss": "8.4.35", - "postcss-loader": "8.1.0", + "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.70.0", - "sass-loader": "14.1.0", + "sass": "1.71.1", + "sass-loader": "14.1.1", "semver": "7.6.0", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.27.0", + "terser": "5.29.1", "tree-kill": "1.2.2", "tslib": "2.6.2", - "undici": "6.6.2", - "vite": "5.0.12", + "undici": "6.7.1", + "vite": "5.1.5", "watchpack": "2.4.0", - "webpack": "5.90.1", + "webpack": "5.90.3", "webpack-dev-middleware": "6.1.1", "webpack-dev-server": "4.15.1", "webpack-merge": "5.10.0", @@ -174,7 +176,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.20.0" + "esbuild": "0.20.1" }, "peerDependencies": { "@angular/compiler-cli": "^17.0.0", @@ -189,7 +191,7 @@ "ng-packagr": "^17.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.2 <5.4" + "typescript": ">=5.2 <5.5" }, "peerDependenciesMeta": { "@angular/localize": { @@ -227,6 +229,51 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@angular-devkit/build-angular/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -273,12 +320,12 @@ "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1702.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1702.2.tgz", - "integrity": "sha512-+c7rHD2Se1VD9i9uPEYHqhq8hTnsUAn5LfeJCLS8g7FU8T42tDSC/k1qWxHp7d99kf7ecg2BvYcZDlYaBUnl3A==", + "version": "0.1703.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.0.tgz", + "integrity": "sha512-IEaLzV5lolURJhMKM4naW6pYTDjI5E8I+97o/kbSa0yakvGOBwg7yRmfc54T1M0Z4nmifPsj4OVRGhBaa6dgXA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1702.2", + "@angular-devkit/architect": "0.1703.0", "rxjs": "7.8.1" }, "engines": { @@ -292,9 +339,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.2.2.tgz", - "integrity": "sha512-bKMi6bBkEeN4a3qTxCykhrAvE0ESHhKO38Qh1bN/8QSyvKVAEyVAVls5W9IN5GKRHvXgEn9aw+DSzRnPpy9nyw==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.0.tgz", + "integrity": "sha512-ldErhMYq8rcFOhWQ0syQdLy6IYb/LL0erigj7gCMOf59oJgM7B13o/ZTOCvyJttUZ9IP0HB98Gi3epEuJ30VLg==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -331,14 +378,14 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.2.2.tgz", - "integrity": "sha512-t6dBhHvto9BEIo+Kew0+YyIS3TV1SEd4MActUk+zF4NNQyJ8wRUHL+8glUKB6ZWPyCTYSinJ+QKn/3yytELTHg==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.0.tgz", + "integrity": "sha512-EW4Y8W/KTlvvT2fw3bh9hY7quDF2b9EaF+KftEqoDRWYbw0tlF8hWIdlfA6JxQC12d6uefh3kDNj5am0Il2oNQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.2.2", + "@angular-devkit/core": "17.3.0", "jsonc-parser": "3.2.1", - "magic-string": "0.30.7", + "magic-string": "0.30.8", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -349,9 +396,9 @@ } }, "node_modules/@angular/animations": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.2.3.tgz", - "integrity": "sha512-eQcN6hC/dXISEYC/TjRuQJgfdZieBROBlXrS+BxRbsy9T4/QeKxChC3yiNxTmdxl5mvjLKvQTXHR8X0AWc07/Q==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.0.tgz", + "integrity": "sha512-H7R3c2E479CPpaX6bU84F8u4JV+IFEfM8BUOgrbcI9tF16m6C2eJbl8IqNuW0yADuTarRSlOT7TW0qyrmcxhRw==", "dependencies": { "tslib": "^2.3.0" }, @@ -359,7 +406,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.2.3" + "@angular/core": "17.3.0" } }, "node_modules/@angular/cdk": { @@ -379,19 +426,19 @@ } }, "node_modules/@angular/cli": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.2.2.tgz", - "integrity": "sha512-cGGOnOTjU1bHBAU+5LMR1vfjUSmIY204pUcRAHu6xq1Qp8jm0Wf1lYOG1KrzpDezKa8d0WZe6FIVlxsCZRRYSw==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.0.tgz", + "integrity": "sha512-xwxlimNP4MECkdzjc0+m7lGxighcH0ncAfEo9yUo+r+4EFalB/Q7DAQPIU1xkbBk8iJwcFhGFAnS1IeLur15kQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1702.2", - "@angular-devkit/core": "17.2.2", - "@angular-devkit/schematics": "17.2.2", - "@schematics/angular": "17.2.2", + "@angular-devkit/architect": "0.1703.0", + "@angular-devkit/core": "17.3.0", + "@angular-devkit/schematics": "17.3.0", + "@schematics/angular": "17.3.0", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", - "ini": "4.1.1", - "inquirer": "9.2.14", + "ini": "4.1.2", + "inquirer": "9.2.15", "jsonc-parser": "3.2.1", "npm-package-arg": "11.0.1", "npm-pick-manifest": "9.0.0", @@ -446,9 +493,9 @@ "dev": true }, "node_modules/@angular/common": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.2.3.tgz", - "integrity": "sha512-XR3rWS4W7/+RknyJMUUo9E81mSeyUznpclqTZ+Hy7+i4Naeso0qcRaIyr6JJmB5UGvlnfT1MlH9Fj78Dc80NEw==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.0.tgz", + "integrity": "sha512-JnS6jbLl2RxsvGFUOBGeoyviNLEjZKRhn3uK4Ein3DENPv0BeSFMjif9Dp4ReUCnqoD4QQVG0X/r1GFaqHn2pw==", "dependencies": { "tslib": "^2.3.0" }, @@ -456,14 +503,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.2.3", + "@angular/core": "17.3.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.2.3.tgz", - "integrity": "sha512-U2okLZ+4ipD5zTv32pMp+RsrM3kkP0XneSsIMPRpYZZfKgfnGLIwkRx6FoVoBwByugng6lBG/PiIe8DhRU/HFg==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.0.tgz", + "integrity": "sha512-lZBD5mFq7SzFJydZwW2jvnQGmtcU1s3e548hl4MSZpRgt13m5UmBQKbyMOvVN2WxKvWKlmDlywsAJlMSXepYig==", "dependencies": { "tslib": "^2.3.0" }, @@ -471,7 +518,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.2.3" + "@angular/core": "17.3.0" }, "peerDependenciesMeta": { "@angular/core": { @@ -480,9 +527,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.2.3.tgz", - "integrity": "sha512-mATybangypneXwO270VQeIw3N0avzc2Lpvdb8nm9WZYj23AcTUzpUUKOn63HtJdwMT5J2GjkyZFSRXisiPmpkA==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.0.tgz", + "integrity": "sha512-ewo+pb0QUC69Ey15z4vPteoBeO81HitqplysOoeXbyVBjMnKmZl3343wx7ukgcI97lmj4d38d1r4AnIoO5n/Vw==", "dependencies": { "@babel/core": "7.23.9", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -502,8 +549,8 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.2.3", - "typescript": ">=5.2 <5.4" + "@angular/compiler": "17.3.0", + "typescript": ">=5.2 <5.5" } }, "node_modules/@angular/compiler-cli/node_modules/reflect-metadata": { @@ -512,9 +559,9 @@ "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==" }, "node_modules/@angular/core": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.2.3.tgz", - "integrity": "sha512-DU+RdUB4E4I489R2P2hOrgkCDJNXlVaTzYixpgeDnuldCIYM0MatEzjor9DYNL3EDCayHF+M4HlVOcn6T/IVPQ==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.0.tgz", + "integrity": "sha512-umwsNFl/wEMTCUVvNl5iieEgHA+ESxSMcjedZGFWNGnpUxKTgYFYNG41/1wNZfPrS0+uRPHuYU9IHD+NR2s/Rw==", "dependencies": { "tslib": "^2.3.0" }, @@ -527,9 +574,9 @@ } }, "node_modules/@angular/forms": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.2.3.tgz", - "integrity": "sha512-v+/6pimht808F5XpmVTNV4/109s+A7m3nadQP97qvIDsrtwrPPZR7cST+DRioG2C41VwtjXM0HVbIon/3ydo6A==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.0.tgz", + "integrity": "sha512-TnLOake1fQCmmGEOZbTjP2gbKerZ/bfEMuiFfoe7R2rUvKl4xHGAHp99bqf7bUyAbB8ZgmPZc9/VHrrts8UNyA==", "dependencies": { "tslib": "^2.3.0" }, @@ -537,16 +584,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.2.3", - "@angular/core": "17.2.3", - "@angular/platform-browser": "17.2.3", + "@angular/common": "17.3.0", + "@angular/core": "17.3.0", + "@angular/platform-browser": "17.3.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/localize": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.2.3.tgz", - "integrity": "sha512-RCReeQabENpWNzhF/jZMhiMCbGt78lb5mgiMNvbGet62IHR62q3Qu1bXprjJvgGIHsxQlM4pkGgMGTZ/8/my4A==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.3.0.tgz", + "integrity": "sha512-f1Ilf7TtG1WoxDxazC8Wn9BP8Nx9z/sD9JWyO1ov8f7zyvtfuqVa8MVuQcggpRcgEi/4wRMGzOOANgs+CovYxw==", "dependencies": { "@babel/core": "7.23.9", "@types/babel__core": "7.20.5", @@ -562,14 +609,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.2.3", - "@angular/compiler-cli": "17.2.3" + "@angular/compiler": "17.3.0", + "@angular/compiler-cli": "17.3.0" } }, "node_modules/@angular/platform-browser": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.2.3.tgz", - "integrity": "sha512-bFi+H8avyCjwSBy+zpOKmqx852MRH8fkuZa4XgwKCPJRay8BfSCjHdtIo3eokUNPMu9JsyXM7HYKIfzLu5y6LA==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.0.tgz", + "integrity": "sha512-sIquvbq04KMOdpk1VdVFt7kVhOk/Rk+hI3M4raarMK5EbZ16nLYzpqjc2OZetUpKy6LB/FemClgNUShj9NlrqA==", "dependencies": { "tslib": "^2.3.0" }, @@ -577,9 +624,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.2.3", - "@angular/common": "17.2.3", - "@angular/core": "17.2.3" + "@angular/animations": "17.3.0", + "@angular/common": "17.3.0", + "@angular/core": "17.3.0" }, "peerDependenciesMeta": { "@angular/animations": { @@ -588,9 +635,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.2.3.tgz", - "integrity": "sha512-K8CsHbmG2nvV1jrNN9PYxyA0zJNoIWp+qf2udvPhG8rJ+Pyw61qmptrarpQUUkr8ONOtjwtOsnKa9/w+15nExw==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.0.tgz", + "integrity": "sha512-oX5AG0aSjmB89SyJZGyabr6uwfWd7yJM+krcrzHxFbVhvDCwdi9G+B0ADmaUn1shaXDseOFiLpo3R/oagd2fTA==", "dependencies": { "tslib": "^2.3.0" }, @@ -598,16 +645,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.2.3", - "@angular/compiler": "17.2.3", - "@angular/core": "17.2.3", - "@angular/platform-browser": "17.2.3" + "@angular/common": "17.3.0", + "@angular/compiler": "17.3.0", + "@angular/core": "17.3.0", + "@angular/platform-browser": "17.3.0" } }, "node_modules/@angular/router": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.2.3.tgz", - "integrity": "sha512-8UPjMzI98xZ6cDNm0MzHd9hFq6aOQJGmgxKDUPIG2h74glRwwbiewpo5hPo2EGIF8BLvQmmAm9ytr5zesHu0cg==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.0.tgz", + "integrity": "sha512-OBMAfjaSfEdEYqfYsAemDvknYZV69ABFf06hhduNLhB5QgbPrZCbNptnlrCPx4YDrzcANj2hrcyAmAVNTk8Giw==", "dependencies": { "tslib": "^2.3.0" }, @@ -615,9 +662,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.2.3", - "@angular/core": "17.2.3", - "@angular/platform-browser": "17.2.3", + "@angular/common": "17.3.0", + "@angular/core": "17.3.0", + "@angular/platform-browser": "17.3.0", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -803,9 +850,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -1018,13 +1065,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1044,9 +1091,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1983,13 +2030,13 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", - "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz", + "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "babel-plugin-polyfill-corejs2": "^0.4.8", "babel-plugin-polyfill-corejs3": "^0.9.0", "babel-plugin-polyfill-regenerator": "^0.5.5", @@ -2151,14 +2198,14 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", - "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", + "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", "dev": true, "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-option": "^7.23.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", @@ -2211,7 +2258,7 @@ "@babel/plugin-transform-new-target": "^7.23.3", "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.24.0", "@babel/plugin-transform-object-super": "^7.23.3", "@babel/plugin-transform-optional-catch-binding": "^7.23.4", "@babel/plugin-transform-optional-chaining": "^7.23.4", @@ -2274,9 +2321,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2286,22 +2333,22 @@ } }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", @@ -2309,8 +2356,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2319,9 +2366,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -2350,9 +2397,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.0.tgz", - "integrity": "sha512-fGFDEctNh0CcSwsiRPxiaqX0P5rq+AqE0SRhYGZ4PX46Lg1FNR6oCxJghf8YgY0WQEgQuh3lErUFE4KxLeRmmw==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", + "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", "cpu": [ "ppc64" ], @@ -2366,9 +2413,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.0.tgz", - "integrity": "sha512-3bMAfInvByLHfJwYPJRlpTeaQA75n8C/QKpEaiS4HrFWFiJlNI0vzq/zCjBrhAYcPyVPG7Eo9dMrcQXuqmNk5g==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", + "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", "cpu": [ "arm" ], @@ -2382,9 +2429,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.0.tgz", - "integrity": "sha512-aVpnM4lURNkp0D3qPoAzSG92VXStYmoVPOgXveAUoQBWRSuQzt51yvSju29J6AHPmwY1BjH49uR29oyfH1ra8Q==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", + "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", "cpu": [ "arm64" ], @@ -2398,9 +2445,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.0.tgz", - "integrity": "sha512-uK7wAnlRvjkCPzh8jJ+QejFyrP8ObKuR5cBIsQZ+qbMunwR8sbd8krmMbxTLSrDhiPZaJYKQAU5Y3iMDcZPhyQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", + "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", "cpu": [ "x64" ], @@ -2414,9 +2461,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.0.tgz", - "integrity": "sha512-AjEcivGAlPs3UAcJedMa9qYg9eSfU6FnGHJjT8s346HSKkrcWlYezGE8VaO2xKfvvlZkgAhyvl06OJOxiMgOYQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", + "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", "cpu": [ "arm64" ], @@ -2430,9 +2477,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.0.tgz", - "integrity": "sha512-bsgTPoyYDnPv8ER0HqnJggXK6RyFy4PH4rtsId0V7Efa90u2+EifxytE9pZnsDgExgkARy24WUQGv9irVbTvIw==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", + "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", "cpu": [ "x64" ], @@ -2446,9 +2493,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.0.tgz", - "integrity": "sha512-kQ7jYdlKS335mpGbMW5tEe3IrQFIok9r84EM3PXB8qBFJPSc6dpWfrtsC/y1pyrz82xfUIn5ZrnSHQQsd6jebQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", + "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", "cpu": [ "arm64" ], @@ -2462,9 +2509,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.0.tgz", - "integrity": "sha512-uG8B0WSepMRsBNVXAQcHf9+Ko/Tr+XqmK7Ptel9HVmnykupXdS4J7ovSQUIi0tQGIndhbqWLaIL/qO/cWhXKyQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", + "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", "cpu": [ "x64" ], @@ -2478,9 +2525,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.0.tgz", - "integrity": "sha512-2ezuhdiZw8vuHf1HKSf4TIk80naTbP9At7sOqZmdVwvvMyuoDiZB49YZKLsLOfKIr77+I40dWpHVeY5JHpIEIg==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", + "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", "cpu": [ "arm" ], @@ -2494,9 +2541,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.0.tgz", - "integrity": "sha512-uTtyYAP5veqi2z9b6Gr0NUoNv9F/rOzI8tOD5jKcCvRUn7T60Bb+42NDBCWNhMjkQzI0qqwXkQGo1SY41G52nw==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", + "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", "cpu": [ "arm64" ], @@ -2510,9 +2557,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.0.tgz", - "integrity": "sha512-c88wwtfs8tTffPaoJ+SQn3y+lKtgTzyjkD8NgsyCtCmtoIC8RDL7PrJU05an/e9VuAke6eJqGkoMhJK1RY6z4w==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", + "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", "cpu": [ "ia32" ], @@ -2526,9 +2573,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.0.tgz", - "integrity": "sha512-lR2rr/128/6svngnVta6JN4gxSXle/yZEZL3o4XZ6esOqhyR4wsKyfu6qXAL04S4S5CgGfG+GYZnjFd4YiG3Aw==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", + "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", "cpu": [ "loong64" ], @@ -2542,9 +2589,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.0.tgz", - "integrity": "sha512-9Sycc+1uUsDnJCelDf6ZNqgZQoK1mJvFtqf2MUz4ujTxGhvCWw+4chYfDLPepMEvVL9PDwn6HrXad5yOrNzIsQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", + "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", "cpu": [ "mips64el" ], @@ -2558,9 +2605,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.0.tgz", - "integrity": "sha512-CoWSaaAXOZd+CjbUTdXIJE/t7Oz+4g90A3VBCHLbfuc5yUQU/nFDLOzQsN0cdxgXd97lYW/psIIBdjzQIwTBGw==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", + "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", "cpu": [ "ppc64" ], @@ -2574,9 +2621,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.0.tgz", - "integrity": "sha512-mlb1hg/eYRJUpv8h/x+4ShgoNLL8wgZ64SUr26KwglTYnwAWjkhR2GpoKftDbPOCnodA9t4Y/b68H4J9XmmPzA==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", + "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", "cpu": [ "riscv64" ], @@ -2590,9 +2637,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.0.tgz", - "integrity": "sha512-fgf9ubb53xSnOBqyvWEY6ukBNRl1mVX1srPNu06B6mNsNK20JfH6xV6jECzrQ69/VMiTLvHMicQR/PgTOgqJUQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", + "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", "cpu": [ "s390x" ], @@ -2606,9 +2653,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.0.tgz", - "integrity": "sha512-H9Eu6MGse++204XZcYsse1yFHmRXEWgadk2N58O/xd50P9EvFMLJTQLg+lB4E1cF2xhLZU5luSWtGTb0l9UeSg==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", + "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", "cpu": [ "x64" ], @@ -2622,9 +2669,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.0.tgz", - "integrity": "sha512-lCT675rTN1v8Fo+RGrE5KjSnfY0x9Og4RN7t7lVrN3vMSjy34/+3na0q7RIfWDAj0e0rCh0OL+P88lu3Rt21MQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", + "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", "cpu": [ "x64" ], @@ -2638,9 +2685,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.0.tgz", - "integrity": "sha512-HKoUGXz/TOVXKQ+67NhxyHv+aDSZf44QpWLa3I1lLvAwGq8x1k0T+e2HHSRvxWhfJrFxaaqre1+YyzQ99KixoA==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", + "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", "cpu": [ "x64" ], @@ -2654,9 +2701,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.0.tgz", - "integrity": "sha512-GDwAqgHQm1mVoPppGsoq4WJwT3vhnz/2N62CzhvApFD1eJyTroob30FPpOZabN+FgCjhG+AgcZyOPIkR8dfD7g==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", + "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", "cpu": [ "x64" ], @@ -2670,9 +2717,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.0.tgz", - "integrity": "sha512-0vYsP8aC4TvMlOQYozoksiaxjlvUcQrac+muDqj1Fxy6jh9l9CZJzj7zmh8JGfiV49cYLTorFLxg7593pGldwQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", + "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", "cpu": [ "arm64" ], @@ -2686,9 +2733,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.0.tgz", - "integrity": "sha512-p98u4rIgfh4gdpV00IqknBD5pC84LCub+4a3MO+zjqvU5MVXOc3hqR2UgT2jI2nh3h8s9EQxmOsVI3tyzv1iFg==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", + "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", "cpu": [ "ia32" ], @@ -2702,9 +2749,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.0.tgz", - "integrity": "sha512-NgJnesu1RtWihtTtXGFMU5YSE6JyyHPMxCwBZK7a6/8d31GuSo9l0Ss7w1Jw5QnKUawG6UEehs883kcXf5fYwg==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", + "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", "cpu": [ "x64" ], @@ -2717,15 +2764,6 @@ "node": ">=12" } }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "dev": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -2846,13 +2884,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -2867,9 +2905,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } @@ -2890,9 +2928,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -3008,9 +3046,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.2.2.tgz", - "integrity": "sha512-HgvClGO6WVq4VA5d0ZvlDG5hrj8lQzRH99Gt87URm7G8E5XkatysdOsMqUQsJz+OwFWhP4PvTRWVblpBDiDl/A==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.0.tgz", + "integrity": "sha512-wNTCDPPEtjP4mxYerLVLCMwOCTEOD2HqZMVXD8pJbarrGPMuoyglUZuqNSIS5KVqR+fFez6JEUnMvC3QSqf58w==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0", @@ -3019,7 +3057,7 @@ }, "peerDependencies": { "@angular/compiler-cli": "^17.0.0", - "typescript": ">=5.2 <5.4", + "typescript": ">=5.2 <5.5", "webpack": "^5.54.0" } }, @@ -3599,13 +3637,13 @@ ] }, "node_modules/@schematics/angular": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.2.2.tgz", - "integrity": "sha512-Q3VAQ/S4gj8D1JPWgWG4enDdDZUu8mUXWVRG1rOi4sHgOF5zgPieQFp3LXqMUgOncmzbXrctkbO6NKc4N2FAag==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.0.tgz", + "integrity": "sha512-QqugP4Uyxk966VaUb/Jk5LQ5rE1BV4v2TmniPZtN3GZ6MDkpvPnFvlysvoq6y+7uiRhCLiT1DsBIwc9vXz3vWA==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.2.2", - "@angular-devkit/schematics": "17.2.2", + "@angular-devkit/core": "17.3.0", + "@angular-devkit/schematics": "17.3.0", "jsonc-parser": "3.2.1" }, "engines": { @@ -3895,13 +3933,13 @@ "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==" }, "node_modules/@syncfusion/ej2-angular-treegrid": { - "version": "24.2.8", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-treegrid/-/ej2-angular-treegrid-24.2.8.tgz", - "integrity": "sha512-Gafs5bzs6HH0zP6vIGhIhZiRVcSXlKR6SX0Mb/nB5UEViGhqqx7Dgrvwz2e7mF4Wd55YNjcWko4s7DQNoDYNqA==", + "version": "24.2.9", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-treegrid/-/ej2-angular-treegrid-24.2.9.tgz", + "integrity": "sha512-a2wlG0vz/AxsI5B2cNyleOsNW6mQILLHQTL9wyHskoTS++QlyisKsm5aq493ga4iiag3fqUhDAr0G/39j2PwYg==", "dependencies": { "@syncfusion/ej2-angular-base": "~24.2.3", "@syncfusion/ej2-base": "~24.2.7", - "@syncfusion/ej2-treegrid": "24.2.8", + "@syncfusion/ej2-treegrid": "24.2.9", "tslib": "^2.3.0" } }, @@ -3925,15 +3963,15 @@ } }, "node_modules/@syncfusion/ej2-calendars": { - "version": "24.2.8", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-calendars/-/ej2-calendars-24.2.8.tgz", - "integrity": "sha512-yNIDopI/QlCEukzmza/YMvNTzeY5HTl7kf03/2JWvSudw6Wo+4RgH+rNiRZoe4QOREcFvvyq5Zt2J9xFsAkEqw==", + "version": "24.2.9", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-calendars/-/ej2-calendars-24.2.9.tgz", + "integrity": "sha512-WyY+eTgHlPiNQ7WqCJfuI8mlsx9XuC7ywgwBNWojK18wmETETPZ2freTlo59khHfWSW5xqKKFXy2lVTtw5NYvw==", "dependencies": { "@syncfusion/ej2-base": "~24.2.7", "@syncfusion/ej2-buttons": "~24.2.7", - "@syncfusion/ej2-inputs": "~24.2.7", + "@syncfusion/ej2-inputs": "~24.2.9", "@syncfusion/ej2-lists": "~24.2.8", - "@syncfusion/ej2-popups": "~24.2.8" + "@syncfusion/ej2-popups": "~24.2.9" } }, "node_modules/@syncfusion/ej2-compression": { @@ -3953,17 +3991,17 @@ } }, "node_modules/@syncfusion/ej2-dropdowns": { - "version": "24.2.8", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-dropdowns/-/ej2-dropdowns-24.2.8.tgz", - "integrity": "sha512-Fakaa54TlMvcZ8GpqN+E27XiKrALanxBPxE/0NPA5/qqNQvQsZwBB8I5YrkWPp2C8AhVf9xqfGK9ZkFK3mxI8w==", + "version": "24.2.9", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-dropdowns/-/ej2-dropdowns-24.2.9.tgz", + "integrity": "sha512-va8WauFI/LSIvhAvhqSGlGwrHWHV6d9SbkfJy+uQ6w6eDnNTzD9ZH+eUcu7bhSoNVHdOSjPIFbLh8Ea2ev4LEA==", "dependencies": { "@syncfusion/ej2-base": "~24.2.7", "@syncfusion/ej2-data": "~24.2.3", - "@syncfusion/ej2-inputs": "~24.2.7", + "@syncfusion/ej2-inputs": "~24.2.9", "@syncfusion/ej2-lists": "~24.2.8", "@syncfusion/ej2-navigations": "~24.2.8", "@syncfusion/ej2-notifications": "~24.2.4", - "@syncfusion/ej2-popups": "~24.2.8" + "@syncfusion/ej2-popups": "~24.2.9" } }, "node_modules/@syncfusion/ej2-excel-export": { @@ -3981,24 +4019,24 @@ "integrity": "sha512-kPejWNjWoougUu/tsxh6ywKR/cr5+2tIZO1BUWlTO+XyFk/uolZ4Xx14tGVnrLpzl4+DaSLfv73b6VDvqpIbzg==" }, "node_modules/@syncfusion/ej2-grids": { - "version": "24.2.8", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-grids/-/ej2-grids-24.2.8.tgz", - "integrity": "sha512-dTAv6zUuow6x4VOufNU2lkjQYxCk7qFPFeqBUGABD4VKUezuCQ3Qz1w+gWHRbO33kZ5bMXBWlAi3laYm6ZBB/w==", + "version": "24.2.9", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-grids/-/ej2-grids-24.2.9.tgz", + "integrity": "sha512-dZUiIjHmVMYnYKlv76kYIYHVN2e1dHdiZAFO80MD/WAmFEkuvdOAhXBXBA4rWygXRDLDnq0mA04WIkKQIVDPlg==", "dependencies": { "@syncfusion/ej2-base": "~24.2.7", "@syncfusion/ej2-buttons": "~24.2.7", - "@syncfusion/ej2-calendars": "~24.2.8", + "@syncfusion/ej2-calendars": "~24.2.9", "@syncfusion/ej2-compression": "~24.2.3", "@syncfusion/ej2-data": "~24.2.3", - "@syncfusion/ej2-dropdowns": "~24.2.8", + "@syncfusion/ej2-dropdowns": "~24.2.9", "@syncfusion/ej2-excel-export": "~24.2.4", "@syncfusion/ej2-file-utils": "~24.2.3", - "@syncfusion/ej2-inputs": "~24.2.7", + "@syncfusion/ej2-inputs": "~24.2.9", "@syncfusion/ej2-lists": "~24.2.8", "@syncfusion/ej2-navigations": "~24.2.8", "@syncfusion/ej2-notifications": "~24.2.4", "@syncfusion/ej2-pdf-export": "~24.2.3", - "@syncfusion/ej2-popups": "~24.2.8", + "@syncfusion/ej2-popups": "~24.2.9", "@syncfusion/ej2-splitbuttons": "~24.2.7" } }, @@ -4008,13 +4046,13 @@ "integrity": "sha512-JdQ7w2SiiUUXZFrmX0j3+0iQZdT+Z5NP7jb1zTKDAiTGB3IjcSTQc8MtPmORTG4vvG6lOSLYHrn2HtP7mqvlEQ==" }, "node_modules/@syncfusion/ej2-inputs": { - "version": "24.2.7", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-inputs/-/ej2-inputs-24.2.7.tgz", - "integrity": "sha512-D99wWfzORyL9k+wWXi4ZN+ckfZhtahfuDg20ls5cNPnZAEk+xjZABoN3/UGM/V8MGV2Kl3vX+qezhR2ZWE9GUA==", + "version": "24.2.9", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-inputs/-/ej2-inputs-24.2.9.tgz", + "integrity": "sha512-inUPQt387emSR12p8hHWVQUA4q2oH8kcMPNe8mc06TN5wgPnSDYjciV2oTam9xkOchOlYrRmL0gsV6a72ilYPw==", "dependencies": { "@syncfusion/ej2-base": "~24.2.7", "@syncfusion/ej2-buttons": "~24.2.7", - "@syncfusion/ej2-popups": "~24.2.5", + "@syncfusion/ej2-popups": "~24.2.9", "@syncfusion/ej2-splitbuttons": "~24.2.7" } }, @@ -4061,9 +4099,9 @@ } }, "node_modules/@syncfusion/ej2-popups": { - "version": "24.2.8", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-popups/-/ej2-popups-24.2.8.tgz", - "integrity": "sha512-vy0GmrP49Kawt4cj9Mza3u6fGOu3id5qCAz9RHOSHbQ9awVvjrpNszZCE0vdkaD67ErvU3UnvTSOG/+jrBIwzA==", + "version": "24.2.10", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-popups/-/ej2-popups-24.2.10.tgz", + "integrity": "sha512-1BJZ05Ms2BfEkPWdpaCuzBe2DwYNUmz2Qz7ys3z+74a46vWWQANL1s8Xet9ApB7r4UR59jcKAxYfbI4lAU73ag==", "dependencies": { "@syncfusion/ej2-base": "~24.2.7", "@syncfusion/ej2-buttons": "~24.2.7" @@ -4079,14 +4117,14 @@ } }, "node_modules/@syncfusion/ej2-treegrid": { - "version": "24.2.8", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-treegrid/-/ej2-treegrid-24.2.8.tgz", - "integrity": "sha512-XGF6mep9gZ+37Tqy7mFKJ7+VKEmEcfV0n8GqvROHnTFO2CfNrT0ghXZX8JZeIGUyKrv8BEoGhKPvcvCykikW9A==", + "version": "24.2.9", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-treegrid/-/ej2-treegrid-24.2.9.tgz", + "integrity": "sha512-iWAkE+rUWBzMlRrLWyA2ta32KO/gxy+qZc6/YQmzY5bGg/icm38bPu9+t2EnTW9C+8QhgWbIwJ0zw7ON3zt9Kw==", "dependencies": { "@syncfusion/ej2-base": "~24.2.7", "@syncfusion/ej2-data": "~24.2.3", - "@syncfusion/ej2-grids": "~24.2.8", - "@syncfusion/ej2-popups": "~24.2.8" + "@syncfusion/ej2-grids": "~24.2.9", + "@syncfusion/ej2-popups": "~24.2.9" } }, "node_modules/@szmarczak/http-timer": { @@ -4918,9 +4956,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/autoprefixer": { - "version": "10.4.17", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", - "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "version": "10.4.18", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", + "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", "dev": true, "funding": [ { @@ -4937,8 +4975,8 @@ } ], "dependencies": { - "browserslist": "^4.22.2", - "caniuse-lite": "^1.0.30001578", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001591", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4998,13 +5036,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", + "@babel/helper-define-polyfill-provider": "^0.6.1", "semver": "^6.3.1" }, "peerDependencies": { @@ -5033,6 +5071,22 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", @@ -5045,6 +5099,22 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -5330,9 +5400,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "funding": [ { "type": "opencollective", @@ -5348,8 +5418,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -5552,9 +5622,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001585", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz", - "integrity": "sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "funding": [ { "type": "opencollective", @@ -5600,6 +5670,14 @@ "pnpm": ">=8" } }, + "node_modules/chartjs-plugin-datalabels": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chartjs-plugin-datalabels/-/chartjs-plugin-datalabels-2.2.0.tgz", + "integrity": "sha512-14ZU30lH7n89oq+A4bWaJPnAG8a7ZTk7dKf48YAzMvJjQtjrgg5Dpk9f+LbjCF6bpx3RAGTeL13IXpKQYyRvlw==", + "peerDependencies": { + "chart.js": ">=3.0.0" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -6160,9 +6238,9 @@ } }, "node_modules/critters": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", - "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz", + "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -6171,7 +6249,7 @@ "domhandler": "^5.0.2", "htmlparser2": "^8.0.2", "postcss": "^8.4.23", - "pretty-bytes": "^5.3.0" + "postcss-media-query-parser": "^0.2.3" } }, "node_modules/critters/node_modules/ansi-styles": { @@ -6401,9 +6479,9 @@ } }, "node_modules/date-fns": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.3.1.tgz", - "integrity": "sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.4.0.tgz", + "integrity": "sha512-Akz4R8J9MXBsOgF1QeWeCsbv6pntT5KCPjU0Q9prBxVmWJYPLhwAIsNg3b0QAdr0ttiozYLD3L/af7Ra0jqYXw==", "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" @@ -6618,6 +6696,11 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, + "node_modules/dom-to-image": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/dom-to-image/-/dom-to-image-2.6.0.tgz", + "integrity": "sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA==" + }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -6692,9 +6775,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.660", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.660.tgz", - "integrity": "sha512-1BqvQG0BBQrAA7FVL2EMrb5A1sVyXF3auwJneXjGWa1TpN+g0C4KbUsYWePz6OZ0mXZfXGy+RmQDELJWwE8v/Q==" + "version": "1.4.705", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.705.tgz", + "integrity": "sha512-LKqhpwJCLhYId2VVwEzFXWrqQI5n5zBppz1W9ehhTlfYU8CUUW6kClbN8LHF/v7flMgRdETS772nqywJ+ckVAw==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -6907,9 +6990,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.0.tgz", - "integrity": "sha512-6iwE3Y2RVYCME1jLpBqq7LQWK3MW6vjV2bZy6gt/WrqkY+WE74Spyc0ThAOYpMtITvnjX09CrC6ym7A/m9mebA==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz", + "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", "dev": true, "hasInstallScript": true, "optional": true, @@ -6920,35 +7003,35 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.0", - "@esbuild/android-arm": "0.20.0", - "@esbuild/android-arm64": "0.20.0", - "@esbuild/android-x64": "0.20.0", - "@esbuild/darwin-arm64": "0.20.0", - "@esbuild/darwin-x64": "0.20.0", - "@esbuild/freebsd-arm64": "0.20.0", - "@esbuild/freebsd-x64": "0.20.0", - "@esbuild/linux-arm": "0.20.0", - "@esbuild/linux-arm64": "0.20.0", - "@esbuild/linux-ia32": "0.20.0", - "@esbuild/linux-loong64": "0.20.0", - "@esbuild/linux-mips64el": "0.20.0", - "@esbuild/linux-ppc64": "0.20.0", - "@esbuild/linux-riscv64": "0.20.0", - "@esbuild/linux-s390x": "0.20.0", - "@esbuild/linux-x64": "0.20.0", - "@esbuild/netbsd-x64": "0.20.0", - "@esbuild/openbsd-x64": "0.20.0", - "@esbuild/sunos-x64": "0.20.0", - "@esbuild/win32-arm64": "0.20.0", - "@esbuild/win32-ia32": "0.20.0", - "@esbuild/win32-x64": "0.20.0" + "@esbuild/aix-ppc64": "0.20.1", + "@esbuild/android-arm": "0.20.1", + "@esbuild/android-arm64": "0.20.1", + "@esbuild/android-x64": "0.20.1", + "@esbuild/darwin-arm64": "0.20.1", + "@esbuild/darwin-x64": "0.20.1", + "@esbuild/freebsd-arm64": "0.20.1", + "@esbuild/freebsd-x64": "0.20.1", + "@esbuild/linux-arm": "0.20.1", + "@esbuild/linux-arm64": "0.20.1", + "@esbuild/linux-ia32": "0.20.1", + "@esbuild/linux-loong64": "0.20.1", + "@esbuild/linux-mips64el": "0.20.1", + "@esbuild/linux-ppc64": "0.20.1", + "@esbuild/linux-riscv64": "0.20.1", + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" } }, "node_modules/esbuild-wasm": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.0.tgz", - "integrity": "sha512-Lc9KeQCg1Zf8kCtfDXgy29rx0x8dOuhDWbkP76Wc64q7ctOOc1Zv1C39AxiE+y4N6ONyXtJk4HKpM7jlU7/jSA==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.1.tgz", + "integrity": "sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -8012,9 +8095,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -8212,17 +8295,17 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/inquirer": { - "version": "9.2.14", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.14.tgz", - "integrity": "sha512-4ByIMt677Iz5AvjyKrDpzaepIyMewNvDcvwpVVRZNmy9dLakVoVgdCHZXbK1SlVJra1db0JZ6XkJyHsanpdrdQ==", + "version": "9.2.15", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz", + "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==", "dev": true, "dependencies": { "@ljharb/through": "^2.3.12", @@ -9127,9 +9210,9 @@ } }, "node_modules/keycloak-js": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-24.0.0.tgz", - "integrity": "sha512-OiIhJjMYWpu30ssFFQOu2/F3HGRUDfp5p61uRL2AaFZ+DbbZl+gJGBk9lgp0rIDr5zHGm7az0A955yjOdEBKZQ==", + "version": "24.0.1", + "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-24.0.1.tgz", + "integrity": "sha512-leV4mlpa0dqYUXTAuq1ufUfk8DOSBCembjQwMwzYrM6xfHSKpcZMxviTWXqro52LMSsYAnivSKVNEvBkLzi7Eg==", "dependencies": { "js-sha256": "^0.11.0", "jwt-decode": "^4.0.0" @@ -9512,9 +9595,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -9718,9 +9801,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.0.tgz", - "integrity": "sha512-CxmUYPFcTgET1zImteG/LZOy/4T5rTojesQXkSNBiquhydn78tfbCE9sjIjnJ/UcjNjOC1bphTCCW5rrS7cXAg==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", + "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", "dev": true, "dependencies": { "schema-utils": "^4.0.0", @@ -12184,9 +12267,9 @@ } }, "node_modules/piscina": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.3.1.tgz", - "integrity": "sha512-MBj0QYm3hJQ/C/wIXTN1OCYC8uQ4BBJ4LVele2P4ZwVQAH04vkk8E1SpDbuemLAL1dZorbuOob9rYqJeWCcCRg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.4.0.tgz", + "integrity": "sha512-+AQduEJefrOApE4bV7KRmp3N2JnnyErlVqq4P/jmko4FPz9Z877BCccl/iB3FdrWSUkvbGV9Kan/KllJgat3Vg==", "dev": true, "optionalDependencies": { "nice-napi": "^1.0.2" @@ -12306,9 +12389,9 @@ } }, "node_modules/postcss-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.0.tgz", - "integrity": "sha512-AbperNcX3rlob7Ay7A/HQcrofug1caABBkopoFeOQMspZBqcqj6giYn1Bwey/0uiOPAcR+NQD0I2HC7rXzk91w==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", "dev": true, "dependencies": { "cosmiconfig": "^9.0.0", @@ -12336,6 +12419,12 @@ } } }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, "node_modules/postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", @@ -12414,18 +12503,6 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", @@ -13166,9 +13243,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", - "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", + "version": "1.71.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", + "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -13183,9 +13260,9 @@ } }, "node_modules/sass-loader": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.1.0.tgz", - "integrity": "sha512-LS2mLeFWA+orYxHNu+O18Xe4jR0kyamNOOUsE3NyBP4DvIL+8stHpNX0arYTItdPe80kluIiJ7Wfe/9iHSRO0Q==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.1.1.tgz", + "integrity": "sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==", "dev": true, "dependencies": { "neo-async": "^2.6.2" @@ -14106,9 +14183,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "version": "5.29.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", + "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -14486,9 +14563,9 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -14521,13 +14598,10 @@ } }, "node_modules/undici": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.6.2.tgz", - "integrity": "sha512-vSqvUE5skSxQJ5sztTZ/CdeJb1Wq0Hf44hlYMciqHghvz+K88U0l7D6u1VsndoFgskDcnU+nG3gYmMzJVzd9Qg==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.7.1.tgz", + "integrity": "sha512-+Wtb9bAQw6HYWzCnxrPTMVEV3Q1QjYanI0E4q02ehReMuquQdLTEFEYbfs7hcImVYKcQkWSwT6buEmSVIiDDtQ==", "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, "engines": { "node": ">=18.0" } @@ -14774,13 +14848,13 @@ } }, "node_modules/vite": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", - "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", "dev": true, "dependencies": { "esbuild": "^0.19.3", - "postcss": "^8.4.32", + "postcss": "^8.4.35", "rollup": "^4.2.0" }, "bin": { @@ -15294,9 +15368,9 @@ } }, "node_modules/webpack": { - "version": "5.90.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", - "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", diff --git a/Front End/poam-app/package.json b/Front End/poam-app/package.json index 168d9696..77d36e84 100644 --- a/Front End/poam-app/package.json +++ b/Front End/poam-app/package.json @@ -10,16 +10,16 @@ }, "private": true, "dependencies": { - "@angular/animations": "^17.2.3", + "@angular/animations": "^17.3.0", "@angular/cdk": "<17.1.0", - "@angular/common": "^17.2.3", - "@angular/compiler": "^17.2.3", - "@angular/core": "^17.2.3", - "@angular/forms": "^17.2.3", - "@angular/localize": "^17.2.3", - "@angular/platform-browser": "^17.2.3", - "@angular/platform-browser-dynamic": "^17.2.3", - "@angular/router": "^17.2.3", + "@angular/common": "^17.3.0", + "@angular/compiler": "^17.3.0", + "@angular/core": "^17.3.0", + "@angular/forms": "^17.3.0", + "@angular/localize": "^17.3.0", + "@angular/platform-browser": "^17.3.0", + "@angular/platform-browser-dynamic": "^17.3.0", + "@angular/router": "^17.3.0", "@nebular/auth": "^13.0.0", "@nebular/date-fns": "^13.0.0", "@nebular/eva-icons": "^13.0.0", @@ -27,12 +27,14 @@ "@nebular/theme": "^13.0.0", "@ng-bootstrap/ng-bootstrap": "^16.0.0", "@popperjs/core": "^2.11.8", - "@syncfusion/ej2-angular-treegrid": "^24.2.8", + "@syncfusion/ej2-angular-treegrid": "^24.2.9", "angular2-smart-table": "^3.2.0", "axios": "^1.6.7", "bootstrap": "^5.3.3", "chart.js": "^4.4.2", - "date-fns": "^3.3.1", + "chartjs-plugin-datalabels": "^2.2.0", + "date-fns": "^3.4.0", + "dom-to-image": "^2.6.0", "eva-icons": "^1.1.3", "express": "^4.18.3", "express-jwt": "^8.4.1", @@ -40,7 +42,7 @@ "jsdom": "^24.0.0", "jsonwebtoken": "^9.0.2", "keycloak-angular": "^15.1.0", - "keycloak-js": "^24.0.0", + "keycloak-js": "^24.0.1", "ng2-charts": "^6.0.0", "ngx-infinite-scroll": "^17.0.0", "npm-check-updates": "^16.14.15", @@ -55,10 +57,10 @@ "zone.js": "^0.14.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.2.2", - "@angular/cli": "^17.2.2", - "@angular/compiler-cli": "^17.2.3", - "@schematics/angular": "^17.2.2", + "@angular-devkit/build-angular": "^17.3.0", + "@angular/cli": "^17.3.0", + "@angular/compiler-cli": "^17.3.0", + "@schematics/angular": "^17.3.0", "@types/chart.js": "^2.9.41", "@types/datatables.net": "^1.10.28", "@types/jasmine": "^5.1.4", @@ -70,6 +72,6 @@ "karma-coverage": "^2.2.1", "karma-jasmine": "^5.1.0", "karma-jasmine-html-reporter": "^2.1.0", - "typescript": "^5.3.3" + "typescript": "^5.4.2" } } diff --git a/Front End/poam-app/src/app/app.module.ts b/Front End/poam-app/src/app/app.module.ts index 6df8f57a..15174fef 100644 --- a/Front End/poam-app/src/app/app.module.ts +++ b/Front End/poam-app/src/app/app.module.ts @@ -34,7 +34,7 @@ import { RoleProvider } from './auth'; import { PoamApproveModule } from "./pages/poam-processing/poam-approve/poam-approve.module"; import { PoamExtendModule } from "./pages/poam-processing/poam-extend/poam-extend.module"; import { FileUploadService } from './file-upload.service'; -import { provideCharts, withDefaultRegisterables } from 'ng2-charts'; +import { BaseChartDirective, provideCharts, withDefaultRegisterables } from 'ng2-charts'; function initializeKeycloak(keycloak: KeycloakService) { return () => @@ -69,8 +69,7 @@ function initializeKeycloak(keycloak: KeycloakService) { provideCharts(withDefaultRegisterables()), ], bootstrap: [AppComponent], - exports: [ - ], + exports: [], imports: [ TreeGridModule, AppRoutingModule, diff --git a/Front End/poam-app/src/app/pages/asset-processing/asset-processing.component.html b/Front End/poam-app/src/app/pages/asset-processing/asset-processing.component.html index 3470e157..c1fdef46 100644 --- a/Front End/poam-app/src/app/pages/asset-processing/asset-processing.component.html +++ b/Front End/poam-app/src/app/pages/asset-processing/asset-processing.component.html @@ -31,6 +31,9 @@

Assets

+

diff --git a/Front End/poam-app/src/app/pages/asset-processing/asset-processing.component.scss b/Front End/poam-app/src/app/pages/asset-processing/asset-processing.component.scss index 0df4d9ea..673e50fc 100644 --- a/Front End/poam-app/src/app/pages/asset-processing/asset-processing.component.scss +++ b/Front End/poam-app/src/app/pages/asset-processing/asset-processing.component.scss @@ -15,10 +15,18 @@ } .canvas { + position: relative; max-height: 50vh; max-width: 100vw; } +.export-button { + position: absolute; + top: 0; + right: 0; + margin-right: 0; +} + .add-asset-button { margin-top: 20px; } diff --git a/Front End/poam-app/src/app/pages/asset-processing/asset-processing.component.ts b/Front End/poam-app/src/app/pages/asset-processing/asset-processing.component.ts index 17defd5c..c7ddb56b 100644 --- a/Front End/poam-app/src/app/pages/asset-processing/asset-processing.component.ts +++ b/Front End/poam-app/src/app/pages/asset-processing/asset-processing.component.ts @@ -25,6 +25,7 @@ import { environment } from '../../../environments/environment'; import { ChangeDetectorRef } from '@angular/core'; import { Assets } from './asset.model'; import { Chart, registerables, ChartData } from 'chart.js'; +import ChartDataLabels from 'chartjs-plugin-datalabels'; interface Permission { userId: number; @@ -80,9 +81,23 @@ export class AssetProcessingComponent implements OnInit, AfterViewInit { maintainAspectRatio: false, scales: { x: { grid: { display: true } }, - y: { beginAtZero: true, grid: { display: false } }, + y: { + beginAtZero: true, + grace: '5%', + grid: { + display: false + }, + ticks: { + font: { + weight: 600, + }, + } + }, }, plugins: { + title: { + display: false, + }, legend: { display: true, position: this.selectedPosition, @@ -180,11 +195,15 @@ export class AssetProcessingComponent implements OnInit, AfterViewInit { } private initializeChart(): void { + Chart.defaults.set('plugins.datalabels', { + display: false, + }); this.cdr.detectChanges(); if (this.assetLabelsChart?.nativeElement) { this.assetLabelChart = new Chart(this.assetLabelsChart.nativeElement, { type: 'bar', data: this.assetLabelChartData, + plugins: [ChartDataLabels], options: this.barChartOptions, }); if (this.assetLabel) { @@ -406,7 +425,8 @@ export class AssetProcessingComponent implements OnInit, AfterViewInit { } const datasets = assetLabel.map((item) => ({ label: item.label, - data: [item.labelCount] + data: [item.labelCount], + datalabels: {}, })); this.assetLabelChart.data.datasets = datasets; this.assetLabelChart.update(); @@ -447,6 +467,66 @@ export class AssetProcessingComponent implements OnInit, AfterViewInit { } } + exportChart(chartInstance: Chart, chartName: string) { + const exportDatalabelsOptions = { + backgroundColor: function (context: any) { + const datasetBackgroundColor = context.chart.data.datasets[context.datasetIndex].backgroundColor; + return Array.isArray(datasetBackgroundColor) + ? datasetBackgroundColor[context.dataIndex] + : datasetBackgroundColor; + }, + borderRadius: 4, + color: 'white', + display: true, + font: { + weight: 'bold' + }, + align: 'end', + anchor: 'end', + padding: 6 + }; + + chartInstance.data.datasets.forEach(dataset => { + if (dataset.datalabels) { + Object.assign(dataset.datalabels, exportDatalabelsOptions); + } + }); + chartInstance.options.plugins!.title = { + display: true, + text: `${chartName}`, + position: 'bottom' + }; + chartInstance.update(); + + setTimeout(() => { + const canvas = chartInstance.canvas; + const dataURL = canvas.toDataURL('image/png'); + const link = document.createElement('a'); + link.download = `${chartName}_Export.png`; + link.href = dataURL; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + + setTimeout(() => { + const disappearDatalabelsOptions = { + display: false + }; + + chartInstance.data.datasets.forEach(dataset => { + if (dataset.datalabels) { + Object.assign(dataset.datalabels, disappearDatalabelsOptions); + } + }); + chartInstance.options.plugins!.title = { + display: false, + }; + chartInstance.update(); + }, 500); + + }, 150); + } + updateSort(sortRequest: NbSortRequest): void { diff --git a/Front End/poam-app/src/app/pages/poam-processing/poam-details/poam-details.component.html b/Front End/poam-app/src/app/pages/poam-processing/poam-details/poam-details.component.html index 5e84e5fe..80ebdd6f 100644 --- a/Front End/poam-app/src/app/pages/poam-processing/poam-details/poam-details.component.html +++ b/Front End/poam-app/src/app/pages/poam-processing/poam-details/poam-details.component.html @@ -98,13 +98,8 @@ - -
- - -
- +
@@ -116,6 +111,25 @@
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+
diff --git a/Front End/poam-app/src/app/pages/poam-processing/poam-details/poam-details.component.ts b/Front End/poam-app/src/app/pages/poam-processing/poam-details/poam-details.component.ts index b025fd28..5f0996f3 100644 --- a/Front End/poam-app/src/app/pages/poam-processing/poam-details/poam-details.component.ts +++ b/Front End/poam-app/src/app/pages/poam-processing/poam-details/poam-details.component.ts @@ -537,7 +537,8 @@ export class PoamDetailsComponent implements OnInit { status: "Draft", poamType: "Standard", vulnIdRestricted: "", - submittedDate: new Date().toISOString().slice(0, 10) + submittedDate: new Date().toISOString().slice(0, 10), + scanResultss: "", }; this.dates.scheduledCompletionDate = this.poam.scheduledCompletionDate; @@ -803,7 +804,6 @@ let approverSettings = this.poamApproverSettings; this.poam.requiredResources = (this.poam.requiredResources) ? this.poam.requiredResources : "" this.poam.vulnIdRestricted = (this.poam.vulnIdRestricted) ? this.poam.vulnIdRestricted : "" this.subs.sink = this.poamService.updatePoam(this.poam).subscribe(data => { - // console.log("returned data: ",data) this.poam = data; this.getData(); this.showConfirmation("Updated POAM", "Success", "Success", true); @@ -849,17 +849,14 @@ let approverSettings = this.poamApproverSettings; }); } this.poam.assignees = assignees; - // pass in assets if (this.poamAssets) { this.poamAssets.forEach((asset: any) => { assets.push({ assetId: +asset.assetId }) }); } this.poam.assets = assets; - // console.log("adding this.poam: ", this.poam) this.subs.sink = this.poamService.postPoam(this.poam).subscribe( res => { - // console.log("postPoam res: ", res) if (res.null || res.null == "null") { this.showConfirmation("unexpected error adding poam"); } else { @@ -1054,9 +1051,8 @@ let approverSettings = this.poamApproverSettings; } confirmEditApprover(event: any) { - // console.log("poamDetails confirmEditApprover event: ", event) if (this.poam.poamId === "ADDPOAM") { - // nothing to do, when the poam is added, we'll the approvers is automatically loaded, the first time it is borughtup in edit mode after the id hasbeen assigned. + // nothing to do, when the poam is added, the approvers are automatically loaded, the first time it is brought up in edit mode after the id has been assigned. event.confirm.reject(); return; } @@ -1137,7 +1133,6 @@ let approverSettings = this.poamApproverSettings; approved: 'Not Reviewed', comments: event.newData.comments } - // console.log("user: ", usert) if (user) { approver.firstName = user.firstName; approver.lastName = user.lastName; @@ -1146,7 +1141,6 @@ let approverSettings = this.poamApproverSettings; } await this.poamService.addPoamApprover(approver).subscribe((res: any) => { - // console.log("poamDetail confirmCreatePoam res: ", res) if (res.null) { this.showConfirmation("Unable to insert row, potentially a duplicate."); event.confirm.reject(); @@ -1354,7 +1348,7 @@ let approverSettings = this.poamApproverSettings; this.router.navigateByUrl('/poam-processing'); } }); - } + } confirm = (dialogOptions: ConfirmationDialogOptions): Observable => this.dialogService.open(ConfirmationDialogComponent, { @@ -1365,6 +1359,35 @@ let approverSettings = this.poamApproverSettings; }, }).onClose; + importScanResultss(): void { + const fields = 'id,name,description,status,initiator,owner,ownerGroup,repository,scan,job,details,importStatus,importStart,importFinish,importDuration,downloadAvailable,downloadFormat,dataFormat,resultType,resultSource,running,errorDetails,importErrorDetails,totalIPs,scannedIPs,startTime,finishTime,scanDuration,completedIPs,completedChecks,totalChecks,agentScanUUID,agentScanContainerUUID,progress'; + if (this.poam && this.poam.iavmNumber) { + this.poamService.getTenableScanResultss(this.poam.iavmNumber, fields) + .subscribe({ + next: (data: any) => { + const plainText = this.parseJsonToPlainText(data); + this.poam.scanResults = plainText; + }, + error: (error: any) => { + this.showConfirmation('API key is not properly configured, please contact your C-PAT administrator.'); + } + }); + } else { + console.error('IAVM Number is not available.'); + } + } + + parseJsonToPlainText(data: any, indent: string = ''): string { + let plainText = ''; + Object.keys(data).forEach(key => { + if (typeof data[key] === 'object' && data[key] !== null) { + plainText += `${indent}${key}:\n${this.parseJsonToPlainText(data[key], indent + ' ')}`; + } else { + plainText += `${indent}${key}: ${data[key]}\n`; + } + }); + return plainText; + } ngOnDestroy() { this.subs.unsubscribe(); diff --git a/Front End/poam-app/src/app/pages/poam-processing/poams.component.html b/Front End/poam-app/src/app/pages/poam-processing/poams.component.html index 2de120c4..566ec4d3 100644 --- a/Front End/poam-app/src/app/pages/poam-processing/poams.component.html +++ b/Front End/poam-app/src/app/pages/poam-processing/poams.component.html @@ -27,6 +27,9 @@
+

@@ -66,6 +69,9 @@
+

@@ -102,6 +108,9 @@
+

@@ -141,6 +150,9 @@
+

diff --git a/Front End/poam-app/src/app/pages/poam-processing/poams.component.scss b/Front End/poam-app/src/app/pages/poam-processing/poams.component.scss index 79752aa5..8ba9bc05 100644 --- a/Front End/poam-app/src/app/pages/poam-processing/poams.component.scss +++ b/Front End/poam-app/src/app/pages/poam-processing/poams.component.scss @@ -17,8 +17,16 @@ } .canvas { - max-height: 50vh; - max-width: 100vw; + position: relative; + max-height: 50vh; + max-width: 100vw; +} + +.export-button { + position: absolute; + top: 0; + right: 0; + margin-right: 0; } hr { diff --git a/Front End/poam-app/src/app/pages/poam-processing/poams.component.ts b/Front End/poam-app/src/app/pages/poam-processing/poams.component.ts index 0680ea3d..91763684 100644 --- a/Front End/poam-app/src/app/pages/poam-processing/poams.component.ts +++ b/Front End/poam-app/src/app/pages/poam-processing/poams.component.ts @@ -20,6 +20,7 @@ import { KeycloakProfile } from 'keycloak-js'; import { UsersService } from '../user-processing/users.service'; import { Chart, registerables, ChartData } from 'chart.js'; import { addDays, differenceInCalendarDays } from 'date-fns'; +import ChartDataLabels from 'chartjs-plugin-datalabels'; interface Permission { userId: number; @@ -80,9 +81,25 @@ estimatedCompletionChartData: ChartData<'bar'> = { maintainAspectRatio: false, scales: { x: { grid: { display: true } }, - y: { beginAtZero: true, grid: { display: false } }, + y: { + beginAtZero: true, + grace: '5%', + grid: { + display: false + }, + ticks: { + font: { + size: 13, + family: 'sans-serif', + weight: 600, + }, + } + }, }, plugins: { + title: { + display: false, + }, legend: { display: true, position: this.selectedPosition, @@ -92,7 +109,7 @@ estimatedCompletionChartData: ChartData<'bar'> = { family: 'sans-serif', weight: 600, } - } + }, }, }, }; @@ -155,11 +172,15 @@ estimatedCompletionChartData: ChartData<'bar'> = { } private initializeChart(): void { + Chart.defaults.set('plugins.datalabels', { + display: false, + }); this.cdr.detectChanges(); if (this.poamStatusChart?.nativeElement) { this.statusChart = new Chart(this.poamStatusChart.nativeElement, { type: 'bar', data: this.statusChartData, + plugins: [ChartDataLabels], options: this.barChartOptions, }); if (this.poamStatus) { @@ -173,6 +194,7 @@ estimatedCompletionChartData: ChartData<'bar'> = { this.labelChart = new Chart(this.poamLabelChart.nativeElement, { type: 'bar', data: this.labelChartData, + plugins: [ChartDataLabels], options: this.barChartOptions, }); if (this.poamLabel) { @@ -186,6 +208,7 @@ estimatedCompletionChartData: ChartData<'bar'> = { this.severityChart = new Chart(this.poamSeverityChart.nativeElement, { type: 'bar', data: this.severityChartData, + plugins: [ChartDataLabels], options: this.barChartOptions, }); if (this.poamSeverity) { @@ -199,6 +222,7 @@ estimatedCompletionChartData: ChartData<'bar'> = { this.estimatedCompletionChart = new Chart(this.poamEstimatedCompletionChart.nativeElement, { type: 'bar', data: this.estimatedCompletionChartData, + plugins: [ChartDataLabels], options: this.barChartOptions, }); if (this.poamEstimatedCompletion) { @@ -332,7 +356,8 @@ estimatedCompletionChartData: ChartData<'bar'> = { } const datasets = poamStatus.map((item) => ({ label: item.status, - data: [item.statusCount] + data: [item.statusCount], + datalabels: {}, })); this.statusChart.data.datasets = datasets; this.statusChart.update(); @@ -346,7 +371,8 @@ estimatedCompletionChartData: ChartData<'bar'> = { } const datasets = poamLabel.map((item) => ({ label: item.label, - data: [item.labelCount] + data: [item.labelCount], + datalabels: {}, })); this.labelChart.data.datasets = datasets; this.labelChart.update(); @@ -360,7 +386,8 @@ estimatedCompletionChartData: ChartData<'bar'> = { } const datasets = poamSeverity.map((item) => ({ label: item.severity, - data: [item.severityCount] + data: [item.severityCount], + datalabels: {}, })); this.severityChart.data.datasets = datasets; @@ -374,7 +401,8 @@ estimatedCompletionChartData: ChartData<'bar'> = { } const datasets = poamEstimatedCompletion.map((item) => ({ label: item.estimatedCompletion, - data: [item.estimatedCompletionCount] + data: [item.estimatedCompletionCount], + datalabels: {}, })); this.estimatedCompletionChart.data.datasets = datasets; @@ -505,4 +533,73 @@ estimatedCompletionChartData: ChartData<'bar'> = { this.updateEstimatedCompletionChartData(filteredPoamEstimatedCompletion); }; + + exportChart(chartInstance: Chart, chartName: string) { + const exportDatalabelsOptions = { + backgroundColor: function (context: any) { + const datasetBackgroundColor = context.chart.data.datasets[context.datasetIndex].backgroundColor; + return Array.isArray(datasetBackgroundColor) + ? datasetBackgroundColor[context.dataIndex] + : datasetBackgroundColor; + }, + borderRadius: 4, + color: 'white', + display: true, + font: { + weight: 'bold' + }, + align: 'end', + anchor: 'end', + padding: 6 + }; + + chartInstance.data.datasets.forEach(dataset => { + if (dataset.datalabels) { + Object.assign(dataset.datalabels, exportDatalabelsOptions); + } + }); + + chartInstance.options.plugins!.title = { + display: true, + position: 'bottom', + text: `${chartName}`, + font: { + size: 16, + family: 'sans-serif', + weight: 600, + }, + }; + chartInstance.update(); + + setTimeout(() => { + const canvas = chartInstance.canvas; + const dataURL = canvas.toDataURL('image/png'); + const link = document.createElement('a'); + link.download = `${chartName}_Export.png`; + link.href = dataURL; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + + setTimeout(() => { + const disappearDatalabelsOptions = { + display: false + }; + + chartInstance.data.datasets.forEach(dataset => { + if (dataset.datalabels) { + Object.assign(dataset.datalabels, disappearDatalabelsOptions); + } + }); + chartInstance.options.plugins!.title = { + display: false, + }; + chartInstance.update(); + }, 500); + + }, 150); + } + + } + diff --git a/Front End/poam-app/src/app/pages/poam-processing/poams.module.ts b/Front End/poam-app/src/app/pages/poam-processing/poams.module.ts index df1575af..ed735a63 100644 --- a/Front End/poam-app/src/app/pages/poam-processing/poams.module.ts +++ b/Front End/poam-app/src/app/pages/poam-processing/poams.module.ts @@ -17,6 +17,7 @@ import { Angular2SmartTableModule } from 'angular2-smart-table'; import { FormsModule } from '@angular/forms'; import { provideCharts, withDefaultRegisterables } from 'ng2-charts'; import { AppComponent } from '../../app.component'; +import { NbEvaIconsModule } from '@nebular/eva-icons'; @NgModule({ declarations: [ @@ -31,6 +32,7 @@ import { AppComponent } from '../../app.component'; NbDatepickerModule, NbFormFieldModule, NbIconModule, + NbEvaIconsModule, NbInputModule, FormsModule, PoamsRoutingModule, diff --git a/Front End/poam-app/src/app/pages/poam-processing/poams.service.ts b/Front End/poam-app/src/app/pages/poam-processing/poams.service.ts index 1b864025..085e2029 100644 --- a/Front End/poam-app/src/app/pages/poam-processing/poams.service.ts +++ b/Front End/poam-app/src/app/pages/poam-processing/poams.service.ts @@ -227,4 +227,20 @@ deletePoamMilestone(poamId: string, milestoneId: string) { return this.http .delete(`${this.uri}/poamLabel/poam/${poamId}/label/${labelId}`, this.httpOptions); } + + getTenableScanResultss(iavmNumber: string, fields?: string) { + const tenableAccessKey = environment.tenableAccessKey; + const tenableSecretKey = environment.tenableSecretKey; + const endpoint = `${environment.getScanResultssFromTenableEndpoint}${iavmNumber}`; + const url = fields ? `${endpoint}?fields=${fields}` : endpoint; + + const headers = new HttpHeaders({ + 'Content-Type': 'application/json', + 'X-ApiKeys': `accessKey=${tenableAccessKey}; secretKey=${tenableSecretKey}` + }); + + return this.http.get(url, { headers }).pipe( + catchError(this.handleError) + ); + } } diff --git a/Front End/poam-app/src/environments/environment.local.ts b/Front End/poam-app/src/environments/environment.local.ts index 032896aa..4574a7be 100644 --- a/Front End/poam-app/src/environments/environment.local.ts +++ b/Front End/poam-app/src/environments/environment.local.ts @@ -17,6 +17,9 @@ export const environment = { fileUploadEndpoint: 'http://localhost:8086/api/poamimport', stigmanCollectionImportEndpoint: 'http://localhost:8086/api/stigmancollectionimport', stigmanAssetImportEndpoint: 'http://localhost:8086/api/stigmanassetimport', + getScanResultssFromTenableEndpoint: 'http://0.0.0.0:9000/scanResults/', //placeholder + tenableAccessKey: 'placeholder', + tenableSecretKey: 'placeholder', getSTIGsFromSTIGMANEndpoint: 'http://localhost:54000/api/stigs/', getCollectionsFromSTIGMANEndpoint: 'http://localhost:54000/api/collections/', getAvailableAssetsFromSTIGMANEndpoint: 'http://localhost:54000/api/assets?collectionId=', diff --git a/Front End/poam-app/src/environments/environment.prod.ts b/Front End/poam-app/src/environments/environment.prod.ts index 42053faf..2d9f469a 100644 --- a/Front End/poam-app/src/environments/environment.prod.ts +++ b/Front End/poam-app/src/environments/environment.prod.ts @@ -15,6 +15,9 @@ export const environment = { fileUploadEndpoint: 'http://localhost:8086/api/poamimport', stigmanCollectionImportEndpoint: 'http://localhost:8086/api/stigmancollectionimport', stigmanAssetImportEndpoint: 'http://localhost:8086/api/stigmanassetimport', + getScanResultssFromTenableEndpoint: 'http://0.0.0.0:9000/scanResults/', //placeholder + tenableAccessKey: 'placeholder', + tenableSecretKey: 'placeholder', getCollectionsFromSTIGMANEndpoint: 'http://localhost:54000/api/collections/', getAvailableAssetsFromSTIGMANEndpoint: 'http://localhost:54000/api/assets?collectionId=', getAssetsFromSTIGMANEndpoint: 'http://localhost:54000/api/assets/', diff --git a/Front End/poam-app/src/environments/environment.ts b/Front End/poam-app/src/environments/environment.ts index ee1f4544..77e7be1f 100644 --- a/Front End/poam-app/src/environments/environment.ts +++ b/Front End/poam-app/src/environments/environment.ts @@ -21,6 +21,9 @@ export const environment = { fileUploadEndpoint: 'http://localhost:8086/api/poamimport', stigmanCollectionImportEndpoint: 'http://localhost:8086/api/stigmancollectionimport', stigmanAssetImportEndpoint: 'http://localhost:8086/api/stigmanassetimport', + getScanResultssFromTenableEndpoint: 'http://0.0.0.0:9000/scanResults/', //placeholder + tenableAccessKey: 'placeholder', + tenableSecretKey: 'placeholder', getCollectionsFromSTIGMANEndpoint: 'http://localhost:54000/api/collections/', getAvailableAssetsFromSTIGMANEndpoint: 'http://localhost:54000/api/assets?collectionId=', getAssetsFromSTIGMANEndpoint: 'http://localhost:54000/api/assets/',