diff --git a/angular.json b/angular.json index 74bdc341ac..10c444e322 100644 --- a/angular.json +++ b/angular.json @@ -32,7 +32,7 @@ "src/favicon.ico", { "glob": "**/*", - "input": "./node_modules/amo-tools-suite/bin/", + "input": "./node_modules/measur-tools-suite/bin/", "output": "." }, "src/manifest.webmanifest" @@ -175,7 +175,7 @@ "src/favicon.ico", { "glob": "**/*", - "input": "./node_modules/amo-tools-suite/bin/", + "input": "./node_modules/measur-tools-suite/bin/", "output": "./assets/" }, "src/manifest.webmanifest" diff --git a/package-lock.json b/package-lock.json index 3535d6d600..d587860cca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "amo-tools-desktop", - "version": "1.5.9", + "version": "1.5.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "amo-tools-desktop", - "version": "1.5.9", + "version": "1.5.10", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -24,7 +24,6 @@ "@angular/service-worker": "^18.2.10", "@ng-bootstrap/ng-bootstrap": "^17.0.1", "@popperjs/core": "^2.11.2", - "amo-tools-suite": "latest", "billboard.js": "^3.14.0", "bootstrap": "4.3.1", "core-js": "3.21.1", @@ -34,6 +33,7 @@ "file-saver": "^2.0.5", "font-awesome": "^4.7.0", "fs-jetpack": "^5.1.0", + "measur-tools-suite": "latest", "ngx-indexed-db": "^16.0.0", "pako": "^2.1.0", "pptxgenjs": "^3.10.0", @@ -78,8 +78,8 @@ "typescript": "5.4.4" }, "engines": { - "node": "20.11.1", - "npm": "10.2.4" + "node": "22.14.0", + "npm": "10.9.2" } }, "node_modules/@ampproject/remapping": { @@ -237,6 +237,21 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -606,14 +621,14 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@types/node": { - "version": "22.8.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.7.tgz", - "integrity": "sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==", + "version": "22.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", + "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", "dev": true, "optional": true, "peer": true, "dependencies": { - "undici-types": "~6.19.8" + "undici-types": "~6.20.0" } }, "node_modules/@angular-devkit/build-angular/node_modules/@vitejs/plugin-basic-ssl": { @@ -628,6 +643,244 @@ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" } }, + "node_modules/@angular-devkit/build-angular/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/terser": { + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/@angular-devkit/build-angular/node_modules/vite": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", @@ -726,9 +979,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", "dev": true, "funding": [ { @@ -745,14 +998,73 @@ } ], "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, + "node_modules/@angular-devkit/build-angular/node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/webpack": { + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, "node_modules/@angular-devkit/build-webpack": { "version": "0.1802.11", "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.11.tgz", @@ -1268,14 +1580,14 @@ } }, "node_modules/@angular/build/node_modules/@types/node": { - "version": "22.8.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.7.tgz", - "integrity": "sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==", + "version": "22.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", + "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", "dev": true, "optional": true, "peer": true, "dependencies": { - "undici-types": "~6.19.8" + "undici-types": "~6.20.0" } }, "node_modules/@angular/build/node_modules/@vitejs/plugin-basic-ssl": { @@ -1290,6 +1602,36 @@ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" } }, + "node_modules/@angular/build/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@angular/build/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@angular/build/node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/@angular/build/node_modules/vite": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", @@ -1387,32 +1729,17 @@ "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/@angular/build/node_modules/vite/node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "node_modules/@angular/build/node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=10.13.0" } }, "node_modules/@angular/cli": { @@ -1746,14 +2073,16 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.0", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" @@ -1771,19 +2100,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", - "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", @@ -1850,13 +2166,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", - "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.1.1", + "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "engines": { @@ -1888,9 +2204,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -1957,9 +2273,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1995,14 +2311,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2011,19 +2327,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", - "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", @@ -2100,11 +2403,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", - "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -2490,12 +2794,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2677,12 +2981,11 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", - "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { @@ -2817,14 +3120,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", - "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-simple-access": "^7.25.9" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2899,12 +3201,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -3189,12 +3491,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -3412,15 +3714,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", + "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -3429,12 +3732,13 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -3443,21 +3747,11 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -4317,10 +4611,11 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.7.tgz", - "integrity": "sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", + "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -4618,9 +4913,9 @@ } }, "node_modules/@jsonjoy.com/json-pack": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", - "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.1.tgz", + "integrity": "sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==", "dev": true, "dependencies": { "@jsonjoy.com/base64": "^1.1.1", @@ -5789,11 +6084,36 @@ "@types/ms": "*" } }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", @@ -5808,9 +6128,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz", - "integrity": "sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "dev": true, "dependencies": { "@types/node": "*", @@ -5935,9 +6255,9 @@ } }, "node_modules/@types/qs": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", - "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", "dev": true }, "node_modules/@types/range-parser": { @@ -6014,9 +6334,9 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", + "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", "dev": true, "dependencies": { "@types/node": "*" @@ -6033,148 +6353,163 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -6191,13 +6526,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", @@ -6224,6 +6561,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -6350,20 +6688,6 @@ "ajv": "^8.8.2" } }, - "node_modules/amo-tools-suite": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/amo-tools-suite/-/amo-tools-suite-1.0.7.tgz", - "integrity": "sha512-UAEwMN95F8dggiKZs/HfGPgKq5lWcxXxFMTnZrSCoYKahVOFTayzpMispFFM5XQZ2NelTyikWgdr5eWlQY4SdQ==", - "dependencies": { - "express": "^4.17.1", - "jquery": "^3.4.1", - "request": "^2.88.2" - }, - "engines": { - "node": "20.16.0", - "npm": "10.8.1" - } - }, "node_modules/angular-plotly.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/angular-plotly.js/-/angular-plotly.js-5.2.2.tgz", @@ -6621,12 +6945,14 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, "dependencies": { "safer-buffer": "~2.1.0" } @@ -6635,6 +6961,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, "engines": { "node": ">=0.8" } @@ -6666,7 +6993,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/at-least-node": { "version": "1.0.0", @@ -6727,6 +7055,7 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, "engines": { "node": "*" } @@ -6734,7 +7063,8 @@ "node_modules/aws4": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true }, "node_modules/babel-loader": { "version": "9.1.3", @@ -6754,13 +7084,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", + "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -6790,12 +7120,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -6844,6 +7174,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, "dependencies": { "tweetnacl": "^0.14.3" } @@ -6940,6 +7271,7 @@ "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -6963,6 +7295,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -6971,6 +7304,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -6981,12 +7315,13 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", @@ -7039,9 +7374,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "funding": [ { "type": "opencollective", @@ -7056,10 +7391,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -7247,6 +7583,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -7346,6 +7683,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -7370,9 +7708,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001677", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001677.tgz", - "integrity": "sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==", + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", "funding": [ { "type": "opencollective", @@ -7386,12 +7724,14 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true }, "node_modules/chainsaw": { "version": "0.1.0", @@ -7683,6 +8023,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -7922,6 +8263,7 @@ "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, "dependencies": { "safe-buffer": "5.2.1" }, @@ -7933,6 +8275,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -7946,6 +8289,7 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -7953,7 +8297,8 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true }, "node_modules/copy-anything": { "version": "2.0.6", @@ -8003,12 +8348,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", "dev": true, "dependencies": { - "browserslist": "^4.24.2" + "browserslist": "^4.24.3" }, "funding": { "type": "opencollective", @@ -8109,10 +8454,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -8457,6 +8803,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, "dependencies": { "assert-plus": "^1.0.0" }, @@ -8595,6 +8942,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -8641,6 +8989,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -8649,6 +8998,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -8657,6 +9007,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -8892,9 +9243,9 @@ } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "dependencies": { "dom-serializer": "^2.0.0", @@ -8965,6 +9316,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -8973,12 +9325,14 @@ "node_modules/ecc-jsbn/node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true }, "node_modules/ejs": { "version": "3.1.10", @@ -9369,9 +9723,10 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.50", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz", - "integrity": "sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==" + "version": "1.5.87", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.87.tgz", + "integrity": "sha512-mPFwmEWmRivw2F8x3w3l2m6htAUN97Gy0kwpO++2m9iT1Gt8RCFVUfv9U/sIbHJ6rY4P6/ooqFL/eL7ock+pPg==", + "license": "ISC" }, "node_modules/electron-updater": { "version": "6.3.9", @@ -9465,6 +9820,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -9616,6 +9972,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -9627,6 +9984,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -9706,7 +10064,8 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -9790,6 +10149,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -9902,6 +10262,7 @@ "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -9947,6 +10308,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -9954,12 +10316,14 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "node_modules/external-editor": { "version": "3.1.0", @@ -10023,6 +10387,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, "engines": [ "node >=0.6.0" ] @@ -10042,7 +10407,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-glob": { "version": "3.3.2", @@ -10073,7 +10439,8 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-uri": { "version": "3.0.3", @@ -10165,6 +10532,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -10182,6 +10550,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -10189,7 +10558,8 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/find-cache-dir": { "version": "4.0.0", @@ -10343,6 +10713,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, "engines": { "node": "*" } @@ -10365,6 +10736,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -10386,6 +10758,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -10479,6 +10852,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10564,6 +10938,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -10627,6 +11002,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, "dependencies": { "assert-plus": "^1.0.0" } @@ -10756,6 +11132,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -10803,6 +11180,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, "engines": { "node": ">=4" } @@ -10812,6 +11190,7 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", + "dev": true, "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -10824,6 +11203,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -10838,7 +11218,8 @@ "node_modules/har-validator/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/has-flag": { "version": "4.0.0", @@ -10853,6 +11234,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -10864,6 +11246,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -10875,6 +11258,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -10886,6 +11270,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -11022,6 +11407,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -11034,9 +11420,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", "dev": true }, "node_modules/http-proxy": { @@ -11088,6 +11474,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -11117,12 +11504,13 @@ "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==" }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -11130,13 +11518,11 @@ } }, "node_modules/https-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, + "license": "MIT", "engines": { "node": ">= 14" } @@ -11367,6 +11753,7 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, "engines": { "node": ">= 0.10" } @@ -11562,7 +11949,8 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, "node_modules/is-unicode-supported": { "version": "0.1.0", @@ -11629,7 +12017,8 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", @@ -11898,14 +12287,15 @@ "dev": true }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -11926,7 +12316,8 @@ "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -11937,7 +12328,8 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true }, "node_modules/json5": { "version": "2.2.3", @@ -11978,6 +12370,7 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -11992,6 +12385,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, "engines": [ "node >=0.6.0" ], @@ -12376,10 +12770,12 @@ } }, "node_modules/less": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.1.tgz", + "integrity": "sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==", "dev": true, + "license": "Apache-2.0", + "peer": true, "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -12433,6 +12829,7 @@ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "optional": true, + "peer": true, "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -12447,6 +12844,7 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, "optional": true, + "peer": true, "bin": { "mime": "cli.js" }, @@ -12460,6 +12858,7 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -12470,6 +12869,7 @@ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "optional": true, + "peer": true, "bin": { "semver": "bin/semver" } @@ -12480,6 +12880,7 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -13111,18 +13512,28 @@ "node": ">=10" } }, + "node_modules/measur-tools-suite": { + "version": "1.0.8-beta.5", + "resolved": "https://registry.npmjs.org/measur-tools-suite/-/measur-tools-suite-1.0.8-beta.5.tgz", + "integrity": "sha512-gr1ljvcAXCdxRTCPST7QXYEsVJyhgOVgQbNjKGa6qkzwvBcqJPHvDZqXIFNYuGKP5ge2PKfSkAGSe6yX8IdePA==", + "engines": { + "node": "20.16.0", + "npm": "10.8.1" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.14.0.tgz", - "integrity": "sha512-JUeY0F/fQZgIod31Ja1eJgiSxLn7BfQlCnqhwXFBzFHEw63OdLK7VJUJ7bnzNsWgCyoUP5tEp1VRY8rDaYzqOA==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", + "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", "dev": true, "dependencies": { "@jsonjoy.com/json-pack": "^1.0.3", @@ -13142,6 +13553,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -13164,6 +13576,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -13207,6 +13620,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -13215,6 +13629,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -13544,9 +13959,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -13582,6 +13997,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -13713,9 +14129,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", - "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "dev": true, "optional": true, "bin": { @@ -13798,9 +14214,10 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" }, "node_modules/nodemon": { "version": "3.1.7", @@ -14131,6 +14548,7 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, "engines": { "node": "*" } @@ -14148,6 +14566,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -14175,6 +14594,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, "dependencies": { "ee-first": "1.1.1" }, @@ -14386,9 +14806,9 @@ } }, "node_modules/p-retry": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", - "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "dev": true, "dependencies": { "@types/retry": "0.12.2", @@ -14567,6 +14987,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -14628,7 +15049,8 @@ "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true }, "node_modules/path-type": { "version": "5.0.0", @@ -14651,7 +15073,8 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true }, "node_modules/picocolors": { "version": "1.1.1", @@ -14735,9 +15158,9 @@ } }, "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -14753,10 +15176,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -14980,6 +15404,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -14998,7 +15423,8 @@ "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true }, "node_modules/pstree.remy": { "version": "1.1.8", @@ -15035,6 +15461,7 @@ "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, "dependencies": { "side-channel": "^1.0.6" }, @@ -15097,6 +15524,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -15105,6 +15533,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -15119,6 +15548,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -15381,15 +15811,15 @@ "dev": true }, "node_modules/regexpu-core": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", - "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.0", "regjsgen": "^0.8.0", - "regjsparser": "^0.11.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -15404,9 +15834,9 @@ "dev": true }, "node_modules/regjsparser": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz", - "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, "dependencies": { "jsesc": "~3.0.2" @@ -15437,6 +15867,7 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -15467,6 +15898,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -15480,6 +15912,7 @@ "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, "engines": { "node": ">=0.6" } @@ -15489,6 +15922,7 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, "bin": { "uuid": "bin/uuid" } @@ -15708,6 +16142,12 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -15943,6 +16383,7 @@ "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -15966,6 +16407,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -15973,12 +16415,14 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/send/node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -15987,6 +16431,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, "bin": { "mime": "cli.js" }, @@ -16114,6 +16559,7 @@ "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -16128,6 +16574,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -16148,7 +16595,8 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -16184,10 +16632,13 @@ } }, "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16196,6 +16647,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -16579,6 +17031,7 @@ "version": "1.18.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -16602,7 +17055,8 @@ "node_modules/sshpk/node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true }, "node_modules/ssri": { "version": "10.0.6", @@ -16629,6 +17083,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -16938,10 +17393,11 @@ } }, "node_modules/terser": { - "version": "5.31.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", - "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -17139,6 +17595,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, "engines": { "node": ">=0.6" } @@ -17156,6 +17613,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -17168,6 +17626,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -17258,9 +17717,10 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/tslint": { "version": "6.1.3", @@ -17480,6 +17940,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -17490,7 +17951,8 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true }, "node_modules/type-fest": { "version": "0.21.3", @@ -17508,6 +17970,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -17661,6 +18124,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -17747,6 +18211,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -17755,6 +18220,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -17774,6 +18240,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, "engines": { "node": ">= 0.4.0" } @@ -17813,6 +18280,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -17842,10 +18310,12 @@ } }, "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -17879,18 +18349,20 @@ "dev": true }, "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", @@ -18144,6 +18616,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -18160,6 +18633,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "peer": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -18168,19 +18642,22 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", diff --git a/package.json b/package.json index 95d6d258dc..1245644b48 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amo-tools-desktop", - "version": "1.5.9", + "version": "1.5.10", "main": "main.js", "license": "MIT", "description": "MEASUR", @@ -8,8 +8,8 @@ "repository": "https://github.com/ORNL-AMO/AMO-Tools-Desktop.git", "angular-cli": {}, "engines": { - "node": "20.11.1", - "npm": "10.2.4" + "node": "22.14.0", + "npm": "10.9.2" }, "scripts": { "start": "node --max_old_space_size=8000 ./node_modules/@angular/cli/bin/ng serve", @@ -45,7 +45,6 @@ "@angular/service-worker": "^18.2.10", "@ng-bootstrap/ng-bootstrap": "^17.0.1", "@popperjs/core": "^2.11.2", - "amo-tools-suite": "latest", "billboard.js": "^3.14.0", "bootstrap": "4.3.1", "core-js": "3.21.1", @@ -55,6 +54,7 @@ "file-saver": "^2.0.5", "font-awesome": "^4.7.0", "fs-jetpack": "^5.1.0", + "measur-tools-suite": "latest", "ngx-indexed-db": "^16.0.0", "pako": "^2.1.0", "pptxgenjs": "^3.10.0", diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 912055b289..aaf881539c 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -5,8 +5,8 @@ import { AnalyticsService } from './shared/analytics/analytics.service'; import { Subscription, catchError, concat, first, interval, pipe } from 'rxjs'; import { SwUpdate } from '@angular/service-worker'; import { ElectronService } from './electron/electron.service'; -import { PwaService } from './shared/pwa/pwa.service'; import { AppErrorService } from './shared/errors/app-error.service'; +import { UpdateApplicationService } from './shared/update-application/update-application.service'; // declare ga as a function to access the JS code in TS declare let gtag: Function; @@ -24,7 +24,7 @@ export class AppComponent { private analyticsService: AnalyticsService, private appRef: ApplicationRef, private updates: SwUpdate, - private pwaService: PwaService, + private updateApplicationService: UpdateApplicationService, private electronService: ElectronService, private appErrorService: AppErrorService, private router: Router) { @@ -54,7 +54,7 @@ export class AppComponent { try { const updateFound = await updates.checkForUpdate(); if (updateFound) { - this.pwaService.displayUpdateToast.next(true); + this.updateApplicationService.webUpdateAvailable.next(true); } console.log(updateFound ? 'A new version is available.' : 'Already on the latest version.'); } catch (err) { diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 13c429c88d..7a56409e3f 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -67,7 +67,7 @@ export function initializeWasmScript(): Promise { window['Module'] = { onRuntimeInitialized: function () { window['dbInstance'] = new window['Module'].SQLite(":memory:", true); - console.log('AMO Tools Suite module initialized'); + console.log('MEASUR Tools Suite module initialized'); resolve(module); }, onAbort: function () { diff --git a/src/app/calculator/furnaces/flue-gas/flue-gas-form-mass/flue-gas-form-mass.component.html b/src/app/calculator/furnaces/flue-gas/flue-gas-form-mass/flue-gas-form-mass.component.html index c586288c91..9ac733fea7 100644 --- a/src/app/calculator/furnaces/flue-gas/flue-gas-form-mass/flue-gas-form-mass.component.html +++ b/src/app/calculator/furnaces/flue-gas/flue-gas-form-mass/flue-gas-form-mass.component.html @@ -143,6 +143,7 @@ Value can't be less than {{byMassForm.controls.moistureInAirCombustion.errors.min.min}} %. + Calculate
@@ -208,4 +209,14 @@
+ + + \ No newline at end of file diff --git a/src/app/calculator/furnaces/flue-gas/flue-gas-form-mass/flue-gas-form-mass.component.ts b/src/app/calculator/furnaces/flue-gas/flue-gas-form-mass/flue-gas-form-mass.component.ts index b2f69c6e02..d90722d5fd 100644 --- a/src/app/calculator/furnaces/flue-gas/flue-gas-form-mass/flue-gas-form-mass.component.ts +++ b/src/app/calculator/furnaces/flue-gas/flue-gas-form-mass/flue-gas-form-mass.component.ts @@ -28,6 +28,7 @@ export class FlueGasFormMassComponent implements OnInit { @ViewChild('formElement', { static: false }) formElement: ElementRef; @ViewChild('materialModal', { static: false }) public materialModal: ModalDirective; + @ViewChild('moistureModal', { static: false }) public moistureModal: ModalDirective; resetDataSub: Subscription; byMassForm: UntypedFormGroup; @@ -44,6 +45,7 @@ export class FlueGasFormMassComponent implements OnInit { warnings: FlueGasWarnings; higherHeatingValue: number; + showMoisture: boolean; constructor(private flueGasService: FlueGasService, private flueGasFormService: FlueGasFormService, @@ -221,6 +223,25 @@ export class FlueGasFormMassComponent implements OnInit { return test; } + + showMoistureModal() { + this.flueGasService.modalOpen.next(true); + this.showMoisture = true; + this.moistureModal.show(); + } + + hideMoistureModal(moistureInAirCombustion?: number) { + if (moistureInAirCombustion) { + moistureInAirCombustion = Number(moistureInAirCombustion.toFixed(2)); + this.byMassForm.controls.moistureInAirCombustion.patchValue(moistureInAirCombustion); + } + this.moistureModal.hide(); + this.showMoisture = false; + this.flueGasService.modalOpen.next(false); + this.calculate(); + } + + showMaterialModal() { this.flueGasService.modalOpen.next(true); this.materialModal.show(); diff --git a/src/app/calculator/furnaces/flue-gas/flue-gas-form-volume/flue-gas-form-volume.component.html b/src/app/calculator/furnaces/flue-gas/flue-gas-form-volume/flue-gas-form-volume.component.html index de3c75f1b7..c80fc898d7 100644 --- a/src/app/calculator/furnaces/flue-gas/flue-gas-form-volume/flue-gas-form-volume.component.html +++ b/src/app/calculator/furnaces/flue-gas/flue-gas-form-volume/flue-gas-form-volume.component.html @@ -148,6 +148,7 @@ Value can't be less than {{byVolumeForm.controls.moistureInAirCombustion.errors.min.min}} %. + Calculate
@@ -180,4 +181,14 @@
+ + + \ No newline at end of file diff --git a/src/app/calculator/furnaces/flue-gas/flue-gas-form-volume/flue-gas-form-volume.component.ts b/src/app/calculator/furnaces/flue-gas/flue-gas-form-volume/flue-gas-form-volume.component.ts index 9c05c17522..86c4177630 100644 --- a/src/app/calculator/furnaces/flue-gas/flue-gas-form-volume/flue-gas-form-volume.component.ts +++ b/src/app/calculator/furnaces/flue-gas/flue-gas-form-volume/flue-gas-form-volume.component.ts @@ -34,6 +34,7 @@ export class FlueGasFormVolumeComponent implements OnInit, OnDestroy { @ViewChild('formElement', { static: false }) formElement: ElementRef; @ViewChild('materialModal', { static: false }) public materialModal: ModalDirective; + @ViewChild('moistureModal', { static: false }) public moistureModal: ModalDirective; resetDataSub: Subscription; generateExampleSub: Subscription; @@ -52,6 +53,7 @@ export class FlueGasFormVolumeComponent implements OnInit, OnDestroy { baselineDataSub: Subscription; higherHeatingValue: number; + showMoisture: boolean; constructor(private flueGasService: FlueGasService, private convertUnitsService: ConvertUnitsService, @@ -244,6 +246,23 @@ export class FlueGasFormVolumeComponent implements OnInit, OnDestroy { this.materialModal.show(); } + showMoistureModal() { + this.flueGasService.modalOpen.next(true); + this.showMoisture = true; + this.moistureModal.show(); + } + + hideMoistureModal(moistureInAirCombustion?: number) { + if (moistureInAirCombustion) { + moistureInAirCombustion = Number(moistureInAirCombustion.toFixed(2)); + this.byVolumeForm.controls.moistureInAirCombustion.patchValue(moistureInAirCombustion); + } + this.moistureModal.hide(); + this.showMoisture = false; + this.flueGasService.modalOpen.next(false); + this.calculate(); + } + hideMaterialModal(event?: any) { if (event) { this.options = this.sqlDbApiService.selectGasFlueGasMaterials(); diff --git a/src/app/calculator/furnaces/flue-gas/flue-gas.module.ts b/src/app/calculator/furnaces/flue-gas/flue-gas.module.ts index cc1bcd116f..a3ad90795e 100644 --- a/src/app/calculator/furnaces/flue-gas/flue-gas.module.ts +++ b/src/app/calculator/furnaces/flue-gas/flue-gas.module.ts @@ -16,6 +16,7 @@ import { OperatingHoursModalModule } from '../../../shared/operating-hours-modal import { EnergyFormComponent } from './energy-form/energy-form.component'; import { FlueGasFormService } from './flue-gas-form.service'; import { EnergyFormService } from './energy-form.service'; +import { FlueGasMoistureModalModule } from '../../../shared/flue-gas-moisture-modal/flue-gas-moisture-modal.module'; @@ -37,7 +38,8 @@ import { EnergyFormService } from './energy-form.service'; SuiteDbModule, SharedPipesModule, ExportableResultsTableModule, - OperatingHoursModalModule + OperatingHoursModalModule, + FlueGasMoistureModalModule ], exports: [ FlueGasComponent, diff --git a/src/app/calculator/motors/motor-performance/motor-performance-chart.service.ts b/src/app/calculator/motors/motor-performance/motor-performance-chart.service.ts index 93180541c5..bd37441cd6 100644 --- a/src/app/calculator/motors/motor-performance/motor-performance-chart.service.ts +++ b/src/app/calculator/motors/motor-performance/motor-performance-chart.service.ts @@ -123,6 +123,9 @@ export class MotorPerformanceChartService { xaxis: { autorange: false, showgrid: true, + // * hoverformat will be overridden by tickvals and tickformat + // hoverformat: '.1f', + hoverformat: '.1%', title: { text: "Motor Shaft Load" }, @@ -130,8 +133,10 @@ export class MotorPerformanceChartService { tickangle: -60, tickmode: 'array', range: [0, 1.4], - tickvals: [0, .20, .40, .60, .80, 1, 1.2], - tickformat: '.0%' + tickvals: [0, 0.2, 0.4, 0.6, 0.8, 1, 1.2], + // * conflicts with hoverFormat + // tickformat: '.0%' + ticktext: ["0%", "20%", "40%", "60%", "80%", "100%", "120%"], }, yaxis: { type: 'linear', diff --git a/src/app/calculator/process-cooling/chiller-staging/chiller-staging.component.ts b/src/app/calculator/process-cooling/chiller-staging/chiller-staging.component.ts index a61c3ba7a4..cd9800ca60 100644 --- a/src/app/calculator/process-cooling/chiller-staging/chiller-staging.component.ts +++ b/src/app/calculator/process-cooling/chiller-staging/chiller-staging.component.ts @@ -58,7 +58,7 @@ export class ChillerStagingComponent implements OnInit { this.chillerStagingInput = this.chillerStagingService.chillerStagingInput.getValue(); if (!this.chillerStagingInput) { this.chillerStagingService.initDefaultEmptyInputs(this.settings); - this.chillerStagingService.initDefaultEmptyOutputs(); + this.chillerStagingService.chillerStagingOutput.next(this.chillerStagingService.getDefaultEmptyOutput()); } this.initSubscriptions(); } @@ -97,7 +97,8 @@ export class ChillerStagingComponent implements OnInit { } calculate() { - this.chillerStagingService.calculate(this.settings); + let chillerStagingOutput = this.chillerStagingService.calculate(this.settings); + this.chillerStagingService.chillerStagingOutput.next(chillerStagingOutput); } btnResetData() { diff --git a/src/app/calculator/process-cooling/chiller-staging/chiller-staging.service.ts b/src/app/calculator/process-cooling/chiller-staging/chiller-staging.service.ts index 7c426e64f3..22207c4a5c 100644 --- a/src/app/calculator/process-cooling/chiller-staging/chiller-staging.service.ts +++ b/src/app/calculator/process-cooling/chiller-staging/chiller-staging.service.ts @@ -47,7 +47,7 @@ export class ChillerStagingService { this.chillerStagingInput.next(emptyInput); } - initDefaultEmptyOutputs() { + getDefaultEmptyOutput(): ChillerStagingOutput { let emptyOutput: ChillerStagingOutput = { baselineTotalPower: 0, baselineTotalEnergy: 0, @@ -60,7 +60,8 @@ export class ChillerStagingService { baselinePowerList: [], modPowerList: [], }; - this.chillerStagingOutput.next(emptyOutput); + + return emptyOutput; } calculate(settings: Settings, inputs?: ChillerStagingInput) { @@ -75,11 +76,12 @@ export class ChillerStagingService { let validInput: boolean; validInput = this.chillerStagingFormService.getChillerStagingForm(inputCopy).valid; + let chillerStagingOutput: ChillerStagingOutput if(!validInput) { - this.initDefaultEmptyOutputs(); + chillerStagingOutput = this.getDefaultEmptyOutput() } else { inputCopy = this.convertInputUnits(inputCopy, settings); - let chillerStagingOutput: ChillerStagingOutput = this.chillersSuiteApiService.chillerStagingEfficiency(inputCopy); + chillerStagingOutput = this.chillersSuiteApiService.chillerStagingEfficiency(inputCopy); if (chillerStagingOutput.baselinePowerList && chillerStagingOutput.modPowerList) { chillerStagingOutput.chillerLoadResults = []; chillerStagingOutput.baselinePowerList.forEach((baselineLoad: number, index) => { @@ -89,9 +91,8 @@ export class ChillerStagingService { chillerStagingOutput.modificationCost = chillerStagingOutput.modTotalEnergy * inputCopy.electricityCost; chillerStagingOutput.costSavings = chillerStagingOutput.baselineCost - chillerStagingOutput.modificationCost; } - this.chillerStagingOutput.next(chillerStagingOutput); - return chillerStagingOutput; } + return chillerStagingOutput; } convertInputUnits(input: ChillerStagingInput, settings: Settings): ChillerStagingInput { if (settings.unitsOfMeasure == "Metric") { diff --git a/src/app/calculator/steam/feedwater-economizer/feedwater-economizer-form/feedwater-economizer-form.component.html b/src/app/calculator/steam/feedwater-economizer/feedwater-economizer-form/feedwater-economizer-form.component.html index 9a3515e6c0..4619a5a6aa 100644 --- a/src/app/calculator/steam/feedwater-economizer/feedwater-economizer-form/feedwater-economizer-form.component.html +++ b/src/app/calculator/steam/feedwater-economizer/feedwater-economizer-form/feedwater-economizer-form.component.html @@ -35,7 +35,7 @@
+ id="higherHeatingVal" onfocus="this.select();" (input)="calculate()" (focus)="focusField('higherHeatingVal')"> Btu/scf kJ/Nm3 @@ -214,6 +214,7 @@ {{warnings.moistureInCombustionAir}} + Calculate
@@ -367,4 +368,14 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/src/app/calculator/steam/feedwater-economizer/feedwater-economizer-form/feedwater-economizer-form.component.ts b/src/app/calculator/steam/feedwater-economizer/feedwater-economizer-form/feedwater-economizer-form.component.ts index 85e8cef938..d79a9c37f5 100644 --- a/src/app/calculator/steam/feedwater-economizer/feedwater-economizer-form/feedwater-economizer-form.component.ts +++ b/src/app/calculator/steam/feedwater-economizer/feedwater-economizer-form/feedwater-economizer-form.component.ts @@ -25,6 +25,8 @@ export class FeedwaterEconomizerFormComponent implements OnInit { @ViewChild('formElement', { static: false }) formElement: ElementRef; @ViewChild('gasMaterialModal', { static: false }) public gasMaterialModal: ModalDirective; + @ViewChild('moistureModal', { static: false }) public moistureModal: ModalDirective; + @HostListener('window:resize', ['$event']) onResize(event) { this.setOpHoursModalWidth(); @@ -37,6 +39,7 @@ export class FeedwaterEconomizerFormComponent implements OnInit { warnings: FeedwaterEconomizerWarnings; formWidth: number; showOperatingHoursModal: boolean; + showMoisture: boolean; calculationMethods: Array = [ 'Excess Air', @@ -197,6 +200,24 @@ export class FeedwaterEconomizerFormComponent implements OnInit { } } + showMoistureModal() { + this.feedwaterEconomizerService.modalOpen.next(true); + this.showMoisture = true; + this.moistureModal.show(); + } + + hideMoistureModal(moistureInAirCombustion?: number) { + if (moistureInAirCombustion) { + moistureInAirCombustion = Number(moistureInAirCombustion.toFixed(2)); + this.form.controls.moistureInCombustionAir.patchValue(moistureInAirCombustion); + } + this.moistureModal.hide(); + this.showMoisture = false; + this.feedwaterEconomizerService.modalOpen.next(false); + this.calculate(); + } + + showMaterialModal() { this.feedwaterEconomizerService.modalOpen.next(true); this.gasMaterialModal.show(); diff --git a/src/app/calculator/steam/feedwater-economizer/feedwater-economizer-help/feedwater-economizer-help.component.html b/src/app/calculator/steam/feedwater-economizer/feedwater-economizer-help/feedwater-economizer-help.component.html index bc93a43435..5988f2329c 100644 --- a/src/app/calculator/steam/feedwater-economizer/feedwater-economizer-help/feedwater-economizer-help.component.html +++ b/src/app/calculator/steam/feedwater-economizer/feedwater-economizer-help/feedwater-economizer-help.component.html @@ -132,12 +132,52 @@
-
+
+
+ Fuel +
+ + Type of fuel used within the heating equipment or reaction chamber. The compositions and Heating Values of fuels + are intended + to represent "typical" compositions of these fuels. This tool can be made more accurate by using more accurate + fuel + compositions for your process. To add a new fuel , click "Add New Fuel". You can "start with existing fuel" and + edit + the composition or add a completely new material. You cannot use the name of a fuel already in the database. + +
+
+ + +
+
+ Percent Oxygen Or Excess Air +
+ + Choose which value is known for the calculation of Available heat. Using Excess Air is recommended (for higher + accuracy) + if known. +
O2 in Flue Gas / Excess Air Dropdown options include + + Excess Air + or + + Oxygen in Flue Gas + +
+
+
+ +
O2 in Flue Gas
- This is the percentage of oxygen in the flue gases of the boiler. This is usually determined using flue gas analysis using external combustion analyzer (dry basis) or in stack oxygen sensor (wet basis) measurement. An average value should be used. + Molar (or volumetric) fraction (% Dry) of O2 in outgoing flue gas (ignoring moisture content). + Higher O2 in the exhaust indicates higher excess air and a greater amount of heat contained within the flue gas (lowering the available heat). +
+ Flue gas O2 (dry basis) reading is taken at the same location where flue gas temperature is measured to maintain accuracy of the calculations. + For many applications this is less than 10%, though a few systems (e.g., thermal oxidizers, paint shop ovens) it may be higher, but still below 21%.
@@ -157,6 +197,43 @@
+
+
+ Excess Air +
+ + The excess air value represents excess air used in burners plus all air entering the furnace and going as flue gases form the furnace. + The value is expressed in terms of percentage of stoichiometric air required for the fuel used and can be calculated as the difference + between the measured O2 and stoichiometric O2 divided by the stoichiometric O2. +
+ This should be minimized while still ensuring adequate air for complete combustion. + The absolute maximum value depends on the fuel, with some natural gas mixes near 500% and coal closer to 100%. +
+
+
+
+ + +
+
+ Ambient Air Temperature +
+ + Temperature of the air near the process heating unit. This is very likely to be less than 150℉. + +
+
+ +
+
+ Ambient Air Temperature +
+ + Temperature of the air near the process heating unit. This is very likely to be less than 65℃. + +
+
+
Combustion Air Temperature @@ -237,7 +314,7 @@
Feed Water Temperature
- This is the average temperature of the feedwater. It is usually found in the range of 180 F to 228 F in the field. When feedwater is coming from Deaerator Tank (DA) it is usually on the higher side (228F), but if the feed water is coming as steam condensate it is usually 180F. An average measured value should be used. + This is the average temperature of the feedwater. It is usually found in the range of 180 ℉ to 228 ℉ in the field. When feedwater is coming from Deaerator Tank (DA) it is usually on the higher side (228 ℉), but if the feed water is coming as steam condensate it is usually 180 ℉. An average measured value should be used.
@@ -262,13 +339,12 @@
-
+
- Fuel Higher Heating Value + Higher Heating Value
- This is the calorific value of the fuel used for the secondary process which will be saved. This can be obtained - from the fuel composition analysis report or fuel invoice. + The total amount of heat released when a specific quantity of fuel is completely burned, taking into account the heat generated by the condensation of water vapor produced during combustion, essentially representing the maximum potential energy a fuel can provide.
diff --git a/src/app/calculator/steam/feedwater-economizer/feedwater-economizer.component.html b/src/app/calculator/steam/feedwater-economizer/feedwater-economizer.component.html index be2d7c2ed2..0a2fa0e068 100644 --- a/src/app/calculator/steam/feedwater-economizer/feedwater-economizer.component.html +++ b/src/app/calculator/steam/feedwater-economizer/feedwater-economizer.component.html @@ -36,7 +36,8 @@

Feedwater Economizer

+ [ngClass]="{'small-screen-tab': smallScreenTab === 'form', 'modal-open': isModalOpen == true}" + [ngStyle]="{'height.px': containerHeight}">
@@ -56,7 +57,8 @@

Feedwater Economizer

+ [ngClass]="{'small-screen-tab': smallScreenTab === 'details', 'modal-open': isModalOpen == true}" + [ngStyle]="{'height.px': containerHeight}">
diff --git a/src/app/calculator/steam/feedwater-economizer/feedwater-economizer.component.ts b/src/app/calculator/steam/feedwater-economizer/feedwater-economizer.component.ts index eb77c60779..8d3a2e86ad 100644 --- a/src/app/calculator/steam/feedwater-economizer/feedwater-economizer.component.ts +++ b/src/app/calculator/steam/feedwater-economizer/feedwater-economizer.component.ts @@ -35,6 +35,8 @@ export class FeedwaterEconomizerComponent implements OnInit { }, 100); } feedWaterInputSub: Subscription; + modalopenSub: Subscription; + isModalOpen: boolean; containerHeight: number; tabSelect: string = 'results'; smallScreenTab: string = 'form'; @@ -66,10 +68,15 @@ export class FeedwaterEconomizerComponent implements OnInit { this.calculate(); } }); + + this.modalopenSub = this.feedwaterEconomizerService.modalOpen.subscribe(isModalOpen => { + this.isModalOpen = isModalOpen; + }); } ngOnDestroy() { this.feedWaterInputSub.unsubscribe(); + this.modalopenSub.unsubscribe(); if (this.inTreasureHunt) { this.feedwaterEconomizerService.feedwaterEconomizerInput.next(undefined); } diff --git a/src/app/calculator/steam/feedwater-economizer/feedwater-economizer.module.ts b/src/app/calculator/steam/feedwater-economizer/feedwater-economizer.module.ts index 658e3ad5aa..de31d3eb38 100644 --- a/src/app/calculator/steam/feedwater-economizer/feedwater-economizer.module.ts +++ b/src/app/calculator/steam/feedwater-economizer/feedwater-economizer.module.ts @@ -12,6 +12,7 @@ import { ExportableResultsTableModule } from '../../../shared/exportable-results import { OperatingHoursModalModule } from '../../../shared/operating-hours-modal/operating-hours-modal.module'; import { SharedPipesModule } from '../../../shared/shared-pipes/shared-pipes.module'; import { SuiteDbModule } from '../../../suiteDb/suiteDb.module'; +import { FlueGasMoistureModalModule } from '../../../shared/flue-gas-moisture-modal/flue-gas-moisture-modal.module'; @@ -30,7 +31,8 @@ import { SuiteDbModule } from '../../../suiteDb/suiteDb.module'; SuiteDbModule, SharedPipesModule, ExportableResultsTableModule, - OperatingHoursModalModule + OperatingHoursModalModule, + FlueGasMoistureModalModule ], exports: [ FeedwaterEconomizerComponent diff --git a/src/app/calculator/utilities/power-factor-triangle/power-factor-triangle-results/power-factor-triangle-results.component.ts b/src/app/calculator/utilities/power-factor-triangle/power-factor-triangle-results/power-factor-triangle-results.component.ts index b6e3ec45ce..c77dcd8c81 100644 --- a/src/app/calculator/utilities/power-factor-triangle/power-factor-triangle-results/power-factor-triangle-results.component.ts +++ b/src/app/calculator/utilities/power-factor-triangle/power-factor-triangle-results/power-factor-triangle-results.component.ts @@ -90,14 +90,12 @@ export class PowerFactorTriangleResultsComponent implements OnInit { xaxis: { range: [0, 1.05 * this.results.realPower], scaleratio: 1, - dtick: 10, }, yaxis: { range: [-1, 1.05 * this.results.reactivePower], scaleratio: 1, - dtick: 10, }, - margin: { t: 25, b: 25, l: 25, r: 25 }, + margin: { t: 25, b: 25, l: 50, r: 25 }, }; var modebarBtns = { diff --git a/src/app/calculator/utilities/power-factor-triangle/power-factor-triangle.service.ts b/src/app/calculator/utilities/power-factor-triangle/power-factor-triangle.service.ts index e8d17346ac..c78072e3f2 100644 --- a/src/app/calculator/utilities/power-factor-triangle/power-factor-triangle.service.ts +++ b/src/app/calculator/utilities/power-factor-triangle/power-factor-triangle.service.ts @@ -32,7 +32,14 @@ export class PowerFactorTriangleService { form.controls.apparentPower.setValidators([Validators.required, Validators.min(form.controls.reactivePower.value)]); form.controls.reactivePower.setValidators([Validators.required, , Validators.min(0), Validators.max(form.controls.apparentPower.value)]); + } else if (form.controls.mode.value != 1 && form.controls.mode.value != 2 ){ + form.controls.apparentPower.setValidators(Validators.required); + form.controls.realPower.setValidators([Validators.required, Validators.min(0)]); + form.controls.reactivePower.setValidators([Validators.required, , Validators.min(0)]); + } + + form.controls.apparentPower.updateValueAndValidity(); form.controls.realPower.updateValueAndValidity(); form.controls.reactivePower.updateValueAndValidity(); diff --git a/src/app/compressed-air-assessment/compressed-air-assessment.component.ts b/src/app/compressed-air-assessment/compressed-air-assessment.component.ts index 03a57e432a..a91ddf4f93 100644 --- a/src/app/compressed-air-assessment/compressed-air-assessment.component.ts +++ b/src/app/compressed-air-assessment/compressed-air-assessment.component.ts @@ -168,7 +168,6 @@ export class CompressedAirAssessmentComponent implements OnInit { ngAfterViewInit() { setTimeout(() => { - // this.disclaimerToast(); this.setContainerHeight(); }, 100); } diff --git a/src/app/core/core.component.html b/src/app/core/core.component.html index c24465a29d..474ae2fa20 100644 --- a/src/app/core/core.component.html +++ b/src/app/core/core.component.html @@ -1,5 +1,3 @@ - -
@@ -16,5 +14,10 @@ + + + + + diff --git a/src/app/core/core.component.ts b/src/app/core/core.component.ts index bc54084ddd..7556f58583 100644 --- a/src/app/core/core.component.ts +++ b/src/app/core/core.component.ts @@ -12,12 +12,12 @@ import { SqlDbApiService } from '../tools-suite-api/sql-db-api.service'; import { SecurityAndPrivacyService } from '../shared/security-and-privacy/security-and-privacy.service'; import { ElectronService, ReleaseData } from '../electron/electron.service'; import { EmailMeasurDataService } from '../shared/email-measur-data/email-measur-data.service'; -import { PwaService } from '../shared/pwa/pwa.service'; import { AppErrorService } from '../shared/errors/app-error.service'; import { AutomaticBackupService } from '../electron/automatic-backup.service'; import { ApplicationInstanceData, ApplicationInstanceDbService } from '../indexedDb/application-instance-db.service'; import { ImportBackupModalService } from '../shared/import-backup-modal/import-backup-modal.service'; import { MeasurSurveyService } from '../shared/measur-survey/measur-survey.service'; +import { UpdateApplicationService } from '../shared/update-application/update-application.service'; @Component({ selector: 'app-core', @@ -26,42 +26,31 @@ import { MeasurSurveyService } from '../shared/measur-survey/measur-survey.servi }) export class CoreComponent implements OnInit { - updateDesktop: boolean; - updatePwa: boolean; showBrowsingDataToast: boolean; hideTutorial: boolean = true; openingTutorialSub: Subscription; idbStarted: boolean = false; tutorialType: string; inTutorialsView: boolean; - updateError: boolean = false; - isOnline: boolean; - releaseData: ReleaseData; - - toastData: { title: string, body: string, setTimeoutVal: number } = { title: '', body: '', setTimeoutVal: undefined }; - showToast: boolean; - showWebDisclaimerToast: boolean = false; - routerSubscription: Subscription; analyticsSessionId: string; + applicationInstanceDataSubscription: Subscription; + routerSubscription: Subscription; + + // * Modals modalOpenSub: Subscription; - showSecurityAndPrivacyModalSub: Subscription; - showSecurityAndPrivacyModal: boolean; - showEmailMeasurDataModal: boolean; - electronUpdateAvailableSub: Subscription; - assessmentUpdateAvailableSub: Subscription; - updateAvailable: boolean; - releaseDataSub: Subscription; showEmailMeasurDataModalSub: Subscription; + showEmailMeasurDataModal: boolean; showImportBackupModalSubscription: Subscription; showImportBackupModal: boolean; - pwaUpdateAvailableSubscription: Subscription; - applicationInstanceDataSubscription: Subscription; + showSecurityAndPrivacyModalSub: Subscription; + showSecurityAndPrivacyModal: boolean; showSurveyModalSub: Subscription; showSurveyModal: boolean; - showSurveyToast: boolean; + showReleaseNotesModal: boolean; + showReleaseNotesModalSub: Subscription; - constructor(private electronService: ElectronService, + constructor(public electronService: ElectronService, private assessmentService: AssessmentService, private changeDetectorRef: ChangeDetectorRef, private assessmentDbService: AssessmentDbService, @@ -72,13 +61,13 @@ export class CoreComponent implements OnInit { private router: Router, private securityAndPrivacyService: SecurityAndPrivacyService, private emailMeasurDataService: EmailMeasurDataService, - private pwaService: PwaService, private appErrorService: AppErrorService, private automaticBackupService: AutomaticBackupService, private applicationInstanceDbService: ApplicationInstanceDbService, private importBackupModalService: ImportBackupModalService, private sqlDbApiService: SqlDbApiService, private measurSurveyService: MeasurSurveyService, + private updateApplicationService: UpdateApplicationService, private inventoryDbService: InventoryDbService) { } @@ -89,18 +78,6 @@ export class CoreComponent implements OnInit { if (this.electronService.isElectron) { this.electronService.sendAppReady('ready'); - this.electronUpdateAvailableSub = this.electronService.updateAvailable.subscribe(val => { - this.updateAvailable = val; - if (this.updateAvailable) { - this.updateDesktop = true; - this.assessmentService.updateAvailable.next(true); - this.changeDetectorRef.detectChanges(); - } - }); - - this.releaseDataSub = this.electronService.releaseData.subscribe(val => { - this.releaseData = val; - }); } this.applicationInstanceDataSubscription = this.applicationInstanceDbService.applicationInstanceData.subscribe((applicationData: ApplicationInstanceData) => { @@ -119,15 +96,8 @@ export class CoreComponent implements OnInit { } }); - this.assessmentUpdateAvailableSub = this.assessmentService.updateAvailable.subscribe(val => { - if (val == true) { - this.updateDesktop = true; - this.changeDetectorRef.detectChanges(); - } - }); - - this.pwaUpdateAvailableSubscription = this.pwaService.displayUpdateToast.subscribe(updatePwa => { - this.updatePwa = updatePwa; + this.showReleaseNotesModalSub = this.updateApplicationService.showReleaseNotesModal.subscribe(val => { + this.showReleaseNotesModal = val; }); this.openingTutorialSub = this.assessmentService.showTutorial.subscribe(val => { @@ -157,18 +127,15 @@ export class CoreComponent implements OnInit { ngOnDestroy() { if (this.electronService.isElectron) { - this.electronUpdateAvailableSub.unsubscribe(); - this.releaseDataSub.unsubscribe(); if (this.applicationInstanceDataSubscription) { this.applicationInstanceDataSubscription.unsubscribe(); } } - this.assessmentUpdateAvailableSub.unsubscribe(); this.openingTutorialSub.unsubscribe(); this.showSecurityAndPrivacyModalSub.unsubscribe(); + this.showReleaseNotesModalSub.unsubscribe(); this.showEmailMeasurDataModalSub.unsubscribe(); this.showImportBackupModalSubscription.unsubscribe(); - this.pwaUpdateAvailableSubscription.unsubscribe(); this.showSurveyModalSub.unsubscribe(); } @@ -256,22 +223,6 @@ export class CoreComponent implements OnInit { this.applicationInstanceDbService.applicationInstanceData.next(appData); } - hideToast() { - this.showToast = false; - this.toastData = { - title: '', - body: '', - setTimeoutVal: undefined - }; - this.changeDetectorRef.detectChanges(); - } - - hideUpdateToast() { - this.updateDesktop = false; - this.updatePwa = false; - this.changeDetectorRef.detectChanges(); - } - hideBrowsingDataToast() { this.showBrowsingDataToast = false; this.changeDetectorRef.detectChanges(); @@ -292,4 +243,8 @@ export class CoreComponent implements OnInit { this.emailMeasurDataService.showEmailMeasurDataModal.next(false); } + closeReleaseNotes() { + this.updateApplicationService.showReleaseNotesModal.next(false); + } + } diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 5bba717922..fbcaf7839c 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -21,10 +21,8 @@ import { CoreService } from './core.service'; import { SsmtModule } from '../ssmt/ssmt.module'; import { TreasureHuntModule } from '../treasure-hunt/treasure-hunt.module'; import { HelperServicesModule } from '../shared/helper-services/helper-services.module'; -import { ToastModule } from '../shared/toast/toast.module'; import { TutorialsModule } from '../tutorials/tutorials.module'; import { DashboardModule } from '../dashboard/dashboard.module'; -import { UpdateToastComponent } from '../update-toast/update-toast.component'; import { LogToolModule } from '../log-tool/log-tool.module'; import { MotorInventoryModule } from '../motor-inventory/motor-inventory.module'; import { WasteWaterModule } from '../waste-water/waste-water.module'; @@ -41,11 +39,12 @@ import { EmailMeasurDataModule } from '../shared/email-measur-data/email-measur- import { ImportBackupModalModule } from '../shared/import-backup-modal/import-backup-modal.module'; import { SurveyToastModule } from '../shared/survey-toast/survey-toast.module'; import { MeasurSurveyModule } from '../shared/measur-survey/measur-survey.module'; +import { SnackbarModule } from '../shared/snackbar-notification/snackbar.module'; +import { UpdateApplicationModule } from '../shared/update-application/update-application.module'; @NgModule({ declarations: [ CoreComponent, - UpdateToastComponent, NotFoundComponent, ], imports: [ @@ -66,7 +65,6 @@ import { MeasurSurveyModule } from '../shared/measur-survey/measur-survey.module SsmtModule, TreasureHuntModule, HelperServicesModule, - ToastModule, TutorialsModule, DashboardModule, LogToolModule, @@ -83,7 +81,9 @@ import { MeasurSurveyModule } from '../shared/measur-survey/measur-survey.module EmailMeasurDataModule, ImportBackupModalModule, SurveyToastModule, - MeasurSurveyModule + MeasurSurveyModule, + SnackbarModule, + UpdateApplicationModule, ], providers: [ AssessmentService, diff --git a/src/app/dashboard/assessment.service.ts b/src/app/dashboard/assessment.service.ts index 1cc0774370..401ec149a7 100644 --- a/src/app/dashboard/assessment.service.ts +++ b/src/app/dashboard/assessment.service.ts @@ -21,11 +21,9 @@ export class AssessmentService { subTab: string; showLandingScreen: boolean = true; - updateAvailable: BehaviorSubject; showTutorial: BehaviorSubject; tutorialShown: boolean = false; constructor(private router: Router, private dashboardService: DashboardService) { - this.updateAvailable = new BehaviorSubject(null); this.showTutorial = new BehaviorSubject(null); } diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html index 3e5c4bab82..958c51d7b8 100644 --- a/src/app/dashboard/dashboard.component.html +++ b/src/app/dashboard/dashboard.component.html @@ -26,7 +26,5 @@ - \ No newline at end of file diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts index 3af77292ad..d75b7ad585 100644 --- a/src/app/dashboard/dashboard.component.ts +++ b/src/app/dashboard/dashboard.component.ts @@ -26,9 +26,6 @@ export class DashboardComponent implements OnInit { showCreateInventory: string; showCreateInventorySub: Subscription; - toastData: { title: string, body: string, setTimeoutVal: number } = { title: '', body: '', setTimeoutVal: undefined }; - showToast: boolean = false; - createFolder: boolean; createFolderSub: Subscription; @@ -41,8 +38,6 @@ export class DashboardComponent implements OnInit { showImportModalSub: Subscription; showImportModal: boolean; - dashboardToastMessageSub: Subscription; - showExportModalSub: Subscription; showExportModal: boolean; sidebarWidth: number; @@ -110,13 +105,6 @@ export class DashboardComponent implements OnInit { this.copyItems = val; }); - this.dashboardToastMessageSub = this.dashboardService.dashboardToastMessage.subscribe(val => { - if (val != undefined) { - this.addToast(val); - this.dashboardService.dashboardToastMessage.next(undefined); - } - }); - this.showImportModalSub = this.directoryDashboardService.showImportModal.subscribe(val => { this.showImportModal = val; }); @@ -144,7 +132,6 @@ export class DashboardComponent implements OnInit { ngOnDestroy() { this.moveItemsSub.unsubscribe(); this.createAssessmentSub.unsubscribe(); - this.dashboardToastMessageSub.unsubscribe(); this.createFolderSub.unsubscribe(); this.showImportModalSub.unsubscribe(); this.sidebarWidthSub.unsubscribe(); @@ -170,21 +157,6 @@ export class DashboardComponent implements OnInit { } } - //TOAST HERE - addToast(msg: string) { - this.toastData.title = msg; - this.toastData.setTimeoutVal = 2000; - this.showToast = true; - } - - hideToast() { - this.showToast = false; - this.toastData = { - title: '', - body: '', - setTimeoutVal: undefined - } - } } export interface ImportDataObjects { diff --git a/src/app/dashboard/dashboard.module.ts b/src/app/dashboard/dashboard.module.ts index ff6387f896..81c512180f 100644 --- a/src/app/dashboard/dashboard.module.ts +++ b/src/app/dashboard/dashboard.module.ts @@ -14,7 +14,6 @@ import { AcknowledgmentsPageComponent } from './acknowledgments-page/acknowledgm import { ContactPageComponent } from './contact-page/contact-page.component'; import { ImportExportModule } from '../shared/import-export/import-export.module'; import { DirectoryDashboardModule } from './directory-dashboard/directory-dashboard.module'; -import { ToastModule } from '../shared/toast/toast.module'; import { DragBarComponent } from './drag-bar/drag-bar.component'; import { CreateInventoryComponent } from './create-inventory/create-inventory.component'; @@ -27,6 +26,7 @@ import { CreateAssessmentModalModule } from '../shared/create-assessment-modal/c import { AppErrorModule } from '../shared/errors/app-error.module'; import { DataAndBackupComponent } from './data-and-backup/data-and-backup.component'; import { MeasurSurveyModule } from '../shared/measur-survey/measur-survey.module'; +import { SnackbarModule } from '../shared/snackbar-notification/snackbar.module'; @NgModule({ declarations: [ @@ -53,7 +53,7 @@ import { MeasurSurveyModule } from '../shared/measur-survey/measur-survey.module RouterModule, ImportExportModule, DirectoryDashboardModule, - ToastModule, + SnackbarModule, SecurityAndPrivacyModule, CreateAssessmentModalModule, AppErrorModule, diff --git a/src/app/dashboard/sidebar/sidebar.component.css b/src/app/dashboard/sidebar/sidebar.component.css index e80f0576a7..9a1e1f5721 100644 --- a/src/app/dashboard/sidebar/sidebar.component.css +++ b/src/app/dashboard/sidebar/sidebar.component.css @@ -9,6 +9,10 @@ font-size: 25px; } +.version-modal-link:hover { + cursor: pointer; +} + .update-available{ cursor: pointer; color: darkslategray; diff --git a/src/app/dashboard/sidebar/sidebar.component.html b/src/app/dashboard/sidebar/sidebar.component.html index b50f55a722..5e3369d6aa 100644 --- a/src/app/dashboard/sidebar/sidebar.component.html +++ b/src/app/dashboard/sidebar/sidebar.component.html @@ -1,9 +1,7 @@
-
-
- - -
+
+ +
@@ -16,7 +14,7 @@
- - - \ No newline at end of file diff --git a/src/app/phast/explore-phast-opportunities/explore-phast-opportunities.component.ts b/src/app/phast/explore-phast-opportunities/explore-phast-opportunities.component.ts index f30337ebf9..fa5eb24099 100644 --- a/src/app/phast/explore-phast-opportunities/explore-phast-opportunities.component.ts +++ b/src/app/phast/explore-phast-opportunities/explore-phast-opportunities.component.ts @@ -6,6 +6,7 @@ import { LossTab } from '../tabs'; import * as _ from 'lodash'; import { Subscription } from 'rxjs'; import { LossesService } from '../losses/losses.service'; +import { SnackbarService } from '../../shared/snackbar-notification/snackbar.service'; @Component({ selector: 'app-explore-phast-opportunities', @@ -39,12 +40,10 @@ export class ExplorePhastOpportunitiesComponent implements OnInit { modExists: boolean = false; selectModificationSubscription: Subscription; - toastData: { title: string, body: string, setTimeoutVal: number } = { title: '', body: '', setTimeoutVal: undefined }; - showToast: boolean = false; isModalOpen: boolean = false; modalOpenSubscription: Subscription; smallScreenTab: string = 'form'; - constructor(private lossesService: LossesService) { + constructor(private lossesService: LossesService, private snackbarService: SnackbarService) { } ngOnInit() { @@ -58,14 +57,14 @@ export class ExplorePhastOpportunitiesComponent implements OnInit { if (changes.exploreModIndex) { if (!changes.exploreModIndex.firstChange) { this.checkExists(); - this.checkExploreOpps(); + this.notifyExpertView(); } } } ngAfterViewInit() { setTimeout(() => { - this.checkExploreOpps(); + this.notifyExpertView(); }, 100) } @@ -111,33 +110,14 @@ export class ExplorePhastOpportunitiesComponent implements OnInit { } - checkExploreOpps() { + notifyExpertView() { if (this.modExists) { if (!this.phast.modifications[this.exploreModIndex].exploreOpportunities) { - let title: string = 'Explore Opportunities'; - let body: string = 'The selected modification was created using the expert view. There may be changes to the modification that are not visible from this screen.'; - this.openToast(title, body); - } else if (this.showToast) { - this.hideToast(); + this.snackbarService.setSnackbarMessage('exploreOpportunities', 'info', 'long'); } } } - openToast(title: string, body: string) { - this.toastData.title = title; - this.toastData.body = body; - this.showToast = true; - } - - hideToast() { - this.showToast = false; - this.toastData = { - title: '', - body: '', - setTimeoutVal: undefined - } - } - setSmallScreenTab(selectedTab: string) { this.smallScreenTab = selectedTab; } diff --git a/src/app/phast/explore-phast-opportunities/explore-phast-opportunities.module.ts b/src/app/phast/explore-phast-opportunities/explore-phast-opportunities.module.ts index ec7de5de5d..34c97f6805 100644 --- a/src/app/phast/explore-phast-opportunities/explore-phast-opportunities.module.ts +++ b/src/app/phast/explore-phast-opportunities/explore-phast-opportunities.module.ts @@ -17,9 +17,9 @@ import { ExploreSlagFormComponent } from './explore-phast-opportunities-form/exp import { ExploreCoolingFormComponent } from './explore-phast-opportunities-form/explore-cooling-form/explore-cooling-form.component'; import { ExploreAtmosphereFormComponent } from './explore-phast-opportunities-form/explore-atmosphere-form/explore-atmosphere-form.component'; import { OperatingHoursModalModule } from '../../shared/operating-hours-modal/operating-hours-modal.module'; -import { ToastModule } from '../../shared/toast/toast.module'; import { SharedPipesModule } from '../../shared/shared-pipes/shared-pipes.module'; import { PhastSankeyModule } from '../../shared/phast-sankey/phast-sankey.module'; +import { SnackbarModule } from '../../shared/snackbar-notification/snackbar.module'; @NgModule({ imports: [ @@ -28,10 +28,10 @@ import { PhastSankeyModule } from '../../shared/phast-sankey/phast-sankey.module LossesModule, ModalModule, OperatingHoursModalModule, - ToastModule, SharedPipesModule, PhastSankeyModule, - ReactiveFormsModule + ReactiveFormsModule, + SnackbarModule ], declarations: [ ExplorePhastOpportunitiesFormComponent, diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-losses-form-mass/flue-gas-losses-form-mass.component.ts b/src/app/phast/losses/flue-gas-losses/flue-gas-losses-form-mass/flue-gas-losses-form-mass.component.ts index 63ac564de1..0d5d71a546 100644 --- a/src/app/phast/losses/flue-gas-losses/flue-gas-losses-form-mass/flue-gas-losses-form-mass.component.ts +++ b/src/app/phast/losses/flue-gas-losses/flue-gas-losses-form-mass/flue-gas-losses-form-mass.component.ts @@ -1,5 +1,4 @@ import { Component, OnInit, Input, EventEmitter, Output, ViewChild, SimpleChanges } from '@angular/core'; -import { FlueGasCompareService } from "../flue-gas-compare.service"; import { ModalDirective } from 'ngx-bootstrap/modal'; import { LossesService } from '../../losses.service'; import { Settings } from '../../../../shared/models/settings'; @@ -12,6 +11,7 @@ import { SolidLiquidFlueGasMaterial } from '../../../../shared/models/materials' import { SqlDbApiService } from '../../../../tools-suite-api/sql-db-api.service'; import { firstValueFrom } from 'rxjs'; import { SolidLiquidMaterialDbService } from '../../../../indexedDb/solid-liquid-material-db.service'; +import { FlueGasCompareService } from '../flue-gas-compare.service'; @Component({ selector: 'app-flue-gas-losses-form-mass', diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-losses-form-volume/flue-gas-losses-form-volume.component.ts b/src/app/phast/losses/flue-gas-losses/flue-gas-losses-form-volume/flue-gas-losses-form-volume.component.ts index 2edbdd2432..366272a50e 100644 --- a/src/app/phast/losses/flue-gas-losses/flue-gas-losses-form-volume/flue-gas-losses-form-volume.component.ts +++ b/src/app/phast/losses/flue-gas-losses/flue-gas-losses-form-volume/flue-gas-losses-form-volume.component.ts @@ -1,5 +1,4 @@ import { Component, OnInit, Input, EventEmitter, Output, ViewChild, SimpleChanges } from '@angular/core'; -import { FlueGasCompareService } from "../flue-gas-compare.service"; import { ModalDirective } from 'ngx-bootstrap/modal'; import { LossesService } from '../../losses.service'; import { Settings } from '../../../../shared/models/settings'; @@ -10,6 +9,7 @@ import { FlueGasMaterial } from '../../../../shared/models/materials'; import { SqlDbApiService } from '../../../../tools-suite-api/sql-db-api.service'; import { FlueGasMaterialDbService } from '../../../../indexedDb/flue-gas-material-db.service'; import { firstValueFrom } from 'rxjs'; +import { FlueGasCompareService } from '../flue-gas-compare.service'; @Component({ selector: 'app-flue-gas-losses-form-volume', diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-losses.component.ts b/src/app/phast/losses/flue-gas-losses/flue-gas-losses.component.ts index 26feb1fe10..6bc9d9b82a 100644 --- a/src/app/phast/losses/flue-gas-losses/flue-gas-losses.component.ts +++ b/src/app/phast/losses/flue-gas-losses/flue-gas-losses.component.ts @@ -3,14 +3,12 @@ import * as _ from 'lodash'; import { PhastService } from '../../phast.service'; import { FlueGas, FlueGasByVolumeSuiteResults, MaterialInputProperties } from '../../../shared/models/phast/losses/flueGas'; import { Losses } from '../../../shared/models/phast/phast'; -import { FlueGasCompareService } from './flue-gas-compare.service'; import { Settings } from '../../../shared/models/settings'; -import { FormGroup } from '@angular/forms'; import { UntypedFormGroup } from '@angular/forms'; -import { FlueGasService } from '../../../calculator/furnaces/flue-gas/flue-gas.service'; import { FlueGasFormService } from '../../../calculator/furnaces/flue-gas/flue-gas-form.service'; import { SolidLiquidFlueGasMaterial } from '../../../shared/models/materials'; import { SqlDbApiService } from '../../../tools-suite-api/sql-db-api.service'; +import { FlueGasCompareService } from './flue-gas-compare.service'; @Component({ selector: 'app-flue-gas-losses', templateUrl: './flue-gas-losses.component.html', diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-losses.module.ts b/src/app/phast/losses/flue-gas-losses/flue-gas-losses.module.ts index 67177099c3..4b880489f1 100644 --- a/src/app/phast/losses/flue-gas-losses/flue-gas-losses.module.ts +++ b/src/app/phast/losses/flue-gas-losses/flue-gas-losses.module.ts @@ -3,17 +3,12 @@ import { CommonModule } from '@angular/common'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FlueGasLossesComponent } from './flue-gas-losses.component'; import { FlueGasLossesFormVolumeComponent } from './flue-gas-losses-form-volume/flue-gas-losses-form-volume.component'; -import { FlueGasLossesMoistureComponent } from './flue-gas-losses-moisture/flue-gas-losses-moisture.component'; import { FlueGasLossesFormMassComponent } from "./flue-gas-losses-form-mass/flue-gas-losses-form-mass.component"; -import { FlueGasCompareService } from "./flue-gas-compare.service"; import { SuiteDbModule } from '../../../suiteDb/suiteDb.module'; import { ModalModule } from 'ngx-bootstrap/modal'; import { SharedPipesModule } from '../../../shared/shared-pipes/shared-pipes.module'; -import { FlueGasMoistureResultsComponent } from './flue-gas-moisture-results/flue-gas-moisture-results.component'; -import { FlueGasMoistureHelpComponent } from './flue-gas-moisture-help/flue-gas-moisture-help.component'; -import { FlueGasMoisturePanelComponent } from './flue-gas-moisture-panel/flue-gas-moisture-panel.component'; -import { FlueGasMoistureModalComponent } from './flue-gas-moisture-modal/flue-gas-moisture-modal.component'; - +import { FlueGasMoistureModalModule } from '../../../shared/flue-gas-moisture-modal/flue-gas-moisture-modal.module'; +import { FlueGasCompareService } from './flue-gas-compare.service'; @NgModule({ imports: [ CommonModule, @@ -21,17 +16,13 @@ import { FlueGasMoistureModalComponent } from './flue-gas-moisture-modal/flue-ga ReactiveFormsModule, SuiteDbModule, ModalModule, - SharedPipesModule + SharedPipesModule, + FlueGasMoistureModalModule ], declarations: [ FlueGasLossesComponent, FlueGasLossesFormMassComponent, FlueGasLossesFormVolumeComponent, - FlueGasLossesMoistureComponent, - FlueGasMoistureResultsComponent, - FlueGasMoistureHelpComponent, - FlueGasMoisturePanelComponent, - FlueGasMoistureModalComponent, ], providers: [ FlueGasCompareService, diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-modal/flue-gas-moisture-modal.component.ts b/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-modal/flue-gas-moisture-modal.component.ts deleted file mode 100644 index ceea589162..0000000000 --- a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-modal/flue-gas-moisture-modal.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Component, Input, Output, OnInit, EventEmitter, ViewChild, HostListener, ElementRef } from '@angular/core'; -import { Settings } from '../../../../shared/models/settings'; -import { FlueGasCompareService } from '../flue-gas-compare.service'; - - -@Component({ - selector: 'app-flue-gas-moisture-modal', - templateUrl: './flue-gas-moisture-modal.component.html', - styleUrls: ['./flue-gas-moisture-modal.component.css'] - }) - - export class FlueGasMoistureModalComponent implements OnInit { - @Input() - settings: Settings; - @Output('hideModal') - hideModal = new EventEmitter(); - - constructor(private flueGasCompareService: FlueGasCompareService) { - } - - ngOnInit() { - this.settings = this.flueGasCompareService.setFanDefaultUnits(this.settings); - } - - - hideMoistureModal(event: number) { - this.hideModal.emit(event); - } - } \ No newline at end of file diff --git a/src/app/phast/losses/losses-tabs/flue-gas-tab/flue-gas-tab.component.ts b/src/app/phast/losses/losses-tabs/flue-gas-tab/flue-gas-tab.component.ts index e15fc3a7f9..fb924328ff 100644 --- a/src/app/phast/losses/losses-tabs/flue-gas-tab/flue-gas-tab.component.ts +++ b/src/app/phast/losses/losses-tabs/flue-gas-tab/flue-gas-tab.component.ts @@ -2,11 +2,11 @@ import { Component, OnInit, Input, ChangeDetectorRef } from '@angular/core'; import { PHAST } from '../../../../shared/models/phast/phast'; import { LossesService } from '../../losses.service'; import { UntypedFormGroup } from '@angular/forms'; -import { FlueGasCompareService } from '../../flue-gas-losses/flue-gas-compare.service'; import { FlueGas, FlueGasWarnings } from '../../../../shared/models/phast/losses/flueGas'; import { Subscription } from 'rxjs'; import { FlueGasFormService } from '../../../../calculator/furnaces/flue-gas/flue-gas-form.service'; import { Settings } from '../../../../shared/models/settings'; +import { FlueGasCompareService } from '../../flue-gas-losses/flue-gas-compare.service'; @Component({ selector: 'app-flue-gas-tab', diff --git a/src/app/phast/phast-compare.service.ts b/src/app/phast/phast-compare.service.ts index e7a3207bd8..409b076837 100644 --- a/src/app/phast/phast-compare.service.ts +++ b/src/app/phast/phast-compare.service.ts @@ -5,7 +5,6 @@ import { OtherLossesCompareService } from './losses/other-losses/other-losses-co import { OpeningLossesCompareService } from './losses/opening-losses/opening-losses-compare.service'; import { HeatSystemEfficiencyCompareService } from './losses/heat-system-efficiency/heat-system-efficiency-compare.service'; import { GasLeakageCompareService } from './losses/gas-leakage-losses/gas-leakage-compare.service'; -import { FlueGasCompareService } from './losses/flue-gas-losses/flue-gas-compare.service'; import { FixtureLossesCompareService } from './losses/fixture-losses/fixture-losses-compare.service'; import { ExtendedSurfaceCompareService } from './losses/extended-surface-losses/extended-surface-compare.service'; import { ExhaustGasCompareService } from './losses/exhaust-gas/exhaust-gas-compare.service'; @@ -18,6 +17,7 @@ import { PHAST, Losses } from '../shared/models/phast/phast'; import { EnergyInputCompareService } from './losses/energy-input/energy-input-compare.service'; import { OperationsCompareService } from './losses/operations/operations-compare.service'; import { BehaviorSubject } from 'rxjs'; +import { FlueGasCompareService } from './losses/flue-gas-losses/flue-gas-compare.service'; @Injectable() export class PhastCompareService { diff --git a/src/app/phast/phast.module.ts b/src/app/phast/phast.module.ts index 3bbbaffc5a..e5f574f283 100644 --- a/src/app/phast/phast.module.ts +++ b/src/app/phast/phast.module.ts @@ -34,7 +34,6 @@ import { ModificationListComponent } from './modification-list/modification-list import { AddModificationComponent } from './add-modification/add-modification.component'; import { UtilitiesModule } from '../calculator/utilities/utilities.module'; import { TabsTooltipModule } from '../shared/tabs-tooltip/tabs-tooltip.module'; -import { ToastModule } from '../shared/toast/toast.module'; import { UnitConverterModule } from '../calculator/utilities/unit-converter/unit-converter.module'; import { PhastValidService } from './phast-valid.service'; import { FlueGasModule } from '../calculator/furnaces/flue-gas/flue-gas.module'; @@ -42,6 +41,8 @@ import { PhastSankeyModule } from '../shared/phast-sankey/phast-sankey.module'; import { UpdateUnitsModalModule } from '../shared/update-units-modal/update-units-modal.module'; import { WelcomeScreenComponent } from './welcome-screen/welcome-screen.component'; import { ImportExportModule } from '../shared/import-export/import-export.module'; +import { SnackbarModule } from '../shared/snackbar-notification/snackbar.module'; +import { FlueGasMoistureModalModule } from '../shared/flue-gas-moisture-modal/flue-gas-moisture-modal.module'; @NgModule({ declarations: [ @@ -80,11 +81,12 @@ import { ImportExportModule } from '../shared/import-export/import-export.module LossesTabsModule, UtilitiesModule, TabsTooltipModule, - ToastModule, + SnackbarModule, UnitConverterModule, PhastSankeyModule, UpdateUnitsModalModule, - ImportExportModule + ImportExportModule, + FlueGasMoistureModalModule ], providers: [ PhastService, diff --git a/src/app/psat/explore-opportunities/explore-opportunities-results/explore-opportunities-results.component.html b/src/app/psat/explore-opportunities/explore-opportunities-results/explore-opportunities-results.component.html index d4240e9b74..7c487ecd93 100644 --- a/src/app/psat/explore-opportunities/explore-opportunities-results/explore-opportunities-results.component.html +++ b/src/app/psat/explore-opportunities/explore-opportunities-results/explore-opportunities-results.component.html @@ -86,10 +86,10 @@ Pump shaft power ({{settings.powerMeasurement}})
- {{baselineResults.pump_shaft_power | number:'2.0-1'}} + {{baselineResults.mover_shaft_power | number:'2.0-1'}}
- {{modificationResults.pump_shaft_power | number:'2.0-1'}} + {{modificationResults.mover_shaft_power | number:'2.0-1'}}
diff --git a/src/app/psat/explore-opportunities/explore-opportunities.component.html b/src/app/psat/explore-opportunities/explore-opportunities.component.html index b8050e4d8b..c10d452cd5 100644 --- a/src/app/psat/explore-opportunities/explore-opportunities.component.html +++ b/src/app/psat/explore-opportunities/explore-opportunities.component.html @@ -103,6 +103,3 @@

Now that you have setup your system and have baseline information, create du

- - \ No newline at end of file diff --git a/src/app/psat/explore-opportunities/explore-opportunities.component.ts b/src/app/psat/explore-opportunities/explore-opportunities.component.ts index 19f8c52abc..8b87d39ffc 100644 --- a/src/app/psat/explore-opportunities/explore-opportunities.component.ts +++ b/src/app/psat/explore-opportunities/explore-opportunities.component.ts @@ -5,6 +5,7 @@ import { Settings } from '../../shared/models/settings'; import { PsatService } from '../psat.service'; import { CompareService } from '../compare.service'; import { SettingsDbService } from '../../indexedDb/settings-db.service'; +import { SnackbarService } from '../../shared/snackbar-notification/snackbar.service'; @Component({ selector: 'app-explore-opportunities', @@ -52,10 +53,11 @@ export class ExploreOpportunitiesComponent implements OnInit { tabSelect: string = 'results'; currentField: string; helpHeight: number; - toastData: { title: string, body: string, setTimeoutVal: number } = { title: '', body: '', setTimeoutVal: undefined }; - showToast: boolean = false; smallScreenTab: string = 'form'; - constructor(private psatService: PsatService, private settingsDbService: SettingsDbService, private compareService: CompareService) { } + constructor(private psatService: PsatService, + private settingsDbService: SettingsDbService, + private compareService: CompareService, + private snackbarService: SnackbarService) { } ngOnInit() { let globalSettings = this.settingsDbService.globalSettings; @@ -74,7 +76,7 @@ export class ExploreOpportunitiesComponent implements OnInit { setTimeout(() => { this.resizeTabs(); this.getContainerHeight(); - this.checkExploreOpps(); + this.notifyExploreOpps(); }, 100); } @@ -86,7 +88,7 @@ export class ExploreOpportunitiesComponent implements OnInit { } if (changes.modificationIndex && !changes.modificationIndex.isFirstChange()) { this.getResults(); - this.checkExploreOpps(); + this.notifyExploreOpps(); } } @@ -151,30 +153,11 @@ export class ExploreOpportunitiesComponent implements OnInit { this.emitAddNewMod.emit(true); } - checkExploreOpps() { + notifyExploreOpps() { if (this.modificationExists) { if (!this.psat.modifications[this.modificationIndex].exploreOpportunities) { - let title: string = 'Explore Opportunities'; - let body: string = 'The selected modification was created using the expert view. There may be changes to the modification that are not visible from this screen.'; - this.openToast(title, body); - } else if (this.showToast) { - this.hideToast(); - } - } - } - - openToast(title: string, body: string) { - this.toastData.title = title; - this.toastData.body = body; - this.showToast = true; - } - - hideToast() { - this.showToast = false; - this.toastData = { - title: '', - body: '', - setTimeoutVal: undefined + this.snackbarService.setSnackbarMessage('exploreOpportunities', 'info', 'long'); + } } } diff --git a/src/app/psat/explore-opportunities/explore-opportunities.module.ts b/src/app/psat/explore-opportunities/explore-opportunities.module.ts index c9c215655c..12df019ab2 100644 --- a/src/app/psat/explore-opportunities/explore-opportunities.module.ts +++ b/src/app/psat/explore-opportunities/explore-opportunities.module.ts @@ -13,10 +13,10 @@ import { HeadToolModule } from '../../calculator/pumps/head-tool/head-tool.modul import { ModalModule } from 'ngx-bootstrap/modal'; import { OperatingHoursModalModule } from '../../shared/operating-hours-modal/operating-hours-modal.module'; import { PercentGraphModule } from '../../shared/percent-graph/percent-graph.module'; -import { ToastModule } from '../../shared/toast/toast.module'; import { SharedPipesModule } from '../../shared/shared-pipes/shared-pipes.module'; import { PsatSankeyModule } from '../../shared/psat-sankey/psat-sankey.module'; import { ConnectedInventoryModule } from '../../shared/connected-inventory/connected-inventory-module'; +import { SnackbarModule } from '../../shared/snackbar-notification/snackbar.module'; @NgModule({ imports: [ @@ -27,10 +27,10 @@ import { ConnectedInventoryModule } from '../../shared/connected-inventory/conne ModalModule, OperatingHoursModalModule, PercentGraphModule, - ToastModule, SharedPipesModule, PsatSankeyModule, - ConnectedInventoryModule + ConnectedInventoryModule, + SnackbarModule ], declarations: [ ExploreOpportunitiesComponent, diff --git a/src/app/psat/psat-report/output-summary/output-summary.component.html b/src/app/psat/psat-report/output-summary/output-summary.component.html index 9a0d90e9c8..2b7275ca10 100644 --- a/src/app/psat/psat-report/output-summary/output-summary.component.html +++ b/src/app/psat/psat-report/output-summary/output-summary.component.html @@ -70,11 +70,11 @@

Report Results

Pump shaft power ({{settings.powerMeasurement}}) - {{psat.outputs.pump_shaft_power | + {{psat.outputs.mover_shaft_power | number:'1.0-1'}} - {{modification.psat.outputs.pump_shaft_power + {{modification.psat.outputs.mover_shaft_power | number:'1.0-1'}} diff --git a/src/app/psat/psat-report/psat-report-graphs/psat-report-graphs.component.ts b/src/app/psat/psat-report/psat-report-graphs/psat-report-graphs.component.ts index 0a48efb478..21298927d6 100644 --- a/src/app/psat/psat-report/psat-report-graphs/psat-report-graphs.component.ts +++ b/src/app/psat/psat-report/psat-report-graphs/psat-report-graphs.component.ts @@ -106,14 +106,14 @@ export class PsatReportGraphsComponent implements OnInit { getGraphData(results: PsatOutputs): PsatGraphData { let motorShaftPower: number = results.motor_shaft_power; - let pumpShaftPower: number = results.pump_shaft_power; + let moverShaftPower: number = results.mover_shaft_power; if (this.settings.powerMeasurement === 'hp') { motorShaftPower = this.convertUnitsService.value(results.motor_shaft_power).from('hp').to('kW'); - pumpShaftPower = this.convertUnitsService.value(results.pump_shaft_power).from("hp").to('kW'); + moverShaftPower = this.convertUnitsService.value(results.mover_shaft_power).from("hp").to('kW'); } let energyInput = results.motor_power; let motorLoss = results.motor_power * (1 - (results.motor_efficiency / 100)); - let driveLoss = motorShaftPower - pumpShaftPower; + let driveLoss = motorShaftPower - moverShaftPower; let pumpLoss = (results.motor_power - motorLoss - driveLoss) * (1 - (results.pump_efficiency / 100)); let usefulOutput = results.motor_power - (motorLoss + driveLoss + pumpLoss); return { energyInput: energyInput, motorLoss: motorLoss, pumpLoss: pumpLoss, driveLoss: driveLoss, usefulOutput: usefulOutput }; diff --git a/src/app/psat/psat.module.ts b/src/app/psat/psat.module.ts index 2e8e2d36a2..8135d2d60d 100644 --- a/src/app/psat/psat.module.ts +++ b/src/app/psat/psat.module.ts @@ -49,7 +49,6 @@ import { PercentGraphModule } from '../shared/percent-graph/percent-graph.module import { PieChartModule } from '../shared/pie-chart/pie-chart.module'; import { SimpleTooltipModule } from '../shared/simple-tooltip/simple-tooltip.module'; import { TabsTooltipModule } from '../shared/tabs-tooltip/tabs-tooltip.module'; -import { ToastModule } from '../shared/toast/toast.module'; import { SharedPipesModule } from '../shared/shared-pipes/shared-pipes.module'; import { UnitConverterModule } from '../calculator/utilities/unit-converter/unit-converter.module'; import { SystemAndEquipmentCurveModule } from '../calculator/system-and-equipment-curve/system-and-equipment-curve.module'; @@ -62,6 +61,7 @@ import { WelcomeScreenComponent } from './welcome-screen/welcome-screen.componen import { ConnectedInventoryModule } from '../shared/connected-inventory/connected-inventory-module'; import { IntegratePumpInventoryComponent } from './integrate-pump-inventory/integrate-pump-inventory.component'; import { ImportExportModule } from '../shared/import-export/import-export.module'; +import { SnackbarModule } from '../shared/snackbar-notification/snackbar.module'; @NgModule({ declarations: [ @@ -112,7 +112,6 @@ import { ImportExportModule } from '../shared/import-export/import-export.module PieChartModule, SimpleTooltipModule, TabsTooltipModule, - ToastModule, SharedPipesModule, UnitConverterModule, SystemAndEquipmentCurveModule, @@ -120,7 +119,8 @@ import { ImportExportModule } from '../shared/import-export/import-export.module UpdateUnitsModalModule, AssessmentCo2SavingsModule, ConnectedInventoryModule, - ImportExportModule + ImportExportModule, + SnackbarModule ], providers: [ PsatService, diff --git a/src/app/psat/psat.service.ts b/src/app/psat/psat.service.ts index 68085b5268..7a7f80ff98 100644 --- a/src/app/psat/psat.service.ts +++ b/src/app/psat/psat.service.ts @@ -65,7 +65,7 @@ export class PsatService { if (settings.powerMeasurement != 'hp') { psatOutputs.motor_rated_power = this.convertUnitsService.value(psatOutputs.motor_rated_power).from('hp').to(settings.powerMeasurement); psatOutputs.motor_shaft_power = this.convertUnitsService.value(psatOutputs.motor_shaft_power).from('hp').to(settings.powerMeasurement); - psatOutputs.pump_shaft_power = this.convertUnitsService.value(psatOutputs.pump_shaft_power).from('hp').to(settings.powerMeasurement); + psatOutputs.mover_shaft_power = this.convertUnitsService.value(psatOutputs.mover_shaft_power).from('hp').to(settings.powerMeasurement); } if (settings.currency !== "$") { psatOutputs.annual_cost = this.convertUnitsService.value(psatOutputs.annual_cost).from('$').to(settings.currency); @@ -190,7 +190,7 @@ export class PsatService { pump_efficiency: 0, motor_rated_power: 0, motor_shaft_power: 0, - pump_shaft_power: 0, + mover_shaft_power: 0, motor_efficiency: 0, motor_power_factor: 0, motor_current: 0, @@ -210,7 +210,7 @@ export class PsatService { pump_efficiency: this.roundVal(psatResults.pump_efficiency, 2), motor_rated_power: this.roundVal(psatResults.motor_rated_power, 2), motor_shaft_power: this.roundVal(psatResults.motor_shaft_power, 2), - pump_shaft_power: this.roundVal(psatResults.pump_shaft_power, 2), + mover_shaft_power: this.roundVal(psatResults.mover_shaft_power, 2), motor_efficiency: this.roundVal(psatResults.motor_efficiency, 2), motor_power_factor: this.roundVal(psatResults.motor_power_factor, 2), motor_current: this.roundVal(psatResults.motor_current, 2), diff --git a/src/app/shared/browsing-data-toast/browsing-data-toast.component.css b/src/app/shared/browsing-data-toast/browsing-data-toast.component.css index 36645289b0..45bf15c784 100644 --- a/src/app/shared/browsing-data-toast/browsing-data-toast.component.css +++ b/src/app/shared/browsing-data-toast/browsing-data-toast.component.css @@ -1,46 +1,62 @@ -.toasty-card{ +.card.card-toast-notification { position: fixed; - z-index: 8000; - right: 15px; - top: -100%; + z-index: 9999; + right: 10px; + top: 0; + margin: 10px; + width: 500px; + background: rgb(111, 113, 116); + color: #fff; + box-shadow: 0 6px 6px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.4); +} + +.app-icon{ + width: 2rem; + border-radius: 16px; } - .update-toast{ - min-width: 300px; - max-width: 500px; - } - - .toast-text { +.card-text-small { font-size: 14px; - } - - .close{ - padding-left: 1rem; - color: white; - } - - a.click-link.danger{ - color: red; - } - - a.click-link{ - font-size: small; - } - - .card-body{ - padding: .25rem; - } - - .card-header{ - background-color: #145A32; - color: white; - padding: 6px; - } - - h1{ - font-size: 1.5rem !important; - } - - p{ - margin-bottom: .25rem; - } +} + +.card-text, +.card-text-small { + margin-bottom: .5rem; +} + +.alert { + padding: 0; +} + +.info-icon { + font-size: 22px; +} + +.close-button { + float: right; + font-size: 24px; +} + +.close-button:hover { + cursor: pointer; +} + +.card-header { + font-size: 18px; +} + +.card-body { + font-size: 16px; + padding: 1rem; +} + +.bold-emphasis { + color: #b5ffd6 !important; + font-weight: bold; +} + +a.click-link { + text-decoration: underline; + color: #b5ffd6 !important; +} + \ No newline at end of file diff --git a/src/app/shared/browsing-data-toast/browsing-data-toast.component.html b/src/app/shared/browsing-data-toast/browsing-data-toast.component.html index ee854b657e..f4c6cd4897 100644 --- a/src/app/shared/browsing-data-toast/browsing-data-toast.component.html +++ b/src/app/shared/browsing-data-toast/browsing-data-toast.component.html @@ -1,22 +1,29 @@ -
-
- User Data Notice - -
-
- MEASUR saves assessments, inventories, and settings as local data in the browser on your machine. Some browsers allow disabling or deleting of this data alongside cookies. - If you experience issues saving data, please ensure your browser "Privacy and Security" or "Site Data" settings are set to allow local data from this website. -
-
- - For information on user data usage, visit the Privacy Notice page - -
+
+
+ + User Data Notice + +
+
+

+ + MEASUR saves assessments, inventories, and settings as local data in the browser on your machine. Some + browsers + allow disabling or deleting of this data alongside cookies. + If you experience issues saving data, please ensure your browser "Privacy and Security" or "Site Data" settings + are set to allow local data from this website. +

+

+ For information on data storage and backup, visit the Data + Storage page +

+

+ For information on user data usage, visit the Privacy + Notice page +

-
- Close -
- + +
\ No newline at end of file diff --git a/src/app/shared/browsing-data-toast/browsing-data-toast.component.ts b/src/app/shared/browsing-data-toast/browsing-data-toast.component.ts index 414fb81173..672d444746 100644 --- a/src/app/shared/browsing-data-toast/browsing-data-toast.component.ts +++ b/src/app/shared/browsing-data-toast/browsing-data-toast.component.ts @@ -7,12 +7,11 @@ import { Router } from '@angular/router'; templateUrl: './browsing-data-toast.component.html', styleUrls: ['./browsing-data-toast.component.css'], animations: [ - trigger('toast', [ - state('show', style({ - top: '20px' - })), - transition('hide => show', animate('.5s ease-in')), - transition('show => hide', animate('.5s ease-out')) + trigger('toastAnimate', [ + state('show', style({ top: '0px' })), + state('hide', style({ top: '-300px' })), + transition('hide => show', animate('.5s ease')), + transition('show => hide', animate('.5s ease')) ]) ] }) @@ -20,7 +19,7 @@ export class BrowsingDataToastComponent { @Output('emitClose') emitClose = new EventEmitter(); - showBrowsingDataToast: string = 'hide'; + toastAnimate: string = 'hide'; constructor(private cd: ChangeDetectorRef, private router: Router) { } @@ -28,7 +27,7 @@ export class BrowsingDataToastComponent { } ngAfterViewInit(){ - this.showBrowsingDataToast = 'show'; + this.toastAnimate = 'show'; this.cd.detectChanges(); } @@ -37,8 +36,13 @@ export class BrowsingDataToastComponent { this.closeToast(); } + routeToDataStorage() { + this.router.navigateByUrl('/data-and-backup'); + this.closeToast(); + } + closeToast() { - this.showBrowsingDataToast = 'hide'; + this.toastAnimate = 'hide'; this.cd.detectChanges(); setTimeout(() => { this.emitClose.emit(true); diff --git a/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal.module.ts b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal.module.ts new file mode 100644 index 0000000000..326fc420e8 --- /dev/null +++ b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal.module.ts @@ -0,0 +1,43 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { SuiteDbModule } from '../../suiteDb/suiteDb.module'; +import { ModalModule } from 'ngx-bootstrap/modal'; +import { SharedPipesModule } from '../shared-pipes/shared-pipes.module'; +import { FlueGasLossesMoistureComponent } from './flue-gas-moisture-modal/flue-gas-losses-moisture/flue-gas-losses-moisture.component'; +import { FlueGasMoistureResultsComponent } from './flue-gas-moisture-modal/flue-gas-moisture-results/flue-gas-moisture-results.component'; +import { FlueGasMoistureHelpComponent } from './flue-gas-moisture-modal/flue-gas-moisture-help/flue-gas-moisture-help.component'; +import { FlueGasMoisturePanelComponent } from './flue-gas-moisture-modal/flue-gas-moisture-panel/flue-gas-moisture-panel.component'; +import { FlueGasMoistureModalComponent } from './flue-gas-moisture-modal/flue-gas-moisture-modal.component'; +import { LossesModule } from '../../phast/losses/losses.module'; +import { FlueGasMoistureModalService } from './flue-gas-moisture-modal.service'; + + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + SuiteDbModule, + ModalModule, + SharedPipesModule, + ], + declarations: [ + FlueGasLossesMoistureComponent, + FlueGasMoistureResultsComponent, + FlueGasMoistureHelpComponent, + FlueGasMoisturePanelComponent, + FlueGasMoistureModalComponent, + ], + providers: [ + FlueGasMoistureModalService + ], + exports: [ + FlueGasLossesMoistureComponent, + FlueGasMoistureResultsComponent, + FlueGasMoistureHelpComponent, + FlueGasMoisturePanelComponent, + FlueGasMoistureModalComponent, + ], +}) +export class FlueGasMoistureModalModule { } diff --git a/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal.service.spec.ts b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal.service.spec.ts new file mode 100644 index 0000000000..bf96b744f7 --- /dev/null +++ b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { FlueGasMoistureModalService } from './flue-gas-moisture-modal.service'; + +describe('FlueGasMoistureModalService', () => { + let service: FlueGasMoistureModalService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(FlueGasMoistureModalService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal.service.ts b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal.service.ts new file mode 100644 index 0000000000..8fd990eb8b --- /dev/null +++ b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal.service.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@angular/core'; +import { BaseGasDensity, PsychrometricResults } from '../models/fans'; +import { FlueGas } from '../models/phast/losses/flueGas'; +import { BehaviorSubject } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class FlueGasMoistureModalService { + baselineFlueGasLoss: FlueGas[]; + modifiedFlueGasLoss: FlueGas[]; + psychrometricResults: BehaviorSubject; + currentField: BehaviorSubject; + baseGasDensity: BaseGasDensity; + + constructor() { + this.baseGasDensity = { + barometricPressure: 29.92, + dewPoint: 0, + dryBulbTemp: 68, + gasDensity: 0.07516579558441701, + gasType: "AIR", + inputType: "relativeHumidity", + relativeHumidity: 0, + specificGravity: 1, + specificHeatGas: 0.24, + specificHeatRatio: 1.4, + staticPressure: 0, + wetBulbTemp: 118.999 + }; + this.psychrometricResults = new BehaviorSubject(undefined); + this.currentField = new BehaviorSubject(undefined); + } + + setCurrentField(currField: string) { + this.currentField.next(currField); + } + + setCurrentDensity(currDensity: BaseGasDensity) { + this.baseGasDensity = currDensity; + } + +} diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-losses-moisture/flue-gas-losses-moisture.component.css b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-losses-moisture/flue-gas-losses-moisture.component.css similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-losses-moisture/flue-gas-losses-moisture.component.css rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-losses-moisture/flue-gas-losses-moisture.component.css diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-losses-moisture/flue-gas-losses-moisture.component.html b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-losses-moisture/flue-gas-losses-moisture.component.html similarity index 95% rename from src/app/phast/losses/flue-gas-losses/flue-gas-losses-moisture/flue-gas-losses-moisture.component.html rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-losses-moisture/flue-gas-losses-moisture.component.html index 6db23821b0..6b301bfe55 100644 --- a/src/app/phast/losses/flue-gas-losses/flue-gas-losses-moisture/flue-gas-losses-moisture.component.html +++ b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-losses-moisture/flue-gas-losses-moisture.component.html @@ -44,16 +44,6 @@

Fluid

-
- -
- -
-
-
diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-losses-moisture/flue-gas-losses-moisture.component.spec.ts b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-losses-moisture/flue-gas-losses-moisture.component.spec.ts similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-losses-moisture/flue-gas-losses-moisture.component.spec.ts rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-losses-moisture/flue-gas-losses-moisture.component.spec.ts diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-losses-moisture/flue-gas-losses-moisture.component.ts b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-losses-moisture/flue-gas-losses-moisture.component.ts similarity index 85% rename from src/app/phast/losses/flue-gas-losses/flue-gas-losses-moisture/flue-gas-losses-moisture.component.ts rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-losses-moisture/flue-gas-losses-moisture.component.ts index 9d0d81f8b3..7eb760c2c2 100644 --- a/src/app/phast/losses/flue-gas-losses/flue-gas-losses-moisture/flue-gas-losses-moisture.component.ts +++ b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-losses-moisture/flue-gas-losses-moisture.component.ts @@ -1,10 +1,10 @@ import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; import { FsatService } from '../../../../fsat/fsat.service'; import { UntypedFormGroup } from '@angular/forms'; -import { BaseGasDensity, PsychrometricResults } from '../../../../shared/models/fans'; +import { BaseGasDensity, PsychrometricResults } from '../../../models/fans'; import { FsatFluidService, GasDensityValidators } from '../../../../fsat/fsat-fluid/fsat-fluid.service'; -import { Settings } from '../../../../shared/models/settings'; -import { FlueGasCompareService } from '../flue-gas-compare.service'; +import { Settings } from '../../../models/settings'; +import { FlueGasMoistureModalService } from '../../flue-gas-moisture-modal.service'; @Component({ selector: 'app-flue-gas-losses-moisture', @@ -26,16 +26,11 @@ export class FlueGasLossesMoistureComponent implements OnInit { { display: 'Gas Dew Point', value: 'dewPoint' }, ]; - gasTypes: Array<{ display: string, value: string }> = [ - { display: 'Air', value: 'AIR' }, - { display: 'Other Gas', value: 'OTHER' } - ]; - moistureInCombustionAir: number; constructor( private fsatService: FsatService, private fsatFluidService: FsatFluidService, - private flueGasCompareService: FlueGasCompareService,) { } + private flueGasMoistureModalService: FlueGasMoistureModalService) { } ngOnInit() { this.init(); @@ -43,23 +38,21 @@ export class FlueGasLossesMoistureComponent implements OnInit { } init() { - let baseGasDensityDefaults: BaseGasDensity = this.flueGasCompareService.baseGasDensity; + let baseGasDensityDefaults: BaseGasDensity = this.flueGasMoistureModalService.baseGasDensity; this.gasDensityForm = this.fsatFluidService.getGasDensityFormFromObj(baseGasDensityDefaults, this.settings); } disableForm() { - this.gasDensityForm.controls.gasType.disable(); this.gasDensityForm.controls.inputType.disable(); } enableForm() { - this.gasDensityForm.controls.gasType.enable(); this.gasDensityForm.controls.inputType.enable(); } save() { let baseGasDensity: BaseGasDensity = this.fsatFluidService.getGasDensityObjFromForm(this.gasDensityForm); - this.flueGasCompareService.baseGasDensity = baseGasDensity; + this.flueGasMoistureModalService.baseGasDensity = baseGasDensity; this.updateFormValidators(baseGasDensity); } @@ -76,18 +69,7 @@ export class FlueGasLossesMoistureComponent implements OnInit { } focusField(str: string) { - this.flueGasCompareService.currentField.next(str); - } - - changeGasType() { - if (this.gasDensityForm.controls.gasType.value === 'OTHER') { - this.gasDensityForm.patchValue({ - inputType: 'custom' - }); - this.changeMethod(); - } else { - this.getResults(); - } + this.flueGasMoistureModalService.currentField.next(str); } getResults() { @@ -117,7 +99,7 @@ export class FlueGasLossesMoistureComponent implements OnInit { psychrometricResults.barometricPressure = this.gasDensityForm.controls.barometricPressure.value; } - this.flueGasCompareService.setPsychrometricResults(psychrometricResults); + this.flueGasMoistureModalService.psychrometricResults.next(psychrometricResults); if (psychrometricResults) { this.moistureInCombustionAir = psychrometricResults.humidityRatio * 100; } else { diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-help/flue-gas-moisture-help.component.css b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-help/flue-gas-moisture-help.component.css similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-help/flue-gas-moisture-help.component.css rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-help/flue-gas-moisture-help.component.css diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-help/flue-gas-moisture-help.component.html b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-help/flue-gas-moisture-help.component.html similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-help/flue-gas-moisture-help.component.html rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-help/flue-gas-moisture-help.component.html diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-help/flue-gas-moisture-help.component.spec.ts b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-help/flue-gas-moisture-help.component.spec.ts similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-help/flue-gas-moisture-help.component.spec.ts rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-help/flue-gas-moisture-help.component.spec.ts diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-help/flue-gas-moisture-help.component.ts b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-help/flue-gas-moisture-help.component.ts similarity index 67% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-help/flue-gas-moisture-help.component.ts rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-help/flue-gas-moisture-help.component.ts index f8a7fada0d..86884ee3a9 100644 --- a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-help/flue-gas-moisture-help.component.ts +++ b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-help/flue-gas-moisture-help.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit, Input } from '@angular/core'; import { Subscription } from 'rxjs'; -import { FlueGasCompareService } from '../flue-gas-compare.service'; +import { FlueGasMoistureModalService } from '../../flue-gas-moisture-modal.service'; @Component({ selector: 'app-flue-gas-moisture-help', @@ -11,12 +11,12 @@ export class FlueGasMoistureHelpComponent implements OnInit { @Input() currentField: string; fieldSubscription: Subscription; - constructor(private flueGasCompareService: FlueGasCompareService) { + constructor(private flueGasMoistureModalService: FlueGasMoistureModalService) { } ngOnInit() { - this.fieldSubscription = this.flueGasCompareService.currentField.subscribe(val => { + this.fieldSubscription = this.flueGasMoistureModalService.currentField.subscribe(val => { this.currentField = val; }); } diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-modal/flue-gas-moisture-modal.component.css b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-modal.component.css similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-modal/flue-gas-moisture-modal.component.css rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-modal.component.css diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-modal/flue-gas-moisture-modal.component.html b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-modal.component.html similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-modal/flue-gas-moisture-modal.component.html rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-modal.component.html diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-modal/flue-gas-moisture-modal.component.spec.ts b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-modal.component.spec.ts similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-modal/flue-gas-moisture-modal.component.spec.ts rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-modal.component.spec.ts diff --git a/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-modal.component.ts b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-modal.component.ts new file mode 100644 index 0000000000..3bcc6fd44f --- /dev/null +++ b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-modal.component.ts @@ -0,0 +1,37 @@ +import { Component, Input, Output, OnInit, EventEmitter } from '@angular/core'; +import { Settings } from '../../models/settings'; +import { FlueGasMoistureModalService } from '../flue-gas-moisture-modal.service'; + + +@Component({ + selector: 'app-flue-gas-moisture-modal', + templateUrl: './flue-gas-moisture-modal.component.html', + styleUrls: ['./flue-gas-moisture-modal.component.css'] + }) + + export class FlueGasMoistureModalComponent implements OnInit { + @Input() + settings: Settings; + @Output('hideModal') + hideModal = new EventEmitter(); + + constructor(private flueGasMoistureModalService: FlueGasMoistureModalService) { + } + + ngOnInit() { + if (this.settings.unitsOfMeasure == 'Imperial') { + this.settings.densityMeasurement = 'lbscf'; + this.settings.fanPressureMeasurement = 'inH2o'; + this.settings.fanBarometricPressure = 'inHg'; + } else { + this.settings.densityMeasurement = 'kgNm3'; + this.settings.fanPressureMeasurement = 'Pa'; + this.settings.fanBarometricPressure = 'Pa'; + } + } + + + hideMoistureModal(event: number) { + this.hideModal.emit(event); + } + } \ No newline at end of file diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-panel/flue-gas-moisture-panel.component.css b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-panel/flue-gas-moisture-panel.component.css similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-panel/flue-gas-moisture-panel.component.css rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-panel/flue-gas-moisture-panel.component.css diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-panel/flue-gas-moisture-panel.component.html b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-panel/flue-gas-moisture-panel.component.html similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-panel/flue-gas-moisture-panel.component.html rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-panel/flue-gas-moisture-panel.component.html diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-panel/flue-gas-moisture-panel.component.spec.ts b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-panel/flue-gas-moisture-panel.component.spec.ts similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-panel/flue-gas-moisture-panel.component.spec.ts rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-panel/flue-gas-moisture-panel.component.spec.ts diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-panel/flue-gas-moisture-panel.component.ts b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-panel/flue-gas-moisture-panel.component.ts similarity index 89% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-panel/flue-gas-moisture-panel.component.ts rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-panel/flue-gas-moisture-panel.component.ts index a3a66068b8..4fdee9e339 100644 --- a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-panel/flue-gas-moisture-panel.component.ts +++ b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-panel/flue-gas-moisture-panel.component.ts @@ -1,5 +1,5 @@ import { Component, Input, OnInit } from '@angular/core'; -import { Settings } from '../../../../shared/models/settings'; +import { Settings } from '../../../models/settings'; @Component({ selector: 'app-flue-gas-moisture-panel', diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-results/flue-gas-moisture-results.component.css b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-results/flue-gas-moisture-results.component.css similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-results/flue-gas-moisture-results.component.css rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-results/flue-gas-moisture-results.component.css diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-results/flue-gas-moisture-results.component.html b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-results/flue-gas-moisture-results.component.html similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-results/flue-gas-moisture-results.component.html rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-results/flue-gas-moisture-results.component.html diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-results/flue-gas-moisture-results.component.spec.ts b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-results/flue-gas-moisture-results.component.spec.ts similarity index 100% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-results/flue-gas-moisture-results.component.spec.ts rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-results/flue-gas-moisture-results.component.spec.ts diff --git a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-results/flue-gas-moisture-results.component.ts b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-results/flue-gas-moisture-results.component.ts similarity index 66% rename from src/app/phast/losses/flue-gas-losses/flue-gas-moisture-results/flue-gas-moisture-results.component.ts rename to src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-results/flue-gas-moisture-results.component.ts index 6f8c9aa532..13013da606 100644 --- a/src/app/phast/losses/flue-gas-losses/flue-gas-moisture-results/flue-gas-moisture-results.component.ts +++ b/src/app/shared/flue-gas-moisture-modal/flue-gas-moisture-modal/flue-gas-moisture-results/flue-gas-moisture-results.component.ts @@ -1,9 +1,9 @@ import { Component, OnInit, Input } from '@angular/core'; -import { PsychrometricResults } from '../../../../shared/models/fans'; +import { PsychrometricResults } from '../../../models/fans'; import { Subscription } from 'rxjs'; -import { Settings } from '../../../../shared/models/settings'; -import { FlueGasCompareService } from '../flue-gas-compare.service'; +import { Settings } from '../../../models/settings'; import { FanPsychrometricService, FanPsychrometricWarnings } from '../../../../calculator/process-cooling/fan-psychrometric/fan-psychrometric.service'; +import { FlueGasMoistureModalService } from '../../flue-gas-moisture-modal.service'; @Component({ @@ -14,21 +14,21 @@ import { FanPsychrometricService, FanPsychrometricWarnings } from '../../../../c export class FlueGasMoistureResultsComponent implements OnInit { @Input() settings: Settings; - psychrometricSubscription: Subscription; psychrometricResults: PsychrometricResults; warnings: FanPsychrometricWarnings; - constructor(private flueGasCompareService: FlueGasCompareService, private fanPsychrometricService: FanPsychrometricService) { } + constructor(private flueGasMoistureModalService: FlueGasMoistureModalService, private fanPsychrometricService: FanPsychrometricService) { } ngOnInit(): void { - this.psychrometricSubscription = this.flueGasCompareService.moistureSubject.subscribe(val => { + this.psychrometricSubscription = this.flueGasMoistureModalService.psychrometricResults.subscribe(val => { this.psychrometricResults = val; this.warnings = this.fanPsychrometricService.checkWarnings(this.psychrometricResults); }); } + ngOnDestroy() { this.psychrometricSubscription.unsubscribe(); } diff --git a/src/app/shared/import-export/import-modal/import-modal.component.html b/src/app/shared/import-export/import-modal/import-modal.component.html index 602dba7b72..fbe5ab6910 100644 --- a/src/app/shared/import-export/import-modal/import-modal.component.html +++ b/src/app/shared/import-export/import-modal/import-modal.component.html @@ -15,9 +15,9 @@

Choose .json or .gz File to be Imported

- Invalid File Destination - This - is a treasure hunt opportunites file and must be imported from within a treasure hunt. - Invalid File Type +
Invalid File Destination - This + is a treasure hunt opportunites file and must be imported from within a treasure hunt.
+
Invalid File Type
diff --git a/src/app/shared/import-export/import-modal/import-modal.component.ts b/src/app/shared/import-export/import-modal/import-modal.component.ts index ce08b11d52..27f75238a0 100644 --- a/src/app/shared/import-export/import-modal/import-modal.component.ts +++ b/src/app/shared/import-export/import-modal/import-modal.component.ts @@ -110,12 +110,10 @@ export class ImportModalComponent implements OnInit { else if (importData.origin === "AMO-TOOLS-DESKTOP-OPPORTUNITIES") { this.treasureFile = true; this.validFile = false; - this.dashboardService.dashboardToastMessage.next('INVALID FILE DESTINATION - This is a treasure hunt opportunites file and must be imported from within a treasure hunt.'); } else { this.treasureFile = false; this.validFile = false; - this.dashboardService.dashboardToastMessage.next('INVALID FILE'); } } } \ No newline at end of file diff --git a/src/app/shared/models/psat.ts b/src/app/shared/models/psat.ts index a0224273d2..6e8a29276e 100644 --- a/src/app/shared/models/psat.ts +++ b/src/app/shared/models/psat.ts @@ -66,7 +66,7 @@ export interface PsatOutputs { pump_efficiency?: number; motor_rated_power?: number; motor_shaft_power?: number; - pump_shaft_power?: number; + mover_shaft_power?: number; motor_efficiency?: number; motor_power_factor?: number; motor_current?: number; @@ -90,7 +90,7 @@ export interface PsatCalcResults { pump_efficiency?: number[]; motor_rated_power?: number[]; motor_shaft_power?: number[]; - pump_shaft_power?: number[]; + mover_shaft_power?: number[]; motor_efficiency?: number[]; motor_power_factor?: number[]; motor_current?: number[]; diff --git a/src/app/shared/psat-sankey/psat-sankey.component.ts b/src/app/shared/psat-sankey/psat-sankey.component.ts index 5124c819ab..366b580c66 100644 --- a/src/app/shared/psat-sankey/psat-sankey.component.ts +++ b/src/app/shared/psat-sankey/psat-sankey.component.ts @@ -263,22 +263,22 @@ export class PsatSankeyComponent implements OnInit { calcLosses(results) { var motorShaftPower; - var pumpShaftPower; + var moverShaftPower; if (this.settings.powerMeasurement === "hp") { motorShaftPower = this.convertUnitsService .value(results.motor_shaft_power) .from("hp") .to("kW"); - pumpShaftPower = this.convertUnitsService - .value(results.pump_shaft_power) + moverShaftPower = this.convertUnitsService + .value(results.mover_shaft_power) .from("hp") .to("kW"); } else { motorShaftPower = results.motor_shaft_power; - pumpShaftPower = results.pump_shaft_power; + moverShaftPower = results.mover_shaft_power; } this.motor = results.motor_power * (1 - results.motor_efficiency / 100); - this.drive = motorShaftPower - pumpShaftPower; + this.drive = motorShaftPower - moverShaftPower; this.pump = (results.motor_power - this.motor - this.drive) * (1 - results.pump_efficiency / 100); diff --git a/src/app/shared/pwa/pwa.service.ts b/src/app/shared/pwa/pwa.service.ts deleted file mode 100644 index d29bd37150..0000000000 --- a/src/app/shared/pwa/pwa.service.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Injectable } from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; - -@Injectable({ - providedIn: 'root' -}) -export class PwaService { - - displayUpdateToast: BehaviorSubject; - constructor() { - this.displayUpdateToast = new BehaviorSubject(undefined) - } -} diff --git a/src/app/shared/snackbar-notification/snackbar-notification.component.css b/src/app/shared/snackbar-notification/snackbar-notification.component.css new file mode 100644 index 0000000000..d57da86abd --- /dev/null +++ b/src/app/shared/snackbar-notification/snackbar-notification.component.css @@ -0,0 +1,69 @@ +.card.card-toast-notification { + position: fixed; + z-index: 9999; + right: 20px; + /* right: 50%; */ + /* transform: translate(50%, 0%); */ + bottom: -25px; + margin: 10px; + /* min-width: 300px; + max-width: 500px; */ + width: 500px; + box-shadow: 0 6px 6px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.4); +} + +.alert-info.measur-info { + background: rgb(111, 113, 116); + color: #fff; + border: none; +} + +.alert-danger { + width: unset; +} + +.alert { + margin: 0 !important; +} + +.title { + font-size: 16px; +} + +.snackbar-container { + display: flex; + justify-content: space-between; + padding: 20px 24px; +} + +.close-button { + float: right; + font-size: 22px; + padding-left: 1rem; +} + +.level-icon { + align-self: baseline; + font-size: 22px; + padding-right: 1rem; +} + +.close-button:hover { + cursor: pointer; +} + +.card-msg { + font-size: 16px; + text-align: left; +} + + +a.click-link { + font-size: 16px; + text-decoration: underline; + color: #b5ffd6; +} + +a.click-link.danger { + color: #721c24 !important; +} \ No newline at end of file diff --git a/src/app/shared/snackbar-notification/snackbar-notification.component.html b/src/app/shared/snackbar-notification/snackbar-notification.component.html new file mode 100644 index 0000000000..392e09af0d --- /dev/null +++ b/src/app/shared/snackbar-notification/snackbar-notification.component.html @@ -0,0 +1,14 @@ +
+
+
+ + +
+ +
+
\ No newline at end of file diff --git a/src/app/shared/snackbar-notification/snackbar-notification.component.spec.ts b/src/app/shared/snackbar-notification/snackbar-notification.component.spec.ts new file mode 100644 index 0000000000..edf5bcf0a3 --- /dev/null +++ b/src/app/shared/snackbar-notification/snackbar-notification.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SnackbarNotificationComponent } from './snackbar-notification.component'; + +describe('SnackbarNotificationComponent', () => { + let component: SnackbarNotificationComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SnackbarNotificationComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SnackbarNotificationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/snackbar-notification/snackbar-notification.component.ts b/src/app/shared/snackbar-notification/snackbar-notification.component.ts new file mode 100644 index 0000000000..210db62cda --- /dev/null +++ b/src/app/shared/snackbar-notification/snackbar-notification.component.ts @@ -0,0 +1,59 @@ +import { trigger, state, style, transition, animate } from '@angular/animations'; +import { Component, } from '@angular/core'; +import { SnackbarMessage, SnackbarService } from './snackbar.service'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'app-snackbar-notification', + templateUrl: './snackbar-notification.component.html', + styleUrl: './snackbar-notification.component.css', + animations: [ + trigger('snackbarState', [ + state('show', style({ bottom: '25px' })), + state('hide', style({ bottom: '-100px' })), + transition('hide => show', animate('.5s ease')), + transition('show => hide', animate('.5s ease')) + ]) + ] +}) +export class SnackbarNotificationComponent { + snackbarMessageSub: Subscription; + snackbarState: string = 'hide'; + snackbarMessage: SnackbarMessage; + dismissTimeRemaining: number; + constructor(private snackbarService: SnackbarService) { } + + ngOnInit() { + this.snackbarMessageSub = this.snackbarService.snackbarMessage.subscribe(message => { + this.snackbarMessage = message; + if (this.snackbarMessage) { + this.showSnackbar(); + } else if (this.snackbarState === 'show') { + this.closeSnackbar(); + } + }); + } + + ngOnDestroy() { + this.snackbarState = 'hide'; + this.snackbarService.snackbarMessage.next(undefined); + this.snackbarMessageSub.unsubscribe(); + } + + showSnackbar() { + this.snackbarState = 'show'; + if (this.snackbarMessage.timeoutMS) { + setTimeout(() => { + this.closeSnackbar(); + }, this.snackbarMessage.timeoutMS); + } + + } + + closeSnackbar() { + this.snackbarState = 'hide'; + setTimeout(() => { + this.snackbarService.snackbarMessage.next(undefined); + }, 500); + } +} diff --git a/src/app/shared/snackbar-notification/snackbar.module.ts b/src/app/shared/snackbar-notification/snackbar.module.ts new file mode 100644 index 0000000000..ee89914679 --- /dev/null +++ b/src/app/shared/snackbar-notification/snackbar.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SnackbarNotificationComponent } from './snackbar-notification.component'; +import { SnackbarService } from './snackbar.service'; + + + +@NgModule({ + declarations: [SnackbarNotificationComponent], + imports: [ + CommonModule + ], + exports: [ + SnackbarNotificationComponent + ], + providers: [ + SnackbarService + ] +}) +export class SnackbarModule { } diff --git a/src/app/shared/snackbar-notification/snackbar.service.spec.ts b/src/app/shared/snackbar-notification/snackbar.service.spec.ts new file mode 100644 index 0000000000..38725240ea --- /dev/null +++ b/src/app/shared/snackbar-notification/snackbar.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { SnackbarService } from './snackbar.service'; + +describe('SnackbarService', () => { + let service: SnackbarService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(SnackbarService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/snackbar-notification/snackbar.service.ts b/src/app/shared/snackbar-notification/snackbar.service.ts new file mode 100644 index 0000000000..78d46fa533 --- /dev/null +++ b/src/app/shared/snackbar-notification/snackbar.service.ts @@ -0,0 +1,37 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; + +@Injectable() +export class SnackbarService { + snackbarMessage: BehaviorSubject; + constructor() { + this.snackbarMessage = new BehaviorSubject(undefined); + } + + setSnackbarMessage(messageOrDefault: string, level: MessageLevel = 'info', timeoutType: TimeoutType = 'none') { + let message = MEASURDefaultNotifications[messageOrDefault]? MEASURDefaultNotifications[messageOrDefault] : messageOrDefault; + let snackbar: SnackbarMessage = { + msg: message, + level: level, + timeoutMS: DismissTimeoutsMS[timeoutType] + } + this.snackbarMessage.next(snackbar) + } +} + +export interface SnackbarMessage { + level: MessageLevel, + msg: string, + timeoutMS?: number +} + +type MessageLevel = 'danger' | 'info'; +type TimeoutType = 'none' | 'short' | 'long'; +const DismissTimeoutsMS = { + short: 3000, + long: 10000 +} + +const MEASURDefaultNotifications: Record = { + exploreOpportunities: 'Explore Opportunities: The selected modification was created using the expert view. There may be changes to the modification that are not visible from this screen.' +} \ No newline at end of file diff --git a/src/app/shared/survey-toast/survey-toast/survey-toast.component.css b/src/app/shared/survey-toast/survey-toast/survey-toast.component.css index 8a0539c794..14faca7291 100644 --- a/src/app/shared/survey-toast/survey-toast/survey-toast.component.css +++ b/src/app/shared/survey-toast/survey-toast/survey-toast.component.css @@ -1,4 +1,4 @@ -.card.card-toast { +.card.card-toast-notification { position: fixed; z-index: 9999; right: 10px; diff --git a/src/app/shared/survey-toast/survey-toast/survey-toast.component.html b/src/app/shared/survey-toast/survey-toast/survey-toast.component.html index 69f261ff04..8d82ca2d53 100644 --- a/src/app/shared/survey-toast/survey-toast/survey-toast.component.html +++ b/src/app/shared/survey-toast/survey-toast/survey-toast.component.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/app/shared/toast/toast.component.css b/src/app/shared/toast/toast.component.css deleted file mode 100644 index 8611be2400..0000000000 --- a/src/app/shared/toast/toast.component.css +++ /dev/null @@ -1,59 +0,0 @@ -.toasty-card{ - position: fixed; - z-index: 800; - right: 15px; - min-width: 300px; - max-width: 500px; - border-style: solid; - border-width: 4px; - } - .card-header, .card-body{ - padding: 6px; - } - - .warning.card{ - background-color: #D35400; - color: white; - border-color: #D35400; - } - - .card-body{ - background-color: #efefef; - color: black - } - - - .disclaimer.card{ - background-color: #145A32; - color: white; - border-color: #145A32; - } - - - .explore-opps.card{ - min-width: 150px; - max-width: 400px; - animation-name: explore-opps-toast; - animation-duration: 1s; - animation-iteration-count: infinite; - animation-direction: alternate; - } - - .explore-opps .card-header{ - font-size: 20px !important; - } - - .explore-opps .card-body{ - font-size: 18px !important; - } - - @keyframes explore-opps-toast{ - from { - background-color: #db281b; - border-color: #db281b; - } - to { - background-color: #F97A1F; - border-color: #F97A1F; - } - } \ No newline at end of file diff --git a/src/app/shared/toast/toast.component.html b/src/app/shared/toast/toast.component.html deleted file mode 100644 index 3e92154433..0000000000 --- a/src/app/shared/toast/toast.component.html +++ /dev/null @@ -1,14 +0,0 @@ -
-
- {{title}} - -
-
-

-
- -
\ No newline at end of file diff --git a/src/app/shared/toast/toast.component.spec.ts b/src/app/shared/toast/toast.component.spec.ts deleted file mode 100644 index ab7e70d8d5..0000000000 --- a/src/app/shared/toast/toast.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ToastComponent } from './toast.component'; - -describe('ToastComponent', () => { - let component: ToastComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ToastComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ToastComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/shared/toast/toast.component.ts b/src/app/shared/toast/toast.component.ts deleted file mode 100644 index 6fd1a690c2..0000000000 --- a/src/app/shared/toast/toast.component.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core'; -import { trigger, state, style, animate, transition } from '@angular/animations'; - -@Component({ - selector: 'app-toast', - templateUrl: './toast.component.html', - styleUrls: ['./toast.component.css'], - animations: [ - trigger('toast', [ - state('show', style({ - bottom: '20px' - })), - transition('hide => show', animate('.5s ease-in')), - transition('show => hide', animate('.5s ease-out')) - ]) - ] -}) -export class ToastComponent implements OnInit { - @Input() - title: string; - @Input() - body: string; - @Output('emitCloseToast') - emitCloseToast = new EventEmitter(); - @Input() - setTimeoutVal: number; - @Input() - toastClass: string; - @Input() - showDisableFooter: boolean; - @Output('emitDisable') - emitDisable = new EventEmitter(); - - showToast: string = 'hide'; - destroyToast: boolean = false; - constructor() { } - - ngOnInit() { - setTimeout(() => { - this.showToast = 'show'; - }, 100); - - if (this.setTimeoutVal) { - setTimeout(() => { - this.closeToast(); - }, this.setTimeoutVal); - } - } - - - closeToast() { - this.showToast = 'hide'; - setTimeout(() => { - this.destroyToast = true; - this.emitCloseToast.emit(true); - }, 500); - } - - disable() { - this.showToast = 'hide'; - setTimeout(() => { - this.destroyToast = true; - this.emitDisable.emit(true); - }, 500); - } -} diff --git a/src/app/shared/toast/toast.module.ts b/src/app/shared/toast/toast.module.ts deleted file mode 100644 index e543bbc8c5..0000000000 --- a/src/app/shared/toast/toast.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ToastComponent } from './toast.component'; - - - -@NgModule({ - declarations: [ - ToastComponent - ], - imports: [ - CommonModule - ], - exports: [ - ToastComponent - ] -}) -export class ToastModule { } diff --git a/src/app/shared/update-application/release-notes-modal/release-notes-modal.component.css b/src/app/shared/update-application/release-notes-modal/release-notes-modal.component.css new file mode 100644 index 0000000000..c1bfb4296e --- /dev/null +++ b/src/app/shared/update-application/release-notes-modal/release-notes-modal.component.css @@ -0,0 +1,85 @@ +.close{ + cursor: pointer; +} + +li{ + font-size: small; +} + +.modal-body{ + max-height: 85vh; +} + +.btn{ + padding: 12px; +} + +.btn-primary { + color: white; + background: #117A65; +} + +.btn-primary:hover, +.btn-primary:focus { + color: white; + background: #447f73 !important; +} + + +.modal-dialog.modal-md { + top: 0 !important; + width: 50%; + min-width: 375px; + max-width: 700px; +} + +.card-body { + max-height: 700px; + overflow-y: scroll; +} + +.card-body > li { + font-size: 14px; +} + + +.card-body > label { + font-size: 15px; +} + +.card-text { + font-size: 16px; +} + +.card-text-small { + font-size: 14px; +} + +.card-body > label.header-label { + width: 100%; + border-bottom: #145A32 solid 2px; + font-weight: bold; + font-size: 16px; + margin-bottom: .5rem; + } + +.active { + background-color: #117A65 !important; +} + +.btn.btn-secondary.btn-sm.toggle-btn { + padding-left: 1rem !important; + padding-right: 1rem !important; +} + + + .card-header { + background: #117A65; + color: white; + font-size: 20px; + padding: 1rem !important; + } + + .close { + color: white; + } \ No newline at end of file diff --git a/src/app/shared/update-application/release-notes-modal/release-notes-modal.component.html b/src/app/shared/update-application/release-notes-modal/release-notes-modal.component.html new file mode 100644 index 0000000000..7d680b0715 --- /dev/null +++ b/src/app/shared/update-application/release-notes-modal/release-notes-modal.component.html @@ -0,0 +1,92 @@ + \ No newline at end of file diff --git a/src/app/shared/update-application/release-notes-modal/release-notes-modal.component.spec.ts b/src/app/shared/update-application/release-notes-modal/release-notes-modal.component.spec.ts new file mode 100644 index 0000000000..f0645e9b6e --- /dev/null +++ b/src/app/shared/update-application/release-notes-modal/release-notes-modal.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ReleaseNotesModalComponent } from './release-notes-modal.component'; + +describe('ReleaseNotesModalComponent', () => { + let component: ReleaseNotesModalComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ReleaseNotesModalComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ReleaseNotesModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/update-application/release-notes-modal/release-notes-modal.component.ts b/src/app/shared/update-application/release-notes-modal/release-notes-modal.component.ts new file mode 100644 index 0000000000..371e0e50f7 --- /dev/null +++ b/src/app/shared/update-application/release-notes-modal/release-notes-modal.component.ts @@ -0,0 +1,35 @@ +import { Component, EventEmitter, Output, ViewChild } from '@angular/core'; +import { ModalDirective } from 'ngx-bootstrap/modal'; +import { environment } from '../../../../environments/environment'; + +@Component({ + selector: 'app-release-notes-modal', + templateUrl: './release-notes-modal.component.html', + styleUrl: './release-notes-modal.component.css' +}) +export class ReleaseNotesModalComponent { +@Output('closeModal') + closeModal = new EventEmitter(); + + @ViewChild('releaseNotesModal', { static: false }) public releaseNotesModal: ModalDirective; + versionNum: any; + constructor() { } + + ngOnInit() { + this.versionNum = environment.version; + } + + ngAfterViewInit() { + this.showModal(); + } + + showModal() { + this.releaseNotesModal.show(); + } + + hideModal() { + this.releaseNotesModal.hide(); + this.closeModal.emit(true); + } + +} diff --git a/src/app/shared/update-application/update-application-toast/update-application-toast.component.css b/src/app/shared/update-application/update-application-toast/update-application-toast.component.css new file mode 100644 index 0000000000..a54ddd738c --- /dev/null +++ b/src/app/shared/update-application/update-application-toast/update-application-toast.component.css @@ -0,0 +1,68 @@ +.card.card-toast-notification { + position: fixed; + z-index: 9999; + right: 10px; + top: 0; + margin: 10px; + width: 500px; + background: rgb(111, 113, 116); + color: #fff; + box-shadow: 0 6px 6px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.4); + +} + +.app-icon{ + width: 2rem; + border-radius: 16px; + } + +.card-text-small { + font-size: 14px; +} + +.card-text, +.card-text-small { + margin-bottom: .5rem; +} + +.alert { + padding: 0; +} + +.info-icon { + font-size: 22px; +} + +.close-button { + float: right; + font-size: 24px; +} + +.close-button:hover { + cursor: pointer; +} + +.card-header { + font-size: 18px; +} + +.card-body { + font-size: 16px; + height: 100px; +} + +a.click-link { + font-size: 16px; + text-decoration: underline; + color: #b5ffd6 !important; +} + + .spinner > div { + width: 25px; + height: 25px; + background-color: #ffffff; + border-radius: 100%; + display: inline-block; + -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both; + animation: sk-bouncedelay 1.4s infinite ease-in-out both; + } \ No newline at end of file diff --git a/src/app/shared/update-application/update-application-toast/update-application-toast.component.html b/src/app/shared/update-application/update-application-toast/update-application-toast.component.html new file mode 100644 index 0000000000..c307ef5bbe --- /dev/null +++ b/src/app/shared/update-application/update-application-toast/update-application-toast.component.html @@ -0,0 +1,70 @@ +
+ +
+ + {{releaseData.releaseName}} is now available! + A new version of MEASUR is now available! + +
+
+ +

+ An error has occured. Please restart your application and try again. +

+ If the error persists, please use the "Feedback" page to notify the MEASUR team of your issue. +

+

This update can also be downloaded from https://ornl-amo.github.io/

+
+ + +

+ Error updating MEASUR. The application can be updated manually by doing a hard-refresh on the current tab or window. + If the application is installed to the desktop, uninstall the current version, then install the new version. +

+ If the error persists, please use the "Feedback" page to notify the MEASUR team of your issue. +

+
+ + +

+ This update can be downloaded and installed below, or from
https://ornl-amo.github.io/ +

+
+ + +

+ MEASUR can perform an update by refreshing the browser's current tab or window. +

+
+ + +
+
+
+
+
+
+
+

+ Downloading Update. This may take a few minutes. +

+
+ + +

+ Downloading Complete. +

+
+
+ +
+
diff --git a/src/app/shared/update-application/update-application-toast/update-application-toast.component.spec.ts b/src/app/shared/update-application/update-application-toast/update-application-toast.component.spec.ts new file mode 100644 index 0000000000..0e8245e7ad --- /dev/null +++ b/src/app/shared/update-application/update-application-toast/update-application-toast.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UpdateApplicationToastComponent } from './update-application-toast.component'; + +describe('UpdateApplicationToastComponent', () => { + let component: UpdateApplicationToastComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [UpdateApplicationToastComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(UpdateApplicationToastComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/update-application/update-application-toast/update-application-toast.component.ts b/src/app/shared/update-application/update-application-toast/update-application-toast.component.ts new file mode 100644 index 0000000000..e4368e9469 --- /dev/null +++ b/src/app/shared/update-application/update-application-toast/update-application-toast.component.ts @@ -0,0 +1,132 @@ +import { Component } from '@angular/core'; +import { combineLatestWith, Observable, Subscription } from 'rxjs'; +import { ReleaseData, ElectronService } from '../../../electron/electron.service'; +import { UpdateApplicationService } from '../update-application.service'; +import { SwUpdate } from '@angular/service-worker'; +import { animate, state, style, transition, trigger } from '@angular/animations'; + +@Component({ + selector: 'app-update-application-toast', + templateUrl: './update-application-toast.component.html', + styleUrl: './update-application-toast.component.css', + animations: [ + trigger('toastAnimate', [ + state('show', style({ top: '0px' })), + state('hide', style({ top: '-300px' })), + transition('hide => show', animate('.5s ease')), + transition('show => hide', animate('.5s ease')) + ]) + ] +}) +export class UpdateApplicationToastComponent { + releaseData: ReleaseData; + toastAnimate: 'hide' | 'show' = 'hide'; + updateStatus: UpdateStatus; + isDownloading: boolean; + + electronUpdateAvailableSub: Subscription; + updateDownloadedSub: Subscription; + updateErrorSub: Subscription; + showUpdateToastSub: Subscription; + webAndPwaUpdateSub: Subscription; + + constructor(private electronService: ElectronService, + private updateApplicationService: UpdateApplicationService, + private serviceWorkerUpdates: SwUpdate, + ) { } + + ngOnInit() { + this.webAndPwaUpdateSub = this.updateApplicationService.webUpdateAvailable.subscribe(webAvailable => { + if (webAvailable) { + this.showUpdateToast('web-available'); + } + }); + + this.showUpdateToastSub = this.updateApplicationService.showUpdateToast.subscribe(showUpdateToast => { + if (showUpdateToast) { + let platformAvailable: 'desktop-available' | 'web-available' = this.electronService.isElectron? 'desktop-available' : 'web-available'; + this.showUpdateToast(platformAvailable); + } + }); + + if (this.electronService.isElectron) { + let isUpdateAvailable: Observable = this.electronService.updateAvailable + .pipe( + combineLatestWith(this.electronService.releaseData) + ); + + this.electronUpdateAvailableSub = isUpdateAvailable.subscribe(([hasUpdate, releaseData]) => { + if (hasUpdate && releaseData) { + this.releaseData = releaseData; + this.showUpdateToast(); + } else if (this.toastAnimate === 'show') { + this.closeUpdateToast(); + } + }); + + this.updateDownloadedSub = this.electronService.updateDownloaded.subscribe(downloaded => { + if (downloaded) { + this.updateStatus = 'downloaded'; + } + }); + this.updateErrorSub = this.electronService.updateError.subscribe(error => { + if (error) { + this.updateStatus = 'error'; + } + }); + } + } + + ngOnDestroy() { + this.toastAnimate = 'hide'; + this.updateStatus = undefined; + this.webAndPwaUpdateSub.unsubscribe(); + if (this.electronService.isElectron) { + this.electronUpdateAvailableSub.unsubscribe(); + this.updateDownloadedSub.unsubscribe(); + this.updateErrorSub.unsubscribe(); + + } + } + + async downloadUpdate() { + this.updateStatus = 'downloading'; + this.electronService.sendUpdateSignal(); + } + + async quitAndInstall() { + this.electronService.sendQuitAndInstall(); + } + + updateWeb() { + this.serviceWorkerUpdates.activateUpdate() + .then((success) => { + console.log('MEASUR updated successfully') + window.location.reload(); + }) + .catch(error => { + console.log('error during MEASUR update') + this.updateStatus = 'web-error'; + }); + } + + viewReleaseNotes() { + this.updateApplicationService.showReleaseNotesModal.next(true); + } + + showUpdateToast(platformAvailable: 'web-available' | 'desktop-available' = 'desktop-available') { + this.updateStatus = platformAvailable; + this.toastAnimate = 'show'; + } + + closeUpdateToast() { + this.toastAnimate = 'hide'; + setTimeout(() => { + // * allow animation to finish + this.updateStatus = undefined; + }, 550); + } + +} + +export type UpdateStatus = 'desktop-available' | 'web-available' | 'downloading' | 'downloaded' | 'error' | 'web-error' | undefined; \ No newline at end of file diff --git a/src/app/shared/update-application/update-application.module.ts b/src/app/shared/update-application/update-application.module.ts new file mode 100644 index 0000000000..6cadac36c7 --- /dev/null +++ b/src/app/shared/update-application/update-application.module.ts @@ -0,0 +1,27 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { UpdateApplicationService } from './update-application.service'; +import { ReleaseNotesModalComponent } from './release-notes-modal/release-notes-modal.component'; +import { ModalModule } from 'ngx-bootstrap/modal'; +import { UpdateApplicationToastComponent } from './update-application-toast/update-application-toast.component'; + + + +@NgModule({ + declarations: [ + UpdateApplicationToastComponent, + ReleaseNotesModalComponent + ], + imports: [ + CommonModule, + ModalModule + ], + exports: [ + ReleaseNotesModalComponent, + UpdateApplicationToastComponent + ], + providers: [ + UpdateApplicationService + ] +}) +export class UpdateApplicationModule { } diff --git a/src/app/shared/update-application/update-application.service.spec.ts b/src/app/shared/update-application/update-application.service.spec.ts new file mode 100644 index 0000000000..902c31e4a3 --- /dev/null +++ b/src/app/shared/update-application/update-application.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { UpdateApplicationService } from './update-application.service'; + +describe('UpdateApplicationService', () => { + let service: UpdateApplicationService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(UpdateApplicationService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/update-application/update-application.service.ts b/src/app/shared/update-application/update-application.service.ts new file mode 100644 index 0000000000..23522bb631 --- /dev/null +++ b/src/app/shared/update-application/update-application.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; + +@Injectable() +export class UpdateApplicationService { + showUpdateToast: BehaviorSubject; + showReleaseNotesModal: BehaviorSubject; + webUpdateAvailable: BehaviorSubject; + + constructor() { + this.showUpdateToast = new BehaviorSubject(false); + this.showReleaseNotesModal = new BehaviorSubject(false); + this.webUpdateAvailable = new BehaviorSubject(false); + } +} diff --git a/src/app/ssmt/explore-opportunities/explore-opportunities.component.html b/src/app/ssmt/explore-opportunities/explore-opportunities.component.html index 7a3db0a973..d05e16301f 100644 --- a/src/app/ssmt/explore-opportunities/explore-opportunities.component.html +++ b/src/app/ssmt/explore-opportunities/explore-opportunities.component.html @@ -76,6 +76,3 @@

Now that you have setup your system and have baseline information, create du

- - \ No newline at end of file diff --git a/src/app/ssmt/explore-opportunities/explore-opportunities.component.ts b/src/app/ssmt/explore-opportunities/explore-opportunities.component.ts index 29a865f372..1a76a9cf9a 100644 --- a/src/app/ssmt/explore-opportunities/explore-opportunities.component.ts +++ b/src/app/ssmt/explore-opportunities/explore-opportunities.component.ts @@ -3,6 +3,7 @@ import { SSMT } from '../../shared/models/steam/ssmt'; import { Assessment } from '../../shared/models/assessment'; import { Settings } from '../../shared/models/settings'; import { SsmtService } from '../ssmt.service'; +import { SnackbarService } from '../../shared/snackbar-notification/snackbar.service'; @Component({ selector: 'app-explore-opportunities', @@ -41,10 +42,7 @@ export class ExploreOpportunitiesComponent implements OnInit { toastData: { title: string, body: string, setTimeoutVal: number } = { title: '', body: '', setTimeoutVal: undefined }; showToast: boolean = false; - constructor(private ssmtService: SsmtService) { - // this.toastyConfig.theme = 'bootstrap'; - // this.toastyConfig.position = 'bottom-right'; - // this.toastyConfig.limit = 1; + constructor(private ssmtService: SsmtService, private snackbarService: SnackbarService) { } ngOnInit() { @@ -55,7 +53,7 @@ export class ExploreOpportunitiesComponent implements OnInit { if (changes.containerHeight) { if (!changes.containerHeight.firstChange) { this.getContainerHeight(); - this.checkExploreOpps(); + this.notifyExploreOpps(); } } if (changes.modificationIndex) { @@ -69,7 +67,7 @@ export class ExploreOpportunitiesComponent implements OnInit { ngAfterViewInit() { setTimeout(() => { this.getContainerHeight(); - this.checkExploreOpps(); + this.notifyExploreOpps(); }, 100); } @@ -104,33 +102,14 @@ export class ExploreOpportunitiesComponent implements OnInit { } } - checkExploreOpps() { + notifyExploreOpps() { if (this.modificationExists) { if (!this.ssmt.modifications[this.modificationIndex].exploreOpportunities) { - let title: string = 'Explore Opportunities'; - let body: string = 'The selected modification was created using the expert view. There may be changes to the modification that are not visible from this screen.'; - this.openToast(title, body); - }else if(this.showToast){ - this.hideToast(); + this.snackbarService.setSnackbarMessage('exploreOpportunities', 'info', 'long'); } } } - openToast(title: string, body: string) { - this.toastData.title = title; - this.toastData.body = body; - this.showToast = true; - } - - hideToast() { - this.showToast = false; - this.toastData = { - title: '', - body: '', - setTimeoutVal: undefined - } - } - setSmallScreenTab(selectedTab: string) { this.smallScreenTab = selectedTab; } diff --git a/src/app/ssmt/explore-opportunities/explore-opportunities.module.ts b/src/app/ssmt/explore-opportunities/explore-opportunities.module.ts index 304faa0f4b..efe7567943 100644 --- a/src/app/ssmt/explore-opportunities/explore-opportunities.module.ts +++ b/src/app/ssmt/explore-opportunities/explore-opportunities.module.ts @@ -17,9 +17,9 @@ import { ExploreOpportunitiesService } from './explore-opportunities.service'; import { SsmtResultsPanelModule } from '../ssmt-results-panel/ssmt-results-panel.module'; import { BlowdownRateModalModule } from '../blowdown-rate-modal/blowdown-rate-modal.module'; import { OperatingHoursModalModule } from '../../shared/operating-hours-modal/operating-hours-modal.module'; -import { ToastModule } from '../../shared/toast/toast.module'; import { SharedPipesModule } from '../../shared/shared-pipes/shared-pipes.module'; import { SsmtSankeyModule } from '../../shared/ssmt-sankey/ssmt-sankey.module'; +import { SnackbarModule } from '../../shared/snackbar-notification/snackbar.module'; @NgModule({ imports: [ @@ -30,9 +30,9 @@ import { SsmtSankeyModule } from '../../shared/ssmt-sankey/ssmt-sankey.module'; SsmtResultsPanelModule, BlowdownRateModalModule, OperatingHoursModalModule, - ToastModule, SharedPipesModule, - SsmtSankeyModule + SsmtSankeyModule, + SnackbarModule ], declarations: [ExploreOpportunitiesComponent, ExploreOpportunitiesFormComponent, ExploreOpportunitiesHelpComponent, OperationsFormComponent, BoilerFormComponent, HeaderFormComponent, CondensateHandlingFormComponent, TurbineFormComponent, ExploreCondensingTurbineFormComponent, ExplorePressureTurbineFormComponent, ExploreTurbineFormComponent], exports: [ExploreOpportunitiesComponent], diff --git a/src/app/ssmt/ssmt.component.html b/src/app/ssmt/ssmt.component.html index 47cddc3196..01bfa83f4d 100644 --- a/src/app/ssmt/ssmt.component.html +++ b/src/app/ssmt/ssmt.component.html @@ -164,9 +164,6 @@

Select Scenario

- - diff --git a/src/app/ssmt/ssmt.component.ts b/src/app/ssmt/ssmt.component.ts index 77ff3f50e2..9625f67bc1 100644 --- a/src/app/ssmt/ssmt.component.ts +++ b/src/app/ssmt/ssmt.component.ts @@ -16,6 +16,7 @@ import { ConvertSsmtService } from './convert-ssmt.service'; import { EGridService } from '../shared/helper-services/e-grid.service'; import { SteamService } from '../calculator/steam/steam.service'; import { AnalyticsService } from '../shared/analytics/analytics.service'; +import { SnackbarService } from '../shared/snackbar-notification/snackbar.service'; @Component({ selector: 'app-ssmt', @@ -75,8 +76,6 @@ export class SsmtComponent implements OnInit { saveSsmtSub: Subscription; modListOpen: boolean = false; - toastData: { title: string, body: string, setTimeoutVal: number } = { title: '', body: '', setTimeoutVal: undefined }; - showToast: boolean = false; ssmtOptions: Array; selectedSSMT: { ssmt: SSMT, name }; @@ -101,7 +100,8 @@ export class SsmtComponent implements OnInit { private settingsService: SettingsService, private steamService: SteamService, private convertSsmtService: ConvertSsmtService, - private analyticsService: AnalyticsService + private analyticsService: AnalyticsService, + private snackbarService: SnackbarService ) { } ngOnInit() { @@ -140,10 +140,10 @@ export class SsmtComponent implements OnInit { this.steamModelerErrorSubscription = this.steamService.steamModelerError.subscribe(error => { if (error) { - this.openToast('Invalid Inputs', error); - this.cd.detectChanges(); + this.snackbarService.setSnackbarMessage(`Invalid Inputs: ${error}`, 'danger'); } }); + this.addNewModificationSubscription = this.ssmtService.openNewModificationModal.subscribe(val => { this.showAddModal = val; if (val) { @@ -548,21 +548,6 @@ export class SsmtComponent implements OnInit { this.ssmtService.modalOpen.next(false); } - openToast(title: string, body: string) { - this.toastData.title = title; - this.toastData.body = body; - this.showToast = true; - } - - hideToast() { - this.showToast = false; - this.toastData = { - title: '', - body: '', - setTimeoutVal: undefined - } - } - setSmallScreenTab(selectedTab: string) { this.smallScreenTab = selectedTab; } diff --git a/src/app/ssmt/ssmt.module.ts b/src/app/ssmt/ssmt.module.ts index 3a1c499ae0..5ce4b08560 100644 --- a/src/app/ssmt/ssmt.module.ts +++ b/src/app/ssmt/ssmt.module.ts @@ -43,12 +43,12 @@ import { DeaeratorModule } from '../calculator/steam/deaerator/deaerator.module' import { ConvertSsmtService } from './convert-ssmt.service'; import { BlowdownRateModalModule } from './blowdown-rate-modal/blowdown-rate-modal.module'; import { TabsTooltipModule } from '../shared/tabs-tooltip/tabs-tooltip.module'; -import { ToastModule } from '../shared/toast/toast.module'; import { SharedPipesModule } from '../shared/shared-pipes/shared-pipes.module'; import { RouterModule } from '@angular/router'; import { UpdateUnitsModalModule } from '../shared/update-units-modal/update-units-modal.module'; import { WelcomeScreenComponent } from './welcome-screen/welcome-screen.component'; import { ImportExportModule } from '../shared/import-export/import-export.module'; +import { SnackbarModule } from '../shared/snackbar-notification/snackbar.module'; @NgModule({ imports: [ @@ -75,12 +75,12 @@ import { ImportExportModule } from '../shared/import-export/import-export.module TurbineModule, BlowdownRateModalModule, TabsTooltipModule, - ToastModule, SharedPipesModule, RouterModule, SsmtSankeyModule, UpdateUnitsModalModule, - ImportExportModule + ImportExportModule, + SnackbarModule ], declarations: [ SsmtComponent, diff --git a/src/app/tools-suite-api/pumps-suite-api.service.ts b/src/app/tools-suite-api/pumps-suite-api.service.ts index a21c7ab8bc..9133961ab1 100644 --- a/src/app/tools-suite-api/pumps-suite-api.service.ts +++ b/src/app/tools-suite-api/pumps-suite-api.service.ts @@ -21,7 +21,7 @@ export class PumpsSuiteApiService { pump_efficiency: calculatedResults.pump_efficiency, motor_rated_power: calculatedResults.motor_rated_power, motor_shaft_power: calculatedResults.motor_shaft_power, - pump_shaft_power: calculatedResults.pump_shaft_power, + mover_shaft_power: calculatedResults.mover_shaft_power, motor_efficiency: calculatedResults.motor_efficiency, motor_power_factor: calculatedResults.motor_power_factor, motor_current: calculatedResults.motor_current, @@ -35,6 +35,7 @@ export class PumpsSuiteApiService { percent_annual_savings: calculatedResults.percent_annual_savings, co2EmissionsOutput: calculatedResults.co2EmissionsOutput, } + calculatedResults.delete(); psatWasmModule.delete(); output = this.convertResultsToPercentages(output); @@ -48,7 +49,7 @@ export class PumpsSuiteApiService { pump_efficiency: calculatedResults.pump_efficiency, motor_rated_power: calculatedResults.motor_rated_power, motor_shaft_power: calculatedResults.motor_shaft_power, - pump_shaft_power: calculatedResults.pump_shaft_power, + mover_shaft_power: calculatedResults.mover_shaft_power, motor_efficiency: calculatedResults.motor_efficiency, motor_power_factor: calculatedResults.motor_power_factor, motor_current: calculatedResults.motor_current, @@ -87,7 +88,7 @@ export class PumpsSuiteApiService { let stageCount = psatInput.stages; let speed = this.suiteApiHelperService.getFixedSpeedEnum(psatInput.fixed_speed); let specifiedDriveEfficiency = psatInput.specifiedDriveEfficiency / 100; - let pumpInput = new Module.PsatInput(pumpStyle, pumpEfficiency, rpm, drive, kviscosity, specificGravity, stageCount, speed, specifiedDriveEfficiency); + let pumpInput = new Module.PumpResultInput(pumpStyle, pumpEfficiency, rpm, drive, kviscosity, specificGravity, stageCount, speed, specifiedDriveEfficiency); //motor let lineFrequency = this.suiteApiHelperService.getLineFrequencyEnum(psatInput.line_frequency); let motorRatedPower = psatInput.motor_rated_power; @@ -109,7 +110,7 @@ export class PumpsSuiteApiService { let operating_hours = this.suiteApiHelperService.convertNullInputValueForObjectConstructor(psatInput.operating_hours); let cost_kw_hour = this.suiteApiHelperService.convertNullInputValueForObjectConstructor(psatInput.cost_kw_hour); let fieldData = new Module.PumpFieldData(flowRate, head, loadEstimationMethod, motorPower, motorAmps, voltage); - let psat = new Module.PSAT(pumpInput, motor, fieldData, operating_hours, cost_kw_hour); + let psat = new Module.PumpResult(pumpInput, motor, fieldData, operating_hours, cost_kw_hour); fieldData.delete(); motor.delete(); pumpInput.delete(); diff --git a/src/app/treasure-hunt/treasure-hunt.module.ts b/src/app/treasure-hunt/treasure-hunt.module.ts index f5ba5459f6..b741b3d1f5 100644 --- a/src/app/treasure-hunt/treasure-hunt.module.ts +++ b/src/app/treasure-hunt/treasure-hunt.module.ts @@ -23,7 +23,6 @@ import { SortCardsService } from './treasure-chest/opportunity-cards/sort-cards. import { TreasureHuntGaugeComponent } from './treasure-hunt-gauge/treasure-hunt-gauge.component'; import { AnimatedCheckmarkModule } from '../shared/animated-checkmark/animated-checkmark.module'; import { OperatingHoursModalModule } from '../shared/operating-hours-modal/operating-hours-modal.module'; -import { ToastModule } from '../shared/toast/toast.module'; import { ConvertInputDataService } from './convert-input-data.service'; import { RouterModule } from '@angular/router'; import { TreasureChestMenuModule } from './treasure-chest/treasure-chest-menu/treasure-chest-menu.module'; @@ -73,7 +72,6 @@ import { PowerFactorCorrectionTreasureHuntService } from './treasure-hunt-calcul TreasureHuntReportModule, AnimatedCheckmarkModule, OperatingHoursModalModule, - ToastModule, RouterModule, TreasureChestMenuModule, UpdateUnitsModalModule, diff --git a/src/app/update-toast/update-toast.component.css b/src/app/update-toast/update-toast.component.css deleted file mode 100644 index c2afa66041..0000000000 --- a/src/app/update-toast/update-toast.component.css +++ /dev/null @@ -1,54 +0,0 @@ -.toasty-card{ - position: fixed; - z-index: 8000; - right: 15px; - top: -100%; - } - - .update-toast{ - min-width: 300px; - max-width: 500px; - } - - .release-notes-card{ - left: 15px; - } - - .close{ - padding-left: 1rem; - color: white; - } - - a.click-link.danger{ - color: red; - } - - a.click-link{ - font-size: small; - } - - .card-body{ - padding: .25rem; - } - - .card-header{ - background-color: #145A32; - color: white; - padding: 6px; - } - - h1{ - font-size: 1.5rem !important; - } - - p{ - margin-bottom: .25rem; - } - - .release-notes-card .card-body{ - max-height: 90vh; - } - - .ng-tns-c2-1 h1{ - font-size: 1.5rem !important; - } \ No newline at end of file diff --git a/src/app/update-toast/update-toast.component.html b/src/app/update-toast/update-toast.component.html deleted file mode 100644 index e59f117fef..0000000000 --- a/src/app/update-toast/update-toast.component.html +++ /dev/null @@ -1,68 +0,0 @@ -
- - -
- {{releaseName}} is now available! - -
- -
-
-
-
-
-
- Downloading Update. This may take a few minutes. -
- -
- An error has occured. Please restart your application and try again. If the error persists, please use the - "Feedback" page to notify ORNL of your issue. -
-
- {{releaseName}} can also be downloaded and installed from https://ornl-amo.github.io/ -
-
- - -
- A new version of MEASUR is available! - -
- -
- The application could not be updated. Please uninstall, then reinstall the newest version. If the problem persists, see the - "Feedback" page to notify ORNL of your issue. -
-
- {{releaseName}} Desktop can also be downloaded and installed from https://ornl-amo.github.io/ -
-
- - -
- - -
-
- {{releaseName}} Release Notes - -
-
-
-
-
\ No newline at end of file diff --git a/src/app/update-toast/update-toast.component.spec.ts b/src/app/update-toast/update-toast.component.spec.ts deleted file mode 100644 index 96f9cd0fb2..0000000000 --- a/src/app/update-toast/update-toast.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { UpdateToastComponent } from './update-toast.component'; - -describe('UpdateToastComponent', () => { - let component: UpdateToastComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ UpdateToastComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(UpdateToastComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/update-toast/update-toast.component.ts b/src/app/update-toast/update-toast.component.ts deleted file mode 100644 index f73fbb2400..0000000000 --- a/src/app/update-toast/update-toast.component.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { Component, OnInit, ChangeDetectorRef, Output, EventEmitter, Input } from '@angular/core'; -import { trigger, state, style, animate, transition } from '@angular/animations'; -import { SettingsDbService } from '../indexedDb/settings-db.service'; - -import { firstValueFrom, Subscription } from 'rxjs'; -import { Settings } from '../shared/models/settings'; -import { ElectronService, ReleaseData } from '../electron/electron.service'; -import { SwUpdate } from '@angular/service-worker'; - -@Component({ - selector: 'app-update-toast', - templateUrl: './update-toast.component.html', - styleUrls: ['./update-toast.component.css'], - animations: [ - trigger('toast', [ - state('show', style({ - top: '20px' - })), - transition('hide => show', animate('.5s ease-in')), - transition('show => hide', animate('.5s ease-out')) - ]) - ] -}) -export class UpdateToastComponent implements OnInit { - @Output('emitCloseToast') - emitCloseToast = new EventEmitter(); - @Input() - releaseData: ReleaseData - @Input() - updatePwa: boolean; - - - error: any; - showUpdateToast: string = 'hide'; - showReleaseNotesCard: string = 'hide'; - destroyToast: boolean = false; - destroyReleaseNotesCard: boolean = false; - releaseNotes: string; - releaseName: string; - downloadingUpdate: boolean = false; - updateDownloaded: boolean = false; - version: string; - updateErrorSub: Subscription; - updateError: boolean; - updateDownloadedSub: Subscription; - constructor(private electronService: ElectronService, - private cd: ChangeDetectorRef, - private updates: SwUpdate, - private settingsDbService: SettingsDbService,) { } - - ngOnInit() { - if (!this.updatePwa) { - this.releaseName = this.releaseData.releaseName; - this.releaseNotes = this.releaseData.releaseNotes.substring(this.releaseData.releaseNotes.indexOf('') + 5); - this.version = this.releaseData.version; - } - - this.updateDownloadedSub = this.electronService.updateDownloaded.subscribe(val => { - this.updateDownloaded = val; - this.cd.detectChanges(); - }) - - this.updateErrorSub = this.electronService.updateError.subscribe(val => { - this.updateError = val; - if (this.updateError) { - this.error = true; - this.cd.detectChanges(); - } - }) - } - - ngOnDestroy() { - this.updateDownloadedSub.unsubscribe(); - this.updateErrorSub.unsubscribe(); - } - ngAfterViewInit(){ - this.showUpdateToast = 'show'; - this.cd.detectChanges(); - } - - closeToast() { - this.showUpdateToast = 'hide'; - this.cd.detectChanges(); - setTimeout(() => { - this.destroyToast = true; - this.emitCloseToast.emit(true); - }, 500); - } - - viewReleaseNotes() { - this.destroyReleaseNotesCard = false; - this.showReleaseNotesCard = 'show'; - this.cd.detectChanges(); - } - - closeReleaseNotes() { - this.showReleaseNotesCard = 'hide'; - this.cd.detectChanges(); - setTimeout(() => { - this.destroyReleaseNotesCard = true; - }, 500); - } - - async updateNow() { - await firstValueFrom(this.settingsDbService.updateWithObservable(this.settingsDbService.globalSettings)); - let updatedSettings: Settings[] = await firstValueFrom(this.settingsDbService.getAllSettings()); - this.settingsDbService.setAll(updatedSettings); - this.downloadingUpdate = true; - this.cd.detectChanges(); - this.electronService.sendUpdateSignal(); - } - - async quitAndInstall() { - if (this.updatePwa) { - this.updates.activateUpdate() - .then((success) => { - console.log('MEASUR updated successfully') - window.location.reload(); - }) - .catch(error => { - console.log('error during MEASUR update') - this.error = true; - }); - } else { - this.electronService.sendQuitAndInstall(); - } - } - - -} diff --git a/src/app/waste-water/explore-opportunities/explore-opportunities.component.html b/src/app/waste-water/explore-opportunities/explore-opportunities.component.html index 23f629ed43..a94794cf18 100644 --- a/src/app/waste-water/explore-opportunities/explore-opportunities.component.html +++ b/src/app/waste-water/explore-opportunities/explore-opportunities.component.html @@ -41,6 +41,3 @@

- - \ No newline at end of file diff --git a/src/app/waste-water/explore-opportunities/explore-opportunities.component.ts b/src/app/waste-water/explore-opportunities/explore-opportunities.component.ts index ba8757ebc6..e75065ae75 100644 --- a/src/app/waste-water/explore-opportunities/explore-opportunities.component.ts +++ b/src/app/waste-water/explore-opportunities/explore-opportunities.component.ts @@ -2,6 +2,7 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { Subscription } from 'rxjs'; import { WasteWater, WasteWaterData } from '../../shared/models/waste-water'; import { WasteWaterService } from '../waste-water.service'; +import { SnackbarService } from '../../shared/snackbar-notification/snackbar.service'; @Component({ selector: 'app-explore-opportunities', @@ -16,9 +17,7 @@ export class ExploreOpportunitiesComponent implements OnInit { selectedModificationIdSub: Subscription; smallScreenTab: string = 'form'; - toastData: { title: string, body: string, setTimeoutVal: number } = { title: '', body: '', setTimeoutVal: undefined }; - showToast: boolean = false; - constructor(private wasteWaterService: WasteWaterService) { } + constructor(private wasteWaterService: WasteWaterService, private snackbarService: SnackbarService) { } ngOnInit(): void { this.selectedModificationIdSub = this.wasteWaterService.selectedModificationId.subscribe(selectedModificationId => { @@ -26,7 +25,7 @@ export class ExploreOpportunitiesComponent implements OnInit { let modification: WasteWaterData = this.wasteWaterService.getModificationFromId(); if (modification) { this.modificationExists = true; - this.checkExploreOpps(modification); + this.notifyExploreOpps(modification); } else { this.modificationExists = false; } @@ -53,30 +52,12 @@ export class ExploreOpportunitiesComponent implements OnInit { } - checkExploreOpps(modification: WasteWaterData) { + notifyExploreOpps(modification: WasteWaterData) { if (modification && !modification.exploreOpportunities) { - let title: string = 'Explore Opportunities'; - let body: string = 'The selected modification was created using the expert view. There may be changes to the modification that are not visible from this screen.'; - this.openToast(title, body); - }else if(this.showToast){ - this.hideToast(); + this.snackbarService.setSnackbarMessage('exploreOpportunities', 'info', 'long'); } } - openToast(title: string, body: string) { - this.toastData.title = title; - this.toastData.body = body; - this.showToast = true; - } - - hideToast() { - this.showToast = false; - this.toastData = { - title: '', - body: '', - setTimeoutVal: undefined - } - } setSmallScreenTab(selectedTab: string) { this.smallScreenTab = selectedTab; diff --git a/src/app/waste-water/waste-water.module.ts b/src/app/waste-water/waste-water.module.ts index b71d4c4b9a..9a2e81317d 100644 --- a/src/app/waste-water/waste-water.module.ts +++ b/src/app/waste-water/waste-water.module.ts @@ -37,7 +37,6 @@ import { ExploreAeratorFormComponent } from './explore-opportunities/explore-opp import { WasteWaterDiagramComponent } from './waste-water-diagram/waste-water-diagram.component'; import { ExploreActivatedSludgeFormComponent } from './explore-opportunities/explore-opportunities-form/explore-activated-sludge-form/explore-activated-sludge-form.component'; import { SharedPipesModule } from '../shared/shared-pipes/shared-pipes.module'; -import { ToastModule } from '../shared/toast/toast.module'; import { UpdateUnitsModalModule } from '../shared/update-units-modal/update-units-modal.module'; import { WasteWaterOperationsComponent } from './waste-water-operations/waste-water-operations.component'; import { WasteWaterOperationsService } from './waste-water-operations/waste-water-operations.service'; @@ -51,6 +50,7 @@ import { WasteWaterCalculatorsComponent } from './waste-water-calculators/waste- import { WelcomeScreenComponent } from './welcome-screen/welcome-screen.component'; import { Co2HelpTextModule } from '../shared/co2-help-text/co2-help-text.module'; import { ImportExportModule } from '../shared/import-export/import-export.module'; +import { SnackbarModule } from '../shared/snackbar-notification/snackbar.module'; @NgModule({ declarations: [ @@ -94,14 +94,14 @@ import { ImportExportModule } from '../shared/import-export/import-export.module WasteWaterAnalysisModule, TabsTooltipModule, SharedPipesModule, - ToastModule, UpdateUnitsModalModule, AssessmentCo2SavingsModule, O2UtilizationRateModule, StatePointAnalysisModule, WaterReductionModule, Co2HelpTextModule, - ImportExportModule + ImportExportModule, + SnackbarModule ], providers: [ WasteWaterService, diff --git a/src/assets/styles/utilities.css b/src/assets/styles/utilities.css index 40cb6c4025..8bee924114 100644 --- a/src/assets/styles/utilities.css +++ b/src/assets/styles/utilities.css @@ -499,3 +499,12 @@ a:not([href]):not([tabindex]).disabled-link:hover { font-size: large; color: #FFE400; } + + + @media print { + .card-toast-notification { + display: none; + } + } + + \ No newline at end of file