From 5f3f8cc885dd41160894ebb2fca1f9dfe11d00f2 Mon Sep 17 00:00:00 2001 From: Chris Rodriguez Date: Fri, 5 Apr 2024 16:28:50 -0400 Subject: [PATCH] Reference pull request for full details. --- Api/package-lock.json | 70 ++- Api/package.json | 12 +- Front End/poam-app/package-lock.json | 396 +++++++------ Front End/poam-app/package.json | 38 +- .../stigmanager-import.component.html | 2 +- .../poam-processing/poams.component.html | 275 ++++----- .../pages/poam-processing/poams.component.ts | 560 +++++++++++------- .../app/pages/poam-processing/poams.module.ts | 5 +- .../pages/poam-processing/poams.service.ts | 2 +- 9 files changed, 738 insertions(+), 622 deletions(-) diff --git a/Api/package-lock.json b/Api/package-lock.json index 2660cc51..f3376f49 100644 --- a/Api/package-lock.json +++ b/Api/package-lock.json @@ -11,23 +11,23 @@ "dependencies": { "@nestjs/passport": "^10.0.3", "async-retry": "^1.3.3", - "axios": "^1.6.7", + "axios": "^1.6.8", "cors": "^2.8.5", - "date-fns": "^3.3.1", + "date-fns": "^3.6.0", "dotenv": "^16.4.5", "exceljs": "^4.4.0", - "express": "^4.18.3", + "express": "^4.19.2", "express-jwt": "^8.4.1", "express-openapi-validator": "^5.1.6", "jsonwebtoken": "^9.0.2", "jwks-rsa": "^3.1.0", "multer": "^1.4.5-lts.1", - "mysql2": "^3.9.2", - "npm-check-updates": "^16.14.15", + "mysql2": "^3.9.3", + "npm-check-updates": "^16.14.18", "passport": "^0.7.0", "passport-local": "^1.0.0", "read-excel-file": "^5.7.1", - "sequelize": "^6.37.1", + "sequelize": "^6.37.2", "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz" } }, @@ -592,6 +592,11 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, + "node_modules/@types/semver-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/semver-utils/-/semver-utils-1.1.3.tgz", + "integrity": "sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==" + }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -893,11 +898,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -1507,9 +1512,9 @@ } }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -1612,9 +1617,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.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" @@ -1945,16 +1950,16 @@ "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" }, "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -2122,9 +2127,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -3774,9 +3779,9 @@ } }, "node_modules/mysql2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.2.tgz", - "integrity": "sha512-3Cwg/UuRkAv/wm6RhtPE5L7JlPB877vwSF6gfLAS68H+zhH+u5oa3AieqEd0D0/kC3W7qIhYbH419f7O9i/5nw==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.3.tgz", + "integrity": "sha512-+ZaoF0llESUy7BffccHG+urErHcWPZ/WuzYAA9TEeLaDYyke3/3D+VQDzK9xzRnXpd0eMtRf0WNOeo4Q1Baung==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -4151,10 +4156,11 @@ } }, "node_modules/npm-check-updates": { - "version": "16.14.15", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.15.tgz", - "integrity": "sha512-WH0wJ9j6CP7Azl+LLCxWAYqroT2IX02kRIzgK/fg0rPpMbETgHITWBdOPtrv521xmA3JMgeNsQ62zvVtS/nCmQ==", + "version": "16.14.18", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.18.tgz", + "integrity": "sha512-9iaRe9ohx9ykdbLjPRIYcq1A0RkrPYUx9HmQK1JIXhfxtJCNE/+497H9Z4PGH6GWRALbz5KF+1iZoySK2uSEpQ==", "dependencies": { + "@types/semver-utils": "^1.1.1", "chalk": "^5.3.0", "cli-table3": "^0.6.3", "commander": "^10.0.1", @@ -5248,9 +5254,9 @@ "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" }, "node_modules/sequelize": { - "version": "6.37.1", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.1.tgz", - "integrity": "sha512-vIKKzQ9dGp2aBOxQRD1FmUYViuQiKXSJ8yah8TsaBx4U3BokJt+Y2A0qz2C4pj08uX59qpWxRqSLEfRmVOEgQw==", + "version": "6.37.2", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.2.tgz", + "integrity": "sha512-bnb7swGANONXCTrVyebpOOZssLwQrVkYX2tcC6qOIvH+P+OhsoMBi7c3GXI5bC+Z4b4tOl+kQy6yeqLCZ1YQAQ==", "funding": [ { "type": "opencollective", diff --git a/Api/package.json b/Api/package.json index 25f33704..23a664db 100644 --- a/Api/package.json +++ b/Api/package.json @@ -11,23 +11,23 @@ "dependencies": { "@nestjs/passport": "^10.0.3", "async-retry": "^1.3.3", - "axios": "^1.6.7", + "axios": "^1.6.8", "cors": "^2.8.5", - "date-fns": "^3.3.1", + "date-fns": "^3.6.0", "dotenv": "^16.4.5", "exceljs": "^4.4.0", - "express": "^4.18.3", + "express": "^4.19.2", "express-jwt": "^8.4.1", "express-openapi-validator": "^5.1.6", "jsonwebtoken": "^9.0.2", "jwks-rsa": "^3.1.0", "multer": "^1.4.5-lts.1", - "mysql2": "^3.9.2", - "npm-check-updates": "^16.14.15", + "mysql2": "^3.9.3", + "npm-check-updates": "^16.14.18", "passport": "^0.7.0", "passport-local": "^1.0.0", "read-excel-file": "^5.7.1", - "sequelize": "^6.37.1", + "sequelize": "^6.37.2", "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz" } } diff --git a/Front End/poam-app/package-lock.json b/Front End/poam-app/package-lock.json index 87733018..15ccdd61 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.3.0", + "@angular/animations": "^17.3.3", "@angular/cdk": "<17.1.0", - "@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", + "@angular/common": "^17.3.3", + "@angular/compiler": "^17.3.3", + "@angular/core": "^17.3.3", + "@angular/forms": "^17.3.3", + "@angular/localize": "^17.3.3", + "@angular/platform-browser": "^17.3.3", + "@angular/platform-browser-dynamic": "^17.3.3", + "@angular/router": "^17.3.3", "@nebular/auth": "^13.0.0", "@nebular/date-fns": "^13.0.0", "@nebular/eva-icons": "^13.0.0", @@ -25,7 +25,7 @@ "@nebular/theme": "^13.0.0", "@ng-bootstrap/ng-bootstrap": "^16.0.0", "@popperjs/core": "^2.11.8", - "@syncfusion/ej2-angular-treegrid": "^25.1.35", + "@syncfusion/ej2-angular-treegrid": "^25.1.38", "angular2-smart-table": "^3.2.0", "axios": "^1.6.8", "bootstrap": "^5.3.3", @@ -34,16 +34,16 @@ "date-fns": "^3.6.0", "dom-to-image": "^2.6.0", "eva-icons": "^1.1.3", - "express": "^4.18.3", + "express": "^4.19.2", "express-jwt": "^8.4.1", "jquery": "^3.7.1", "jsdom": "^24.0.0", "jsonwebtoken": "^9.0.2", - "keycloak-angular": "^15.2.0", - "keycloak-js": "^24.0.1", + "keycloak-angular": "^15.2.1", + "keycloak-js": "^24.0.2", "ng2-charts": "^6.0.0", "ngx-infinite-scroll": "^17.0.0", - "npm-check-updates": "^16.14.17", + "npm-check-updates": "^16.14.18", "passport": "^0.7.0", "passport-local": "^1.0.0", "rxjs": "^7.8.1", @@ -55,10 +55,10 @@ "zone.js": "^0.14.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.3.0", - "@angular/cli": "^17.3.0", - "@angular/compiler-cli": "^17.3.0", - "@schematics/angular": "^17.3.0", + "@angular-devkit/build-angular": "^17.3.3", + "@angular/cli": "^17.3.3", + "@angular/compiler-cli": "^17.3.3", + "@schematics/angular": "^17.3.3", "@types/chart.js": "^2.9.41", "@types/datatables.net": "^1.10.28", "@types/jasmine": "^5.1.4", @@ -70,7 +70,7 @@ "karma-coverage": "^2.2.1", "karma-jasmine": "^5.1.0", "karma-jasmine-html-reporter": "^2.1.0", - "typescript": "^5.4.2" + "typescript": "^5.4.4" } }, "node_modules/@ampproject/remapping": { @@ -86,12 +86,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1703.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.0.tgz", - "integrity": "sha512-2X2cswI4TIwtQxCe5U9f4jeiDjAb8r89XLpU0QwEHyZyWx02uhYHO3FDMJq/NxCS95IUAQOBGBhbD4ey4Hl9cQ==", + "version": "0.1703.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.3.tgz", + "integrity": "sha512-BKbdigCjmspqxOxSIQuWgPZzpyuKqZoTBDh0jDeLcAmvPsuxCgIWbsExI4OQ0CyusnQ+XT0IT39q8B9rvF56cg==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.3.0", + "@angular-devkit/core": "17.3.3", "rxjs": "7.8.1" }, "engines": { @@ -101,15 +101,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "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==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.3.tgz", + "integrity": "sha512-E/6Z1MIMhEB1I2sN+Pw4/zinwAFj4vLDh6dEuj856WWEPndgPiUB6fGX4EbCTsyIUzboXI5ysdNyt2Eq56bllA==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1703.0", - "@angular-devkit/build-webpack": "0.1703.0", - "@angular-devkit/core": "17.3.0", + "@angular-devkit/architect": "0.1703.3", + "@angular-devkit/build-webpack": "0.1703.3", + "@angular-devkit/core": "17.3.3", "@babel/core": "7.24.0", "@babel/generator": "7.23.6", "@babel/helper-annotate-as-pure": "7.22.5", @@ -120,7 +120,7 @@ "@babel/preset-env": "7.24.0", "@babel/runtime": "7.24.0", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.3.0", + "@ngtools/webpack": "17.3.3", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.18", @@ -165,7 +165,7 @@ "vite": "5.1.5", "watchpack": "2.4.0", "webpack": "5.90.3", - "webpack-dev-middleware": "6.1.1", + "webpack-dev-middleware": "6.1.2", "webpack-dev-server": "4.15.1", "webpack-merge": "5.10.0", "webpack-subresource-integrity": "5.1.0" @@ -320,12 +320,12 @@ "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1703.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.0.tgz", - "integrity": "sha512-IEaLzV5lolURJhMKM4naW6pYTDjI5E8I+97o/kbSa0yakvGOBwg7yRmfc54T1M0Z4nmifPsj4OVRGhBaa6dgXA==", + "version": "0.1703.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.3.tgz", + "integrity": "sha512-d0JjE8MaGVNphlJfeP1OZKhNT4wCXkEZKdSdwE0+W+vDHNUuZiUBB1czO48sb7T4xBrdjRWlV/9CzMNJ7n3ydA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1703.0", + "@angular-devkit/architect": "0.1703.3", "rxjs": "7.8.1" }, "engines": { @@ -339,9 +339,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.0.tgz", - "integrity": "sha512-ldErhMYq8rcFOhWQ0syQdLy6IYb/LL0erigj7gCMOf59oJgM7B13o/ZTOCvyJttUZ9IP0HB98Gi3epEuJ30VLg==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.3.tgz", + "integrity": "sha512-J22Sh3M7rj8Ar3iEs20ko5wgC3DE7vWfYZNdimt2IJiS4J7BEX8R3Awf+TRt+6AN3NFm3/xe1Sz4yvDh3FvNFg==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -378,12 +378,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.0.tgz", - "integrity": "sha512-EW4Y8W/KTlvvT2fw3bh9hY7quDF2b9EaF+KftEqoDRWYbw0tlF8hWIdlfA6JxQC12d6uefh3kDNj5am0Il2oNQ==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.3.tgz", + "integrity": "sha512-SABqTtj2im4PJhQjNaAsSypbNkpZFW8YozJ3P748tlh5a9XoHpgiqXv5JhRbyKElLDAyk5i9fe2++JmSudPG/Q==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.3.0", + "@angular-devkit/core": "17.3.3", "jsonc-parser": "3.2.1", "magic-string": "0.30.8", "ora": "5.4.1", @@ -396,9 +396,9 @@ } }, "node_modules/@angular/animations": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.0.tgz", - "integrity": "sha512-H7R3c2E479CPpaX6bU84F8u4JV+IFEfM8BUOgrbcI9tF16m6C2eJbl8IqNuW0yADuTarRSlOT7TW0qyrmcxhRw==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.3.tgz", + "integrity": "sha512-poLW3FHe5wkxmTIsQ3em2vq4obgQHyZJz6biF+4hCqQSNMbMBS0e5ZycAiJLkUD/WLc88lQZ20muRO7qjVuMLA==", "dependencies": { "tslib": "^2.3.0" }, @@ -406,7 +406,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.0" + "@angular/core": "17.3.3" } }, "node_modules/@angular/cdk": { @@ -426,15 +426,15 @@ } }, "node_modules/@angular/cli": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.0.tgz", - "integrity": "sha512-xwxlimNP4MECkdzjc0+m7lGxighcH0ncAfEo9yUo+r+4EFalB/Q7DAQPIU1xkbBk8iJwcFhGFAnS1IeLur15kQ==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.3.tgz", + "integrity": "sha512-veIGK2sRm0SfiLHeftx0W0xC3N8uxoqxXiSG57V6W2wIFN/fKm3aRq3sa8phz7vxUzoKGqyZh6hsT7ybkjgkGA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1703.0", - "@angular-devkit/core": "17.3.0", - "@angular-devkit/schematics": "17.3.0", - "@schematics/angular": "17.3.0", + "@angular-devkit/architect": "0.1703.3", + "@angular-devkit/core": "17.3.3", + "@angular-devkit/schematics": "17.3.3", + "@schematics/angular": "17.3.3", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.2", @@ -493,9 +493,9 @@ "dev": true }, "node_modules/@angular/common": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.0.tgz", - "integrity": "sha512-JnS6jbLl2RxsvGFUOBGeoyviNLEjZKRhn3uK4Ein3DENPv0BeSFMjif9Dp4ReUCnqoD4QQVG0X/r1GFaqHn2pw==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.3.tgz", + "integrity": "sha512-GwlKetNpfWKiG2j4S6bYTi6PA2iT4+eln7o8owo44xZWdQnWQjfxnH39vQuCyhi6OOQL1dozmae+fVXgQsV6jQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -503,14 +503,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.0", + "@angular/core": "17.3.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.0.tgz", - "integrity": "sha512-lZBD5mFq7SzFJydZwW2jvnQGmtcU1s3e548hl4MSZpRgt13m5UmBQKbyMOvVN2WxKvWKlmDlywsAJlMSXepYig==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.3.tgz", + "integrity": "sha512-ZNMRfagMxMjk1KW5H3ssCg5QL0J6ZW1JAZ1mrTXixqS7gbdwl60bTGE+EfuEwbjvovEYaj4l9cga47eMaxZTbQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -518,7 +518,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.0" + "@angular/core": "17.3.3" }, "peerDependenciesMeta": { "@angular/core": { @@ -527,9 +527,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.0.tgz", - "integrity": "sha512-ewo+pb0QUC69Ey15z4vPteoBeO81HitqplysOoeXbyVBjMnKmZl3343wx7ukgcI97lmj4d38d1r4AnIoO5n/Vw==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.3.tgz", + "integrity": "sha512-vM0lqwuXQZ912HbLnIuvUblvIz2WEUsU7a5Z2ieNey6famH4zxPH12vCbVwXgicB6GLHorhOfcWC5443wD2mJw==", "dependencies": { "@babel/core": "7.23.9", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -549,7 +549,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.3.0", + "@angular/compiler": "17.3.3", "typescript": ">=5.2 <5.5" } }, @@ -559,9 +559,9 @@ "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==" }, "node_modules/@angular/core": { - "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==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.3.tgz", + "integrity": "sha512-O/jr3aFJMCxF6Jmymjx4jIigRHJfqM/ALIi60y2LVznBVFkk9xyMTsAjgWQIEHX+2muEIzgfKuXzpL0y30y+wA==", "dependencies": { "tslib": "^2.3.0" }, @@ -574,9 +574,9 @@ } }, "node_modules/@angular/forms": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.0.tgz", - "integrity": "sha512-TnLOake1fQCmmGEOZbTjP2gbKerZ/bfEMuiFfoe7R2rUvKl4xHGAHp99bqf7bUyAbB8ZgmPZc9/VHrrts8UNyA==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.3.tgz", + "integrity": "sha512-wqn+eAggbOZY91hr7oDjv5qdflszVOC9SZMcWJUoZTGn+8eoV6v6728GDFuDDwYkKQ9G9eQbX4IZmYoVw3TVjQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -584,16 +584,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.0", - "@angular/core": "17.3.0", - "@angular/platform-browser": "17.3.0", + "@angular/common": "17.3.3", + "@angular/core": "17.3.3", + "@angular/platform-browser": "17.3.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/localize": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.3.0.tgz", - "integrity": "sha512-f1Ilf7TtG1WoxDxazC8Wn9BP8Nx9z/sD9JWyO1ov8f7zyvtfuqVa8MVuQcggpRcgEi/4wRMGzOOANgs+CovYxw==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.3.3.tgz", + "integrity": "sha512-gahGKy0VBZ+KP6MUULGQMoi5SN3REwslaPvtomizzz9fdmqHfR8PPd1vOJSNm2IEVlvm1hv1dDRjPcR4DJwvaQ==", "dependencies": { "@babel/core": "7.23.9", "@types/babel__core": "7.20.5", @@ -609,14 +609,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.3.0", - "@angular/compiler-cli": "17.3.0" + "@angular/compiler": "17.3.3", + "@angular/compiler-cli": "17.3.3" } }, "node_modules/@angular/platform-browser": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.0.tgz", - "integrity": "sha512-sIquvbq04KMOdpk1VdVFt7kVhOk/Rk+hI3M4raarMK5EbZ16nLYzpqjc2OZetUpKy6LB/FemClgNUShj9NlrqA==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.3.tgz", + "integrity": "sha512-XFWjquD+Pr9VszRzrDlT6uaf57TsY9XhL9iHCNok6Op5DpVQpIAuw1vFt2t5ZoQ0gv+lY8mVWnxgqe3CgTdYxw==", "dependencies": { "tslib": "^2.3.0" }, @@ -624,9 +624,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.3.0", - "@angular/common": "17.3.0", - "@angular/core": "17.3.0" + "@angular/animations": "17.3.3", + "@angular/common": "17.3.3", + "@angular/core": "17.3.3" }, "peerDependenciesMeta": { "@angular/animations": { @@ -635,9 +635,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "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==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.3.tgz", + "integrity": "sha512-jSgSNHRTXCIat20I+4tLm/e8qOvrIE3Zv7S/DtYZEiAth84uoznvo1kXnN+KREse2vP/WoNgSDKQ2JLzkwYXSQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -645,16 +645,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.0", - "@angular/compiler": "17.3.0", - "@angular/core": "17.3.0", - "@angular/platform-browser": "17.3.0" + "@angular/common": "17.3.3", + "@angular/compiler": "17.3.3", + "@angular/core": "17.3.3", + "@angular/platform-browser": "17.3.3" } }, "node_modules/@angular/router": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.0.tgz", - "integrity": "sha512-OBMAfjaSfEdEYqfYsAemDvknYZV69ABFf06hhduNLhB5QgbPrZCbNptnlrCPx4YDrzcANj2hrcyAmAVNTk8Giw==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.3.tgz", + "integrity": "sha512-kj42+TtwvET7MFqxB3pkKyob0VNmspASlv8Y29vSpzzaOHn8J1fDf6H+8opoIC+Gmvo5NqXUDwq7nxI5aQ0mUQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -662,9 +662,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.0", - "@angular/core": "17.3.0", - "@angular/platform-browser": "17.3.0", + "@angular/common": "17.3.3", + "@angular/core": "17.3.3", + "@angular/platform-browser": "17.3.3", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -2942,9 +2942,9 @@ "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, "node_modules/@ljharb/through": { @@ -3046,9 +3046,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.0.tgz", - "integrity": "sha512-wNTCDPPEtjP4mxYerLVLCMwOCTEOD2HqZMVXD8pJbarrGPMuoyglUZuqNSIS5KVqR+fFez6JEUnMvC3QSqf58w==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.3.tgz", + "integrity": "sha512-053KMbg1Tb+Mmg4Htsv8yTpI7ABghguoxhwosQXKB0CjO6M0oexuvdaxbRDQ1vd5xYNOW9LcOfxOMPIwyU4BBA==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0", @@ -3637,13 +3637,13 @@ ] }, "node_modules/@schematics/angular": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.0.tgz", - "integrity": "sha512-QqugP4Uyxk966VaUb/Jk5LQ5rE1BV4v2TmniPZtN3GZ6MDkpvPnFvlysvoq6y+7uiRhCLiT1DsBIwc9vXz3vWA==", + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.3.tgz", + "integrity": "sha512-kNlyjIKTBhfi8Jab3MCkxNRbbpErbzdu0lZNSL8Nidmqs6Tk23Dc1bZe4t/gPNOCkCvQlwYa6X88SjC/ntyVng==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.3.0", - "@angular-devkit/schematics": "17.3.0", + "@angular-devkit/core": "17.3.3", + "@angular-devkit/schematics": "17.3.3", "jsonc-parser": "3.2.1" }, "engines": { @@ -3897,9 +3897,9 @@ "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, "node_modules/@syncfusion/ej2-angular-base": { - "version": "25.1.35", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-base/-/ej2-angular-base-25.1.35.tgz", - "integrity": "sha512-qgU9HuC7z7TneCMXCNIZljtEl1rR0rz5UsiYTrJQALlsQJjBRtdBoHJ95vg/6P7rB5uOivkTkrDyGXZV9YbWtA==", + "version": "25.1.37", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-base/-/ej2-angular-base-25.1.37.tgz", + "integrity": "sha512-R90bSxbdLheCzrlGLjfsrCg/0WXJD3F3jPmZQCdHjrdmwmTsrEkTXwDYURd2wQsF4fsAI/qxdzehhbA29TL1XA==", "hasInstallScript": true, "dependencies": { "@syncfusion/ej2-base": "~25.1.35", @@ -3907,13 +3907,13 @@ } }, "node_modules/@syncfusion/ej2-angular-treegrid": { - "version": "25.1.35", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-treegrid/-/ej2-angular-treegrid-25.1.35.tgz", - "integrity": "sha512-yIGNnUywaQy/P3Nf0WGBTFyZMUgQ8UWWeKB6XkDvat7nxFl//NDXxwWr93o6h8A13h2xxsVBs6Mf8PypiJ2NOQ==", + "version": "25.1.38", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-angular-treegrid/-/ej2-angular-treegrid-25.1.38.tgz", + "integrity": "sha512-7hiGM8c4EE4c3tWu/1Xmci+WLcYzU84iF6RLkhigpeQvxpYVY7Xuc1hsCbygtiI0260jyn24WhQ4E3B7tBR/Tw==", "dependencies": { - "@syncfusion/ej2-angular-base": "~25.1.35", + "@syncfusion/ej2-angular-base": "~25.1.37", "@syncfusion/ej2-base": "~25.1.35", - "@syncfusion/ej2-treegrid": "25.1.35", + "@syncfusion/ej2-treegrid": "25.1.38", "tslib": "^2.3.0" } }, @@ -3937,13 +3937,13 @@ } }, "node_modules/@syncfusion/ej2-calendars": { - "version": "25.1.35", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-calendars/-/ej2-calendars-25.1.35.tgz", - "integrity": "sha512-S/MaJ/Pb62rfRIwU2kFV+2nZ5+TwEr5LbHRp+3sR+u786MiNqla4O7StK7LfEluxGpFVQGPRyRkx77wC5FfBbg==", + "version": "25.1.37", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-calendars/-/ej2-calendars-25.1.37.tgz", + "integrity": "sha512-zr3RiG/uDBZyUoZ7/+F8/pw/hjzDoN6lhqChF1x1ob+X99GFAfLopDudd8CwqSpXbFaLWEf8HHW3FLwrEdmlcg==", "dependencies": { "@syncfusion/ej2-base": "~25.1.35", "@syncfusion/ej2-buttons": "~25.1.35", - "@syncfusion/ej2-inputs": "~25.1.35", + "@syncfusion/ej2-inputs": "~25.1.37", "@syncfusion/ej2-lists": "~25.1.35", "@syncfusion/ej2-popups": "~25.1.35" } @@ -3965,15 +3965,15 @@ } }, "node_modules/@syncfusion/ej2-dropdowns": { - "version": "25.1.35", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-dropdowns/-/ej2-dropdowns-25.1.35.tgz", - "integrity": "sha512-0P6t07FSGNzRlpm/Nsd63V+QKr58kgqjBdypDpsYmS5BKmimoLeWPboWdpi8lSWLZh4Mh4u+NM4WXXMyZjsg/A==", + "version": "25.1.37", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-dropdowns/-/ej2-dropdowns-25.1.37.tgz", + "integrity": "sha512-kKvxXTxweHSgpu9NTeczNC78mdHcRT34rji0QYn+IDm//XQJLaSX68OwUCOXWGmSZxY+fwopYLzzhKnd6lBIhw==", "dependencies": { "@syncfusion/ej2-base": "~25.1.35", "@syncfusion/ej2-data": "~25.1.35", - "@syncfusion/ej2-inputs": "~25.1.35", + "@syncfusion/ej2-inputs": "~25.1.37", "@syncfusion/ej2-lists": "~25.1.35", - "@syncfusion/ej2-navigations": "~25.1.35", + "@syncfusion/ej2-navigations": "~25.1.37", "@syncfusion/ej2-notifications": "~25.1.35", "@syncfusion/ej2-popups": "~25.1.35" } @@ -3993,25 +3993,25 @@ "integrity": "sha512-nBkZXnGtBt5MFpTkJdvvEKS65HGLa5UM1pQq34K/Cdx4YPlxzStQkVo4RyamXqwtadhLqmpKc9zGolHvUw7KvA==" }, "node_modules/@syncfusion/ej2-grids": { - "version": "25.1.35", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-grids/-/ej2-grids-25.1.35.tgz", - "integrity": "sha512-XHxTphdt4O55MURpyC96j/bEMimqufrPXw1UPpApiOa+It3WjxLDvh1eKj39UZyIrjV/VgGav0z9MZx/r2s/RA==", + "version": "25.1.38", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-grids/-/ej2-grids-25.1.38.tgz", + "integrity": "sha512-Fau++49AGYvQ9Dyg++3a/UKnLK2oTpwcGwF0S6m3dTgimOwpfjPuWhdAQyRfbldx6YsxG7RZfnX+9br7GsXGcQ==", "dependencies": { "@syncfusion/ej2-base": "~25.1.35", "@syncfusion/ej2-buttons": "~25.1.35", - "@syncfusion/ej2-calendars": "~25.1.35", + "@syncfusion/ej2-calendars": "~25.1.37", "@syncfusion/ej2-compression": "~25.1.35", "@syncfusion/ej2-data": "~25.1.35", - "@syncfusion/ej2-dropdowns": "~25.1.35", + "@syncfusion/ej2-dropdowns": "~25.1.37", "@syncfusion/ej2-excel-export": "~25.1.35", "@syncfusion/ej2-file-utils": "~25.1.35", - "@syncfusion/ej2-inputs": "~25.1.35", + "@syncfusion/ej2-inputs": "~25.1.38", "@syncfusion/ej2-lists": "~25.1.35", - "@syncfusion/ej2-navigations": "~25.1.35", + "@syncfusion/ej2-navigations": "~25.1.38", "@syncfusion/ej2-notifications": "~25.1.35", - "@syncfusion/ej2-pdf-export": "~25.1.35", - "@syncfusion/ej2-popups": "~25.1.35", - "@syncfusion/ej2-splitbuttons": "~25.1.35" + "@syncfusion/ej2-pdf-export": "~25.1.38", + "@syncfusion/ej2-popups": "~25.1.38", + "@syncfusion/ej2-splitbuttons": "~25.1.38" } }, "node_modules/@syncfusion/ej2-icons": { @@ -4020,14 +4020,14 @@ "integrity": "sha512-E8ypbeB9ISTsaj8Q29w3Ysh6HG35GOdTjfaU6JTCaZ9wP30q04B4WfN9lqcd42Q198qhynFAXd3lJyYev68aGw==" }, "node_modules/@syncfusion/ej2-inputs": { - "version": "25.1.35", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-inputs/-/ej2-inputs-25.1.35.tgz", - "integrity": "sha512-vVU55vBalmNKI1kon3F2IM/yzatC/2IU+Hso2fp1pFO5OzNfySCOtnWkMypVYc/9+pAG6qxuPIg7GyqjsrsWRg==", + "version": "25.1.38", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-inputs/-/ej2-inputs-25.1.38.tgz", + "integrity": "sha512-WspFi4Lv9CpfmWTZpKnWLQL1fbEDIocZhm2tlkg2BEQGOjscg80HJjbMIEea/p/We8jYt2BqRWXVdI6gI35kvQ==", "dependencies": { "@syncfusion/ej2-base": "~25.1.35", "@syncfusion/ej2-buttons": "~25.1.35", - "@syncfusion/ej2-popups": "~25.1.35", - "@syncfusion/ej2-splitbuttons": "~25.1.35" + "@syncfusion/ej2-popups": "~25.1.38", + "@syncfusion/ej2-splitbuttons": "~25.1.38" } }, "node_modules/@syncfusion/ej2-lists": { @@ -4042,16 +4042,16 @@ } }, "node_modules/@syncfusion/ej2-navigations": { - "version": "25.1.35", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-navigations/-/ej2-navigations-25.1.35.tgz", - "integrity": "sha512-4VeoH70R16RnfzVzVa/urGNIH3g1WkBnBvasAWQPY/TQQ8umk0EDEY22+TEzkGRWb7zc8K6Km9nQ57NxbLdDiA==", + "version": "25.1.38", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-navigations/-/ej2-navigations-25.1.38.tgz", + "integrity": "sha512-1KWbcbevraqLv7MLnL2jSLa/G0jV0cCVBsNw1YVo7a9Kv5T/9+6fvuxjsAILRu7TPBMgBfoxp3eQAQLN3vBcZA==", "dependencies": { "@syncfusion/ej2-base": "~25.1.35", "@syncfusion/ej2-buttons": "~25.1.35", "@syncfusion/ej2-data": "~25.1.35", - "@syncfusion/ej2-inputs": "~25.1.35", + "@syncfusion/ej2-inputs": "~25.1.38", "@syncfusion/ej2-lists": "~25.1.35", - "@syncfusion/ej2-popups": "~25.1.35" + "@syncfusion/ej2-popups": "~25.1.38" } }, "node_modules/@syncfusion/ej2-notifications": { @@ -4065,40 +4065,40 @@ } }, "node_modules/@syncfusion/ej2-pdf-export": { - "version": "25.1.35", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-pdf-export/-/ej2-pdf-export-25.1.35.tgz", - "integrity": "sha512-1Nt42y2n0/ExDfx93eV5aGJipU9rrJzvFa7xfRqtGObldll5S7yBpMKU6NDEoioeW+woOib4ea9+8vBtkQ+DnQ==", + "version": "25.1.38", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-pdf-export/-/ej2-pdf-export-25.1.38.tgz", + "integrity": "sha512-j+vdveDoV8DB2kOrwFLUGmL3qE2EnO/8XzGvfDE+DI3QpThjxJTNYPGBuhsTcVPAVYJv7Ysi3I5lpk4tZQQCBg==", "dependencies": { "@syncfusion/ej2-compression": "~25.1.35" } }, "node_modules/@syncfusion/ej2-popups": { - "version": "25.1.35", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-popups/-/ej2-popups-25.1.35.tgz", - "integrity": "sha512-tuo2YpcnCWFZntR77Cy/8rrWWAgLgxiGQC2ffXD2fnwuw5+Sp04MagefyoriAOMglXQHvNh2e+9//pVDA0NcmA==", + "version": "25.1.38", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-popups/-/ej2-popups-25.1.38.tgz", + "integrity": "sha512-dnCn6roKbaAk8VxbbYn59U4T0VYvS2U3RoctdQ4277EvsYrHarqsTlCh4bdMG1G6rNyerCWTSv2XgodQ+opJ6Q==", "dependencies": { "@syncfusion/ej2-base": "~25.1.35", "@syncfusion/ej2-buttons": "~25.1.35" } }, "node_modules/@syncfusion/ej2-splitbuttons": { - "version": "25.1.35", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-splitbuttons/-/ej2-splitbuttons-25.1.35.tgz", - "integrity": "sha512-S/MhCWHB59e8bm8ZRL896XxtQtNcyNNVcpclus8tsuN9sCiM7Dsg/HPtoZ04hZRgRs7nNJmyA0u+Z8E7HkaQHg==", + "version": "25.1.38", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-splitbuttons/-/ej2-splitbuttons-25.1.38.tgz", + "integrity": "sha512-D5RkU93v2UdbWeny6qkfwiBx38jDe0suHZv1CYES7dnFcQKkKOUjI2TBwIi5d7aFyf4W8reQt7YPmOyNt/8b/Q==", "dependencies": { "@syncfusion/ej2-base": "~25.1.35", - "@syncfusion/ej2-popups": "~25.1.35" + "@syncfusion/ej2-popups": "~25.1.38" } }, "node_modules/@syncfusion/ej2-treegrid": { - "version": "25.1.35", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-treegrid/-/ej2-treegrid-25.1.35.tgz", - "integrity": "sha512-iT29vYnKddjNeq+YDElfBs6h9bjBihM71JueR2OQ2Jge3hoP9PL7DxKpEDjIZaF+BX6KLBE1XFdKSmUCBTsTdw==", + "version": "25.1.38", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-treegrid/-/ej2-treegrid-25.1.38.tgz", + "integrity": "sha512-sBHcLgnYAQ1XEt/uN48zMyx3O236zHC2AuBDEmxT1bWE8vIjYL4429tsFDz8s0cnQfuMoI/1TmDYGlm6m/RGSg==", "dependencies": { "@syncfusion/ej2-base": "~25.1.35", "@syncfusion/ej2-data": "~25.1.35", - "@syncfusion/ej2-grids": "~25.1.35", - "@syncfusion/ej2-popups": "~25.1.35" + "@syncfusion/ej2-grids": "~25.1.38", + "@syncfusion/ej2-popups": "~25.1.38" } }, "node_modules/@szmarczak/http-timer": { @@ -4395,9 +4395,9 @@ } }, "node_modules/@types/qs": { - "version": "6.9.12", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", - "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==", "dev": true }, "node_modules/@types/range-parser": { @@ -4412,6 +4412,11 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "node_modules/@types/semver-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/semver-utils/-/semver-utils-1.1.3.tgz", + "integrity": "sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==" + }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -4432,14 +4437,14 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/sizzle": { @@ -6066,9 +6071,9 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -7158,16 +7163,16 @@ "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" }, "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -9160,9 +9165,9 @@ } }, "node_modules/keycloak-angular": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/keycloak-angular/-/keycloak-angular-15.2.0.tgz", - "integrity": "sha512-HXrTzTr5T7ayY8CP4CmbpWtjum25ZmJP0NFYC9iw34cgK3njV6sO5Z0eEq1ugHu5stf1ZVLLbL7RMH11goi4mg==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/keycloak-angular/-/keycloak-angular-15.2.1.tgz", + "integrity": "sha512-7w8bkJQ9OBtBJt5eNfqnRG2IL9btvp8Stf2fpVipSE1C/qtd5UQ31skx735PMPgMTUFsdz/0VA32Gmsng54+Xg==", "dependencies": { "tslib": "^2.3.1" }, @@ -9170,13 +9175,13 @@ "@angular/common": "^17", "@angular/core": "^17", "@angular/router": "^17", - "keycloak-js": "^18 || ^19 || ^20 || ^21 || ^22 || ^23 || ˆ24" + "keycloak-js": "^18 || ^19 || ^20 || ^21 || ^22 || ^23 || ^24" } }, "node_modules/keycloak-js": { - "version": "24.0.1", - "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-24.0.1.tgz", - "integrity": "sha512-leV4mlpa0dqYUXTAuq1ufUfk8DOSBCembjQwMwzYrM6xfHSKpcZMxviTWXqro52LMSsYAnivSKVNEvBkLzi7Eg==", + "version": "24.0.2", + "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-24.0.2.tgz", + "integrity": "sha512-V2N8cSz3NfON98XHp+DCzvrb1WW35JalL5Zphe/uoVWOxcof7v522Yz9Q2O3BqXqXP3V/H9ml6o24BwwtXUTGA==", "dependencies": { "js-sha256": "^0.11.0", "jwt-decode": "^4.0.0" @@ -10458,10 +10463,11 @@ } }, "node_modules/npm-check-updates": { - "version": "16.14.17", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.17.tgz", - "integrity": "sha512-ElnDdXKe60f8S6RhzFeaGuH2TFJmt2cU2HjLdowldabdm27nWFCxV2ebeP3xGbQkzp2+RPDQNdW9HqU1lcY8ag==", + "version": "16.14.18", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.18.tgz", + "integrity": "sha512-9iaRe9ohx9ykdbLjPRIYcq1A0RkrPYUx9HmQK1JIXhfxtJCNE/+497H9Z4PGH6GWRALbz5KF+1iZoySK2uSEpQ==", "dependencies": { + "@types/semver-utils": "^1.1.1", "chalk": "^5.3.0", "cli-table3": "^0.6.3", "commander": "^10.0.1", @@ -14517,9 +14523,9 @@ } }, "node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", + "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -15369,9 +15375,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", - "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", + "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -15465,9 +15471,9 @@ } }, "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, "dependencies": { "colorette": "^2.0.10", diff --git a/Front End/poam-app/package.json b/Front End/poam-app/package.json index 6e0f216d..ed6acd39 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.3.0", + "@angular/animations": "^17.3.3", "@angular/cdk": "<17.1.0", - "@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", + "@angular/common": "^17.3.3", + "@angular/compiler": "^17.3.3", + "@angular/core": "^17.3.3", + "@angular/forms": "^17.3.3", + "@angular/localize": "^17.3.3", + "@angular/platform-browser": "^17.3.3", + "@angular/platform-browser-dynamic": "^17.3.3", + "@angular/router": "^17.3.3", "@nebular/auth": "^13.0.0", "@nebular/date-fns": "^13.0.0", "@nebular/eva-icons": "^13.0.0", @@ -27,7 +27,7 @@ "@nebular/theme": "^13.0.0", "@ng-bootstrap/ng-bootstrap": "^16.0.0", "@popperjs/core": "^2.11.8", - "@syncfusion/ej2-angular-treegrid": "^25.1.35", + "@syncfusion/ej2-angular-treegrid": "^25.1.38", "angular2-smart-table": "^3.2.0", "axios": "^1.6.8", "bootstrap": "^5.3.3", @@ -36,16 +36,16 @@ "date-fns": "^3.6.0", "dom-to-image": "^2.6.0", "eva-icons": "^1.1.3", - "express": "^4.18.3", + "express": "^4.19.2", "express-jwt": "^8.4.1", "jquery": "^3.7.1", "jsdom": "^24.0.0", "jsonwebtoken": "^9.0.2", - "keycloak-angular": "^15.2.0", - "keycloak-js": "^24.0.1", + "keycloak-angular": "^15.2.1", + "keycloak-js": "^24.0.2", "ng2-charts": "^6.0.0", "ngx-infinite-scroll": "^17.0.0", - "npm-check-updates": "^16.14.17", + "npm-check-updates": "^16.14.18", "passport": "^0.7.0", "passport-local": "^1.0.0", "rxjs": "^7.8.1", @@ -57,10 +57,10 @@ "zone.js": "^0.14.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.3.0", - "@angular/cli": "^17.3.0", - "@angular/compiler-cli": "^17.3.0", - "@schematics/angular": "^17.3.0", + "@angular-devkit/build-angular": "^17.3.3", + "@angular/cli": "^17.3.3", + "@angular/compiler-cli": "^17.3.3", + "@schematics/angular": "^17.3.3", "@types/chart.js": "^2.9.41", "@types/datatables.net": "^1.10.28", "@types/jasmine": "^5.1.4", @@ -72,6 +72,6 @@ "karma-coverage": "^2.2.1", "karma-jasmine": "^5.1.0", "karma-jasmine-html-reporter": "^2.1.0", - "typescript": "^5.4.2" + "typescript": "^5.4.4" } } diff --git a/Front End/poam-app/src/app/pages/import-processing/stigmanager-import/stigmanager-import.component.html b/Front End/poam-app/src/app/pages/import-processing/stigmanager-import/stigmanager-import.component.html index 238a28ae..635aace2 100644 --- a/Front End/poam-app/src/app/pages/import-processing/stigmanager-import/stigmanager-import.component.html +++ b/Front End/poam-app/src/app/pages/import-processing/stigmanager-import/stigmanager-import.component.html @@ -72,7 +72,7 @@
- All 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 566ec4d3..34fdb853 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 @@ -9,160 +9,137 @@ --> -
- +
+ - - -
-
- - - - - POAM ID: {{ poam.id }} - Vulnerability ID: {{ poam.vulnerabilityId }} - {{ poam.description }} - - - -
-
-
- - -
-
-
- -
+ + +
+
+ + + + + POAM ID: {{ poam.id }} - Vulnerability ID: {{ poam.vulnerabilityId }} - {{ poam.description }} + + + +
+
+
+ + +
+
-
- - - All - Draft - Approved - Submitted - Rejected - Closed - Expired - -
-
-
+ + +
+
+ + + + + POAM ID: {{ poam.id }} - Vulnerability ID: {{ poam.vulnerabilityId }} - {{ poam.description }} + + + +
+
+
+ + +
+
- - -
-
- - - - - POAM ID: {{ poam.id }} - Vulnerability ID: {{ poam.vulnerabilityId }} - {{ poam.description }} - - - -
-
-
- - -
-
-
- -
+ + +
+
+ + + + + POAM ID: {{ poam.id }} - Vulnerability ID: {{ poam.vulnerabilityId }} - {{ poam.description }} + + + +
+
+
+ + +
+
-
- - - All - CAT I - Critical/High - CAT II - Medium - CAT III - Low - -
-
-
+ + +
+
+ + + + + POAM ID: {{ poam.id }} - Vulnerability ID: {{ poam.vulnerabilityId }} - {{ poam.description }} + + + +
+
+
+ + +
+
+
+
+ - - -
-
- - - - - POAM ID: {{ poam.id }} - Vulnerability ID: {{ poam.vulnerabilityId }} - {{ poam.description }} - - - -
-
-
- - -
-
-
- -
+ +
+
+
+ +
+
+
+
+ + + + {{ status.label }} + + + + + {{ severity.label }} + -
- - - All - OVERDUE - < 30 Days - 30-60 Days - 60-90 Days - 90-180 Days - > 365 Days - -
-
- + + + {{ estimatedCompletion.label }} + - - -
-
- - - - - POAM ID: {{ poam.id }} - Vulnerability ID: {{ poam.vulnerabilityId }} - {{ poam.description }} - - - -
-
-
- - -
-
-
- -
- -
-
- + + + {{ label.label }} + +
+
+
+ +
- - +
+
+ 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 91763684..65ecadd2 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 @@ -31,6 +31,12 @@ interface Permission { canView: number; } +interface LabelInfo { + poamId: number; + labelId: number; + labelName: string; +} + @Component({ selector: 'ngx-poams', templateUrl: './poams.component.html', @@ -51,10 +57,34 @@ export class PoamsComponent implements OnInit { public poamSeverity: any[] = []; public poamEstimatedCompletion: any[] = []; public detailedPoam: any; - public selectedStatus: any = 'All'; - public selectedLabel: any = 'All'; - public selectedSeverity: any = 'All'; - public selectedEstimatedCompletion: any = 'All'; + public selectedStatus: any = null; + public selectedLabel: any = null; + public selectedSeverity: any = null; + public selectedEstimatedCompletion: any = null; + selectedOptionsValues: string[] = []; + poamStatuses = [ + { value: 'Draft', label: 'Draft' }, + { value: 'Approved', label: 'Approved' }, + { value: 'Submitted', label: 'Submitted' }, + { value: 'Rejected', label: 'Rejected' }, + { value: 'Closed', label: 'Closed' }, + { value: 'Expired', label: 'Expired' } + ]; + + poamSeverities = [ + { value: 'CAT I - Critical/High', label: 'CAT I - Critical/High' }, + { value: 'CAT II - Medium', label: 'CAT II - Medium' }, + { value: 'CAT III - Low', label: 'CAT III - Low' } + ]; + + poamEstimatedCompletions = [ + { value: 'OVERDUE', label: 'OVERDUE' }, + { value: '< 30 Days', label: '< 30 Days' }, + { value: '30-60 Days', label: '30-60 Days' }, + { value: '60-90 Days', label: '60-90 Days' }, + { value: '90-180 Days', label: '90-180 Days' }, + { value: '> 365 Days', label: '> 365 Days' } + ]; statusChart!: Chart; statusChartData: ChartData<'bar'> = { labels: [''], @@ -71,7 +101,7 @@ export class PoamsComponent implements OnInit { datasets: [], }; estimatedCompletionChart!: Chart; -estimatedCompletionChartData: ChartData<'bar'> = { + estimatedCompletionChartData: ChartData<'bar'> = { labels: [''], datasets: [], }; @@ -116,27 +146,9 @@ estimatedCompletionChartData: ChartData<'bar'> = { poams: any[] = []; users: any; user: any; - filteredPoams: any; - viewingfulldetails: boolean = false; collection: any; payload: any; - members: any; - data: any; - themeSubscription: any; selectedPoamId: any; - items: any; - values: number[] | undefined; - buttonClasses = [ - 'btn-outline-primary', - 'btn-outline-secondary', - 'btn-outline-success', - 'btn-outline-danger', - 'btn-outline-warning', - 'btn-outline-info', - 'btn-outline-light', - 'btn-outline-dark', - ]; - buttonClass = this.buttonClasses[0]; constructor( private poamService: PoamService, @@ -155,10 +167,6 @@ estimatedCompletionChartData: ChartData<'bar'> = { if (this.isLoggedIn) { this.userProfile = await this.keycloak.loadUserProfile(); this.setPayload(); - this.onSelectedStatusChange(); - this.onSelectedLabelChange(); - this.onSelectedSeverityChange(); - this.onSelectedEstimatedCompletionChange(); } } @@ -183,9 +191,6 @@ estimatedCompletionChartData: ChartData<'bar'> = { plugins: [ChartDataLabels], options: this.barChartOptions, }); - if (this.poamStatus) { - this.updateStatusChartData(this.poamStatus); - } } else { console.error('Unable to initialize chart: Element not available.'); } @@ -197,23 +202,17 @@ estimatedCompletionChartData: ChartData<'bar'> = { plugins: [ChartDataLabels], options: this.barChartOptions, }); - if (this.poamLabel) { - this.updateLabelChartData(this.poamLabel); - } } else { console.error('Unable to initialize chart: Element not available.'); } - + if (this.poamSeverityChart?.nativeElement) { this.severityChart = new Chart(this.poamSeverityChart.nativeElement, { type: 'bar', data: this.severityChartData, plugins: [ChartDataLabels], options: this.barChartOptions, - }); - if (this.poamSeverity) { - this.updateSeverityChartData(this.poamSeverity); - } + }); } else { console.error('Unable to initialize chart: Element not available.'); } @@ -225,9 +224,6 @@ estimatedCompletionChartData: ChartData<'bar'> = { plugins: [ChartDataLabels], options: this.barChartOptions, }); - if (this.poamEstimatedCompletion) { - this.updateSeverityChartData(this.poamEstimatedCompletion); - } } else { console.error('Unable to initialize chart: Element not available.'); } @@ -236,9 +232,8 @@ estimatedCompletionChartData: ChartData<'bar'> = { setPayload() { this.user = null; this.payload = null; - - this.subs.sink = this.userService.getCurrentUser().subscribe( - (response: any) => { + this.subs.sink = this.userService.getCurrentUser().subscribe({ + next: (response: any) => { if (response && response.userId) { this.user = response; @@ -255,21 +250,20 @@ estimatedCompletionChartData: ChartData<'bar'> = { }) ), }; - this.getPoamData(); } } else { console.error('User data is not available or user is not active'); } }, - (error) => { + error: (error) => { console.error('An error occurred:', error); } - ); + }); } getPoamData() { - this.subs.sink = forkJoin( + this.subs.sink = forkJoin([ this.poamService.getCollection( this.payload.lastCollectionAccessedId, this.payload.userName @@ -288,19 +282,21 @@ estimatedCompletionChartData: ChartData<'bar'> = { ), this.poamService.getPoamsByCollection( this.payload.lastCollectionAccessedId + ), + this.poamService.getPoamLabels( + this.payload.lastCollectionAccessedId ) - ).subscribe(([collection, poamStatusResponse, poamLabelResponse, poamSeverityResponse, poamEstimatedCompletionResponse, poams]: any) => { + ]).subscribe(([collection, poamStatusResponse, collectionLabelResponse, poamSeverityResponse, poamEstimatedCompletionResponse, poams, poamLabelResponse]: any) => { if (!Array.isArray(poamStatusResponse.poamStatus)) { console.error( 'poamStatusResponse.poamStatus is not an array', poamStatusResponse.poamStatus ); } - else if (!Array.isArray(poamLabelResponse.poamLabel)) { - console.log("poamLabelResponse: ", poamLabelResponse); + else if (!Array.isArray(collectionLabelResponse.poamLabel)) { console.error( - 'poamLabelResponse.poamLabel is not an array', - poamLabelResponse.poamLabel + 'collectionLabelResponse.poamLabel is not an array', + collectionLabelResponse.poamLabel ); } else if (!Array.isArray(poamSeverityResponse.poamSeverity)) { @@ -310,122 +306,259 @@ estimatedCompletionChartData: ChartData<'bar'> = { ); } else if (!Array.isArray(poamEstimatedCompletionResponse.poamEstimatedCompletion)) { - console.error( - 'poamEstimatedCompletionResponse.poamEstimatedCompletion is not an array', - poamEstimatedCompletionResponse.poamEstimatedCompletion - ); - return; - } - + console.error( + 'poamEstimatedCompletionResponse.poamEstimatedCompletion is not an array', + poamEstimatedCompletionResponse.poamEstimatedCompletion + ); + } + else if (!Array.isArray(poamLabelResponse.poamLabels)) { + console.error( + 'poamLabelResponse.poamLabels is not an array', + poamLabelResponse.poamLabels + ); + return; + } this.collection = collection; this.poamStatus = poamStatusResponse.poamStatus; - this.poamLabel = poamLabelResponse.poamLabel; + this.poamLabel = collectionLabelResponse.poamLabel; this.poamSeverity = poamSeverityResponse.poamSeverity; this.poamEstimatedCompletion = poamEstimatedCompletionResponse.poamEstimatedCompletion; - this.poams = poams.poams; - this.filteredPoams = this.poams; - - this.sortData(); - this.setStatusChartData(this.poamStatus); - this.setLabelChartData(this.poamLabel); - this.setSeverityChartData(this.poamSeverity); - this.setEstimatedCompletionChartData(this.poamEstimatedCompletion); - }); - } - - setStatusChartData(poamStatus: any[]) { - this.updateStatusChartData(poamStatus); - } - - setLabelChartData(poamLabel: any[]) { - this.updateLabelChartData(poamLabel); - } + const poamLabelMap: { [poamId: number]: string[] } = {}; + (poamLabelResponse.poamLabels as LabelInfo[]).forEach(labelInfo => { + if (!poamLabelMap[labelInfo.poamId]) { + poamLabelMap[labelInfo.poamId] = []; + } + poamLabelMap[labelInfo.poamId].push(labelInfo.labelName); + }); - setSeverityChartData(poamSeverity: any[]) { - this.updateSeverityChartData(poamSeverity); + this.poams = poams.poams.map((poam: any) => ({ + ...poam, + labels: poamLabelMap[poam.poamId] || [''] + })); + this.updateCharts(); + }); } - setEstimatedCompletionChartData(poamEstimatedCompletion: any[]) { - this.updateEstimatedCompletionChartData(poamEstimatedCompletion); + updateCharts(): void { + this.updateStatusChart(); + this.updateLabelChart(); + this.updateSeverityChart(); + this.updateEstimatedCompletionChart(); } - updateStatusChartData(poamStatus: any[]): void { + updateStatusChart(): void { if (!this.statusChart) { console.warn("POAM Status chart is not initialized."); return; } - const datasets = poamStatus.map((item) => ({ - label: item.status, - data: [item.statusCount], - datalabels: {}, - })); - this.statusChart.data.datasets = datasets; - this.statusChart.update(); - + const filteredPoamStatus = this.applyFilters('status'); + const datasets = filteredPoamStatus.map((item) => ({ + label: item.status, + data: [item.statusCount], + datalabels: {}, + })); + this.statusChart.data.datasets = datasets; + this.statusChart.update(); } - updateLabelChartData(poamLabel: any[]): void { + updateLabelChart(): void { if (!this.labelChart) { console.warn("POAM Label chart is not initialized."); return; } - const datasets = poamLabel.map((item) => ({ - label: item.label, - data: [item.labelCount], - datalabels: {}, - })); - this.labelChart.data.datasets = datasets; - this.labelChart.update(); - + const filteredPoamLabel = this.applyFilters('label'); + const datasets = filteredPoamLabel.map((item) => ({ + label: item.label, + data: [item.labelCount], + datalabels: {}, + })); + + this.labelChart.data.datasets = datasets; + this.labelChart.update(); } - updateSeverityChartData(poamSeverity: any[]): void { + + updateSeverityChart(): void { if (!this.severityChart) { console.warn("POAM Severity chart is not initialized."); return; } - const datasets = poamSeverity.map((item) => ({ - label: item.severity, - data: [item.severityCount], - datalabels: {}, - })); - - this.severityChart.data.datasets = datasets; - this.severityChart.update(); + const filteredPoamSeverity = this.applyFilters('severity'); + const datasets = filteredPoamSeverity.map((item) => ({ + label: item.severity, + data: [item.severityCount], + datalabels: {}, + })); + this.severityChart.data.datasets = datasets; + this.severityChart.update(); } - updateEstimatedCompletionChartData(poamEstimatedCompletion: any[]): void { + updateEstimatedCompletionChart(): void { if (!this.estimatedCompletionChart) { console.warn("POAM Estimated Completion chart is not initialized."); return; } - const datasets = poamEstimatedCompletion.map((item) => ({ - label: item.estimatedCompletion, - data: [item.estimatedCompletionCount], - datalabels: {}, + const filteredPoamEstimatedCompletion = this.applyFilters('estimatedCompletion'); + const datasets = filteredPoamEstimatedCompletion.map((item) => ({ + label: item.estimatedCompletion, + data: [item.estimatedCompletionCount], + datalabels: {}, + })); + this.estimatedCompletionChart.data.datasets = datasets; + this.estimatedCompletionChart.update(); + } + + applyFilters(filterType: string): any[] { + let filteredPoams = this.poams; + + if (this.selectedOptions['status'] !== null) { + filteredPoams = filteredPoams.filter(poam => poam.status === this.selectedOptions['status']); + } + + if (this.selectedOptions['label'] !== null) { + filteredPoams = filteredPoams.filter(poam => poam.labels.includes(this.selectedOptions['label'])); + } + + if (this.selectedOptions['severity'] !== null) { + filteredPoams = filteredPoams.filter(poam => poam.rawSeverity === this.selectedOptions['severity']); + } + + if (this.selectedOptions['estimatedCompletion'] !== null) { + filteredPoams = filteredPoams.filter(poam => this.filterPoamsByEstimatedCompletion(poam)); + } + + this.poamsForChart = filteredPoams.map((poam: any) => ({ + id: poam.poamId, + vulnerabilityId: poam.vulnerabilityId, + description: poam.description, + })); + + switch (filterType) { + case 'status': + return this.generateChartDataForStatus(filteredPoams); + case 'label': + return this.generateChartDataForLabel(filteredPoams); + case 'severity': + return this.generateChartDataForSeverity(filteredPoams); + case 'estimatedCompletion': + return this.generateChartDataForEstimatedCompletion(filteredPoams); + default: + return []; + } + } + + generateChartDataForStatus(filteredPoams: any[]): any[] { + const statusCounts: { [status: string]: number } = {}; + filteredPoams.forEach(poam => { + const status = poam.status; + statusCounts[status] = (statusCounts[status] || 0) + 1; + }); + + if (this.selectedStatus === null) { + return Object.entries(statusCounts).map(([status, statusCount]) => ({ + status, + statusCount, })); + } else { + return [ + { + status: this.selectedStatus, + statusCount: statusCounts[this.selectedStatus] || 0, + }, + ]; + } + } - this.estimatedCompletionChart.data.datasets = datasets; - this.estimatedCompletionChart.update(); + generateChartDataForLabel(filteredPoams: any[]): any[] { + const labelCounts: { [label: string]: number } = {}; + filteredPoams.forEach(poam => { + if (poam.labels && poam.labels.length > 0) { + poam.labels.forEach((label: string) => { + if (label) { + labelCounts[label] = (labelCounts[label] || 0) + 1; + } + }); + } + }); + if (this.selectedLabel === null) { + return Object.entries(labelCounts).map(([label, labelCount]) => ({ + label, + labelCount, + })); + } else { + return [ + { + label: this.selectedLabel, + labelCount: labelCounts[this.selectedLabel] || 0, + }, + ]; + } } - sortData() { - if (this.filteredPoams) { - this.filteredPoams.sort((n1: any, n2: any) => { - if (n1.poamId < n2.poamId) { - return -1; - } else if (n1.poamId > n2.poamId) { - return 1; - } else { - return 0; - } - }); + generateChartDataForSeverity(filteredPoams: any[]): any[] { + const severityCounts: { [severity: string]: number } = {}; + filteredPoams.forEach(poam => { + const severity = poam.rawSeverity; + severityCounts[severity] = (severityCounts[severity] || 0) + 1; + }); - this.poamsForChart = this.filteredPoams.map((poam: any) => ({ - id: poam.poamId, - vulnerabilityId: poam.vulnerabilityId, - description: poam.description, + if (this.selectedSeverity === null) { + return Object.entries(severityCounts).map(([severity, severityCount]) => ({ + severity, + severityCount, })); + } else { + return [ + { + severity: this.selectedSeverity, + severityCount: severityCounts[this.selectedSeverity] || 0, + }, + ]; + } + } + + generateChartDataForEstimatedCompletion(filteredPoams: any[]): any[] { + const estimatedCompletionCounts: { [estimatedCompletion: string]: number } = {}; + filteredPoams.forEach(poam => { + const days = this.calculateDaysDifference(poam.scheduledCompletionDate, poam.extensionTimeAllowed); + const estimatedCompletion = this.getEstimatedCompletionLabel(days); + estimatedCompletionCounts[estimatedCompletion] = (estimatedCompletionCounts[estimatedCompletion] || 0) + 1; + }); + + if (this.selectedEstimatedCompletion === null) { + return Object.entries(estimatedCompletionCounts).map(([estimatedCompletion, estimatedCompletionCount]) => ({ + estimatedCompletion, + estimatedCompletionCount, + })); + } else { + return [ + { + estimatedCompletion: this.selectedEstimatedCompletion, + estimatedCompletionCount: estimatedCompletionCounts[this.selectedEstimatedCompletion] || 0, + }, + ]; + } + } + + filterPoamsByEstimatedCompletion = (poam: any) => { + const days = this.calculateDaysDifference(poam.scheduledCompletionDate, poam.extensionTimeAllowed); + const estimatedCompletion = this.getEstimatedCompletionLabel(days); + return estimatedCompletion === this.selectedOptions['estimatedCompletion']; + }; + + getEstimatedCompletionLabel(days: number): string { + if (days < 0) { + return 'OVERDUE'; + } else if (days <= 30) { + return '< 30 Days'; + } else if (days <= 60) { + return '30-60 Days'; + } else if (days <= 90) { + return '60-90 Days'; + } else if (days <= 180) { + return '90-180 Days'; + } else { + return '> 365 Days'; } } @@ -435,7 +568,6 @@ estimatedCompletionChartData: ChartData<'bar'> = { onSelectPoam(poamId: number) { const selectedPoam = this.poamsForChart.find((poam: any) => poam.id === poamId); - if (selectedPoam) { this.router.navigateByUrl(`/poam-details/${selectedPoam.id}`); } else { @@ -443,96 +575,72 @@ estimatedCompletionChartData: ChartData<'bar'> = { } } - onSelectedStatusChange(): void { - let filteredPoamStatus = - this.selectedStatus !== 'All' - ? this.poamStatus.filter((item) => item.status === this.selectedStatus) - : this.poamStatus; - this.updateStatusChartData(filteredPoamStatus); - if (this.selectedStatus !== 'All') { - this.filteredPoams = this.poams.filter((poam: any) => poam.status === this.selectedStatus); - this.sortData(); - } - else { - this.filteredPoams = this.poams; - this.sortData(); - } + selectedOptions: { [key: string]: string | null } = { + status: null, + severity: null, + estimatedCompletion: null, + label: null + }; + + onGroupSelect(selectedValues: string[]) { + this.selectedOptions = { + status: null, + severity: null, + estimatedCompletion: null, + label: null + }; + + selectedValues.forEach(value => { + const [group, selectedValue] = value.split(':'); + this.selectedOptions[group] = selectedValue === null ? null : selectedValue; + }); + + this.selectedOptionsValues = Object.entries(this.selectedOptions) + .filter(([_, value]) => value !== null) + .map(([key, value]) => `${key}:${value}`); + + this.updateCharts(); } - onSelectedLabelChange(): void { - let filteredPoamLabel = - this.selectedLabel !== 'All' - ? this.poamLabel.filter((item) => item.label === this.selectedLabel) - : this.poamLabel; - this.updateLabelChartData(filteredPoamLabel); - if (this.selectedLabel !== 'All') { - this.filteredPoams = this.poams.filter((poam: any) => poam.label === this.selectedLabel); - this.sortData(); - } - else { - this.filteredPoams = this.poams; - this.sortData(); - } + isOptionDisabled(groupName: string, optionValue: string): boolean { + return this.selectedOptions[groupName] !== null && this.selectedOptions[groupName] !== optionValue; } - onSelectedSeverityChange(): void { - let filteredPoamSeverity = - this.selectedSeverity !== 'All' - ? this.poamSeverity.filter((item) => item.severity === this.selectedSeverity) - : this.poamSeverity; - this.updateSeverityChartData(filteredPoamSeverity); - if (this.selectedSeverity !== 'All') { - this.filteredPoams = this.poams.filter((poam: any) => poam.rawSeverity === this.selectedSeverity); - this.sortData(); - } - else { - this.filteredPoams = this.poams; - this.sortData(); - } + resetChartFilters() { + this.selectedOptions = { + status: null, + severity: null, + estimatedCompletion: null, + label: null + }; + this.selectedOptionsValues = []; + this.updateCharts(); } - onSelectedEstimatedCompletionChange(): void { + calculateDaysDifference(scheduledCompletionDate: any, extensionTimeAllowed: any): number { const currentDate = new Date(); + const completionDate = addDays(new Date(scheduledCompletionDate), extensionTimeAllowed); + return differenceInCalendarDays(completionDate, currentDate); + } - const calculateDaysDifference = (scheduledCompletionDate: any, extensionTimeAllowed: any) => { - const completionDate = addDays(new Date(scheduledCompletionDate), extensionTimeAllowed); - return differenceInCalendarDays(completionDate, currentDate); - }; + getChartSubtitle(): string { + const filterSelections: string[] = []; - const filterPoamsByEstimatedCompletion = (poam: any) => { - const days = calculateDaysDifference(poam.scheduledCompletionDate, poam.extensionTimeAllowed); - switch (this.selectedEstimatedCompletion) { - case 'OVERDUE': - return days < 0; - case '< 30 Days': - return days >= 0 && days <= 30; - case '30-60 Days': - return days > 30 && days <= 60; - case '60-90 Days': - return days > 60 && days <= 90; - case '90-180 Days': - return days > 90 && days <= 180; - case '> 365 Days': - return days > 365; - default: - return true; - } - }; - - if (this.selectedEstimatedCompletion !== 'All') { - this.filteredPoams = this.poams.filter(filterPoamsByEstimatedCompletion); - } else { - this.filteredPoams = this.poams; + if (this.selectedOptions['status'] !== null) { + filterSelections.push(`Status: ${this.selectedOptions['status']}`); + } + if (this.selectedOptions['severity'] !== null) { + filterSelections.push(`Severity: ${this.selectedOptions['severity']}`); + } + if (this.selectedOptions['estimatedCompletion'] !== null) { + filterSelections.push(`Estimated Completion: ${this.selectedOptions['estimatedCompletion']}`); + } + if (this.selectedOptions['label'] !== null) { + filterSelections.push(`Label: ${this.selectedOptions['label']}`); } - this.sortData(); - - let filteredPoamEstimatedCompletion = - this.selectedEstimatedCompletion !== 'All' - ? this.poamEstimatedCompletion.filter((item) => item.estimatedCompletion === this.selectedEstimatedCompletion) - : this.poamEstimatedCompletion; - this.updateEstimatedCompletionChartData(filteredPoamEstimatedCompletion); - }; + return filterSelections.join(', '); + } exportChart(chartInstance: Chart, chartName: string) { const exportDatalabelsOptions = { @@ -552,22 +660,40 @@ estimatedCompletionChartData: ChartData<'bar'> = { anchor: 'end', padding: 6 }; - chartInstance.data.datasets.forEach(dataset => { if (dataset.datalabels) { Object.assign(dataset.datalabels, exportDatalabelsOptions); } }); + const chartSubtitle = this.getChartSubtitle(); + chartInstance.options.plugins!.title = { display: true, position: 'bottom', - text: `${chartName}`, + text: chartSubtitle, + font: { + size: 14, + family: 'sans-serif', + weight: 600, + }, + padding: { + bottom: 0, + }, + }; + chartInstance.options.plugins!.subtitle = { + display: true, + position: 'bottom', + text: chartName, font: { size: 16, family: 'sans-serif', weight: 600, }, + padding: { + top: 5, + bottom: 10, + }, }; chartInstance.update(); @@ -594,12 +720,12 @@ estimatedCompletionChartData: ChartData<'bar'> = { chartInstance.options.plugins!.title = { display: false, }; + chartInstance.options.plugins!.subtitle = { + 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 ec771a2a..e7bd1212 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 @@ -15,7 +15,7 @@ import { PoamsRoutingModule } from './poams.routing'; import { NbCardModule, NbIconModule, NbInputModule, NbFormFieldModule, NbButtonModule, NbThemeModule, NbSelectModule, NbRadioModule, NbDatepickerModule, NbAutocompleteModule, NbTabsetModule, NbTooltipModule, NbCheckboxModule, NbToggleModule } from '@nebular/theme'; import { Angular2SmartTableModule } from 'angular2-smart-table'; import { FormsModule } from '@angular/forms'; -import { provideCharts, withDefaultRegisterables } from 'ng2-charts'; +import { provideCharts, withDefaultRegisterables, BaseChartDirective } from 'ng2-charts'; import { AppComponent } from '../../app.component'; import { NbEvaIconsModule } from '@nebular/eva-icons'; @@ -26,7 +26,8 @@ import { NbEvaIconsModule } from '@nebular/eva-icons'; exports: [ PoamsComponent, ], - imports: [ + imports: [ + BaseChartDirective, CommonModule, NbAutocompleteModule, NbToggleModule, 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 8ab1f585..37565b3b 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 @@ -218,7 +218,7 @@ deletePoamMilestone(poamId: string, milestoneId: string) { getPoamLabels(id: any) { return this.http - .get(`${this.uri}/poamLabels/poam/${id}`) + .get(`${this.uri}/poamLabels/${id}`) .pipe(catchError(this.handleError)); }