diff --git a/package-lock.json b/package-lock.json index 7e5b91982e..9ab8e30dd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,29 +1,29 @@ { "name": "@denbi/cloud-portal-webapp", - "version": "4.736.0", + "version": "4.749.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@denbi/cloud-portal-webapp", - "version": "4.736.0", + "version": "4.749.0", "dependencies": { "@angular-eslint/eslint-plugin": "^16.0.3", - "@angular/animations": "16.1.7", - "@angular/cdk": "16.1.6", - "@angular/common": "16.1.7", - "@angular/compiler": "16.1.7", - "@angular/core": "16.1.7", - "@angular/forms": "16.1.7", - "@angular/localize": "16.1.7", - "@angular/platform-browser": "16.1.7", - "@angular/platform-browser-dynamic": "16.1.7", - "@angular/router": "16.1.7", - "@angular/service-worker": "16.1.7", - "@angular/upgrade": "16.1.7", - "@coreui/angular": "4.5.10", + "@angular/animations": "16.1.9", + "@angular/cdk": "16.1.8", + "@angular/common": "16.1.9", + "@angular/compiler": "16.1.9", + "@angular/core": "16.1.9", + "@angular/forms": "16.1.9", + "@angular/localize": "16.1.9", + "@angular/platform-browser": "16.1.9", + "@angular/platform-browser-dynamic": "16.1.9", + "@angular/router": "16.1.9", + "@angular/service-worker": "16.1.9", + "@angular/upgrade": "16.1.9", + "@coreui/angular": "4.5.14", "@coreui/coreui": "4.2.6", - "@coreui/icons-angular": "4.5.8", + "@coreui/icons-angular": "4.5.13", "@ng-bootstrap/ng-bootstrap": "^15.0.1", "@ng-select/ng-select": "^11.0.0", "@sindresorhus/transliterate": "1.6.0", @@ -31,10 +31,10 @@ "@types/jquery": "3.5.16", "acorn": "8.10.0", "ajv-formats": "2.1.1", - "angulartics2": "12.2.0", - "billboard.js": "3.9.1", + "angulartics2": "12.2.1", + "billboard.js": "3.9.3", "bootstrap": "4.6.2", - "chart.js": "4.3.2", + "chart.js": "4.3.3", "cli-color": "2.0.3", "core-js": "3.32.0", "css-loader": "6.8.1", @@ -76,20 +76,20 @@ "@angular-eslint/schematics": "16.1.0", "@angular-eslint/template-parser": "16.1.0", "@angular/cli": "^16.1.4", - "@angular/compiler-cli": "16.1.7", + "@angular/compiler-cli": "16.1.9", "@compodoc/compodoc": "1.1.21", "@playwright/test": "1.36.2", "@types/jasmine": "4.3.5", - "@types/node": "18.17.1", + "@types/node": "18.17.5", "@typescript-eslint/eslint-plugin": "5.62.0", "@typescript-eslint/parser": "5.62.0", "async": "3.2.4", "audit-ci": "6.6.1", - "autoprefixer": "10.4.14", + "autoprefixer": "10.4.15", "eslint": "^8.44.0", "eslint-config-airbnb-base": "15.0.0", "eslint-plugin-import": "2.27.5", - "eslint-plugin-jsdoc": "46.4.5", + "eslint-plugin-jsdoc": "46.4.6", "eslint-plugin-no-null": "latest", "eslint-plugin-prefer-arrow": "1.2.3", "exports-loader": "4.0.0", @@ -100,10 +100,10 @@ "karma": "6.4.2", "karma-chrome-launcher": "3.2.0", "less-loader": "11.1.3", - "lint-staged": "13.2.3", + "lint-staged": "14.0.0", "ngx-spec": "2.1.6", "npm-run-all": "4.1.5", - "prettier": "3.0.0", + "prettier": "3.0.1", "raw-loader": "4.0.2", "sass-loader": "13.3.2", "script-loader": "0.7.2", @@ -151,12 +151,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1601.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.6.tgz", - "integrity": "sha512-dY+/FNUNrOj+m4iG5/v8N0PfbDmjkjjoy/YkquRHS1yo7fGGDFNqji2552mbtjN6/LwyWDhOO7fxdqppadjnvA==", + "version": "0.1601.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.8.tgz", + "integrity": "sha512-kOXVGwsQnZvtz2UZNefcEy64Jiwq0eSoQUeozvDXOaYRJABLjPKI2YaarvKC9/Z1SGLuje0o/eRJO4T8aRk9rQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.1.6", + "@angular-devkit/core": "16.1.8", "rxjs": "7.8.1" }, "engines": { @@ -166,15 +166,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.6.tgz", - "integrity": "sha512-IEC1tApX8/Qa/RIVmbj0nYbOQ5WGcrkGNJ7D42q4DkIo74XKPzxDRruJE1RCjdZsj8lf4CCCZgSOPBsEI8Zbdw==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.8.tgz", + "integrity": "sha512-iyElPBQdcJq2plw5YqSz4mzNUfSRXI3ISFTEwPtimzPOorsj/OxB3Z6kJ8fDUsBAJ5OKR7xL7VnQJJ3S+05RhQ==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1601.6", - "@angular-devkit/build-webpack": "0.1601.6", - "@angular-devkit/core": "16.1.6", + "@angular-devkit/architect": "0.1601.8", + "@angular-devkit/build-webpack": "0.1601.8", + "@angular-devkit/core": "16.1.8", "@babel/core": "7.22.5", "@babel/generator": "7.22.7", "@babel/helper-annotate-as-pure": "7.22.5", @@ -186,7 +186,7 @@ "@babel/runtime": "7.22.5", "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.1.6", + "@ngtools/webpack": "16.1.8", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", @@ -196,7 +196,7 @@ "cacache": "17.1.3", "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.19", + "critters": "0.0.20", "css-loader": "6.8.1", "esbuild-wasm": "0.17.19", "fast-glob": "3.2.12", @@ -287,6 +287,39 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -408,12 +441,12 @@ "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1601.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.6.tgz", - "integrity": "sha512-Uz/GjnhgAqSDPxrO4HP/tHNGPPZU3tEShtAVKyAypBl20bh2Aw1L5D+lCZi/Uq3Sh2JTPD9/M0ei2u9CMLhLDw==", + "version": "0.1601.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.8.tgz", + "integrity": "sha512-LUMA3xNnN4IY/FPaqyF6rzba+QVxl3vA+v0l71CBIKNU+Qee6D9xe8KG0Bn7relqDhWZOSHY0nhhO2mBoz4iQg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1601.6", + "@angular-devkit/architect": "0.1601.8", "rxjs": "7.8.1" }, "engines": { @@ -427,9 +460,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.6.tgz", - "integrity": "sha512-3OjtrPWvsqVkMBwqPeE65ccCIw56FooNpVVAJ0XwhVQv5mA81pmbCzU7JsR6U449ZT7O4cQblzZMQvWvx74HCg==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.8.tgz", + "integrity": "sha512-dSRD/+bGanArIXkj+kaU1kDFleZeQMzmBiOXX+pK0Ah9/0Yn1VmY3RZh1zcX9vgIQXV+t7UPrTpOjaERMUtVGw==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -453,12 +486,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.6.tgz", - "integrity": "sha512-KA8P78gaS76HMHGBOM8JHJXWLOxCIShYVB2Un/Cu6z3jVODvXq+ILZUc1Y0RsAce/vsl2wf8qpoh5Lku9KJHUQ==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.8.tgz", + "integrity": "sha512-6LyzMdFJs337RTxxkI2U1Ndw0CW5mMX/aXWl8d7cW2odiSrAg8IdlMqpc+AM8+CPfsB0FtS1aWkEZqJLT0jHOg==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.1.6", + "@angular-devkit/core": "16.1.8", "jsonc-parser": "3.2.0", "magic-string": "0.30.0", "ora": "5.4.1", @@ -569,9 +602,9 @@ } }, "node_modules/@angular/animations": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.7.tgz", - "integrity": "sha512-+fMLwUlHLNsHWzX2cnsr4sMyix0R5v/a5srQTQjl6BYhdyqFgT82h5F4P49yFu+nZr0jdsxF012wPJbDRR+1qQ==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.9.tgz", + "integrity": "sha512-m7RREew0HWVAXnFrPBoV0J0d5wLvlMjqf/4YkrRSvQlAfic2pY+xKXjBxtSfb7QXl7d6/7htTLqKqmLRESkO3Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -579,13 +612,13 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.7" + "@angular/core": "16.1.9" } }, "node_modules/@angular/cdk": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.1.6.tgz", - "integrity": "sha512-ICwX3OyxmVotlhzlkvilvfZz32y9RXvUAaVtPsU1i20orgQBOMp+JGdP/vahLjTQRioUus834Wh6bu0KdHjCEg==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.1.8.tgz", + "integrity": "sha512-9vND9a/6GRFFLvQXRhQSr2Y6jhIAnJWxOVCMDLwnE2dSsmv17vaTI0Ij+41yWlK+mE1MTUiJaZZdW2PZlLnW9Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -599,15 +632,15 @@ } }, "node_modules/@angular/cli": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.6.tgz", - "integrity": "sha512-yXVgUKMXxlAHkhc6xk3ljR7TXpMLBykyu8do+ooSP08VKEQnWjTdVgrcOHd0n5w9YHXUQgBSmjDKxtQaBmvyZQ==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.8.tgz", + "integrity": "sha512-amOIHMq8EvixhnI+do5Bcy6IZSFAJx0njhhLM4ltDuNUczH8VH0hNegZKxhb8K87AMO8jITFM+NLrzccyghsDQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1601.6", - "@angular-devkit/core": "16.1.6", - "@angular-devkit/schematics": "16.1.6", - "@schematics/angular": "16.1.6", + "@angular-devkit/architect": "0.1601.8", + "@angular-devkit/core": "16.1.8", + "@angular-devkit/schematics": "16.1.8", + "@schematics/angular": "16.1.8", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -650,9 +683,9 @@ } }, "node_modules/@angular/common": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.7.tgz", - "integrity": "sha512-7WwYwtJjuJtUkutB+aMCvtV5zxa43T4x+kqT+kS4KnUmLv5KdrGPxcS+/7YUuKEELWp1SG032UTwGPX0DXxH4g==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.9.tgz", + "integrity": "sha512-mBetJ08synwk5nvtreek/ny5+KYPImKcr/8phdqWcL4dxfXH5HKh7afBJorPXe890BAF0LFmfVeTOmwrzZu6oA==", "dependencies": { "tslib": "^2.3.0" }, @@ -660,14 +693,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.7", + "@angular/core": "16.1.9", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.7.tgz", - "integrity": "sha512-93nbMFPSpKNfUyuRvEQxPdYLU6g25oZ4Gp7ewzNLyDHIbTQv6FwsthHfgPigPJJUUyKak6Gr3koFsgk7Dl3LAA==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.9.tgz", + "integrity": "sha512-0gBvI6Eucah7r0TWxOg2YuZQjOWTO5dDbppeqZm90XRvjp+W4g+2A2EicdcLT6xasMeFslOTUIohS8eCddEglw==", "dependencies": { "tslib": "^2.3.0" }, @@ -675,7 +708,7 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.7" + "@angular/core": "16.1.9" }, "peerDependenciesMeta": { "@angular/core": { @@ -684,9 +717,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.7.tgz", - "integrity": "sha512-6iuogfVrbCh6o4hWbNCClsLQdLtlXiaNc72LGz5LMXI0TOwKVlRXhbzhiQeLS0/nsYIdHFbgyr1aepI2wQA3mQ==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.9.tgz", + "integrity": "sha512-RWmo+YnE8pH28iu1XqqnkVyZKvQiMS/ovavKMfUzesuJpunUZFsYLJhpMRGz6S9pOiYCowye99x9YVYzvpLT6w==", "dependencies": { "@babel/core": "7.22.5", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -706,14 +739,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "16.1.7", + "@angular/compiler": "16.1.9", "typescript": ">=4.9.3 <5.2" } }, "node_modules/@angular/core": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.7.tgz", - "integrity": "sha512-Wl5BR9X1xnV7Z9v/MNVANhymuTKAuRv4etr4rRgaC5NbbJSuFM4y+mg4yVI4wmrYJo0gKRcV9+2mHaePr41fTg==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.9.tgz", + "integrity": "sha512-EPveq1kBb79/WtyAOiGeYgyh/we20TddbpQG23WZVjXHH0GoL6mmV2QHwQHOi9tYNeOneUz2bC3F88qbiacuOA==", "dependencies": { "tslib": "^2.3.0" }, @@ -726,9 +759,9 @@ } }, "node_modules/@angular/forms": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.7.tgz", - "integrity": "sha512-AZ6oCIAS2JwH7rJiTOj2uKl1eykiDP98y0trgQ/42+zzpOQZyZAjXrtdqHkVUXMc1PFf5NmYioz19Muj1p+Ttg==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.9.tgz", + "integrity": "sha512-WojLwxcJ9v2Mv7UEqbFM3GmLi9AGISPe1cqlnno22dZR/33XuK0OY1h/jIGj3WjwH4O++ksPa8NfJeJMRxLpsA==", "dependencies": { "tslib": "^2.3.0" }, @@ -736,16 +769,16 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.7", - "@angular/core": "16.1.7", - "@angular/platform-browser": "16.1.7", + "@angular/common": "16.1.9", + "@angular/core": "16.1.9", + "@angular/platform-browser": "16.1.9", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/localize": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-16.1.7.tgz", - "integrity": "sha512-xxFwdu082rikBAQXshA8akc96lKFOusgOwa5kUh2m+d8h/Hp9sOl4nOtVuHqMLz/h1OJIpskoA22EasQaccaHg==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-16.1.9.tgz", + "integrity": "sha512-uh6uVqdyjuX/sXLvKv5+p/20+otJlJnjp6MlmxE2ilQBoFiboNL4BNPD4DfuNOmwnmli+f1o49N7UeY7PY5Ayw==", "dependencies": { "@babel/core": "7.22.5", "fast-glob": "3.3.0", @@ -760,14 +793,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "16.1.7", - "@angular/compiler-cli": "16.1.7" + "@angular/compiler": "16.1.9", + "@angular/compiler-cli": "16.1.9" } }, "node_modules/@angular/platform-browser": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.7.tgz", - "integrity": "sha512-AjdUUv5+v50cclHPsKVVdNRdCQZJMGNKmvxyLgeGj2hs61lGoJxBYcYqPre2PpM0SvezNJBreUvjwqM3ttOjng==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.9.tgz", + "integrity": "sha512-a3DKGIsPYF7Hz323oGYmibLfn9fim91r9J03Hib/p4PbhRquyA5drm4mWT6+6IUhlYZCm2z9y9NVfYGrkLS+fw==", "dependencies": { "tslib": "^2.3.0" }, @@ -775,9 +808,9 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "16.1.7", - "@angular/common": "16.1.7", - "@angular/core": "16.1.7" + "@angular/animations": "16.1.9", + "@angular/common": "16.1.9", + "@angular/core": "16.1.9" }, "peerDependenciesMeta": { "@angular/animations": { @@ -786,9 +819,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.7.tgz", - "integrity": "sha512-xoT4wDl7Kurg2N5gcLNmkvqYx14xnYwa2Zm1ZIOM7kYMRXiAg1+XBzaxFXog0fCCs/lqUKUwaNn32YpLKwMNaw==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.9.tgz", + "integrity": "sha512-M+nRbLph8FecStiMTlkwAW/Tj9FzvT3gXP7gJDyFMz8lFmXRI2r4+r40Gx3jfA4+rQG0ArTq842aLBldi305Uw==", "dependencies": { "tslib": "^2.3.0" }, @@ -796,16 +829,16 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.7", - "@angular/compiler": "16.1.7", - "@angular/core": "16.1.7", - "@angular/platform-browser": "16.1.7" + "@angular/common": "16.1.9", + "@angular/compiler": "16.1.9", + "@angular/core": "16.1.9", + "@angular/platform-browser": "16.1.9" } }, "node_modules/@angular/router": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.7.tgz", - "integrity": "sha512-nzjuAEAXLktA3puvSae54noAHEiuizNTvaOpuvQYHfvZF27QMW28XlC33+vDhckWjSD02K7Fb2+AELkOJhUM5Q==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.9.tgz", + "integrity": "sha512-73dFYwcYc6mmhjHDPJsZr2hbwDTNXDBYJ6cjNk9PPtMJe70ylL0MgTR3sMtibqlhvulUtjS1E0SsWMmqq3u8FA==", "dependencies": { "tslib": "^2.3.0" }, @@ -813,16 +846,16 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.7", - "@angular/core": "16.1.7", - "@angular/platform-browser": "16.1.7", + "@angular/common": "16.1.9", + "@angular/core": "16.1.9", + "@angular/platform-browser": "16.1.9", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.1.7.tgz", - "integrity": "sha512-54Z123g6e3beJTxUT2a7c3sihuQpeclf1CrGk0QJalYMclxB7qmjFNdi0OdbPL19YupRou7NxSo1XHMTBWDQ1g==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.1.9.tgz", + "integrity": "sha512-17eRG3fn5S3kbjn+5hJZIFwpussE0lYPpqQwFHoMEAHy0Imjl5rY1FqTfz2khPB4JqaoMh1pVeYHWgSJzCKx5Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -833,14 +866,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.7", - "@angular/core": "16.1.7" + "@angular/common": "16.1.9", + "@angular/core": "16.1.9" } }, "node_modules/@angular/upgrade": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/upgrade/-/upgrade-16.1.7.tgz", - "integrity": "sha512-BZ3lx/lxnh5nwOtPD8ALR7fDvcvIzYLkLi3nDg2WJ4QctaJGBHDP2kg2Cd+lWxknLPl882T5Vxhe0+7bSbeTuw==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/upgrade/-/upgrade-16.1.9.tgz", + "integrity": "sha512-IQvwNBLNO/DplWeCN3Vl7+iSE+cwYzo5FKIckQzB4H4ZcGdm0Wcyphe3XbMJjUMLof/dB5HWTDjEH3C3dh+4XQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -848,10 +881,10 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "16.1.7", - "@angular/core": "16.1.7", - "@angular/platform-browser": "16.1.7", - "@angular/platform-browser-dynamic": "16.1.7" + "@angular/compiler": "16.1.9", + "@angular/core": "16.1.9", + "@angular/platform-browser": "16.1.9", + "@angular/platform-browser-dynamic": "16.1.9" } }, "node_modules/@assemblyscript/loader": { @@ -2800,18 +2833,20 @@ } }, "node_modules/@coreui/angular": { - "version": "4.5.10", - "resolved": "https://registry.npmjs.org/@coreui/angular/-/angular-4.5.10.tgz", - "integrity": "sha512-kSHwBfqYr+b2Hm2cxswx6BNzf73BnSuaEdqBEyivs0KQgyol3QAyZzjyYmGIIOYjAsZstMWstQXUumN083ZKbw==", + "version": "4.5.14", + "resolved": "https://registry.npmjs.org/@coreui/angular/-/angular-4.5.14.tgz", + "integrity": "sha512-eJYdRXgKf2Fz1R/ueWrbhBIHqV7k8+QxxnYDv/D2Fe53UFgVUFlNWY5DOECg4csS64/Onx6/BhA6mRaqhNqaoQ==", "dependencies": { "@popperjs/core": "~2.11.6", "tslib": "^2.3.0" }, "peerDependencies": { + "@angular/animations": "^16.1.0", "@angular/cdk": "^16.1.0", "@angular/common": "^16.1.0", "@angular/core": "^16.1.0", - "@angular/router": "^16.1.0" + "@angular/router": "^16.1.0", + "rxjs": "^7.8.1" } }, "node_modules/@coreui/coreui": { @@ -2831,15 +2866,15 @@ "peer": true }, "node_modules/@coreui/icons-angular": { - "version": "4.5.8", - "resolved": "https://registry.npmjs.org/@coreui/icons-angular/-/icons-angular-4.5.8.tgz", - "integrity": "sha512-oll1Bj09Nr/BntulpRQPyBJG+GF255AtC3t0fpRzfQeqcoytrcjPYaYSkOucn0orTQ50JVDa2U+ZkphK/50Uxg==", + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@coreui/icons-angular/-/icons-angular-4.5.13.tgz", + "integrity": "sha512-kZdaryRiyHWVeEXofG2f+gCiHJHQ+YaHJig+MeNJqUfslm+PWfGg6HFVhF2no8VYZPHgU0+moC53KFhhKpNNRA==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "^16.0.0", - "@angular/core": "^16.0.0", + "@angular/common": "^16.1.0", + "@angular/core": "^16.1.0", "@coreui/icons": "^2.1.0 || ^3.0.0" } }, @@ -2872,12 +2907,12 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.39.4", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz", - "integrity": "sha512-Jvw915fjqQct445+yron7Dufix9A+m9j1fCJYlCo1FWlRvTxa3pjJelxdSTdaLWcTwRU6vbL+NYjO4YuNIS5Qg==", + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.40.1.tgz", + "integrity": "sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg==", "dev": true, "dependencies": { - "comment-parser": "1.3.1", + "comment-parser": "1.4.0", "esquery": "^1.5.0", "jsdoc-type-pratt-parser": "~4.0.0" }, @@ -3253,18 +3288,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", + "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -3352,9 +3387,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", + "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3635,9 +3670,9 @@ "dev": true }, "node_modules/@ng-bootstrap/ng-bootstrap": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-15.1.0.tgz", - "integrity": "sha512-4Z/sXYcAq22D15jtlnZV7qztuSnlSlOgO7EVp6rJ8dyGi3CPzX9PqMfetoM6K5sKQTiSW8IfsbdXCWN7rnzxWQ==", + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-15.1.1.tgz", + "integrity": "sha512-nZlIMMggtI3IHkGs0XPrUIUdpeEzQvfGV9M4I9IvCqiS2n4RwWoUvWK1ICo4csZqFNBDlCQx956gO6ZZUSL2mw==", "dependencies": { "tslib": "^2.3.0" }, @@ -3651,9 +3686,9 @@ } }, "node_modules/@ng-select/ng-select": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-11.0.0.tgz", - "integrity": "sha512-zuqZ/9LVV4nxiOFWo0hWncTqDV2QcUcUqZyMa4kKZxJALRmPumo4+BXca1h1KY6SHYFJeINIriK93LApeMSwQQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-11.1.1.tgz", + "integrity": "sha512-Z5wV/u2HgaKl7CQSG3Sy1oF+BPQolmVV6jBuPqHa2+OWg0Nn2e9eXYdcZT8Q3BahfP5j5rHNIBrkkESg/m4YiQ==", "dependencies": { "tslib": "^2.3.1" }, @@ -3668,9 +3703,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.6.tgz", - "integrity": "sha512-rDE1bV3+Ys/VyeD6l7JKtbs3+bTQAfWhi7meEuq5mkaJHOERu6Z40ce866faAIX2I1AVpsSv8rLlb7kB7t7kzw==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.8.tgz", + "integrity": "sha512-co2SC1a822655Ek2f6fkMFsswHeCm2obNceb0kftLSpqomCgPAC3T447pB3TE1Iw+BEMFdjrAgIrp3nyYWwHsQ==", "dev": true, "engines": { "node": "^16.14.0 || >=18.10.0", @@ -4104,13 +4139,13 @@ } }, "node_modules/@schematics/angular": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.6.tgz", - "integrity": "sha512-BxghkeLfnMgV0D4DZDcbfPpox/Orw1ismSVGoQMIV/Daj2pqfSK+n97NAu0r0EsQyR5agPxOX9khVft+otODhg==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.8.tgz", + "integrity": "sha512-gTHy1A/E9BCr0sj3VCr6eBYkgVkO96QWiZcFumedGnvstvp5wiCoIoJPLLfYaxVt1vt08xmnmS3OZ3r0qCLdpA==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.1.6", - "@angular-devkit/schematics": "16.1.6", + "@angular-devkit/core": "16.1.8", + "@angular-devkit/schematics": "16.1.8", "jsonc-parser": "3.2.0" }, "engines": { @@ -4635,9 +4670,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.17.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz", - "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==" + "version": "18.17.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.5.tgz", + "integrity": "sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA==" }, "node_modules/@types/qs": { "version": "6.9.7", @@ -5384,8 +5419,9 @@ } }, "node_modules/angulartics2": { - "version": "12.2.0", - "license": "MIT", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/angulartics2/-/angulartics2-12.2.1.tgz", + "integrity": "sha512-+uDXkGGJJzzIITE59z1s3rL5okNyGXZN5mP7m2Ro9gouJF88COeRkhYlXZwIXkdQjBzIyOvUv6UamzgL9NiXLg==", "dependencies": { "tslib": "^2.3.0" }, @@ -5626,14 +5662,6 @@ "node": ">= 0.6" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "3.2.4", "dev": true, @@ -5688,9 +5716,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", "dev": true, "funding": [ { @@ -5700,11 +5728,15 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -5902,9 +5934,9 @@ } }, "node_modules/billboard.js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/billboard.js/-/billboard.js-3.9.1.tgz", - "integrity": "sha512-EVeB3uZjoijQRkc9r185bx7/FW4v7MiqS2lOlIWlssJjfiYE4bEJLSGXHaeoEU684r7j4KqeP0Jci71bgna+Jg==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/billboard.js/-/billboard.js-3.9.3.tgz", + "integrity": "sha512-w1YrBpYiVR2YmSa55OGciV0PfsUdLkTE7OMTPmrtBoc1sbz6po27nRyRpI/hL5finba5XZks2bADBQP4cvUKAg==", "dependencies": { "@types/d3-selection": "^3.0.5", "@types/d3-transition": "^3.0.3", @@ -6091,9 +6123,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", - "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "funding": [ { "type": "opencollective", @@ -6109,9 +6141,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001489", - "electron-to-chromium": "^1.4.411", - "node-releases": "^2.0.12", + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.11" }, "bin": { @@ -6282,9 +6314,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001503", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001503.tgz", - "integrity": "sha512-Sf9NiF+wZxPfzv8Z3iS0rXM1Do+iOy2Lxvib38glFX+08TCYYYGR5fRJXk4d77C4AYwhUjgYgMsMudbh2TqCKw==", + "version": "1.0.30001520", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz", + "integrity": "sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==", "funding": [ { "type": "opencollective", @@ -6343,9 +6375,9 @@ "license": "MIT" }, "node_modules/chart.js": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.3.2.tgz", - "integrity": "sha512-pvQNyFOY1QmbmIr8oDORL16/FFivfxj8V26VFpFilMo4cNvkV5WXLJetDio365pd9gKUHGdirUTbqJfw8tr+Dg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.3.3.tgz", + "integrity": "sha512-aTk7pBw+x6sQYhon/NR3ikfUJuym/LdgpTlgZRe2PaEhjUMKBKyNaFCMVRAyTEWYFNO7qRu7iQVqOw/OqzxZxQ==", "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -6626,9 +6658,10 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "node_modules/colorette": { - "version": "2.0.19", - "dev": true, - "license": "MIT" + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true }, "node_modules/colors": { "version": "1.4.0", @@ -6660,9 +6693,10 @@ } }, "node_modules/comment-parser": { - "version": "1.3.1", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.0.tgz", + "integrity": "sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 12.0.0" } @@ -6990,9 +7024,9 @@ "license": "MIT" }, "node_modules/critters": { - "version": "0.0.19", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.19.tgz", - "integrity": "sha512-Fm4ZAXsG0VzWy1U30rP4qxbaWGSsqXDgSupJW1OUJGDAs0KWC+j37v7p5a2kZ9BPJvhRzWm3be+Hc9WvQOBUOw==", + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -8135,9 +8169,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.430", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.430.tgz", - "integrity": "sha512-FytjTbGwz///F+ToZ5XSeXbbSaXalsVRXsz2mHityI5gfxft7ieW3HqFLkU5V1aIrY42aflICqbmFoDxW10etg==" + "version": "1.4.490", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz", + "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -8606,27 +8640,27 @@ } }, "node_modules/eslint": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", - "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", + "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.1", + "@eslint/js": "^8.46.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.2", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -8730,8 +8764,9 @@ }, "node_modules/eslint-plugin-import": { "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -8758,16 +8793,18 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -8785,14 +8822,14 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "46.4.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.4.5.tgz", - "integrity": "sha512-HjTuxqDYplAQFu29F3MHFCDDBgeqOxPXI6TyBhL0u2rr4XntJ0z3C9PmJvpjFscKdHwkZDN/0l1QCG0QwyRi4g==", + "version": "46.4.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.4.6.tgz", + "integrity": "sha512-z4SWYnJfOqftZI+b3RM9AtWL1vF/sLWE/LlO9yOKDof9yN2+n3zOdOJTGX/pRE/xnPsooOLG2Rq6e4d+XW3lNw==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.39.4", + "@es-joy/jsdoccomment": "~0.40.1", "are-docs-informative": "^0.0.2", - "comment-parser": "1.3.1", + "comment-parser": "1.4.0", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.5.0", @@ -8873,9 +8910,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -8889,9 +8926,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", + "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -9241,9 +9278,9 @@ } }, "node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", @@ -12002,39 +12039,36 @@ "license": "MIT" }, "node_modules/lint-staged": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", - "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.0.tgz", + "integrity": "sha512-0tLf0pqZYkar/wu3nTctk4rVIG+d7PanDYv4/IQR4qwdqfQkTDziLRFnqMcLuLBTuUqmcLwsHPD2EjQ18d/oaA==", "dev": true, "dependencies": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", + "chalk": "5.3.0", + "commander": "11.0.0", + "debug": "4.3.4", + "execa": "7.2.0", "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.2" + "listr2": "6.6.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.1" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": "^16.14.0 || >=18.0.0" }, "funding": { "url": "https://opencollective.com/lint-staged" } }, "node_modules/lint-staged/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -12043,31 +12077,30 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/lint-staged/node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "node_modules/lint-staged/node_modules/commander": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true, "engines": { - "node": ">= 14" + "node": ">=16" } }, "node_modules/listr2": { - "version": "5.0.7", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "dev": true, - "license": "MIT", "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" + "wrap-ansi": "^8.1.0" }, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": ">=16.0.0" }, "peerDependencies": { "enquirer": ">= 2.3.0 < 3" @@ -12078,73 +12111,89 @@ } } }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", + "node_modules/listr2/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/listr2/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "license": "MIT", "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr2/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/listr2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/listr2/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/load-json-file": { @@ -12309,89 +12358,183 @@ } }, "node_modules/log-update": { - "version": "4.0.0", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, - "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "type-fest": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/log-update/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/log-update/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "node_modules/log-update/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" + } + }, + "node_modules/log-update/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/slice-ansi": { + "node_modules/log-update/node_modules/restore-cursor": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/log4js": { @@ -13310,9 +13453,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "node_modules/nopt": { "version": "6.0.0", @@ -15109,9 +15252,9 @@ } }, "node_modules/prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", + "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -16916,9 +17059,10 @@ } }, "node_modules/string-argv": { - "version": "0.3.1", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6.19" } @@ -18929,6 +19073,15 @@ "version": "3.1.1", "license": "ISC" }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -19011,25 +19164,25 @@ } }, "@angular-devkit/architect": { - "version": "0.1601.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.6.tgz", - "integrity": "sha512-dY+/FNUNrOj+m4iG5/v8N0PfbDmjkjjoy/YkquRHS1yo7fGGDFNqji2552mbtjN6/LwyWDhOO7fxdqppadjnvA==", + "version": "0.1601.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.8.tgz", + "integrity": "sha512-kOXVGwsQnZvtz2UZNefcEy64Jiwq0eSoQUeozvDXOaYRJABLjPKI2YaarvKC9/Z1SGLuje0o/eRJO4T8aRk9rQ==", "dev": true, "requires": { - "@angular-devkit/core": "16.1.6", + "@angular-devkit/core": "16.1.8", "rxjs": "7.8.1" } }, "@angular-devkit/build-angular": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.6.tgz", - "integrity": "sha512-IEC1tApX8/Qa/RIVmbj0nYbOQ5WGcrkGNJ7D42q4DkIo74XKPzxDRruJE1RCjdZsj8lf4CCCZgSOPBsEI8Zbdw==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.8.tgz", + "integrity": "sha512-iyElPBQdcJq2plw5YqSz4mzNUfSRXI3ISFTEwPtimzPOorsj/OxB3Z6kJ8fDUsBAJ5OKR7xL7VnQJJ3S+05RhQ==", "dev": true, "requires": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1601.6", - "@angular-devkit/build-webpack": "0.1601.6", - "@angular-devkit/core": "16.1.6", + "@angular-devkit/architect": "0.1601.8", + "@angular-devkit/build-webpack": "0.1601.8", + "@angular-devkit/core": "16.1.8", "@babel/core": "7.22.5", "@babel/generator": "7.22.7", "@babel/helper-annotate-as-pure": "7.22.5", @@ -19041,7 +19194,7 @@ "@babel/runtime": "7.22.5", "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.1.6", + "@ngtools/webpack": "16.1.8", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", @@ -19051,7 +19204,7 @@ "cacache": "17.1.3", "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.19", + "critters": "0.0.20", "css-loader": "6.8.1", "esbuild": "0.17.19", "esbuild-wasm": "0.17.19", @@ -19093,6 +19246,20 @@ "webpack-subresource-integrity": "5.1.0" }, "dependencies": { + "autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "requires": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, "fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -19157,19 +19324,19 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1601.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.6.tgz", - "integrity": "sha512-Uz/GjnhgAqSDPxrO4HP/tHNGPPZU3tEShtAVKyAypBl20bh2Aw1L5D+lCZi/Uq3Sh2JTPD9/M0ei2u9CMLhLDw==", + "version": "0.1601.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.8.tgz", + "integrity": "sha512-LUMA3xNnN4IY/FPaqyF6rzba+QVxl3vA+v0l71CBIKNU+Qee6D9xe8KG0Bn7relqDhWZOSHY0nhhO2mBoz4iQg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1601.6", + "@angular-devkit/architect": "0.1601.8", "rxjs": "7.8.1" } }, "@angular-devkit/core": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.6.tgz", - "integrity": "sha512-3OjtrPWvsqVkMBwqPeE65ccCIw56FooNpVVAJ0XwhVQv5mA81pmbCzU7JsR6U449ZT7O4cQblzZMQvWvx74HCg==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.8.tgz", + "integrity": "sha512-dSRD/+bGanArIXkj+kaU1kDFleZeQMzmBiOXX+pK0Ah9/0Yn1VmY3RZh1zcX9vgIQXV+t7UPrTpOjaERMUtVGw==", "dev": true, "requires": { "ajv": "8.12.0", @@ -19180,12 +19347,12 @@ } }, "@angular-devkit/schematics": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.6.tgz", - "integrity": "sha512-KA8P78gaS76HMHGBOM8JHJXWLOxCIShYVB2Un/Cu6z3jVODvXq+ILZUc1Y0RsAce/vsl2wf8qpoh5Lku9KJHUQ==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.8.tgz", + "integrity": "sha512-6LyzMdFJs337RTxxkI2U1Ndw0CW5mMX/aXWl8d7cW2odiSrAg8IdlMqpc+AM8+CPfsB0FtS1aWkEZqJLT0jHOg==", "dev": true, "requires": { - "@angular-devkit/core": "16.1.6", + "@angular-devkit/core": "16.1.8", "jsonc-parser": "3.2.0", "magic-string": "0.30.0", "ora": "5.4.1", @@ -19268,32 +19435,32 @@ } }, "@angular/animations": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.7.tgz", - "integrity": "sha512-+fMLwUlHLNsHWzX2cnsr4sMyix0R5v/a5srQTQjl6BYhdyqFgT82h5F4P49yFu+nZr0jdsxF012wPJbDRR+1qQ==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.9.tgz", + "integrity": "sha512-m7RREew0HWVAXnFrPBoV0J0d5wLvlMjqf/4YkrRSvQlAfic2pY+xKXjBxtSfb7QXl7d6/7htTLqKqmLRESkO3Q==", "requires": { "tslib": "^2.3.0" } }, "@angular/cdk": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.1.6.tgz", - "integrity": "sha512-ICwX3OyxmVotlhzlkvilvfZz32y9RXvUAaVtPsU1i20orgQBOMp+JGdP/vahLjTQRioUus834Wh6bu0KdHjCEg==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.1.8.tgz", + "integrity": "sha512-9vND9a/6GRFFLvQXRhQSr2Y6jhIAnJWxOVCMDLwnE2dSsmv17vaTI0Ij+41yWlK+mE1MTUiJaZZdW2PZlLnW9Q==", "requires": { "parse5": "^7.1.2", "tslib": "^2.3.0" } }, "@angular/cli": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.6.tgz", - "integrity": "sha512-yXVgUKMXxlAHkhc6xk3ljR7TXpMLBykyu8do+ooSP08VKEQnWjTdVgrcOHd0n5w9YHXUQgBSmjDKxtQaBmvyZQ==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.8.tgz", + "integrity": "sha512-amOIHMq8EvixhnI+do5Bcy6IZSFAJx0njhhLM4ltDuNUczH8VH0hNegZKxhb8K87AMO8jITFM+NLrzccyghsDQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1601.6", - "@angular-devkit/core": "16.1.6", - "@angular-devkit/schematics": "16.1.6", - "@schematics/angular": "16.1.6", + "@angular-devkit/architect": "0.1601.8", + "@angular-devkit/core": "16.1.8", + "@angular-devkit/schematics": "16.1.8", + "@schematics/angular": "16.1.8", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -19324,25 +19491,25 @@ } }, "@angular/common": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.7.tgz", - "integrity": "sha512-7WwYwtJjuJtUkutB+aMCvtV5zxa43T4x+kqT+kS4KnUmLv5KdrGPxcS+/7YUuKEELWp1SG032UTwGPX0DXxH4g==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.9.tgz", + "integrity": "sha512-mBetJ08synwk5nvtreek/ny5+KYPImKcr/8phdqWcL4dxfXH5HKh7afBJorPXe890BAF0LFmfVeTOmwrzZu6oA==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.7.tgz", - "integrity": "sha512-93nbMFPSpKNfUyuRvEQxPdYLU6g25oZ4Gp7ewzNLyDHIbTQv6FwsthHfgPigPJJUUyKak6Gr3koFsgk7Dl3LAA==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.9.tgz", + "integrity": "sha512-0gBvI6Eucah7r0TWxOg2YuZQjOWTO5dDbppeqZm90XRvjp+W4g+2A2EicdcLT6xasMeFslOTUIohS8eCddEglw==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.7.tgz", - "integrity": "sha512-6iuogfVrbCh6o4hWbNCClsLQdLtlXiaNc72LGz5LMXI0TOwKVlRXhbzhiQeLS0/nsYIdHFbgyr1aepI2wQA3mQ==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.9.tgz", + "integrity": "sha512-RWmo+YnE8pH28iu1XqqnkVyZKvQiMS/ovavKMfUzesuJpunUZFsYLJhpMRGz6S9pOiYCowye99x9YVYzvpLT6w==", "requires": { "@babel/core": "7.22.5", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -19355,25 +19522,25 @@ } }, "@angular/core": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.7.tgz", - "integrity": "sha512-Wl5BR9X1xnV7Z9v/MNVANhymuTKAuRv4etr4rRgaC5NbbJSuFM4y+mg4yVI4wmrYJo0gKRcV9+2mHaePr41fTg==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.9.tgz", + "integrity": "sha512-EPveq1kBb79/WtyAOiGeYgyh/we20TddbpQG23WZVjXHH0GoL6mmV2QHwQHOi9tYNeOneUz2bC3F88qbiacuOA==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.7.tgz", - "integrity": "sha512-AZ6oCIAS2JwH7rJiTOj2uKl1eykiDP98y0trgQ/42+zzpOQZyZAjXrtdqHkVUXMc1PFf5NmYioz19Muj1p+Ttg==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.9.tgz", + "integrity": "sha512-WojLwxcJ9v2Mv7UEqbFM3GmLi9AGISPe1cqlnno22dZR/33XuK0OY1h/jIGj3WjwH4O++ksPa8NfJeJMRxLpsA==", "requires": { "tslib": "^2.3.0" } }, "@angular/localize": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-16.1.7.tgz", - "integrity": "sha512-xxFwdu082rikBAQXshA8akc96lKFOusgOwa5kUh2m+d8h/Hp9sOl4nOtVuHqMLz/h1OJIpskoA22EasQaccaHg==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-16.1.9.tgz", + "integrity": "sha512-uh6uVqdyjuX/sXLvKv5+p/20+otJlJnjp6MlmxE2ilQBoFiboNL4BNPD4DfuNOmwnmli+f1o49N7UeY7PY5Ayw==", "requires": { "@babel/core": "7.22.5", "fast-glob": "3.3.0", @@ -19381,41 +19548,41 @@ } }, "@angular/platform-browser": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.7.tgz", - "integrity": "sha512-AjdUUv5+v50cclHPsKVVdNRdCQZJMGNKmvxyLgeGj2hs61lGoJxBYcYqPre2PpM0SvezNJBreUvjwqM3ttOjng==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.9.tgz", + "integrity": "sha512-a3DKGIsPYF7Hz323oGYmibLfn9fim91r9J03Hib/p4PbhRquyA5drm4mWT6+6IUhlYZCm2z9y9NVfYGrkLS+fw==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.7.tgz", - "integrity": "sha512-xoT4wDl7Kurg2N5gcLNmkvqYx14xnYwa2Zm1ZIOM7kYMRXiAg1+XBzaxFXog0fCCs/lqUKUwaNn32YpLKwMNaw==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.9.tgz", + "integrity": "sha512-M+nRbLph8FecStiMTlkwAW/Tj9FzvT3gXP7gJDyFMz8lFmXRI2r4+r40Gx3jfA4+rQG0ArTq842aLBldi305Uw==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.7.tgz", - "integrity": "sha512-nzjuAEAXLktA3puvSae54noAHEiuizNTvaOpuvQYHfvZF27QMW28XlC33+vDhckWjSD02K7Fb2+AELkOJhUM5Q==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.9.tgz", + "integrity": "sha512-73dFYwcYc6mmhjHDPJsZr2hbwDTNXDBYJ6cjNk9PPtMJe70ylL0MgTR3sMtibqlhvulUtjS1E0SsWMmqq3u8FA==", "requires": { "tslib": "^2.3.0" } }, "@angular/service-worker": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.1.7.tgz", - "integrity": "sha512-54Z123g6e3beJTxUT2a7c3sihuQpeclf1CrGk0QJalYMclxB7qmjFNdi0OdbPL19YupRou7NxSo1XHMTBWDQ1g==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.1.9.tgz", + "integrity": "sha512-17eRG3fn5S3kbjn+5hJZIFwpussE0lYPpqQwFHoMEAHy0Imjl5rY1FqTfz2khPB4JqaoMh1pVeYHWgSJzCKx5Q==", "requires": { "tslib": "^2.3.0" } }, "@angular/upgrade": { - "version": "16.1.7", - "resolved": "https://registry.npmjs.org/@angular/upgrade/-/upgrade-16.1.7.tgz", - "integrity": "sha512-BZ3lx/lxnh5nwOtPD8ALR7fDvcvIzYLkLi3nDg2WJ4QctaJGBHDP2kg2Cd+lWxknLPl882T5Vxhe0+7bSbeTuw==", + "version": "16.1.9", + "resolved": "https://registry.npmjs.org/@angular/upgrade/-/upgrade-16.1.9.tgz", + "integrity": "sha512-IQvwNBLNO/DplWeCN3Vl7+iSE+cwYzo5FKIckQzB4H4ZcGdm0Wcyphe3XbMJjUMLof/dB5HWTDjEH3C3dh+4XQ==", "requires": { "tslib": "^2.3.0" } @@ -20757,9 +20924,9 @@ } }, "@coreui/angular": { - "version": "4.5.10", - "resolved": "https://registry.npmjs.org/@coreui/angular/-/angular-4.5.10.tgz", - "integrity": "sha512-kSHwBfqYr+b2Hm2cxswx6BNzf73BnSuaEdqBEyivs0KQgyol3QAyZzjyYmGIIOYjAsZstMWstQXUumN083ZKbw==", + "version": "4.5.14", + "resolved": "https://registry.npmjs.org/@coreui/angular/-/angular-4.5.14.tgz", + "integrity": "sha512-eJYdRXgKf2Fz1R/ueWrbhBIHqV7k8+QxxnYDv/D2Fe53UFgVUFlNWY5DOECg4csS64/Onx6/BhA6mRaqhNqaoQ==", "requires": { "@popperjs/core": "~2.11.6", "tslib": "^2.3.0" @@ -20778,9 +20945,9 @@ "peer": true }, "@coreui/icons-angular": { - "version": "4.5.8", - "resolved": "https://registry.npmjs.org/@coreui/icons-angular/-/icons-angular-4.5.8.tgz", - "integrity": "sha512-oll1Bj09Nr/BntulpRQPyBJG+GF255AtC3t0fpRzfQeqcoytrcjPYaYSkOucn0orTQ50JVDa2U+ZkphK/50Uxg==", + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/@coreui/icons-angular/-/icons-angular-4.5.13.tgz", + "integrity": "sha512-kZdaryRiyHWVeEXofG2f+gCiHJHQ+YaHJig+MeNJqUfslm+PWfGg6HFVhF2no8VYZPHgU0+moC53KFhhKpNNRA==", "requires": { "tslib": "^2.3.0" } @@ -20807,12 +20974,12 @@ "dev": true }, "@es-joy/jsdoccomment": { - "version": "0.39.4", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz", - "integrity": "sha512-Jvw915fjqQct445+yron7Dufix9A+m9j1fCJYlCo1FWlRvTxa3pjJelxdSTdaLWcTwRU6vbL+NYjO4YuNIS5Qg==", + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.40.1.tgz", + "integrity": "sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg==", "dev": true, "requires": { - "comment-parser": "1.3.1", + "comment-parser": "1.4.0", "esquery": "^1.5.0", "jsdoc-type-pratt-parser": "~4.0.0" } @@ -20981,15 +21148,15 @@ } }, "@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true }, "@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", + "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -21054,9 +21221,9 @@ } }, "@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", + "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", "dev": true }, "@foliojs-fork/fontkit": { @@ -21266,25 +21433,25 @@ "dev": true }, "@ng-bootstrap/ng-bootstrap": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-15.1.0.tgz", - "integrity": "sha512-4Z/sXYcAq22D15jtlnZV7qztuSnlSlOgO7EVp6rJ8dyGi3CPzX9PqMfetoM6K5sKQTiSW8IfsbdXCWN7rnzxWQ==", + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-15.1.1.tgz", + "integrity": "sha512-nZlIMMggtI3IHkGs0XPrUIUdpeEzQvfGV9M4I9IvCqiS2n4RwWoUvWK1ICo4csZqFNBDlCQx956gO6ZZUSL2mw==", "requires": { "tslib": "^2.3.0" } }, "@ng-select/ng-select": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-11.0.0.tgz", - "integrity": "sha512-zuqZ/9LVV4nxiOFWo0hWncTqDV2QcUcUqZyMa4kKZxJALRmPumo4+BXca1h1KY6SHYFJeINIriK93LApeMSwQQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-11.1.1.tgz", + "integrity": "sha512-Z5wV/u2HgaKl7CQSG3Sy1oF+BPQolmVV6jBuPqHa2+OWg0Nn2e9eXYdcZT8Q3BahfP5j5rHNIBrkkESg/m4YiQ==", "requires": { "tslib": "^2.3.1" } }, "@ngtools/webpack": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.6.tgz", - "integrity": "sha512-rDE1bV3+Ys/VyeD6l7JKtbs3+bTQAfWhi7meEuq5mkaJHOERu6Z40ce866faAIX2I1AVpsSv8rLlb7kB7t7kzw==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.8.tgz", + "integrity": "sha512-co2SC1a822655Ek2f6fkMFsswHeCm2obNceb0kftLSpqomCgPAC3T447pB3TE1Iw+BEMFdjrAgIrp3nyYWwHsQ==", "dev": true, "requires": {} }, @@ -21541,13 +21708,13 @@ "version": "2.11.6" }, "@schematics/angular": { - "version": "16.1.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.6.tgz", - "integrity": "sha512-BxghkeLfnMgV0D4DZDcbfPpox/Orw1ismSVGoQMIV/Daj2pqfSK+n97NAu0r0EsQyR5agPxOX9khVft+otODhg==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.8.tgz", + "integrity": "sha512-gTHy1A/E9BCr0sj3VCr6eBYkgVkO96QWiZcFumedGnvstvp5wiCoIoJPLLfYaxVt1vt08xmnmS3OZ3r0qCLdpA==", "dev": true, "requires": { - "@angular-devkit/core": "16.1.6", - "@angular-devkit/schematics": "16.1.6", + "@angular-devkit/core": "16.1.8", + "@angular-devkit/schematics": "16.1.8", "jsonc-parser": "3.2.0" } }, @@ -21981,9 +22148,9 @@ "dev": true }, "@types/node": { - "version": "18.17.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz", - "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==" + "version": "18.17.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.5.tgz", + "integrity": "sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA==" }, "@types/qs": { "version": "6.9.7", @@ -22531,7 +22698,9 @@ "optional": true }, "angulartics2": { - "version": "12.2.0", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/angulartics2/-/angulartics2-12.2.1.tgz", + "integrity": "sha512-+uDXkGGJJzzIITE59z1s3rL5okNyGXZN5mP7m2Ro9gouJF88COeRkhYlXZwIXkdQjBzIyOvUv6UamzgL9NiXLg==", "requires": { "tslib": "^2.3.0" } @@ -22686,10 +22855,6 @@ "version": "0.7.8", "dev": true }, - "astral-regex": { - "version": "2.0.0", - "dev": true - }, "async": { "version": "3.2.4", "dev": true @@ -22724,13 +22889,13 @@ } }, "autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", "dev": true, "requires": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -22856,9 +23021,9 @@ "dev": true }, "billboard.js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/billboard.js/-/billboard.js-3.9.1.tgz", - "integrity": "sha512-EVeB3uZjoijQRkc9r185bx7/FW4v7MiqS2lOlIWlssJjfiYE4bEJLSGXHaeoEU684r7j4KqeP0Jci71bgna+Jg==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/billboard.js/-/billboard.js-3.9.3.tgz", + "integrity": "sha512-w1YrBpYiVR2YmSa55OGciV0PfsUdLkTE7OMTPmrtBoc1sbz6po27nRyRpI/hL5finba5XZks2bADBQP4cvUKAg==", "requires": { "@types/d3-selection": "^3.0.5", "@types/d3-transition": "^3.0.3", @@ -23007,13 +23172,13 @@ } }, "browserslist": { - "version": "4.21.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", - "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "requires": { - "caniuse-lite": "^1.0.30001489", - "electron-to-chromium": "^1.4.411", - "node-releases": "^2.0.12", + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.11" } }, @@ -23121,9 +23286,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001503", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001503.tgz", - "integrity": "sha512-Sf9NiF+wZxPfzv8Z3iS0rXM1Do+iOy2Lxvib38glFX+08TCYYYGR5fRJXk4d77C4AYwhUjgYgMsMudbh2TqCKw==" + "version": "1.0.30001520", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz", + "integrity": "sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==" }, "canvg": { "version": "3.0.10", @@ -23157,9 +23322,9 @@ "dev": true }, "chart.js": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.3.2.tgz", - "integrity": "sha512-pvQNyFOY1QmbmIr8oDORL16/FFivfxj8V26VFpFilMo4cNvkV5WXLJetDio365pd9gKUHGdirUTbqJfw8tr+Dg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.3.3.tgz", + "integrity": "sha512-aTk7pBw+x6sQYhon/NR3ikfUJuym/LdgpTlgZRe2PaEhjUMKBKyNaFCMVRAyTEWYFNO7qRu7iQVqOw/OqzxZxQ==", "requires": { "@kurkle/color": "^0.3.0" } @@ -23333,7 +23498,9 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "colorette": { - "version": "2.0.19", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "colors": { @@ -23356,7 +23523,9 @@ "dev": true }, "comment-parser": { - "version": "1.3.1", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.0.tgz", + "integrity": "sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw==", "dev": true }, "commondir": { @@ -23607,9 +23776,9 @@ "dev": true }, "critters": { - "version": "0.0.19", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.19.tgz", - "integrity": "sha512-Fm4ZAXsG0VzWy1U30rP4qxbaWGSsqXDgSupJW1OUJGDAs0KWC+j37v7p5a2kZ9BPJvhRzWm3be+Hc9WvQOBUOw==", + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -24378,9 +24547,9 @@ } }, "electron-to-chromium": { - "version": "1.4.430", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.430.tgz", - "integrity": "sha512-FytjTbGwz///F+ToZ5XSeXbbSaXalsVRXsz2mHityI5gfxft7ieW3HqFLkU5V1aIrY42aflICqbmFoDxW10etg==" + "version": "1.4.490", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz", + "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==" }, "emoji-regex": { "version": "8.0.0" @@ -24718,27 +24887,27 @@ } }, "eslint": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", - "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", + "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.1", + "@eslint/js": "^8.46.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.2", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -24967,6 +25136,8 @@ }, "eslint-plugin-import": { "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "requires": { "array-includes": "^3.1.6", @@ -24988,6 +25159,8 @@ "dependencies": { "debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -24995,6 +25168,8 @@ }, "doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { "esutils": "^2.0.2" @@ -25009,14 +25184,14 @@ } }, "eslint-plugin-jsdoc": { - "version": "46.4.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.4.5.tgz", - "integrity": "sha512-HjTuxqDYplAQFu29F3MHFCDDBgeqOxPXI6TyBhL0u2rr4XntJ0z3C9PmJvpjFscKdHwkZDN/0l1QCG0QwyRi4g==", + "version": "46.4.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.4.6.tgz", + "integrity": "sha512-z4SWYnJfOqftZI+b3RM9AtWL1vF/sLWE/LlO9yOKDof9yN2+n3zOdOJTGX/pRE/xnPsooOLG2Rq6e4d+XW3lNw==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.39.4", + "@es-joy/jsdoccomment": "~0.40.1", "are-docs-informative": "^0.0.2", - "comment-parser": "1.3.1", + "comment-parser": "1.4.0", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.5.0", @@ -25070,9 +25245,9 @@ "requires": {} }, "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -25080,9 +25255,9 @@ } }, "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", + "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", "dev": true }, "espree": { @@ -25162,9 +25337,9 @@ "version": "3.3.0" }, "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, "requires": { "cross-spawn": "^7.0.3", @@ -26973,97 +27148,104 @@ "version": "1.2.4" }, "lint-staged": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", - "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.0.tgz", + "integrity": "sha512-0tLf0pqZYkar/wu3nTctk4rVIG+d7PanDYv4/IQR4qwdqfQkTDziLRFnqMcLuLBTuUqmcLwsHPD2EjQ18d/oaA==", "dev": true, "requires": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", + "chalk": "5.3.0", + "commander": "11.0.0", + "debug": "4.3.4", + "execa": "7.2.0", "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.2" + "listr2": "6.6.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.1" }, "dependencies": { "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true }, - "yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "commander": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true } } }, "listr2": { - "version": "5.0.7", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "dev": true, "requires": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" + "wrap-ansi": "^8.1.0" }, "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true }, - "cli-truncate": { - "version": "2.1.0", + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "requires": { - "color-name": "~1.1.4" + "ansi-regex": "^6.0.1" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" } } } @@ -27177,57 +27359,114 @@ } }, "log-update": { - "version": "4.0.0", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", + "ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "type-fest": "^1.0.2" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "requires": { - "color-name": "~1.1.4" + "restore-cursor": "^4.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "slice-ansi": { + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" } }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true + }, "wrap-ansi": { - "version": "6.2.0", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" } } } @@ -27883,9 +28122,9 @@ "dev": true }, "node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "nopt": { "version": "6.0.0", @@ -29033,9 +29272,9 @@ "dev": true }, "prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", + "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", "dev": true }, "pretty-bytes": { @@ -30261,7 +30500,9 @@ } }, "string-argv": { - "version": "0.3.1", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true }, "string-width": { @@ -31518,6 +31759,12 @@ "yallist": { "version": "3.1.1" }, + "yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true + }, "yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index c44c4ed3e5..35daf67e1d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@denbi/cloud-portal-webapp", - "version": "4.736.0", + "version": "4.749.0", "description": "de.NBI Cloud Portal", "scripts": { "ng": "ng serve", @@ -19,21 +19,21 @@ "private": true, "dependencies": { "@angular-eslint/eslint-plugin": "^16.0.3", - "@angular/animations": "16.1.7", - "@angular/cdk": "16.1.6", - "@angular/common": "16.1.7", - "@angular/compiler": "16.1.7", - "@angular/core": "16.1.7", - "@angular/forms": "16.1.7", - "@angular/localize": "16.1.7", - "@angular/platform-browser": "16.1.7", - "@angular/platform-browser-dynamic": "16.1.7", - "@angular/router": "16.1.7", - "@angular/service-worker": "16.1.7", - "@angular/upgrade": "16.1.7", - "@coreui/angular": "4.5.10", + "@angular/animations": "16.1.9", + "@angular/cdk": "16.1.8", + "@angular/common": "16.1.9", + "@angular/compiler": "16.1.9", + "@angular/core": "16.1.9", + "@angular/forms": "16.1.9", + "@angular/localize": "16.1.9", + "@angular/platform-browser": "16.1.9", + "@angular/platform-browser-dynamic": "16.1.9", + "@angular/router": "16.1.9", + "@angular/service-worker": "16.1.9", + "@angular/upgrade": "16.1.9", + "@coreui/angular": "4.5.14", "@coreui/coreui": "4.2.6", - "@coreui/icons-angular": "4.5.8", + "@coreui/icons-angular": "4.5.13", "@ng-bootstrap/ng-bootstrap": "^15.0.1", "@ng-select/ng-select": "^11.0.0", "@sindresorhus/transliterate": "1.6.0", @@ -41,10 +41,10 @@ "@types/jquery": "3.5.16", "acorn": "8.10.0", "ajv-formats": "2.1.1", - "angulartics2": "12.2.0", - "billboard.js": "3.9.1", + "angulartics2": "12.2.1", + "billboard.js": "3.9.3", "bootstrap": "4.6.2", - "chart.js": "4.3.2", + "chart.js": "4.3.3", "cli-color": "2.0.3", "core-js": "3.32.0", "css-loader": "6.8.1", @@ -86,20 +86,20 @@ "@angular-eslint/schematics": "16.1.0", "@angular-eslint/template-parser": "16.1.0", "@angular/cli": "^16.1.4", - "@angular/compiler-cli": "16.1.7", + "@angular/compiler-cli": "16.1.9", "@compodoc/compodoc": "1.1.21", "@playwright/test": "1.36.2", "@types/jasmine": "4.3.5", - "@types/node": "18.17.1", + "@types/node": "18.17.5", "@typescript-eslint/eslint-plugin": "5.62.0", "@typescript-eslint/parser": "5.62.0", "async": "3.2.4", "audit-ci": "6.6.1", - "autoprefixer": "10.4.14", + "autoprefixer": "10.4.15", "eslint": "^8.44.0", "eslint-config-airbnb-base": "15.0.0", "eslint-plugin-import": "2.27.5", - "eslint-plugin-jsdoc": "46.4.5", + "eslint-plugin-jsdoc": "46.4.6", "eslint-plugin-no-null": "latest", "eslint-plugin-prefer-arrow": "1.2.3", "exports-loader": "4.0.0", @@ -110,10 +110,10 @@ "karma": "6.4.2", "karma-chrome-launcher": "3.2.0", "less-loader": "11.1.3", - "lint-staged": "13.2.3", + "lint-staged": "14.0.0", "ngx-spec": "2.1.6", "npm-run-all": "4.1.5", - "prettier": "3.0.0", + "prettier": "3.0.1", "raw-loader": "4.0.2", "sass-loader": "13.3.2", "script-loader": "0.7.2", diff --git a/src/app/api-connector/email.service.ts b/src/app/api-connector/email.service.ts index 33c609c7a5..eb313a36d2 100644 --- a/src/app/api-connector/email.service.ts +++ b/src/app/api-connector/email.service.ts @@ -3,11 +3,14 @@ import { Observable } from 'rxjs'; import { HttpClient } from '@angular/common/http'; import { ApiSettings } from './api-settings.service'; import { IResponseTemplate } from './response-template'; +import { CsvMailTemplateModel } from '../shared/classes/csvMailTemplate.model'; /** * Service which provides methods for Flavors. */ -@Injectable() +@Injectable({ + providedIn: 'root', +}) export class EmailService { constructor(private http: HttpClient) {} @@ -17,6 +20,38 @@ export class EmailService { }); } + sendCsvTemplate(csvFile: File): Observable { + const formData = new FormData(); + formData.append('csv_file', csvFile, csvFile.name); + + return this.http.post(`${ApiSettings.getApiBaseURL()}emails/templated/csv/`, formData, { + withCredentials: true, + }); + } + + sendCsvTemplatedMail( + csvFile: File, + projectIds: (string | number)[], + subject: string, + message: string, + adminsOnly: boolean, + reply?: string, + ): Observable { + const formData = new FormData(); + formData.append('csv_file', csvFile, csvFile.name); + formData.append('project_ids', JSON.stringify(projectIds)); + formData.append('subject', subject); + formData.append('message', message); + formData.append('adminsOnly', String(adminsOnly)); + if (reply !== undefined) { + formData.append('reply', reply); + } + + return this.http.post(`${ApiSettings.getApiBaseURL()}emails/templated/csv/projects/`, formData, { + withCredentials: true, + }); + } + sendMailToProjects( projectIds: (string | number)[], subject: string, diff --git a/src/app/facility_manager/facilityprojectsoverview.component.html b/src/app/facility_manager/facilityprojectsoverview.component.html index 46192d4a46..5bce4b8159 100644 --- a/src/app/facility_manager/facilityprojectsoverview.component.html +++ b/src/app/facility_manager/facilityprojectsoverview.component.html @@ -34,6 +34,22 @@ Send email +
+ +
+
+ + +
-
+
-
- -
Projects
diff --git a/src/app/facility_manager/facilityprojectsoverview.component.ts b/src/app/facility_manager/facilityprojectsoverview.component.ts index f4d6acc5d0..7047290e56 100644 --- a/src/app/facility_manager/facilityprojectsoverview.component.ts +++ b/src/app/facility_manager/facilityprojectsoverview.component.ts @@ -20,6 +20,8 @@ import { AbstractBaseClass } from '../shared/shared_modules/baseClass/abstract-b import { ProjectEmailModalComponent } from '../shared/modal/email/project-email-modal/project-email-modal.component'; import { NotificationModalComponent } from '../shared/modal/notification-modal'; import { MembersListModalComponent } from '../shared/modal/members/members-list-modal.component'; +import { EmailService } from '../api-connector/email.service'; +import { CsvMailTemplateModel } from '../shared/classes/csvMailTemplate.model'; /** * Facility Project overview component. @@ -95,6 +97,7 @@ export class FacilityProjectsOverviewComponent extends AbstractBaseClass impleme private newsService: NewsService, public sortProjectService: ProjectSortService, private modalService: BsModalService, + private emailService: EmailService, ) { super(); } @@ -155,6 +158,21 @@ export class FacilityProjectsOverviewComponent extends AbstractBaseClass impleme }); * */ } + onCsvFileSelected(event): void { + const inputElement = event.target as HTMLInputElement; + if (inputElement.files && inputElement.files.length > 0) { + this.emailService.sendCsvTemplate(inputElement.files[0]).subscribe( + (csvTemplate: CsvMailTemplateModel) => { + this.openProjectMailsModal(inputElement.files[0], csvTemplate); + }, + (error: CsvMailTemplateModel) => { + console.log(error['error']); + this.openProjectMailsModal(inputElement.files[0], error['error']); + }, + ); + } + } + onSort({ column, direction }: SortEvent) { // resetting other headers this.headers.forEach(header => { @@ -442,9 +460,18 @@ export class FacilityProjectsOverviewComponent extends AbstractBaseClass impleme }); } - openProjectMailsModal(): void { - const initialState = { selectedProjects: this.selectedEmailProjects }; + openProjectMailsModal(csvFile: File = null, csvTemplate: CsvMailTemplateModel = null): void { + let initialState = {}; + if (csvFile) { + initialState = { + selectedProjects: csvTemplate.valid_projects, + csvFile, + csvMailTemplate: csvTemplate, + }; + } else { + initialState = { selectedProjects: this.selectedEmailProjects }; + } this.bsModalRef = this.modalService.show(ProjectEmailModalComponent, { initialState, class: 'modal-lg' }); this.bsModalRef.content.event.subscribe((sent_successfully: boolean) => { if (sent_successfully) { diff --git a/src/app/shared/classes/csvMailTemplate.model.ts b/src/app/shared/classes/csvMailTemplate.model.ts new file mode 100644 index 0000000000..5c7543683a --- /dev/null +++ b/src/app/shared/classes/csvMailTemplate.model.ts @@ -0,0 +1,8 @@ +import { Application } from '../../applications/application.model/application.model'; + +export class CsvMailTemplateModel { + errors: string[] = []; + warnings: string[] = []; + valid_projects: Application[] = []; + keys: string[] = []; +} diff --git a/src/app/shared/modal/email/project-email-modal/project-email-modal.component.html b/src/app/shared/modal/email/project-email-modal/project-email-modal.component.html index 657e40f143..c880a809cb 100644 --- a/src/app/shared/modal/email/project-email-modal/project-email-modal.component.html +++ b/src/app/shared/modal/email/project-email-modal/project-email-modal.component.html @@ -4,6 +4,7 @@
+ +
+

+ The following keys were provided by the CSV file: {{ csvFile.name }} +

+
+ {{ '{' + template + '}' }} +
+
+
-

The following keys can be used as variables:

+

You can use the following keys as variables:

- {{ '{' + template + '}' }}, + {{ '{' + template + '}' }}
+
Please consider: In case any dates are part of the sent E-Mails, they will be formatted in the german TT.MM.YYYY-format. @@ -108,11 +155,21 @@
diff --git a/src/app/shared/modal/email/project-email-modal/project-email-modal.component.ts b/src/app/shared/modal/email/project-email-modal/project-email-modal.component.ts index 1b8798084f..40c9dce8ef 100644 --- a/src/app/shared/modal/email/project-email-modal/project-email-modal.component.ts +++ b/src/app/shared/modal/email/project-email-modal/project-email-modal.component.ts @@ -6,6 +6,8 @@ import { Application } from '../../../../applications/application.model/applicat import { VoService } from '../../../../api-connector/vo.service'; import { IResponseTemplate } from '../../../../api-connector/response-template'; import { EmailService } from '../../../../api-connector/email.service'; +import { STATUS_LINK } from '../../../../../links/links'; +import { CsvMailTemplateModel } from '../../../classes/csvMailTemplate.model'; @Component({ selector: 'app-project-email-modal', @@ -14,17 +16,26 @@ import { EmailService } from '../../../../api-connector/email.service'; providers: [EmailService], }) export class ProjectEmailModalComponent implements OnInit, OnDestroy { - // currently only for vo @Input() selectedProjects: Application[]; + @Input() csvMailTemplate: CsvMailTemplateModel; + @Input() csvFile: File; + emailAdminsOnly: boolean; emailSubject: string; emailReply: string; emailText: string; templates: string[]; + validCSVExample = `Project, Key1, Key2 +Proj1, ValK1, ValK2 +Proj2, ValK1, ValK2`; public event: EventEmitter = new EventEmitter(); - constructor(public bsModalRef: BsModalRef, private voService: VoService, private emailService: EmailService) { + constructor( + public bsModalRef: BsModalRef, + private voService: VoService, + private emailService: EmailService, + ) { // eslint-disable-next-line no-empty-function } @@ -38,6 +49,28 @@ export class ProjectEmailModalComponent implements OnInit, OnDestroy { }); } + sentProjectsTemplatedMail(): void { + const project_ids = this.selectedProjects.map((pr: Application) => pr.project_application_perun_id); + + this.emailService + .sendCsvTemplatedMail( + this.csvFile, + project_ids, + this.emailSubject, + this.emailText, + this.emailAdminsOnly, + this.emailReply, + ) + .subscribe( + (res: IResponseTemplate) => { + this.event.emit(res.value as boolean); + }, + () => { + this.event.emit(false); + }, + ); + } + sentProjectsMail(): void { const project_ids = this.selectedProjects.map((pr: Application) => pr.project_application_perun_id); @@ -56,4 +89,6 @@ export class ProjectEmailModalComponent implements OnInit, OnDestroy { ngOnDestroy(): void { this.bsModalRef.hide(); } + + protected readonly STATUS_LINK = STATUS_LINK; } diff --git a/src/app/shared/modal/email/project-email-modal/projext-email-modal.component.scss b/src/app/shared/modal/email/project-email-modal/projext-email-modal.component.scss index 6e91f2f7da..a86e9ffc41 100644 --- a/src/app/shared/modal/email/project-email-modal/projext-email-modal.component.scss +++ b/src/app/shared/modal/email/project-email-modal/projext-email-modal.component.scss @@ -8,3 +8,18 @@ margin: 10px 0; font-family: monospace; } + +.valid-example { + border: 1px solid #ccc; + padding: 10px; + background-color: #f9f9f9; + margin-top: 10px; +} + +.valid-example-heading { + margin-bottom: 5px; +} + +.valid-example-content { + font-family: monospace; +} \ No newline at end of file diff --git a/src/app/virtualmachines/clustercard/clustercard.component.html b/src/app/virtualmachines/clustercard/clustercard.component.html index 4f7bc7e165..618a057807 100644 --- a/src/app/virtualmachines/clustercard/clustercard.component.html +++ b/src/app/virtualmachines/clustercard/clustercard.component.html @@ -19,7 +19,7 @@
{{ cluster?.userlogin }}
- {{ cluster?.launch_date | date : 'yyyy.MM.dd HH:mm' }} + {{ cluster?.launch_date | date: 'yyyy.MM.dd HH:mm' }}
-
- -
-
-
- You are not able to control this instance via this platform as it is part of a migrated project! -
-
-
-
- + diff --git a/src/app/virtualmachines/clustercard/clustercard.component.ts b/src/app/virtualmachines/clustercard/clustercard.component.ts index c64db5de7e..243b30bc3f 100644 --- a/src/app/virtualmachines/clustercard/clustercard.component.ts +++ b/src/app/virtualmachines/clustercard/clustercard.component.ts @@ -7,15 +7,11 @@ import { BsModalService } from 'ngx-bootstrap/modal'; import { VirtualMachineStates } from '../virtualmachinemodels/virtualmachinestates'; import { VirtualmachineService } from '../../api-connector/virtualmachine.service'; import { ImageService } from '../../api-connector/image.service'; -import { Clusterinfo, WorkerBatch } from '../clusters/clusterinfo'; -import { DeleteClusterComponent } from '../modals/delete-cluster/delete-cluster.component'; -import { PasswordClusterComponent } from '../modals/password-cluster/password-cluster.component'; -import { ScaleClusterComponent } from '../modals/scale-cluster/scale-cluster.component'; +import { Clusterinfo } from '../clusters/clusterinfo'; + import { SharedModal } from '../../shared/shared_modules/baseClass/shared-modal'; -import { ResumeClusterComponent } from '../modals/resume-cluster/resume-cluster.component'; -import { StopClusterComponent } from '../modals/stop-cluster/stop-cluster.component'; + import { CLOUD_PORTAL_SUPPORT_MAIL } from '../../../links/links'; -import { RenameClusterComponent } from '../modals/rename-cluster/rename-cluster.component'; /** * Vm card component to be used by vm-overview. Holds information about a virtual machine. @@ -28,9 +24,6 @@ import { RenameClusterComponent } from '../modals/rename-cluster/rename-cluster. }) export class ClustercardComponent extends SharedModal implements OnInit, OnDestroy { CLOUD_PORTAL_SUPPORT_MAIL: string = CLOUD_PORTAL_SUPPORT_MAIL; - SCALE_UP: string = 'scale_up'; - SCALE_DOWN: string = 'scale_down'; - SCALE_SUCCESS: string = 'scale_success'; /** * The virtual machine this card is for. @@ -42,16 +35,6 @@ export class ClustercardComponent extends SharedModal implements OnInit, OnDestr */ VirtualMachineStates: VirtualMachineStates = new VirtualMachineStates(); - /** - * Is the vm checked. - */ - is_checked: boolean = false; - - /** - * If connection info are shown. - */ - show_connection_info: boolean = false; - /** * Eventemitter when the vm is checked/unchecked. */ @@ -156,103 +139,6 @@ export class ClustercardComponent extends SharedModal implements OnInit, OnDestr this.stopCheckWorkerStatusTimer(); } - /** - * Show Cluster Resume modal - */ - showResumeModal(): void { - const initialState = { cluster: this.cluster }; - - this.bsModalRef = this.modalService.show(ResumeClusterComponent, { initialState }); - this.bsModalRef.setClass('modal-lg'); - this.subscribeToBsModalRef(); - } - - /** - * Show Cluster Stop modal - */ - showStopModal(): void { - const initialState = { cluster: this.cluster }; - - this.bsModalRef = this.modalService.show(StopClusterComponent, { initialState }); - this.bsModalRef.setClass('modal-lg'); - this.subscribeToBsModalRef(); - } - - /** - * Show deletion modal - */ - showDeleteModal(): void { - this.stopAllCheckStatusTimer(); - const all_loaded: boolean = this.get_all_batches_loaded(); - const initialState = { cluster: this.cluster, all_loaded }; - - this.bsModalRef = this.modalService.show(DeleteClusterComponent, { initialState }); - this.bsModalRef.setClass('modal-lg'); - this.subscribeToBsModalRef(); - } - - /** - * Show rename modal - */ - showRenameModal(): void { - this.stopAllCheckStatusTimer(); - const all_loaded: boolean = this.get_all_batches_loaded(); - const initialState = { cluster: this.cluster, all_loaded }; - - this.bsModalRef = this.modalService.show(RenameClusterComponent, { initialState }); - this.bsModalRef.setClass('modal-lg'); - this.subscribeToBsModalRef(); - } - - /** - * Show password modal - */ - showPasswordModal(): void { - this.stopCheckStatusTimer(); - const initialState = { cluster: this.cluster }; - - this.bsModalRef = this.modalService.show(PasswordClusterComponent, { initialState }); - this.bsModalRef.setClass('modal-lg'); - this.subscribeToBsModalRef(); - } - - /** - * Show password modal - */ - showScaleModal(mode: string, msg?: string): void { - this.hideCurrentModal(); - this.stopCheckStatusTimer(); - const initialState = { cluster: this.cluster, mode, msg }; - this.bsModalRef = this.modalService.show(ScaleClusterComponent, { initialState }); - this.bsModalRef.setClass('modal-xl'); - this.subscribeToBsModalRef(); - } - - scaleUpCluster(selectedBatch: WorkerBatch): void { - const scale_up_count: number = selectedBatch.upscale_count; - this.showNotificationModal('Upscaling Cluster', `Starting ${scale_up_count} additional workers..`, 'info'); - - this.subscription.add( - this.virtualmachineservice - .scaleCluster( - this.cluster.cluster_id, - encodeURIComponent(selectedBatch.flavor.name), - selectedBatch.upscale_count, - ) - .subscribe((res: any): void => { - selectedBatch.setNewScalingUpWorkerCount(); - this.cluster.password = res['password']; - this.all_worker_loaded = this.get_all_batches_loaded(); - - this.check_worker_count_loop(); - this.showScaleModal( - this.SCALE_SUCCESS, - `The start of ${scale_up_count} workers was successfully initiated. Remember to configure your cluster after the machines are active!'`, - ); - }), - ); - } - get_all_batches_loaded(): boolean { let worker_amount: number = 0; for (const worker_batch of this.cluster.worker_batches) { @@ -309,102 +195,6 @@ export class ClustercardComponent extends SharedModal implements OnInit, OnDestr }, this.checkStatusTimeout); } - scaleDownCluster(cluster: Clusterinfo): void { - this.cluster = cluster; - let scale_down_count: number = 0; - - const scale_down_batches: any = []; - this.cluster.worker_batches.forEach((batch: WorkerBatch): void => { - if (batch.delete_count > 0) { - scale_down_batches.push({ worker_flavor_name: batch.flavor.name, downscale_count: batch.delete_count }); - scale_down_count += batch.delete_count; - } - }); - let msg: string = 'Scaling Down Batches: '; - for (const batch of scale_down_batches) { - msg += ` \n[Batch with Flavor ${batch.worker_flavor_name} by ${batch.downscale_count} instances ]`; - } - this.showNotificationModal('Scaling Down', msg, 'info'); - - this.subscription.add( - this.virtualmachineservice - .scaleDownCluster(this.cluster.cluster_id, scale_down_batches) - .subscribe((res: any): void => { - this.cluster.password = res['password']; - - this.cluster.setScaleDownBatchesCount(); - - this.cluster.instances_count -= scale_down_count; - this.all_worker_loaded = this.get_all_batches_loaded(); - this.showScaleModal(this.SCALE_SUCCESS, 'Successfully Scaled Down!'); - }), - ); - } - - /** - * Run function to delete a cluster. - */ - deleteCluster(): void { - this.cluster.status = VirtualMachineStates.DELETING; - this.subscription.add( - this.virtualmachineservice.deleteCluster(this.cluster.cluster_id).subscribe((): void => { - this.cluster.status = VirtualMachineStates.DELETED; - }), - ); - } - - resumeCluster(): void { - this.cluster.status = VirtualMachineStates.POWERING_ON; - this.subscription.add( - this.virtualmachineservice.resumeCluster(this.cluster.cluster_id).subscribe((): void => { - this.check_status_loop(); - }), - ); - } - - stopCluster(): void { - this.cluster.status = VirtualMachineStates.POWERING_OFF; - this.subscription.add( - this.virtualmachineservice.stopCluster(this.cluster.cluster_id).subscribe((): void => { - this.check_status_loop(); - }), - ); - } - - renameCluster(name: string): void { - this.subscription.add( - this.virtualmachineservice.renameCluster(this.cluster.cluster_id, name).subscribe((cl: Clusterinfo): void => { - this.cluster.name = cl.name; - this.check_status_loop(); - }), - ); - } - - /** - * Function to listen to modal results. - */ - subscribeToBsModalRef(): void { - this.subscription.add( - this.bsModalRef.content.event.subscribe((result: any) => { - if ('new_name' in result) { - this.renameCluster(result['new_name']); - } else if ('deleteCluster' in result) { - this.deleteCluster(); - } else if ('scaleDownCluster' in result) { - this.scaleDownCluster(result['cluster']); - } else if ('scaleUpCluster' in result) { - this.scaleUpCluster(result['selectedBatch']); - } else if ('resumeCluster' in result) { - this.resumeCluster(); - } else if ('stopCluster' in result) { - this.stopCluster(); - } else { - this.check_status_loop(); - } - }), - ); - } - /** * Copy some text to clipboard. */ diff --git a/src/app/virtualmachines/clusters/cluster-actions/cluster-actions.component.html b/src/app/virtualmachines/clusters/cluster-actions/cluster-actions.component.html new file mode 100644 index 0000000000..e9a8669414 --- /dev/null +++ b/src/app/virtualmachines/clusters/cluster-actions/cluster-actions.component.html @@ -0,0 +1,169 @@ +
+
+ + + + +
+ + Stop +
+ + + + +
+
+
+ You are not able to control this instance via this platform as it is part of a migrated project! +
+
+
+
+
+ diff --git a/src/app/virtualmachines/clusters/cluster-actions/cluster-actions.component.scss b/src/app/virtualmachines/clusters/cluster-actions/cluster-actions.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/virtualmachines/clusters/cluster-actions/cluster-actions.component.spec.ts b/src/app/virtualmachines/clusters/cluster-actions/cluster-actions.component.spec.ts new file mode 100644 index 0000000000..77fe7a065a --- /dev/null +++ b/src/app/virtualmachines/clusters/cluster-actions/cluster-actions.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ClusterActionsComponent } from './cluster-actions.component'; + +describe('ClusterActionsComponent', () => { + let component: ClusterActionsComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [ClusterActionsComponent], + }); + fixture = TestBed.createComponent(ClusterActionsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/virtualmachines/clusters/cluster-actions/cluster-actions.component.ts b/src/app/virtualmachines/clusters/cluster-actions/cluster-actions.component.ts new file mode 100644 index 0000000000..925a1d95a9 --- /dev/null +++ b/src/app/virtualmachines/clusters/cluster-actions/cluster-actions.component.ts @@ -0,0 +1,263 @@ +import { + Component, EventEmitter, Input, OnDestroy, Output, +} from '@angular/core'; +import { ClipboardService } from 'ngx-clipboard'; +import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal'; +import { Subscription } from 'rxjs'; +import { CLOUD_PORTAL_SUPPORT_MAIL } from '../../../../links/links'; +import { Clusterinfo, WorkerBatch } from '../clusterinfo'; +import { VirtualMachineStates } from '../../virtualmachinemodels/virtualmachinestates'; +import { ResumeClusterComponent } from '../../modals/resume-cluster/resume-cluster.component'; +import { StopClusterComponent } from '../../modals/stop-cluster/stop-cluster.component'; +import { DeleteClusterComponent } from '../../modals/delete-cluster/delete-cluster.component'; +import { RenameClusterComponent } from '../../modals/rename-cluster/rename-cluster.component'; +import { PasswordClusterComponent } from '../../modals/password-cluster/password-cluster.component'; +import { ScaleClusterComponent } from '../../modals/scale-cluster/scale-cluster.component'; +import { VirtualmachineService } from '../../../api-connector/virtualmachine.service'; +import { NotificationModalComponent } from '../../../shared/modal/notification-modal'; + +@Component({ + selector: 'app-cluster-actions', + templateUrl: './cluster-actions.component.html', + styleUrls: ['./cluster-actions.component.scss'], +}) +export class ClusterActionsComponent implements OnDestroy { + @Input() cluster: Clusterinfo; + bsModalRef: BsModalRef; + subscription: Subscription = new Subscription(); + SCALE_UP: string = 'scale_up'; + SCALE_DOWN: string = 'scale_down'; + SCALE_SUCCESS: string = 'scale_success'; + show_connection_info: boolean = false; + + VirtualMachineStates: VirtualMachineStates = new VirtualMachineStates(); + @Output() readonly stopStatusLoop: EventEmitter = new EventEmitter(); + @Output() readonly startStatusLoop: EventEmitter = new EventEmitter(); + + protected readonly CLOUD_PORTAL_SUPPORT_MAIL = CLOUD_PORTAL_SUPPORT_MAIL; + + constructor( + private clipboardService: ClipboardService, + private modalService: BsModalService, + private virtualmachineservice: VirtualmachineService, + ) {} + + copyToClipboard(text: string): void { + if (this.clipboardService.isSupported) { + this.clipboardService.copy(text); + } + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + // this.statusSubscription.unsubscribe(); + // this.stopAllCheckStatusTimer(); + } + + showResumeModal(): void { + const initialState = { cluster: this.cluster }; + + this.bsModalRef = this.modalService.show(ResumeClusterComponent, { initialState }); + this.bsModalRef.setClass('modal-lg'); + this.subscribeToBsModalRef(); + } + + /** + * Show Cluster Stop modal + */ + showStopModal(): void { + const initialState = { cluster: this.cluster }; + + this.bsModalRef = this.modalService.show(StopClusterComponent, { initialState }); + this.bsModalRef.setClass('modal-lg'); + this.subscribeToBsModalRef(); + } + + showDeleteModal(): void { + // this.stopAllCheckStatusTimer(); + // const all_loaded: boolean = this.get_all_batches_loaded(); + const initialState = { cluster: this.cluster }; + + this.bsModalRef = this.modalService.show(DeleteClusterComponent, { initialState }); + this.bsModalRef.setClass('modal-lg'); + this.subscribeToBsModalRef(); + } + + /** + * Show rename modal + */ + showRenameModal(): void { + // this.stopAllCheckStatusTimer(); + // const all_loaded: boolean = this.get_all_batches_loaded(); + const initialState = { cluster: this.cluster }; + + this.bsModalRef = this.modalService.show(RenameClusterComponent, { initialState }); + this.bsModalRef.setClass('modal-lg'); + this.subscribeToBsModalRef(); + } + + showPasswordModal(): void { + // this.stopCheckStatusTimer(); + const initialState = { cluster: this.cluster }; + + this.bsModalRef = this.modalService.show(PasswordClusterComponent, { initialState }); + this.bsModalRef.setClass('modal-lg'); + this.subscribeToBsModalRef(); + } + + showScaleModal(mode: string, msg?: string): void { + this.hideCurrentModal(); + // this.stopCheckStatusTimer(); + const initialState = { cluster: this.cluster, mode, msg }; + this.bsModalRef = this.modalService.show(ScaleClusterComponent, { initialState }); + this.bsModalRef.setClass('modal-xl'); + this.subscribeToBsModalRef(); + } + + hideCurrentModal() { + if (this.bsModalRef) { + this.modalService.hide(this.bsModalRef.id); + } + } + + stopCluster(): void { + this.stopStatusLoop.emit(); + + this.cluster.status = VirtualMachineStates.POWERING_OFF; + this.subscription.add( + this.virtualmachineservice.stopCluster(this.cluster.cluster_id).subscribe((): void => { + this.cluster.status === VirtualMachineStates.POWERING_OFF; + this.startStatusLoop.emit(); + }), + ); + } + + renameCluster(name: string): void { + this.stopStatusLoop.emit(); + + this.subscription.add( + this.virtualmachineservice.renameCluster(this.cluster.cluster_id, name).subscribe((cl: Clusterinfo): void => { + this.cluster.name = cl.name; + this.startStatusLoop.emit(); + }), + ); + } + + deleteCluster(): void { + this.stopStatusLoop.emit(); + + this.cluster.status = VirtualMachineStates.DELETING; + this.subscription.add( + this.virtualmachineservice.deleteCluster(this.cluster.cluster_id).subscribe((): void => { + this.cluster.status = VirtualMachineStates.DELETED; + this.startStatusLoop.emit(); + }), + ); + } + + resumeCluster(): void { + this.stopStatusLoop.emit(); + this.cluster.status = VirtualMachineStates.POWERING_ON; + this.subscription.add( + this.virtualmachineservice.resumeCluster(this.cluster.cluster_id).subscribe((): void => { + this.startStatusLoop.emit(); + }), + ); + } + + showNotificationModal( + notificationModalTitle: string, + notificationModalMessage: string, + notificationModalType: string, + ) { + const initialState = { notificationModalTitle, notificationModalType, notificationModalMessage }; + if (this.bsModalRef) { + this.bsModalRef.hide(); + } + + this.bsModalRef = this.modalService.show(NotificationModalComponent, { initialState }); + this.bsModalRef.setClass('modal-lg'); + } + + scaleDownCluster(cluster: Clusterinfo): void { + this.stopStatusLoop.emit(); + + this.cluster = cluster; + let scale_down_count: number = 0; + + const scale_down_batches: any = []; + this.cluster.worker_batches.forEach((batch: WorkerBatch): void => { + if (batch.delete_count > 0) { + scale_down_batches.push({ worker_flavor_name: batch.flavor.name, downscale_count: batch.delete_count }); + scale_down_count += batch.delete_count; + } + }); + let msg: string = 'Scaling Down Batches: '; + for (const batch of scale_down_batches) { + msg += ` \n[Batch with Flavor ${batch.worker_flavor_name} by ${batch.downscale_count} instances ]`; + } + this.showNotificationModal('Scaling Down', msg, 'info'); + + this.subscription.add( + this.virtualmachineservice + .scaleDownCluster(this.cluster.cluster_id, scale_down_batches) + .subscribe((res: any): void => { + this.cluster.password = res['password']; + + this.cluster.setScaleDownBatchesCount(); + + this.cluster.instances_count -= scale_down_count; + this.startStatusLoop.emit(); + this.showScaleModal(this.SCALE_SUCCESS, 'Successfully Scaled Down!'); + }), + ); + } + + scaleUpCluster(selectedBatch: WorkerBatch): void { + this.stopStatusLoop.emit(); + + const scale_up_count: number = selectedBatch.upscale_count; + this.showNotificationModal('Upscaling Cluster', `Starting ${scale_up_count} additional workers..`, 'info'); + + this.subscription.add( + this.virtualmachineservice + .scaleCluster( + this.cluster.cluster_id, + encodeURIComponent(selectedBatch.flavor.name), + selectedBatch.upscale_count, + ) + .subscribe((res: any): void => { + selectedBatch.setNewScalingUpWorkerCount(); + this.cluster.password = res['password']; + this.startStatusLoop.emit(); + + this.showScaleModal( + this.SCALE_SUCCESS, + `The start of ${scale_up_count} workers was successfully initiated. Remember to configure your cluster after the machines are active!'`, + ); + }), + ); + } + + subscribeToBsModalRef(): void { + this.subscription.add( + this.bsModalRef.content.event.subscribe((result: any) => { + if ('new_name' in result) { + this.renameCluster(result['new_name']); + } else if ('deleteCluster' in result) { + this.deleteCluster(); + } else if ('scaleDownCluster' in result) { + this.scaleDownCluster(result['cluster']); + } else if ('scaleUpCluster' in result) { + this.scaleUpCluster(result['selectedBatch']); + } else if ('resumeCluster' in result) { + this.resumeCluster(); + } else if ('stopCluster' in result) { + this.stopCluster(); + } else { + // this.check_status_loop(); + } + }), + ); + } +} diff --git a/src/app/virtualmachines/clusters/clusterdetail/clusterdetail.component.html b/src/app/virtualmachines/clusters/clusterdetail/clusterdetail.component.html index ae43bcf5a1..956b1366ad 100644 --- a/src/app/virtualmachines/clusters/clusterdetail/clusterdetail.component.html +++ b/src/app/virtualmachines/clusters/clusterdetail/clusterdetail.component.html @@ -87,19 +87,11 @@
Actions
-
-
- -
-
+
@@ -109,6 +101,7 @@
Instance: {{ cluster?.master_instance.name }} +
@@ -119,6 +112,7 @@
Instance: {{ worker.name }} +
diff --git a/src/app/virtualmachines/clusters/clusterdetail/clusterdetail.component.ts b/src/app/virtualmachines/clusters/clusterdetail/clusterdetail.component.ts index a500956411..8511a567b3 100644 --- a/src/app/virtualmachines/clusters/clusterdetail/clusterdetail.component.ts +++ b/src/app/virtualmachines/clusters/clusterdetail/clusterdetail.component.ts @@ -43,7 +43,11 @@ export class ClusterdetailComponent implements OnInit, OnDestroy { errorOnLoading = false; STATUS_LINK: string = STATUS_LINK; bsModalRef: BsModalRef; + all_worker_loaded: boolean = false; + checkStatusTimer: ReturnType; + VirtualMachineStates: VirtualMachineStates = new VirtualMachineStates(); + statusSubscription: Subscription = new Subscription(); constructor( private activatedRoute: ActivatedRoute, @@ -93,6 +97,7 @@ export class ClusterdetailComponent implements OnInit, OnDestroy { (cluster_info: Clusterinfo): void => { this.cluster = new Clusterinfo(cluster_info); this.isLoaded = true; + this.check_status_loop(); this.check_status_loop_cluster_vms(); }, () => { @@ -133,6 +138,56 @@ export class ClusterdetailComponent implements OnInit, OnDestroy { ); } + get_all_batches_loaded(): boolean { + let worker_amount: number = 0; + for (const worker_batch of this.cluster.worker_batches) { + worker_amount += worker_batch.worker_count; + } + + return this.cluster.worker_instances.length === worker_amount; + } + + stopAllCheckStatusTimer(): void { + this.stopCheckStatusTimer(); + } + + stopCheckStatusTimer(): void { + if (this.checkStatusTimer) { + clearTimeout(this.checkStatusTimer); + } + if (this.statusSubscription) { + this.statusSubscription.unsubscribe(); + } + } + + /** + * Stop and clear the worker check status loop. + */ + + check_status_loop(): void { + this.all_worker_loaded = this.get_all_batches_loaded(); + this.stopAllCheckStatusTimer(); + this.statusSubscription = new Subscription(); + this.checkStatusTimer = setTimeout((): void => { + this.statusSubscription.add( + this.virtualmachineService + .getClusterInfo(this.cluster.cluster_id) + .subscribe((updated_cluster: Clusterinfo): void => { + const password: string = this.cluster.password; + this.cluster = new Clusterinfo(updated_cluster); + this.cluster.password = password; + if ( + this.cluster.status !== VirtualMachineStates.DELETED + || this.cluster.status !== VirtualMachineStates.MIGRATED + ) { + this.check_status_loop(); + this.check_status_loop_cluster_vms(); + } + }), + ); + }, this.checkStatusTimeout); + } + check_status_loop_cluster_vms(): void { this.cluster.worker_instances.forEach((vm: VirtualMachine): void => { if ( diff --git a/src/app/virtualmachines/vm.module.ts b/src/app/virtualmachines/vm.module.ts index b0da375ed6..fa2a08e7cf 100644 --- a/src/app/virtualmachines/vm.module.ts +++ b/src/app/virtualmachines/vm.module.ts @@ -50,6 +50,7 @@ import { RecreateBackendVmComponent } from './modals/recreate-backend-vm/recreat import { DatePickerComponent } from '../shared/datepicking/datepicker.component'; import { TimepickerComponent } from '../shared/datepicking/timepicker.component'; import { SharedModuleModule } from '../shared/shared_modules/shared-module.module'; +import { ClusterActionsComponent } from './clusters/cluster-actions/cluster-actions.component'; /** * VM module. @@ -77,6 +78,7 @@ import { SharedModuleModule } from '../shared/shared_modules/shared-module.modul ], declarations: [ ImageCarouselSlideComponent, + ClusterActionsComponent, ImageDetailComponent, VirtualMachineComponent, FlavorDetailComponent, diff --git a/src/app/vo_manager/VoOverviewComponent.ts b/src/app/vo_manager/VoOverviewComponent.ts index 710297627a..ba38963185 100644 --- a/src/app/vo_manager/VoOverviewComponent.ts +++ b/src/app/vo_manager/VoOverviewComponent.ts @@ -23,6 +23,8 @@ import { ProjectEmailModalComponent } from '../shared/modal/email/project-email- import { ConfirmationModalComponent } from '../shared/modal/confirmation-modal.component'; import { ConfirmationActions } from '../shared/modal/confirmation_actions'; import { MembersListModalComponent } from '../shared/modal/members/members-list-modal.component'; +import { EmailService } from '../api-connector/email.service'; +import { CsvMailTemplateModel } from '../shared/classes/csvMailTemplate.model'; /** * Vo Overview component. @@ -95,6 +97,7 @@ export class VoOverviewComponent extends AbstractBaseClass implements OnInit, On private facilityService: FacilityService, public sortProjectService: ProjectSortService, private modalService: BsModalService, + private emailService: EmailService, ) { super(); } @@ -112,6 +115,21 @@ export class VoOverviewComponent extends AbstractBaseClass implements OnInit, On this.subscription.unsubscribe(); } + onCsvFileSelected(event): void { + const inputElement = event.target as HTMLInputElement; + if (inputElement.files && inputElement.files.length > 0) { + this.emailService.sendCsvTemplate(inputElement.files[0]).subscribe( + (csvTemplate: CsvMailTemplateModel) => { + this.openProjectMailsModal(inputElement.files[0], csvTemplate); + }, + (error: CsvMailTemplateModel) => { + console.log(error['error']); + this.openProjectMailsModal(inputElement.files[0], error['error']); + }, + ); + } + } + getTSVInformation(timeout: number = this.checkTSVTimeout): void { this.stopCheckTSVTimer(); this.subscription.add( @@ -227,8 +245,18 @@ export class VoOverviewComponent extends AbstractBaseClass implements OnInit, On } } - openProjectMailsModal(): void { - const initialState = { selectedProjects: this.selectedEmailProjects }; + openProjectMailsModal(csvFile: File = null, csvTemplate: CsvMailTemplateModel = null): void { + let initialState = {}; + + if (csvFile) { + initialState = { + selectedProjects: csvTemplate.valid_projects, + csvFile, + csvMailTemplate: csvTemplate, + }; + } else { + initialState = { selectedProjects: this.selectedEmailProjects }; + } this.bsModalRef = this.modalService.show(ProjectEmailModalComponent, { initialState, class: 'modal-lg' }); this.bsModalRef.content.event.subscribe((sent_successfully: boolean) => { diff --git a/src/app/vo_manager/voOverview.component.html b/src/app/vo_manager/voOverview.component.html index ea86751c6f..87ff0dd170 100644 --- a/src/app/vo_manager/voOverview.component.html +++ b/src/app/vo_manager/voOverview.component.html @@ -36,6 +36,10 @@ {{ selectedEmailProjects?.length }} + + + *ngIf="project | hasstatusinlist : project_states.ACTIVE" + style="margin-left: 5px; margin-bottom: 5px" + type="button" + class="btn btn-warning" + (click)="selectedProject = project; suspendModal.show()" + > +  Suspend Project + + *ngIf="project | hasstatusinlist : project_states.SUSPENDED" + style="margin-left: 5px; margin-bottom: 5px" + type="button" + class="btn btn-success" + (click)="selectedProject = project; resumeModal.show()" + > +  Resume Project +