diff --git a/SAS/TMSS/frontend/tmss_webapp/package-lock.json b/SAS/TMSS/frontend/tmss_webapp/package-lock.json index 034f2620e09636da0d899ce4b5baddc21c44fe7d..17f76618b076e5cae4b28e1d5e206833d117f9a2 100644 --- a/SAS/TMSS/frontend/tmss_webapp/package-lock.json +++ b/SAS/TMSS/frontend/tmss_webapp/package-lock.json @@ -633,9 +633,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/terser": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", - "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -671,6 +671,18 @@ "node": ">=0.10.0" } }, + "node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -790,11 +802,6 @@ "postcss": "^8.4.21" } }, - "node_modules/pac-resolver/node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" - }, "node_modules/gauge": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", @@ -1025,6 +1032,28 @@ "react": ">=16.8.0" } }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", @@ -1321,15 +1350,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/npm-check-updates/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", @@ -1344,6 +1364,32 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dependencies": { + "minipass-flush": "^1.0.5", + "minipass-fetch": "^2.0.3", + "minipass": "^3.1.6", + "minipass-pipeline": "^1.2.4", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "http-cache-semantics": "^4.1.0", + "ssri": "^9.0.0", + "socks-proxy-agent": "^7.0.0", + "cacache": "^16.1.0", + "https-proxy-agent": "^5.0.0", + "promise-retry": "^2.0.1", + "minipass-collect": "^1.0.2", + "http-proxy-agent": "^5.0.0", + "agentkeepalive": "^4.2.1", + "negotiator": "^0.6.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -1949,9 +1995,9 @@ } }, "node_modules/@types/sockjs": { - "version": "0.3.35", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.35.tgz", - "integrity": "sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==", + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "dependencies": { "@types/node": "*" @@ -2158,6 +2204,15 @@ "postcss": "^8.4" } }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/jest-jasmine2/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2301,6 +2356,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -2346,19 +2414,6 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -2406,14 +2461,14 @@ } }, "node_modules/@types/prop-types": { - "version": "15.7.9", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", - "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" + "version": "15.7.10", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", + "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==" }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, "node_modules/string.prototype.trimstart": { @@ -2635,9 +2690,9 @@ } }, "node_modules/@types/yauzl": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.2.tgz", - "integrity": "sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "optional": true, "dependencies": { "@types/node": "*" @@ -2743,9 +2798,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001553", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001553.tgz", - "integrity": "sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==", + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", "funding": [ { "type": "opencollective", @@ -2762,9 +2817,9 @@ ] }, "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dev": true, "dependencies": { "ignore": "^5.2.0", @@ -2782,7 +2837,7 @@ "@ungap/structured-clone": "^1.2.0", "imurmurhash": "^0.1.4", "cross-spawn": "^7.0.2", - "@eslint/eslintrc": "^2.1.2", + "@eslint/eslintrc": "^2.1.3", "graphemer": "^1.4.0", "is-path-inside": "^3.0.3", "@nodelib/fs.walk": "^1.2.8", @@ -2804,7 +2859,7 @@ "find-up": "^5.0.0", "optionator": "^0.9.3", "escape-string-regexp": "^4.0.0", - "@eslint/js": "8.52.0" + "@eslint/js": "8.53.0" }, "bin": { "eslint": "bin/eslint.js" @@ -2988,6 +3043,18 @@ "ajv": "^6.9.1" } }, + "node_modules/react-scripts/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -3250,9 +3317,9 @@ } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -3443,9 +3510,9 @@ } }, "node_modules/@types/yargs-parser": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", - "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==" + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/npm-check-updates/node_modules/brace-expansion": { "version": "2.0.1", @@ -3664,9 +3731,9 @@ } }, "node_modules/pptr-testing-library/node_modules/@types/yargs": { - "version": "15.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", - "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", + "version": "15.0.18", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.18.tgz", + "integrity": "sha512-DDi2KmvAnNsT/EvU8jp1UR7pOJojBtJ3GLZ/uw1MUq4VbbESppPWoHUY4h0OB4BbEbGJiyEsmUcuZDZtoR+ZwQ==", "dependencies": { "@types/yargs-parser": "*" } @@ -3845,9 +3912,9 @@ "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==" }, "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "dev": true }, "node_modules/postcss-initial": { @@ -3927,9 +3994,9 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", - "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.6.tgz", + "integrity": "sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA==" }, "node_modules/string-width-cjs": { "name": "string-width", @@ -4065,9 +4132,9 @@ } }, "node_modules/@types/mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", - "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, "node_modules/shebang-regex": { @@ -4079,9 +4146,9 @@ } }, "node_modules/cssdb": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.8.0.tgz", - "integrity": "sha512-SkeezZOQr5AHt9MgJgSFNyiuJwg1p8AwoVln6JwaQJsyxduRW9QJ+HP/gAQzbsz8SIqINtYvpJKjxTRI67zxLg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.9.0.tgz", + "integrity": "sha512-WPMT9seTQq6fPAa1yN4zjgZZeoTriSN2LqW9C+otjar12DQIWA4LuSfFrvFJiKp4oD0xIk1vumDLw8K9ur4NBw==", "dev": true, "funding": [ { @@ -4130,6 +4197,15 @@ "react": "^15.0.2 || ^16.0.0 || ^17.0.0" } }, + "node_modules/workbox-build/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/jest-util/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4377,9 +4453,9 @@ } }, "node_modules/jest-editor-support/node_modules/@types/yargs": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.7.tgz", - "integrity": "sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg==", + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", + "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -4589,9 +4665,9 @@ } }, "node_modules/chromium-bidi": { - "version": "0.4.32", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.32.tgz", - "integrity": "sha512-RJnw0PW3sNdx1WclINVfVVx8JUH+tWTHZNpnEzlcM+Qgvf40dUH34U7gJq+cc/0LE+rbPxeT6ldqWrCbUf4jeg==", + "version": "0.4.33", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.33.tgz", + "integrity": "sha512-IxoFM5WGQOIAd95qrSXzJUv4eXIrh+RvU3rwwqIiwYuvfE7U/Llj4fejbsJnjJMUYCuGtVQsY2gv7oGl4aTNSQ==", "dependencies": { "mitt": "3.0.1", "urlpattern-polyfill": "9.0.0" @@ -4754,6 +4830,19 @@ "node": ">= 0.4.0" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/es6-weak-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", @@ -4900,9 +4989,9 @@ "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" }, "node_modules/is-symbol": { "version": "1.0.4", @@ -4919,6 +5008,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/react-scripts/node_modules/jest-leak-detector": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", @@ -5412,9 +5509,9 @@ } }, "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.7.tgz", - "integrity": "sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg==", + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", + "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -5517,13 +5614,9 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -5541,9 +5634,9 @@ "dev": true }, "node_modules/eslint-formatter-gitlab": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-gitlab/-/eslint-formatter-gitlab-5.0.0.tgz", - "integrity": "sha512-4mF/Bam1xAzsNNYE7kWN/qBQD4mSMkDBEw5AoMLY4oU5iY7BxTxcAzs253FNnUKc5FvduD4Q4+/RW9l1xjz7Zg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-formatter-gitlab/-/eslint-formatter-gitlab-5.1.0.tgz", + "integrity": "sha512-IxhrjLYzDlbFgPWEnvZlWLwPjMeyymbyo0hDHWntZ3DSAP9AP9huj15KbU+BK3OqeO3OHhbFEh2TA6sR0KZhkA==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -5553,7 +5646,7 @@ "url": "https://github.com/sponsors/remcohaszing" }, "peerDependencies": { - "eslint": "^5 || ^6 || ^7 || ^8" + "eslint": ">=5" } }, "node_modules/raw-body": { @@ -6312,9 +6405,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -6348,9 +6441,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.4.tgz", - "integrity": "sha512-JXZNOkggUAc9T5E7nCrimoXHcSf9h3NWFe5sh36CGD/3M5TRLuQeFnQoDsit2uVTqgoOZHLx5rTykLUu16vsMQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", "dev": true, "dependencies": { "is-glob": "^4.0.3", @@ -6581,9 +6674,9 @@ } }, "node_modules/@types/stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, "node_modules/tar/node_modules/yallist": { @@ -6624,9 +6717,9 @@ } }, "node_modules/jest-jasmine2/node_modules/@types/yargs": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.7.tgz", - "integrity": "sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg==", + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", + "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -6715,9 +6808,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.566", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.566.tgz", - "integrity": "sha512-mv+fAy27uOmTVlUULy15U3DVJ+jg+8iyKH1bpwboCRhtDC69GKf1PPTZvEIhCyDr81RFqfxZJYrbgp933a1vtg==" + "version": "1.4.578", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.578.tgz", + "integrity": "sha512-V0ZhSu1BQZKfG0yNEL6Dadzik8E1vAzfpVOapdSiT9F6yapEJ3Bk+4tZ4SMPdWiUchCgnM/ByYtBzp5ntzDMIA==" }, "node_modules/@babel/parser": { "version": "7.23.0", @@ -6774,9 +6867,9 @@ } }, "node_modules/streamx": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", - "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.2.tgz", + "integrity": "sha512-b62pAV/aeMjUoRN2C/9F0n+G8AfcJjNC0zw/ZmOHeFsIe4m4GzjVW9m6VHXVjk536NbdU9JRwKMJRfkc+zUFTg==", "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -6968,9 +7061,9 @@ } }, "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" }, "node_modules/sass-loader": { "version": "12.6.0", @@ -7010,6 +7103,17 @@ } } }, + "node_modules/node-gyp/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/jest-editor-support/node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -7200,23 +7304,6 @@ "elliptic": "^6.5.3" } }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/@xobotyi/scrollbar-width": { "version": "1.9.5", "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", @@ -7839,9 +7926,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", - "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/tempy/node_modules/type-fest": { "version": "0.16.0", @@ -7871,11 +7958,12 @@ } }, "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, "dependencies": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { @@ -8003,6 +8091,17 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/node-gyp/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/urlpattern-polyfill": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz", @@ -8799,6 +8898,19 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/babel-loader/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -8831,9 +8943,9 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.12.tgz", - "integrity": "sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -9169,9 +9281,9 @@ } }, "node_modules/@types/express": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", - "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -9454,6 +9566,17 @@ "node": ">=10" } }, + "node_modules/node-gyp/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/react-use-websocket": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/react-use-websocket/-/react-use-websocket-4.5.0.tgz", @@ -9696,9 +9819,9 @@ "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" }, "node_modules/@types/http-errors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", - "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true }, "node_modules/methods": { @@ -9924,19 +10047,6 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, - "node_modules/svgo/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -10054,24 +10164,24 @@ } }, "node_modules/axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", + "make-fetch-happen": "^10.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -10119,9 +10229,9 @@ } }, "node_modules/@types/warning": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.2.tgz", - "integrity": "sha512-S/2+OjBIcBl8Kur23YLe0hG1e7J5m2bHfB4UuMNoLZjIFhQWhTf1FeS+WFoXHUC6QsCEfk4pftj4J1KIKC1glA==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" }, "node_modules/eastasianwidth": { "version": "0.2.0", @@ -10327,9 +10437,9 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@types/yargs": { - "version": "17.0.29", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", - "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", + "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -10544,9 +10654,9 @@ } }, "node_modules/@types/raf": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.2.tgz", - "integrity": "sha512-sM4HyDVlDFl4goOXPF+g9nNHJFZQGot+HgySjM4cRjqXzjdatcEvYrtG4Ia8XumR9T6k8G2tW9B7hnUj51Uf0A==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz", + "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==", "optional": true }, "node_modules/ini": { @@ -10811,9 +10921,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.6", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", - "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" @@ -10887,9 +10997,9 @@ "dev": true }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.39", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", - "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "dev": true, "dependencies": { "@types/node": "*", @@ -10962,23 +11072,6 @@ "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", "dev": true }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dev": true, - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, "node_modules/jest-jasmine2/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -11090,9 +11183,9 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", - "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, "dependencies": { "@types/http-errors": "*", @@ -11275,6 +11368,19 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -11344,9 +11450,9 @@ "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==" }, "node_modules/@types/q": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.7.tgz", - "integrity": "sha512-HBPgtzp44867rkL+IzQ3560/E/BlobwCjeXsuKqogrcE99SKgZR4tvBBCuNJZMhUFMz26M7cjKWZg785lllwpA==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", "dev": true }, "node_modules/levn": { @@ -11869,15 +11975,15 @@ } }, "node_modules/puppeteer-core": { - "version": "21.4.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.4.1.tgz", - "integrity": "sha512-Lh0e+oGhUquxVOi1U701gTfFLFvw5gDBFh3CWpnfAvtItmyZKUce4R54VNfOJfi+KKnzhVPdB/lDrg65gdRIng==", + "version": "21.5.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.5.0.tgz", + "integrity": "sha512-qG0RJ6qKgFz09UUZxDB9IcyTJGypQXMuE8WmEoHk7kgjutmRiOVv5RgsyUkY67AxDdBWx21bn1PHHRJnO/6b4A==", "dependencies": { "@puppeteer/browsers": "1.8.0", - "chromium-bidi": "0.4.32", + "chromium-bidi": "0.4.33", "cross-fetch": "4.0.0", "debug": "4.3.4", - "devtools-protocol": "0.0.1191157", + "devtools-protocol": "0.0.1203626", "ws": "8.14.2" }, "engines": { @@ -12040,9 +12146,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", - "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -12118,11 +12224,11 @@ } }, "node_modules/@types/node": { - "version": "20.8.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.8.tgz", - "integrity": "sha512-YRsdVxq6OaLfmR9Hy816IMp33xOBjfyOgUd77ehqg96CFywxAPbDbXvAsuN2KVg2HOT8Eh6uAfU+l4WffwPVrQ==", + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", "dependencies": { - "undici-types": "~5.25.1" + "undici-types": "~5.26.4" } }, "node_modules/path-scurry": { @@ -12186,14 +12292,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/get-uri/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -12227,6 +12325,18 @@ "node": ">=8" } }, + "node_modules/workbox-build/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/launch-editor": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", @@ -12382,26 +12492,6 @@ "postcss": "^8.4" } }, - "node_modules/degenerator/node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, "node_modules/postcss-color-functional-notation": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", @@ -12612,6 +12702,20 @@ "entities": "^2.0.0" } }, + "node_modules/react-scripts/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -12734,9 +12838,9 @@ } }, "node_modules/@types/qs": { - "version": "6.9.9", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", - "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", "dev": true }, "node_modules/tsconfig-paths/node_modules/json5": { @@ -12775,9 +12879,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -12807,9 +12911,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.1.tgz", + "integrity": "sha512-opCrKqbthmq3SKZ10mFMQG9dk3fTa3quaOLD35kJa5ejwZHd9xAr+kLuziiZz2cG32s4lMZxNdmdcEQnTDP4+g==", "dev": true, "engines": { "node": ">=8" @@ -12982,17 +13086,16 @@ } }, "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dependencies": { "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=6 <7 || >=8" } }, "node_modules/cacache/node_modules/minipass": { @@ -13279,9 +13382,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", - "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", + "version": "18.2.15", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.15.tgz", + "integrity": "sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==", "dev": true, "dependencies": { "@types/react": "*" @@ -13449,6 +13552,11 @@ "node": ">= 14" } }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -13560,9 +13668,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.29", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", - "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", + "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -13827,27 +13935,15 @@ "dev": true }, "node_modules/core-js-pure": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.1.tgz", - "integrity": "sha512-wCXGbLjnsP10PlK/thHSQlOLlLKNEkaWbTzVvHHZ79fZNeN1gUmw2gBlpItxPv/pvqldevEXFh/d5stdNvl6EQ==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.2.tgz", + "integrity": "sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q==", "hasInstallScript": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -14027,15 +14123,6 @@ "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -14192,19 +14279,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/popper.js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", @@ -14953,27 +15027,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jsdom/node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.22.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", @@ -15046,15 +15099,35 @@ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.4", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/jsx-ast-utils": { @@ -15417,11 +15490,11 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "node_modules/interactjs": { - "version": "1.10.19", - "resolved": "https://registry.npmjs.org/interactjs/-/interactjs-1.10.19.tgz", - "integrity": "sha512-5zWXBrfLnXAyhrxKlhRiud/JxWd3GvZkvdTf8bqjeHWDx9zgiu+qFNA3nnJMszadFCig2GU5zKx9PYrkT87OKA==", + "version": "1.10.20", + "resolved": "https://registry.npmjs.org/interactjs/-/interactjs-1.10.20.tgz", + "integrity": "sha512-jNFZiuBUL/j9Kkv6c89l+v5NpOn1m2LE8t7TrQOQBpBaYObYG6y6FHfqIMlF2XEcR6gCFLUQGQ3F0qBjqUMZvQ==", "dependencies": { - "@interactjs/types": "1.10.19" + "@interactjs/types": "1.10.20" } }, "node_modules/@babel/plugin-syntax-numeric-separator": { @@ -15790,9 +15863,9 @@ } }, "node_modules/@types/serve-index": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.3.tgz", - "integrity": "sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "dependencies": { "@types/express": "*" @@ -15829,27 +15902,6 @@ "react-dom": ">=16.6.0" } }, - "node_modules/jest-editor-support/node_modules/@babel/traverse": { - "version": "7.20.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz", - "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/postcss-preset-env": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", @@ -15936,14 +15988,6 @@ "popper.js": "^1.16.1" } }, - "node_modules/get-uri/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -16086,9 +16130,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==" + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/pptr-testing-library/node_modules/@jest/types": { "version": "26.6.2", @@ -16222,9 +16266,9 @@ } }, "node_modules/@types/range-parser": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", - "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, "node_modules/is-promise": { @@ -16864,9 +16908,9 @@ "dev": true }, "node_modules/@interactjs/types": { - "version": "1.10.19", - "resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.10.19.tgz", - "integrity": "sha512-oEqGmt9/Ob+jz0FUaBzpDXBmf+2dfdhPuEwQcMGH6nQTR2ETGtYIlAnQtADHvnCin+cVkrmqVohfHBysyQr4Lw==" + "version": "1.10.20", + "resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.10.20.tgz", + "integrity": "sha512-59QRmyawJCCSx9H9tE7MaIC9dYprc27vspJ+zvwfIpt1/ZmosM64c1XiqM3Z2/FZ2/C5BTGZ/bJJLEokr56aJg==" }, "node_modules/handle-thing": { "version": "2.0.1", @@ -16925,14 +16969,14 @@ "dev": true }, "node_modules/jest-editor-support": { - "version": "31.1.1", - "resolved": "https://registry.npmjs.org/jest-editor-support/-/jest-editor-support-31.1.1.tgz", - "integrity": "sha512-bCKpKWAMLhjK7QDX9geBDzfyvZacl937hnT3Z+yfERBx8bB7yZg2uhvCBErqO51Ie+wgg42Ffo8rn+Nhdr2hHQ==", + "version": "31.1.2", + "resolved": "https://registry.npmjs.org/jest-editor-support/-/jest-editor-support-31.1.2.tgz", + "integrity": "sha512-QlCN8dWVxMcmvzbkH2G1gSNjMPFM+69+Lx9WZcpYiHEaqrb1QKuVJrVNfbjHrlv0PhgCvzf1EdYKh8qqrQ3Rhw==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/runtime": "^7.20.7", - "@babel/traverse": "7.20.10", + "@babel/traverse": "7.23.2", "@babel/types": "^7.20.7", "core-js": "^3.17.3", "jest-snapshot": "^27.2.0" @@ -16982,9 +17026,9 @@ } }, "node_modules/@types/body-parser": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", - "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "dependencies": { "@types/connect": "*", @@ -17124,27 +17168,27 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", "dev": true, "dependencies": { - "ast-types-flow": "^0.0.7", - "semver": "^6.3.0", - "axobject-query": "^3.1.1", - "@babel/runtime": "^7.20.7", - "language-tags": "=1.0.5", - "axe-core": "^4.6.2", - "array.prototype.flatmap": "^1.3.1", - "aria-query": "^5.1.3", - "object.fromentries": "^2.0.6", + "ast-types-flow": "^0.0.8", + "axobject-query": "^3.2.1", + "hasown": "^2.0.0", + "@babel/runtime": "^7.23.2", + "language-tags": "^1.0.9", + "axe-core": "=4.7.0", + "array.prototype.flatmap": "^1.3.2", + "aria-query": "^5.3.0", + "object.fromentries": "^2.0.7", "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.15", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "has": "^1.0.3", + "object.entries": "^1.1.7", "damerau-levenshtein": "^1.0.8", - "jsx-ast-utils": "^3.3.3", - "array-includes": "^3.1.6" + "jsx-ast-utils": "^3.3.5", + "array-includes": "^3.1.7" }, "engines": { "node": ">=4.0" @@ -17508,9 +17552,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "bin": { "acorn": "bin/acorn" }, @@ -17707,19 +17751,6 @@ "get-intrinsic": "^1.2.1" } }, - "node_modules/get-uri/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, "node_modules/npmlog": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", @@ -17886,9 +17917,9 @@ } }, "node_modules/react-scripts/node_modules/@types/yargs": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.7.tgz", - "integrity": "sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg==", + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", + "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -17971,9 +18002,9 @@ } }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.4.tgz", - "integrity": "sha512-ZchYkbieA+7tnxwX/SCBySx9WwvWR8TaP5tb2jRAzwvLb/rWchGw3v0w3pqUbUvj0GCwW2Xz/AVPSk6kUGctXQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -17989,9 +18020,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.44.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", - "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", + "version": "8.44.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz", + "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -18059,9 +18090,9 @@ "peer": true }, "node_modules/@types/eslint-scope": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", - "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", + "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==", "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -18165,9 +18196,9 @@ } }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, "node_modules/semver": { @@ -18295,9 +18326,9 @@ } }, "node_modules/ua-parser-js": { - "version": "1.0.36", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.36.tgz", - "integrity": "sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==", + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", + "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", "funding": [ { "type": "opencollective", @@ -18693,9 +18724,9 @@ } }, "node_modules/@types/aria-query": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.3.tgz", - "integrity": "sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true }, "node_modules/tempy": { @@ -19085,9 +19116,9 @@ } }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", - "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -19296,6 +19327,15 @@ } } }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -19357,9 +19397,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/@types/http-proxy": { - "version": "1.17.13", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", - "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, "dependencies": { "@types/node": "*" @@ -19742,6 +19782,17 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/node-gyp/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -19823,6 +19874,15 @@ "node": ">=10" } }, + "node_modules/@types/node-forge": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.9.tgz", + "integrity": "sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/detect-port-alt/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -20079,6 +20139,17 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -20099,22 +20170,21 @@ } }, "node_modules/esprima": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", - "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", - "dev": true, + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=0.4.0" + "node": ">=4" } }, "node_modules/@types/graceful-fs": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", - "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -20180,9 +20250,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -20255,9 +20325,9 @@ } }, "node_modules/@types/babel__template": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", - "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -20509,6 +20579,15 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/create-react-context": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", @@ -20568,9 +20647,9 @@ } }, "node_modules/@types/ws": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz", - "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==", + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", + "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", "dev": true, "dependencies": { "@types/node": "*" @@ -20802,9 +20881,9 @@ "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, "node_modules/@types/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dependencies": { "@types/istanbul-lib-report": "*" } @@ -21046,9 +21125,9 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz", - "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.9.tgz", + "integrity": "sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg==", "dependencies": { "@types/react": "*" } @@ -21246,9 +21325,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", - "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -21431,9 +21510,9 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.1.tgz", - "integrity": "sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", + "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", "dev": true, "dependencies": { "browserslist": "^4.22.1" @@ -21643,9 +21722,9 @@ } }, "node_modules/@types/react-redux": { - "version": "7.1.28", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.28.tgz", - "integrity": "sha512-EQr7cChVzVUuqbA+J8ArWK1H0hLAHKOs21SIMrskKZ3nHNeE+LFYA+IsoZGhVOT8Ktjn3M20v4rnZKN3fLbypw==", + "version": "7.1.30", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.30.tgz", + "integrity": "sha512-i2kqM6YaUwFKduamV6QM/uHbb0eCP8f8ZQ/0yWf+BsAVVsZPRYJ9eeGWZ3uxLfWwwA0SrPRMTPTqsPFkY3HZdA==", "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -21953,9 +22032,9 @@ } }, "node_modules/@types/trusted-types": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.5.tgz", - "integrity": "sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.6.tgz", + "integrity": "sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg==", "dev": true }, "node_modules/has-proto": { @@ -22149,12 +22228,15 @@ } }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/process": { @@ -22242,12 +22324,11 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { - "node": ">= 10.0.0" + "node": ">= 4.0.0" } }, "node_modules/stack-utils/node_modules/escape-string-regexp": { @@ -22297,14 +22378,11 @@ } }, "node_modules/node-gyp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/postcss-svgo/node_modules/mdn-data": { @@ -22349,6 +22427,15 @@ "node": ">= 14" } }, + "node_modules/react-scripts/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/rollup-plugin-terser/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22362,9 +22449,9 @@ } }, "node_modules/jspdf-autotable": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.7.0.tgz", - "integrity": "sha512-K6R5U4W4E2RoINRMUvcAKmTwGMyN5DE634G35dcXyGuqzhjY4AgOBDss5+M91HEznvZ28k7rk0gAo8WfeDIXLw==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.7.1.tgz", + "integrity": "sha512-5fgjqE8nIwUoNz5l/i/aD/uONKofE4yp/kJ097EKBllPVTPGnGV5OWHld30db3+CvNrgzrRl8gmTnKF6vag05g==", "peerDependencies": { "jspdf": "^2.5.1" } @@ -22396,6 +22483,23 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dev": true, + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, "node_modules/npm-install-checks": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", @@ -22439,9 +22543,9 @@ } }, "node_modules/@types/connect": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", - "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "dependencies": { "@types/node": "*" @@ -22486,19 +22590,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jsdom/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", @@ -22523,6 +22614,11 @@ "node": ">= 14" } }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -22764,6 +22860,18 @@ "node": ">=0.10.0" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -22859,6 +22967,34 @@ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" }, + "node_modules/node-gyp/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dependencies": { + "minipass-flush": "^1.0.5", + "unique-filename": "^2.0.0", + "infer-owner": "^1.0.4", + "@npmcli/move-file": "^2.0.0", + "promise-inflight": "^1.0.1", + "tar": "^6.1.11", + "minipass": "^3.1.6", + "minipass-pipeline": "^1.2.4", + "lru-cache": "^7.7.1", + "ssri": "^9.0.0", + "chownr": "^2.0.0", + "mkdirp": "^1.0.4", + "minipass-collect": "^1.0.2", + "fs-minipass": "^2.1.0", + "@npmcli/fs": "^2.1.0", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "glob": "^8.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", @@ -22931,9 +23067,9 @@ } }, "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -22984,9 +23120,9 @@ } }, "node_modules/core-js": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.1.tgz", - "integrity": "sha512-qVSq3s+d4+GsqN0teRCJtM6tdEEXyWxjzbhVrCHmBS5ZTM0FS2MOS0D13dUXAWDUN6a+lHI/N1hF9Ytz6iLl9Q==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", + "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -22994,9 +23130,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -23065,9 +23201,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.6", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.6.tgz", - "integrity": "sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==", + "version": "29.5.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", + "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -23119,6 +23255,17 @@ "next-tick": "1" } }, + "node_modules/node-gyp/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@babel/helper-wrap-function": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", @@ -23853,9 +24000,9 @@ } }, "node_modules/domain-browser": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", - "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", + "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", "engines": { "node": ">=10" }, @@ -23895,9 +24042,9 @@ } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz", - "integrity": "sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz", + "integrity": "sha512-6mfQ6iNvhSKCZJoY6sIG3m0pKkdUcweVNOLuBBKvoWGzl2yRxOJcYOTRyLKt3nxXvBLJWa6QkW//tgbIwJehmA==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -23938,15 +24085,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/jest-jasmine2/node_modules/jest-each": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", @@ -24320,9 +24458,9 @@ } }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -24342,18 +24480,6 @@ "node": ">=6.0.0" } }, - "node_modules/json-schema-ref-parser/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -24411,6 +24537,11 @@ "node": ">= 6.0.0" } }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -24606,6 +24737,24 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/node-gyp/node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -24671,18 +24820,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/degenerator/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/replace-in-file/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -24741,6 +24878,15 @@ "randombytes": "^2.1.0" } }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", @@ -25154,9 +25300,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -25737,6 +25883,17 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/node-gyp/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -26093,6 +26250,18 @@ "postcss": "^8.2.15" } }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/postcss-normalize-unicode": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", @@ -26136,22 +26305,20 @@ "dev": true }, "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dependencies": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "estraverse": "^5.2.0", + "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=4.0" + "node": ">=6.0" }, "optionalDependencies": { "source-map": "~0.6.1" @@ -26387,9 +26554,9 @@ } }, "node_modules/react-live-clock": { - "version": "6.1.16", - "resolved": "https://registry.npmjs.org/react-live-clock/-/react-live-clock-6.1.16.tgz", - "integrity": "sha512-J8w3Af/gLG6Q+QB9+jAYm9cFBv6B1238KVSTBgpFiOHJkk7qJNlgTlEgUNDTBvKlHNauvk8QT+DyIZSCOIE6tg==", + "version": "6.1.18", + "resolved": "https://registry.npmjs.org/react-live-clock/-/react-live-clock-6.1.18.tgz", + "integrity": "sha512-NeNMHVMkzV4lqAlI2fRUW3j4i8uc44dR1/lRr5MAdmsVUUtrn9m9oNYL/rkPjcuaIhKniDtwJQyZhU8uC2X+nw==", "dependencies": { "moment": "^2.29.1", "moment-timezone": "^0.5.33" @@ -26840,19 +27007,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -27012,14 +27166,14 @@ } }, "node_modules/puppeteer": { - "version": "21.4.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.4.1.tgz", - "integrity": "sha512-opJqQeYMjAB3ICG8lCF3wtSs9k05dozmrEMrHgo3ZWbISiy8qbv/yAJz/6Io221qSh3yURfVf6Z7crrlzKZjLQ==", + "version": "21.5.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.5.0.tgz", + "integrity": "sha512-prvy9rdauyIaaEgefQRcw9zhQnYQbl8O1Gj5VJazKJ7kwNx703+Paw/1bwA+b96jj/S+r55hrmF5SfiEG5PUcg==", "hasInstallScript": true, "dependencies": { "@puppeteer/browsers": "1.8.0", "cosmiconfig": "8.3.6", - "puppeteer-core": "21.4.1" + "puppeteer-core": "21.5.0" }, "engines": { "node": ">=16.3.0" @@ -27062,9 +27216,9 @@ } }, "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/string.prototype.trimend": { "version": "1.0.7", @@ -27095,9 +27249,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1191157", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1191157.tgz", - "integrity": "sha512-Fu2mUhX7zkzLHMJZk5wQTiHdl1eJrhK0GypUoSzogUt51MmYEv/46pCz4PtGGFlr0f2ZyYDzzx5CPtbEkuvcTA==" + "version": "0.0.1203626", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1203626.tgz", + "integrity": "sha512-nEzHZteIUZfGCZtTiS1fRpC8UZmsfD1SiyPvaUNvS13dvKf666OAm8YTi0+Ca3n1nLEyu49Cy4+dPWpaHFJk9g==" }, "node_modules/ag-grid-community": { "version": "24.1.0", @@ -27876,6 +28030,22 @@ "node": ">=8" } }, + "node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, "node_modules/react-scripts/node_modules/resolve.exports": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", @@ -28087,9 +28257,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/@types/parse-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", - "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true }, "node_modules/html-encoding-sniffer": { @@ -28118,9 +28288,9 @@ } }, "node_modules/@types/react": { - "version": "18.2.31", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.31.tgz", - "integrity": "sha512-c2UnPv548q+5DFh03y8lEDeMfDwBn9G3dRwfkrxQMo/dOtRHUUO57k6pHvBIfH/VF4Nh+98mZ5aaSe+2echD5g==", + "version": "18.2.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz", + "integrity": "sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -28269,9 +28439,9 @@ } }, "node_modules/@types/send": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", - "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "dependencies": { "@types/mime": "^1", @@ -28685,9 +28855,9 @@ } }, "node_modules/yaml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", - "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true, "engines": { "node": ">= 14" @@ -28965,9 +29135,9 @@ } }, "node_modules/@types/invariant": { - "version": "2.2.36", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.36.tgz", - "integrity": "sha512-WdRjvN2y1PiXCmCIEBbe+eoHGylBQa2oIBGEQsfKMJzqff7fwv2OhyXcGQn70+dWII6a5W8Y3ipYwVnhf+IXig==" + "version": "2.2.37", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.37.tgz", + "integrity": "sha512-IwpIMieE55oGWiXkQPSBY1nw1nFs6bsKXTFskNY8sdS17K24vyEBRQZEwlRS7ZmXCWnJcQtbxWzly+cODWGs2A==" }, "node_modules/http-proxy": { "version": "1.18.1", diff --git a/SAS/TMSS/frontend/tmss_webapp/prepareTemplateSchemas_dev.js b/SAS/TMSS/frontend/tmss_webapp/prepareTemplateSchemas_dev.js index 63857a11b9a1d4e589ac2fe28735367914f86e1b..ddb2d68e3c0c752553dc0a2d14394d91526284e8 100644 --- a/SAS/TMSS/frontend/tmss_webapp/prepareTemplateSchemas_dev.js +++ b/SAS/TMSS/frontend/tmss_webapp/prepareTemplateSchemas_dev.js @@ -222,6 +222,7 @@ getTemplateFiles('../../backend/src/tmss/tmssapp/schemas').then(async (backEndFi taskTemplate.type_value = "ingest"; } + if (taskTemplate?.schema?.properties?.beamformer) { taskTemplate.schema.properties.beamformer["$ref"] = "#/definitions/beamformer"; } if (taskTemplate?.schema?.properties?.station_configuration) { taskTemplate.schema.properties.station_configuration["$ref"] = "#/definitions/station_configuration"; } if (taskTemplate?.schema?.properties?.QA) taskTemplate.schema.properties.QA["$ref"] = "#/definitions/QA"; if (taskTemplate?.schema?.properties?.duration) taskTemplate.schema.properties.duration["$ref"] = "#/definitions/duration"; diff --git a/SAS/TMSS/frontend/tmss_webapp/public/index.html b/SAS/TMSS/frontend/tmss_webapp/public/index.html index 4d5295648ddd04e625e8c19fb890c91f89629b5f..88a552b440609a910caa366a381cd8dfaf47556e 100644 --- a/SAS/TMSS/frontend/tmss_webapp/public/index.html +++ b/SAS/TMSS/frontend/tmss_webapp/public/index.html @@ -3,41 +3,14 @@ <head> <meta charset="utf-8" /> <link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> - <meta name="viewport" content="width=device-width, initial-scale=1" /> - <meta name="theme-color" content="#000000" /> - <meta - name="description" - content="Telescope Manager Specification System" - /> + <meta name="viewport" content="width=device-width, initial-scale=1.00, maximum-scale=3.00, minimum-scale=1.00"> + <meta name="description" content="Telescope Manager Specification System" /> <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> - <!-- - manifest.json provides metadata used when your web app is installed on a - user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ - --> <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> - <!-- - Notice the use of %PUBLIC_URL% in the tags above. - It will be replaced with the URL of the `public` folder during the build. - Only files inside the `public` folder can be referenced from the HTML. - - Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will - work correctly both with client-side routing and a non-root public URL. - Learn how to configure a non-root public URL by running `npm run build`. - --> <title>TMSS</title> </head> <body> <noscript>You need to enable JavaScript to run this app.</noscript> <div id="root"></div> - <!-- - This HTML file is a template. - If you open it directly in the browser, you will see an empty page. - - You can add webfonts, meta tags, or analytics to this file. - The build step will place the bundled scripts into the <body> tag. - - To begin the development, run `npm start` or `yarn start`. - To create a production bundle, use `npm run build` or `yarn build`. - --> </body> </html> diff --git a/SAS/TMSS/frontend/tmss_webapp/src/App.js b/SAS/TMSS/frontend/tmss_webapp/src/App.js index 06f9f40318a417bda2628d769ab7ffda38fd3964..0093bcdce0d3e12657aac0152cf56fb689bb5464 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/App.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/App.js @@ -1,11 +1,10 @@ -import React, {Component} from 'react'; -import { Redirect, BrowserRouter as Router} from 'react-router-dom'; +import { Component } from 'react'; +import { Redirect, BrowserRouter as Router } from 'react-router-dom'; import classNames from 'classnames'; import { AppTopbar } from './layout/components/AppTopbar'; -import AppMenu from './layout/components/AppMenu'; -import {AppFooter } from './layout/components/AppFooter'; -import {RoutedContent} from './routes'; +import AppMenu from './layout/components/AppMenu'; +import { RoutedContent } from './routes'; import AppBreadcrumb from "./layout/components/AppBreadcrumb"; import handleResponse from "./response.handler" import 'primeicons/primeicons.css'; @@ -16,18 +15,18 @@ import './layout/layout.scss'; import 'primeflex/primeflex.css'; import './App.scss'; import './App.css'; -import Auth from'./authenticate/auth'; -import { Login } from './authenticate/login'; +import Auth from './authenticate/auth'; + import pubsub from './utils/pubSub'; import { CustomDialog } from './layout/components/CustomDialog'; import AuthStore from './authenticate/auth.store'; -import {Provider} from "react-redux"; +import { Provider } from "react-redux"; import AuthComponent from './components/AuthComponent'; -const { publish, subscribe } = pubsub(); +const { publish, subscribe } = pubsub(); export { publish, @@ -37,17 +36,19 @@ class App extends Component { constructor() { super(); this.state = { - layoutMode: 'static', - currentMenu: '', - currentPath: '/', - PageTitle:'', - staticMenuInactive: localStorage.getItem('staticMenuInactive') === 'true', - overlayMenuActive: localStorage.getItem('overlayMenuActive') === 'true', - mobileMenuActive: localStorage.getItem('mobileMenuActive') === 'true', - authenticated: true, - findObjectPlaceholder: 'Sub Task', - redirect: window.location.pathname === '/'? '/su/timelineview/week': window.location.pathname, - isLogin: true + layoutMode: 'static', + currentMenu: '', + currentPath: '/', + PageTitle: '', + isBreadCrumbVisible: false, + isDateTimeVisible:true, + staticMenuInactive: localStorage.getItem('staticMenuInactive') === 'true', + overlayMenuActive: localStorage.getItem('overlayMenuActive') === 'true', + mobileMenuActive: localStorage.getItem('mobileMenuActive') === 'true', + authenticated: true, + findObjectPlaceholder: 'Sub Task', + redirect: window.location.pathname === '/' ? '/su/timelineview/week' : window.location.pathname, + isLogin: true }; this.onWrapperClick = this.onWrapperClick.bind(this); this.onToggleMenu = this.onToggleMenu.bind(this); @@ -59,16 +60,16 @@ class App extends Component { this.setSearchField = this.setSearchField.bind(this); this.toggleEditToggle = this.toggleEditToggle.bind(this); - this.menu = [ + this.menu = [ //{label: 'Dashboard', icon: 'pi pi-fw pi-home', to:'/dashboard',section: 'dashboard'}, - {label: 'Cycle', icon:'pi pi-fw pi-spinner', to:'/cycle',section: 'cycle'}, - {label: 'Project', icon: 'pi pi-fw pi-compass', to:'/project',section: 'project'}, - {label: 'Scheduling Units', icon: 'pi pi-fw pi-calendar', to:'/schedulingunit',section: 'schedulingunit'}, - {label: 'Tasks', icon: 'pi pi-fw pi-check-square', to:'/task'}, - {label: 'Workflow', icon: 'pi pi-fw pi-sitemap', to:'/su/workflow',section: 'workflow'}, - {label: 'Week View', icon: 'pi pi-fw pi-calendar-times', to:'/su/timelineview/week',section: 'su/timelineview/week'}, - {label: 'Reports', icon: 'pi pi-fw pi-chart-bar', to:'/reports',section: 'reports'}, - ]; + { label: 'Cycle', icon: 'pi pi-fw pi-spinner', to: '/cycle', section: 'cycle', isBreadCrumbVisible: true,isDateTimeVisible:false }, + { label: 'Project', icon: 'pi pi-fw pi-compass', to: '/project', section: 'project', isBreadCrumbVisible: true ,isDateTimeVisible:false}, + { label: 'Scheduling Units', icon: 'pi pi-fw pi-calendar', to: '/schedulingunit', section: 'schedulingunit', isBreadCrumbVisible: true ,isDateTimeVisible:false}, + { label: 'Tasks', icon: 'pi pi-fw pi-check-square', to: '/task', isBreadCrumbVisible: true ,isDateTimeVisible:false}, + { label: 'Workflow', icon: 'pi pi-fw pi-sitemap', to: '/su/workflow', section: 'workflow', isBreadCrumbVisible: true,isDateTimeVisible:false }, + { label: 'Week View', icon: 'pi pi-fw pi-calendar-times', to: '/su/timelineview/week', section: 'su/timelineview/week', isBreadCrumbVisible: false ,isDateTimeVisible:true}, + { label: 'Reports', icon: 'pi pi-fw pi-chart-bar', to: '/reports', section: 'reports', isBreadCrumbVisible: false ,isDateTimeVisible:false}, + ]; } onWrapperClick() { if (!this.menuClick) { @@ -107,7 +108,7 @@ class App extends Component { } ); } - event.preventDefault(); + event.preventDefault(); } onSidebarClick() { @@ -115,10 +116,10 @@ class App extends Component { } onMenuItemClick(event) { - this.setState({currentMenu:event.item.label, currentPath: event.item.path}); + this.setState({ currentMenu: event.item.label, currentPath: event.item.path, isBreadCrumbVisible: event.item.isBreadCrumbVisible, isDateTimeVisible:event.item.isDateTimeVisible }); } - - isDesktop() { + + isDesktop() { return window.innerWidth > 1024; } @@ -126,7 +127,7 @@ class App extends Component { if (PageTitle !== this.state.PageTitle) { this.setState({ PageTitle }) } - } + } /** * Callback function from login page to set the authentication state to true amd redirect to the @@ -138,7 +139,7 @@ class App extends Component { */ logout() { Auth.logout(); - this.setState({ redirect:"/login", isLogin: false}); + this.setState({ redirect: "/login", isLogin: false }); } /** @@ -148,7 +149,7 @@ class App extends Component { validateAndLogout() { if (this.state.isEditDirty) { this.toggleDirtyDialog(this.logout); - } else { + } else { this.logout(); } } @@ -158,7 +159,7 @@ class App extends Component { } componentDidMount() { - + subscribe('edit-dirty', (flag) => { this.setState({ isEditDirty: flag }, () => { if (flag) { @@ -166,21 +167,21 @@ class App extends Component { window.history.pushState(null, document.title, window.location.href); window.addEventListener('popstate', this.onBackButtonEvent); } else { - window.removeEventListener("beforeunload",reloadDirty); + window.removeEventListener("beforeunload", reloadDirty); } }); }); - let reloadDirty =function (e) { + let reloadDirty = function (e) { let confirmationMessage = "\\o/"; - (e || window.event).returnValue = confirmationMessage; //Gecko + IE - return confirmationMessage; + (e).returnValue = confirmationMessage; //Gecko + IE + return confirmationMessage; }; } componentDidUpdate() { - if(window.location.pathname === '/'){ - this.setState({redirect : '/su/timelineview/week'}) + if (window.location.pathname === '/') { + this.setState({ redirect: '/su/timelineview/week', isBreadCrumbVisible: false ,isDateTimeVisible:true}) } } @@ -189,21 +190,21 @@ class App extends Component { if (this.state.isEditDirty) { const leavePage = window.confirm("Do you want to discard your changes? Your changes may not be saved."); if (leavePage) { - this.setState({isEditDirty: false}); - window.history.back(); + this.setState({ isEditDirty: false }); + window.history.back(); } else { window.history.pushState(null, document.title, window.location.href); - } + } } } - close = () => { - this.setState({showDirtyDialog: false}); + close = () => { + this.setState({ showDirtyDialog: false }); } /** * Cancel edit and redirect to Cycle View page */ - cancelEdit = () => { + cancelEdit = () => { this.setState({ isEditDirty: false, showDirtyDialog: false }); this.state.toPathCallback(); } @@ -220,69 +221,67 @@ class App extends Component { callback(); } - /** - * Set search param - * @param {*} key - * @param {*} value - */ - setSearchField(key, value) { + /** + * Set search param + * @param {*} key + * @param {*} value + */ + setSearchField(key, value) { this.setState({ - objectType: key, - findObjectId: value, - redirect:"/find/object/"+key+"/"+value + objectType: key, + findObjectId: value, + redirect: "/find/object/" + key + "/" + value }); } - + render() { const wrapperClass = classNames('layout-wrapper', { 'layout-overlay': this.state.layoutMode === 'overlay', 'layout-static': this.state.layoutMode === 'static', 'layout-static-sidebar-inactive': this.state.staticMenuInactive && this.state.layoutMode === 'static', 'layout-overlay-sidebar-active': this.state.overlayMenuActive && this.state.layoutMode === 'overlay', - 'layout-mobile-sidebar-active': this.state.mobileMenuActive + 'layout-mobile-sidebar-active': this.state.mobileMenuActive }); return ( - <React.Fragment> + <div className="App"> <Provider store={AuthStore}> - {/* <div className={wrapperClass} onClick={this.onWrapperClick}> */} - <div className={wrapperClass}> - {/* Load main routes and application only if the application is authenticated */} - <> - {this.state.redirect && - // <AuthComponent isLogin = {this.state.isLogin}> - <AuthComponent> - <AppTopbar - onToggleMenu={this.onToggleMenu} - isLoggedIn={this.state.authenticated} - onLogout={this.validateAndLogout} - setSearchField={this.setSearchField} - /> - <Router basename={ this.state.currentPath }> - - <AppMenu model={this.menu} toggleDirtyDialog={this.toggleDirtyDialog} isEditDirty={this.state.isEditDirty} onMenuItemClick={this.onMenuItemClick} layoutMode={this.state.la} active={this.state.menuActive}/> - <div className="layout-main"> - {(this.state.redirect || this.state.redirect==="/login") && - <Redirect to={{pathname: this.state.redirect==="/login"?"/su/timelineview/week":this.state.redirect, state: {userrole: this.state.userrole}}} />} - <AppBreadcrumb setPageTitle={this.setPageTitle} section={this.state.currentMenu} onBreadcrumbClick={this.onBreadcrumbClick} /> - <RoutedContent /> - </div> - </Router> + <div className={wrapperClass}> + {/* Load main routes and application only if the application is authenticated */} + {this.state.redirect && + // <AuthComponent isLogin = {this.state.isLogin}> + <AuthComponent> + <AppTopbar + onToggleMenu={this.onToggleMenu} + isLoggedIn={this.state.authenticated} + onLogout={this.validateAndLogout} + setSearchField={this.setSearchField} + isDateTimeVisible={this.state.isDateTimeVisible} + /> + <Router basename={this.state.currentPath}> + + <AppMenu model={this.menu} toggleDirtyDialog={this.toggleDirtyDialog} isEditDirty={this.state.isEditDirty} onMenuItemClick={this.onMenuItemClick} layoutMode={this.state.la} active={this.state.menuActive} /> + <div className="layout-main"> + {(this.state.redirect || this.state.redirect === "/login") && + <Redirect to={{ pathname: this.state.redirect === "/login" ? "/su/timelineview/week" : this.state.redirect, state: { userrole: this.state.userrole } }} />} + {(this.state.isBreadCrumbVisible) && + <AppBreadcrumb setPageTitle={this.setPageTitle} section={this.state.currentMenu} onBreadcrumbClick={this.onBreadcrumbClick} /> + } + <RoutedContent /> + </div> + </Router> - <AppFooter></AppFooter> - </AuthComponent> - } - </> - <CustomDialog type="confirmation" visible={this.state.showDirtyDialog} width="40vw" - header={'Confirmation'} message={'Do you want to discard your changes? Your changes may not be saved.'} - content={''} onClose={this.close} - actions={ [ {id:"yes", title: 'Discard', callback: this.cancelEdit, className:'act-btn-dispose'}, - {id:"no", title: 'Cancel', className:'act-btn-cancel', callback: this.close} ]}> - </CustomDialog> - </div> + </AuthComponent> + } + <CustomDialog type="confirmation" visible={this.state.showDirtyDialog} width="40vw" + header={'Confirmation'} message={'Do you want to discard your changes? Your changes may not be saved.'} + content={''} onClose={this.close} + actions={[{ id: "yes", title: 'Discard', callback: this.cancelEdit, className: 'act-btn-dispose' }, + { id: "no", title: 'Cancel', className: 'act-btn-cancel', callback: this.close }]}> + </CustomDialog> + </div> </Provider> </div> - </React.Fragment> ); } } diff --git a/SAS/TMSS/frontend/tmss_webapp/src/__mocks__/task_templates.json b/SAS/TMSS/frontend/tmss_webapp/src/__mocks__/task_templates.json index ee125d2478a14e12ceec1556fa741bf536e71094..d27e1dc2012b55b433312fea09d7463e0d97acac 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/__mocks__/task_templates.json +++ b/SAS/TMSS/frontend/tmss_webapp/src/__mocks__/task_templates.json @@ -533,6 +533,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -2219,6 +2361,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -3905,6 +4189,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -5591,6 +6017,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -7277,6 +7845,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -8963,6 +9673,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -10649,6 +11501,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -12335,6 +13329,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -13515,7 +14651,7 @@ } }, "beamformer": { - "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/beamforming/3#/definitions/beamformer", + "$ref": "#/definitions/beamformer", "default": {} }, "duration": { @@ -14055,6 +15191,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -15217,7 +16495,7 @@ } }, "beamformer": { - "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/beamforming/3#/definitions/beamformer", + "$ref": "#/definitions/beamformer", "default": {} }, "duration": { @@ -15264,7 +16542,7 @@ } }, "beamformer": { - "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/beamforming/9#/definitions/beamformer", + "$ref": "#/definitions/beamformer", "default": {} }, "duration": { @@ -15804,6 +17082,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -16966,7 +18386,7 @@ } }, "beamformer": { - "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/beamforming/9#/definitions/beamformer", + "$ref": "#/definitions/beamformer", "default": {} }, "duration": { @@ -17545,6 +18965,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -19280,6 +20842,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -20474,7 +22178,7 @@ "default": {} }, "beamformer": { - "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/beamforming/9#/definitions/beamformer", + "$ref": "#/definitions/beamformer", "default": {} }, "calibrator": { @@ -21024,6 +22728,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -22178,7 +24024,7 @@ "default": {} }, "beamformer": { - "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/beamforming/9#/definitions/beamformer", + "$ref": "#/definitions/beamformer", "default": {} }, "calibrator": { @@ -22769,6 +24615,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -24510,6 +26498,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -25706,7 +27836,7 @@ "default": {} }, "beamformer": { - "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/beamforming/9#/definitions/beamformer", + "$ref": "#/definitions/beamformer", "default": {} }, "correlator": { @@ -26251,6 +28381,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -27405,7 +29677,7 @@ "default": {} }, "beamformer": { - "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/beamforming/9#/definitions/beamformer", + "$ref": "#/definitions/beamformer", "default": {} }, "correlator": { @@ -27986,6 +30258,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -29717,6 +32131,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -31448,6 +34004,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -33275,6 +35973,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -35199,6 +38039,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -37123,6 +40105,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -39047,6 +42171,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -40975,6 +44241,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -43075,6 +46483,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -45340,6 +48890,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -47605,6 +51297,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, @@ -49874,6 +53708,148 @@ ], "type": "object" }, + "lofar2antennafield": { + "additionalProperties": false, + "properties": { + "SAPs": { + "default": [ + {} + ], + "items": { + "sap": { + "default": {}, + "properties": { + "pointing": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "subbands": { + "default": [ + 0 + ], + "items": { + "maximum": 511, + "minimum": 0, + "type": "number" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "subbands", + "pointing" + ], + "type": "object" + } + }, + "minItems": 1, + "type": "array" + }, + "antenna_field": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/antenna_field", + "default": "HBA" + }, + "antenna_set": { + "default": "ALL", + "description": "Fields & antennas to use", + "enum": [ + "ALL", + "INNER", + "OUTER", + "SPARSE_EVEN", + "SPARSE_ODD" + ], + "type": "string" + }, + "lead_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timedelta", + "default": 2, + "description": "Number of seconds to start before the provided start time, to account for initialising the on-line signal chain, and for possibly negative geometrical delay compensation.", + "minimum": 0 + }, + "filter": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/stations/10/#/definitions/filter", + "default": "HBA_110_190" + }, + "first_beamlet": { + "default": 0, + "minimum": 0, + "type": "number" + }, + "observation_id": { + "default": 1, + "minimum": 1, + "type": "number" + }, + "start_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp" + }, + "stop_time": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/datetime/10#/definitions/timestamp", + "default": "2100-01-01T00:00:00Z" + }, + "HBA": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "tile_beam": { + "$ref": "https://tmss.lofar.eu/api/schemas/commonschematemplate/pointing/9#/definitions/pointing", + "default": {} + }, + "DAB_filter": { + "type": "boolean", + "default": false, + "description": "Enable hardware filter on DAB frequencies" + }, + "element_selection": { + "type": "string", + "default": "ALL", + "description": "Which element(s) to enable in each tile", + "enum": [ + "ALL", + "GENERIC_201512" + ] + } + } + }, + "dithering": { + "type": "object", + "additionalProperties": false, + "default": {}, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "power": { + "type": "number", + "description": "Power of dithering signal, in dBm", + "minimum": -25, + "maximum": -4, + "default": -4 + }, + "frequency": { + "type": "number", + "description": "Frequency of dithering signal, in Hz", + "default": 102000000 + } + } + } + }, + "required": [ + "observation_id", + "stop_time", + "antenna_field", + "antenna_set", + "filter", + "SAPs" + ], + "title": "lofar2antennafield", + "type": "object", + "version": 2 + }, "cluster_resources": { "additionalProperties": false, "default": {}, diff --git a/SAS/TMSS/frontend/tmss_webapp/src/components/JSONEditor/JEditor.js b/SAS/TMSS/frontend/tmss_webapp/src/components/JSONEditor/JEditor.js index 697cddebebd8a594eea8a03c6025e511e53fb2ea..1565cce1d0d563868a1be233a7d07f23e8ff961e 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/components/JSONEditor/JEditor.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/components/JSONEditor/JEditor.js @@ -875,7 +875,7 @@ function Jeditor(props) { // }; // properties[propertyKey] = newProperty; - } else if (propertyValue['$ref'] && propertyValue['$ref'].toLowerCase().indexOf('#/definitions/timestamp')>=0) { + } else if ( propertyValue?.['$ref'] && propertyValue?.['$ref'].toLowerCase().indexOf('#/definitions/timestamp')>=0) { let newProperty = {}; newProperty.format = 'datetime-local'; newProperty.validationType = 'dateTime'; @@ -900,7 +900,7 @@ function Jeditor(props) { newProperty.options.flatpickr["defaultMinute"] = systemTime.minutes(); } properties[propertyKey] = {...propertyValue, ...newProperty}; - } else if (propertyValue['$ref'] && propertyValue['$ref'].toLowerCase().indexOf('#/definitions/timedelta')>=0) { + } else if (propertyValue?.['$ref'] && propertyValue?.['$ref'].toLowerCase().indexOf('#/definitions/timedelta')>=0) { //TODO: Customization is applied only for constraints transit_offset fields as it is required to keep just time value (seconds) in some places like integration_time // set 'required' field value, it required in fields validation if (parentProps && parentProps.transit_offset) { diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/_overrides.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/_overrides.scss index 698947e1e4f065c6a7fa206d5bbcd7e34489ace1..c395c8127779d3bcd8f458914ac6b301da478a1e 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/layout/_overrides.scss +++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/_overrides.scss @@ -311,8 +311,6 @@ In Excel View the for Accordion background color override .__react_component_tooltip.place-left { font-size: 14px; width: 170px; -} -.__react_component_tooltip.place-left { padding-left: 10px; background-color: black; margin-left: -3px; @@ -419,9 +417,7 @@ h3 + div + p { margin-bottom: 0.25em !important; width: fit-content; } -.chips .p-inputtext { - // display: none; -} + .chipsview .p-chips-token-icon { display: none; } @@ -452,6 +448,7 @@ h3 + div + p { padding-top: 0px; padding-bottom: 0px; line-height: 2; + margin-left:5px; } .timeline-filters .p-button-icon-only { diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/_variables.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/_variables.scss index fe7ba49deb049db953fea7be0292bbe662059c70..5c69ac830b2a843eac8b32dc8fc110eb65970889 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/layout/_variables.scss +++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/_variables.scss @@ -37,6 +37,7 @@ $menuitemDarkBorderColor:rgba(246, 248, 252, 0.918); /* Topbar */ $topbarLeftBgColor:#3d4977; +$topbarLighterColor:#5C568A; $topbarRightBgColor:#3d4977; $topbarItemBadgeBgColor:#ef6262; $topbarItemBadgeColor:#ffffff; diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/components/AppFooter.js b/SAS/TMSS/frontend/tmss_webapp/src/layout/components/AppFooter.js deleted file mode 100644 index 2040255cb5d32bf11d7e6ca48996674ecd5798df..0000000000000000000000000000000000000000 --- a/SAS/TMSS/frontend/tmss_webapp/src/layout/components/AppFooter.js +++ /dev/null @@ -1,14 +0,0 @@ -import { Component } from 'react'; - -export class AppFooter extends Component { - - render() { - return ( - <div className="layout-footer"> - <span className="footer-text" style={{'marginRight': '5px', color:'#0066CC'}}><strong>TMSS</strong> by <strong>ASTRON</strong><span className="footer-version" >v0.1.4</span></span> - </div> - ); - } -} - -export default AppFooter; \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/components/AppFooter.test.js b/SAS/TMSS/frontend/tmss_webapp/src/layout/components/AppFooter.test.js deleted file mode 100644 index 2a6dd7e71ea2a44fce754d335333324feb0bb596..0000000000000000000000000000000000000000 --- a/SAS/TMSS/frontend/tmss_webapp/src/layout/components/AppFooter.test.js +++ /dev/null @@ -1,11 +0,0 @@ -import { render } from '@testing-library/react'; -import AppFooter from './AppFooter'; -import {removeReact18ConsoleErrors} from "../../utils/test.helper"; - -removeReact18ConsoleErrors() - -test('renders ASTRON in footer', () => { - const { getByText } = render(<AppFooter />); - const linkElement = getByText("ASTRON"); - expect(linkElement).toBeInTheDocument(); -}); diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/components/AppTopbar.js b/SAS/TMSS/frontend/tmss_webapp/src/layout/components/AppTopbar.js index 25d5931f056c4195502bf8220a5cc43049aee0de..03e8e60b54347ada33e404bd578952206551a46f 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/layout/components/AppTopbar.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/components/AppTopbar.js @@ -7,6 +7,7 @@ import 'primeflex/primeflex.css'; import { PropTypes } from 'prop-types'; import Auth from '../../authenticate/auth'; import { FindObject } from './FindObject'; +import DateTimeInfo from "./DateTimeInfo"; export class AppTopbar extends Component { constructor(props) { @@ -21,36 +22,50 @@ export class AppTopbar extends Component { } static propTypes = { - onToggleMenu: PropTypes.func.isRequired + onToggleMenu: PropTypes.func.isRequired, + isLoggedIn: PropTypes.bool, + isDateTimeVisible:PropTypes.bool, + setSearchField:PropTypes.func } render() { return ( - <React.Fragment> <div className="layout-wrapper layout-static layout-static-sidebar-inactive"> <div className="layout-topbar clearfix"> <button className="p-link layout-menu-button" onClick={this.props.onToggleMenu}> <i className="pi pi-bars"></i></button> <span className="header-title">TMSS</span> + <span className="header-by">by</span> + <span className="header-company">ASTRON</span> {this.props.isLoggedIn && + <React.Fragment> + + {this.props.isDateTimeVisible && + <div className="top-date-bar"> + <DateTimeInfo/> + </div> + } + <div className="top-right-bar"> + <a className="p-link layout-menu-button" style= {{marginLeft: '8px', marginRight: '8px'}} title="Documentation" - href="https://support.astron.nl/confluence/display/public/TMSS+User+Documentation"> + href="https://support.astron.nl/confluence/display/public/TMSS+User+Manual" target="_blank" rel="noreferrer "> <i className="pi pi-file-o"></i></a> - <a className="p-link layout-menu-button" title="Helpdesk" href="https://support.astron.nl/sdchelpdesk"> + <a className="p-link layout-menu-button" title="Helpdesk" href="https://support.astron.nl/sdchelpdesk" target="_blank" rel="noreferrer "> <span><i className="pi pi-question-circle"></i></span></a> <button className="p-link layout-menu-button" onClick={this.props.onLogout} title="Logout"> <i className="pi pi-power-off"></i></button> <span style= {{marginLeft: '8px'}}><i className="fa fa-user" title={`Logged in as ${this.state.username}`}></i></span> </div> + </React.Fragment> } <FindObject setSearchField={this.props.setSearchField} /> </div> </div> - </React.Fragment> + ) } } diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeInfo.js b/SAS/TMSS/frontend/tmss_webapp/src/layout/components/DateTimeInfo.js similarity index 80% rename from SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeInfo.js rename to SAS/TMSS/frontend/tmss_webapp/src/layout/components/DateTimeInfo.js index 474da6ad2c0f7503cfb81448ca63fb9cfe16fdc0..a142fa92b4f893040800481abe9eeb7778cabdc3 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeInfo.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/components/DateTimeInfo.js @@ -1,30 +1,28 @@ import {useEffect, useState} from "react"; -import UtilService from "../../../../services/util.service"; +import UtilService from "../../services/util.service"; import moment from "moment"; -import UIConstants from "../../../../utils/ui.constants"; +import UIConstants from "../../utils/ui.constants"; import { ProgressSpinner } from 'primereact/progressspinner'; import Clock from 'react-live-clock'; function getDateOrTimeElement(title, element) { - return <div className="element" data-testid={title + "-element"}> - <label >{title}:</label> + return <span className="date-element" data-testid={title + "-element"}> + <span className="date-title">{title}</span> {element} - </div>; + </span>; } export default function DateTimeInfo() { const [currentUTC, setCurrentUTC] = useState() const [currentLST, setCurrentLST] = useState() - - useEffect(() => { // initializer + async function fetchUTC() { + let utc = await UtilService.getUTC() + setCurrentUTC(moment(utc)) + } + useEffect(() => { // initializer if (!currentUTC) { - async function fetchUTC() { - let utc = await UtilService.getUTC() - setCurrentUTC(moment(utc)) - } - fetchUTC().catch(e => console.error("Couldn't get current utc from the server", e)) } }, []) @@ -51,16 +49,16 @@ export default function DateTimeInfo() { if (currentUTC.isValid() && currentLST.isValid()) { return <div className="datetime-info-container"> - {getDateOrTimeElement("Date", <span className="h5" + {getDateOrTimeElement("Date", <span className="clock-time" title={currentUTC.format(UIConstants.CALENDAR_DEFAULTDATE_FORMAT)}> {currentUTC.format(UIConstants.CALENDAR_DEFAULTDATE_FORMAT)} </span>)} - {getDateOrTimeElement("UTC", <Clock className="h5" + {getDateOrTimeElement("UTC", <Clock className="clock-time" date={currentUTC.format(UIConstants.CALENDAR_DATETIME_FORMAT)} format="HH:mm:ss" interval={1000} ticking={true}/>)} - {getDateOrTimeElement("LST", <Clock className="h5" + {getDateOrTimeElement("LST", <Clock className="clock-time" date={currentLST.format(UIConstants.CALENDAR_DATETIME_FORMAT)} format="HH:mm:ss" interval={1000} diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeInfo.test.js b/SAS/TMSS/frontend/tmss_webapp/src/layout/components/DateTimeInfo.test.js similarity index 91% rename from SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeInfo.test.js rename to SAS/TMSS/frontend/tmss_webapp/src/layout/components/DateTimeInfo.test.js index b0dbd5c57cfdc5131cfbefbd1682dfab9f169487..2f14041e79b7a70efb8504b398eb62884c95dd42 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeInfo.test.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/components/DateTimeInfo.test.js @@ -1,12 +1,12 @@ import DateTimeInfo from "./DateTimeInfo"; import {render} from "@testing-library/react"; -import UtilService from "../../../../services/util.service"; -import {removeReact18ConsoleErrors} from "../../../../utils/test.helper"; +import UtilService from "../../services/util.service"; +import {removeReact18ConsoleErrors} from "../../utils/test.helper"; import {act} from "react-dom/test-utils"; removeReact18ConsoleErrors() -jest.mock('../../../../services/util.service'); +jest.mock('../../services/util.service'); describe('DateTimeInfo Component', () => { beforeEach(() => { diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/components/PageActionMenu.js b/SAS/TMSS/frontend/tmss_webapp/src/layout/components/PageActionMenu.js index e41d255572650b3ef0ff91db6376eb789137781c..8c13b34ba618f26ff5b3d79acf47f4c78f6488c2 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/layout/components/PageActionMenu.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/components/PageActionMenu.js @@ -1,7 +1,7 @@ import { Link } from "react-router-dom"; - -//TODO: old component (should test + refactor) +import { Button } from 'primereact/button'; +import { Dropdown } from 'primereact/dropdown'; const PageActionMenu = ({ actions, className }) => { const onClickLink = (action) => { if (action.link) { @@ -31,14 +31,32 @@ const PageActionMenu = ({ actions, className }) => { action.props.callback(e); } } - + const setSelected= (e, action) => { + if (action.actOn && action.actOn === 'select') { + action.props.callback(e.value); + } + } return <div className={"page-action-menu " + className}> {(actions || []).map((action) => { - if (action.type === 'button') { + if (action.type === 'buttonv2') { + return ( + <Button key={action.title + '_page_header'} title={action.title || ''} + style={action.style} + icon={`pi ${action.icon}`} disabled={action.disabled} + onMouseOver={(e) => action.disabled ? '' : onButtonMouseOver(e, action)} + onFocus={(e) => action.disabled ? '' : onButtonMouseOver(e, action)} + onClick={(e) => action.disabled ? '' : onButtonClick(e, action)} + onKeyDown={(e) => action.disabled ? '' : handleOnKeyDown(e, action)} + > + </Button> + ); + } + switch(action.type) { + case 'button' : return ( - <button className="p-link" key={action.title + '_page_header'} title={action.title || ''} + <button className="p-link" key={action.title + '_page_header'} title={action.title || '' } style={action.style}> <i className={`${action.iconType ? action.iconType : 'fa'} ${action.disabled ? 'fa-disabled' : ''} ${action.icon} ${action.classes}`} onMouseOver={(e) => action.disabled ? '' : onButtonMouseOver(e, action)} @@ -47,21 +65,33 @@ const PageActionMenu = ({ actions, className }) => { onKeyDown={(e) => action.disabled ? '' : handleOnKeyDown(e, action)} /> </button> ); - } else if (action.type === 'element') { + case 'divider': + return (<span className="action-divider" key={action.title}></span>); + case 'element': return ( <div key={`index`} className={action.classes} dangerouslySetInnerHTML={{ __html: action.element }} /> ) - } else if (action.type === 'ext_link') { + case 'dropdown': + return (<div className={action.classes}> <span className="dropdown-title">{action.title} </span><Dropdown value={action.selected} onChange={(e) => setSelected(e,action)} options={action.options} optionLabel="value" className="w-full md:w-14rem" /></div> ) + + case 'ext_link': return ( <a href={action.props.pathname} title={action.title || ''} key={action.title} target={action.target ? action.target : "_blank"} rel="noreferrer">{action.label}</a> ); - } else if (action.type === 'tag') { + case 'tag': return ( <span key={action.title + '_page_header'} className={action.className} title={action.title || ''}>{action.content}</span> ); - } else { + case 'tagv2': + return ( + <span key={action.title + '_page_header'} className={action.className} + title={action.title || ''}>{action.content}</span> + ); + + + default: return ( <Link key={action.title + '_page_header'} className={action.classname} to={action.disabled ? {} : { ...action.props }} diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_breadcrumb.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_breadcrumb.scss index 8c27dd9432d5d7d0bb79b84ec2e6694b0aa9d95e..4b7d31a50e12a29433c54ff5509d75288d4f0244 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_breadcrumb.scss +++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_breadcrumb.scss @@ -7,6 +7,7 @@ body .p-breadcrumb{ margin-bottom: 5px; box-shadow: 2px 2px #d6d9d9; border: none; + margin-top:10px; } .p-breadcrumb .pi{ color: #535252; diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_content.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_content.scss index dc1c2f8c6dd3f60f5c9276af8a140a692b454e00..7df17bae02ce067cbe8f9f5e36c939d524592d3f 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_content.scss +++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_content.scss @@ -1,6 +1,6 @@ .layout-main { @include transition(margin-left $transitionDuration); - padding: 60px 16px 10px 25px; + padding: 50px 7px 00px 25px; min-height: 95vh; background-color: white; } diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_report.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_report.scss index ac9ed42c071bbe40358cff2eb0ae364966d6d024..37841aedfbc98b339ace109e74d933c8aacc205d 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_report.scss +++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_report.scss @@ -13,7 +13,9 @@ font-size: 12px; color: black; } - +.routerpage { + margin-top:5px; +} .print-btn { margin-top: 10px; cursor: pointer; diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_responsive.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_responsive.scss index 8db4dd4239880dd812faa09bc21c46f495a2b438..0ff6acb631ffd242746a5255bf795454f9ea9d53 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_responsive.scss +++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_responsive.scss @@ -34,11 +34,10 @@ } .layout-main, .layout-footer { - margin-left: 175px; + margin-left: 162px; } &.layout-static-sidebar-inactive { - .layout-sidebar { left: 0; width: 50px; @@ -50,7 +49,7 @@ } .layout-main, .layout-footer { - margin-left: 50px; + margin-left: 37px; } } @@ -71,9 +70,11 @@ .layout-sidebar { left: -250px; margin-top: 50px; - z-index: 1; + z-index: 10000; + padding-top:10px; } + .layout-mask { display: none; position: fixed; @@ -100,4 +101,9 @@ .body-overflow-hidden { overflow: hidden; } + + .layout-wrapper.layout-static.layout-static-sidebar-inactive ul li a span { + display: inline !important; + + } } \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_timeline.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_timeline.scss index 4abd138bfc4e82f48d67a25d67a30f2166d211ec..0f817888083e74795164a809e22fbcaf1587052b 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_timeline.scss +++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_timeline.scss @@ -1,6 +1,6 @@ .sticky { position: sticky; - top: 33px; + top: 0px; z-index: 999; } @@ -9,8 +9,7 @@ } .react-calendar-timeline { - padding-bottom: 25rem; - min-width: calc(50vw - 225px); + min-width: calc(50vw - 225px); .rct-header-root { background-color: #f0f0f0; @@ -19,8 +18,8 @@ .timeline-tools { display: flex; - justify-content: center; - margin-bottom: 1.125rem; + justify-content: left; + margin-bottom: 5px; .header { display: flex; @@ -32,12 +31,7 @@ padding-bottom: 1rem; } - .section { - border-right: 2px solid var(--gray-100); - padding: 0 1rem; - height: calc(100% - 0.5rem); - } - + .group { display: flex; width: 100%; @@ -48,7 +42,12 @@ } } } - +.sectiontitle { + margin-bottom: 0px; + padding-top: 0px; + padding-bottom: 0px; + line-height: 29px; +} .current-marker { position: absolute; top: 0; @@ -74,7 +73,39 @@ position: fixed; top: 14rem; } +.fix-element { + position: fixed; + top:100px; + width: 100vw; +} +.action-divider { + margin-right: 10px; + margin-top:5px; + padding-right:5px; + height: 30px; + border-right: 1px solid var(--gray-200); +} + +.timeline-header-dropdown{ + display: flex; + float:left; + margin-right: 10px; + margin-top:5px; + padding-right:5px; + height: 30px; + width:230px; + border-right: 1px solid var(--gray-200); + border-left : 1px solid var(--gray-200); + .dropdown-title { + + padding-right: 5px; + padding-left: 5px; + font-size: 14px; + line-height: 28px; + min-width: 70px; + } +} .hide-element { display: none; } @@ -155,6 +186,11 @@ } .timeline-datetime-navigator { + margin-left: 5px; + + .p-panel-content { + height: 180px; + } .datetime-info-container { display: inline-grid; @@ -169,7 +205,6 @@ } .p-button.p-button-icon-only { - line-height: 0; padding: 0.1rem; margin-right: 0.1rem; } @@ -185,7 +220,7 @@ } .jump-to-input { - width: 8.75rem; + width: 134px; input { width: inherit; @@ -220,6 +255,17 @@ } .timeline-zoom-and-move { + + margin-left:5px; + margin-right: 5px; +.p-panel-content +{ + height: 180px; +} + .p-panel-header { + padding-top:5px; + padding-bottom: 5px; + } .p-dropdown { width: 7rem !important; } @@ -283,14 +329,13 @@ font-size: 1rem; font-weight: 600; color: #004B93; - padding-bottom: 1rem; } .legendbar { font-size: 0.75rem; flex-wrap: wrap; - overflow: scroll; - margin-right: 1.25rem; + overflow: hidden; + .left, .right { @@ -302,13 +347,19 @@ .section { display: flex; flex-direction: row; - + border-bottom: 1px solid var(--gray-100); + height:28px; + line-height: 12px; + margin-bottom: 1px; + label { text-overflow: ellipsis; overflow: hidden; text-align: end; } } + + } } @@ -326,24 +377,24 @@ } .calendar-input { - width: 70% !important; + width: 134px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; font-size: 12px !important; height: 29px; + margin-right: 5px; } .time-input { width: 5rem; - border-top-right-radius: 0 !important; - border-bottom-right-radius: 0 !important; + font-size: 12px !important; height: 29px; } .calendar-button { position: relative; - width: 20px !important; + width: 36px !important; height: 29px; margin-left: -2px !important; border-radius: 20% !important; @@ -361,6 +412,9 @@ .timeline-details-pane { font-size: 14px; flex-direction: column; + max-height: 80vh; + min-height: 80vh; + overflow-y: scroll; } .timeline-details-header { @@ -678,7 +732,7 @@ .su-legend { padding: 0.5rem; - margin-bottom: 0.5rem; + margin-bottom: 1px; width: calc(100% * 1); overflow: clip; text-overflow: ellipsis; @@ -741,6 +795,7 @@ body .p-multiselect-panel .p-multiselect-header .p-multiselect-filter-container .timeline-view-toolbar .p-multiselect .p-multiselect-label { padding: 0 0.2rem 0 0.2rem; max-width: 5rem; + } #reserv-reasons .p-multiselect-panel { @@ -835,17 +890,21 @@ body .p-multiselect-panel .p-multiselect-header .p-multiselect-filter-container background-color: #1ff811 !important; color: black !important; } - +.legend-panel { + margin-left:15px; + margin-bottom: 5px; + cursor:default; + user-select: none; +} .timeline-panel { - max-height: 85vh; overflow-y: scroll; padding-left: 0 !important; - width: 100%; - + width:100%; &.summary { border-left: 1px solid white; margin-top: 0; background-color: var(--gray-50); + width:500px; } } diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_topbar.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_topbar.scss index 8ee0d4fd1435eb8d4399f0876443aba0fcd6b0b1..5021ae3aee2de7dffeef6f3896521536d247e160 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_topbar.scss +++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_topbar.scss @@ -6,12 +6,28 @@ z-index: 1000; right: 0; @include clearfix(); - @include linear-gradient-left($topbarLeftBgColor,$topbarRightBgColor); + @include linear-gradient-left($topbarLeftBgColor, $topbarRightBgColor); @include transition(left $transitionDuration); .header-title { font-size: 22px; margin-left: 10px; + cursor:default; + user-select: none; + } + + .header-by { + font-size: 14px; + margin-left: 5px; + cursor:default; + user-select: none; + } + + .header-company { + font-size: 22px; + margin-left: 5px; + cursor:default; + user-select: none; } .layout-topbar-icons { @@ -21,7 +37,7 @@ -webkit-animation-duration: .5s; animation-duration: .5s; - + button { position: relative; color: $topbarItemColor; @@ -82,10 +98,29 @@ margin: 0px; @include border-radius(2px); - &::-webkit-input-placeholder { color:$topbarSearchInputColor; opacity: .7; @include transition(opacity $transitionDuration);} - &:-moz-placeholder { color:$topbarSearchInputColor; opacity: .7; @include transition(opacity $transitionDuration);} - &::-moz-placeholder { color:$topbarSearchInputColor; opacity: .7; @include transition(opacity $transitionDuration);} - &:-ms-input-placeholder { color:$topbarSearchInputColor; opacity: .7; @include transition(opacity $transitionDuration);} + &::-webkit-input-placeholder { + color: $topbarSearchInputColor; + opacity: .7; + @include transition(opacity $transitionDuration); + } + + &:-moz-placeholder { + color: $topbarSearchInputColor; + opacity: .7; + @include transition(opacity $transitionDuration); + } + + &::-moz-placeholder { + color: $topbarSearchInputColor; + opacity: .7; + @include transition(opacity $transitionDuration); + } + + &:-ms-input-placeholder { + color: $topbarSearchInputColor; + opacity: .7; + @include transition(opacity $transitionDuration); + } } .layout-topbar-search-icon { @@ -98,10 +133,22 @@ &:hover { input { border-bottom-color: $topbarItemHoverColor; - &::-webkit-input-placeholder { opacity: 1 } - &:-moz-placeholder {opacity: 1} - &::-moz-placeholder {opacity: 1} - &:-ms-input-placeholder {opacity: 1} + + &::-webkit-input-placeholder { + opacity: 1 + } + + &:-moz-placeholder { + opacity: 1 + } + + &::-moz-placeholder { + opacity: 1 + } + + &:-ms-input-placeholder { + opacity: 1 + } } .layout-topbar-search-icon { @@ -119,7 +166,7 @@ @include transition(color $transitionDuration); // Search type dropdown arrow looks bigger in topbar, - /* span { + /* span { font-size: 2em; }*/ @@ -133,9 +180,71 @@ } } +@media (max-width: 1024px) { + .date-title { + font-size: 8px; + + padding-right: 2px; + } + + .top-date-bar { + right: 70%; + } +} + +@media (max-width: 970px) { + .date-title { + display: none; + } + + .top-date-bar { + left: 120px; + width: 180px; + + } + + .clock-time { + font-size: 10px; + } + +} + +.top-date-bar { + position: fixed; + top: 0px; + right: 50%; + + color: white; + font-family: monospace; + font-size: 14px; + height: 50px; + border-right: 1px solid white; + border-left: 1px solid white; + background-color: $topbarLighterColor; +} + .top-right-bar { float: right; - padding-top: 5px + padding-top: 5px; + height: 50px; + + span { + padding-right: 5px; + } + +} + +.date-title { + padding-right: 10px; + +} + +.date-element { + line-height: 50px; + + padding-left: 5px; + padding-right: 5px; + } .top-right-bar span>i { @@ -148,9 +257,11 @@ .find-object-search { padding-top: 0px; + .p-dropdown-label { background-color: #ffffff; } + .p-dropdown-trigger { background-color: #ffffff; margin-left: -1px; @@ -173,8 +284,6 @@ .find-object-type { width: 13em; - right:1em; - height:29px -} - - \ No newline at end of file + right: 1em; + height: 29px +} \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/index.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/index.js index 76602b79e0d3d7609297758f33e314960848d81d..ff5557dba198662f8c3f55bf8739565b83f259c9 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/index.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Report/index.js @@ -23,8 +23,9 @@ class ReportHome extends Component { render() { return ( <React.Fragment> - <PageHeader location={this.props.location} title={'Reports'} actions={[{icon:'fa-window-close', title:'Click to Close Report', - type: 'button', actOn: 'click', props:{ callback: this.close }}]}/> + <div className='routerpage'> + <PageHeader location={this.props.location} title={'Reports'} actions={[{icon:'pi pi-times', title:'Click to Close Report', + type: 'buttonv2', actOn: 'click', props:{ callback: this.close }}]}/> <TabView activeIndex={this.state.reportIndex} onTabChange={(e) => this.setState({reportIndex: e.index})}> <TabPanel header="Cycle"> <CycleReportMain></CycleReportMain> @@ -33,7 +34,7 @@ class ReportHome extends Component { <ProjectReportMain ></ProjectReportMain> </TabPanel> </TabView> - + </div> </React.Fragment> ); } diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/edit.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/edit.js index dfb467cf66aaf15600ca91a0bccbe2625a21ea8a..f3e4c38fe4389a6d3cc5ac7fb9fede6ca9614feb 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/edit.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/edit.js @@ -278,7 +278,7 @@ export class TaskEdit extends Component { fieldsToDisable: this.state.fieldsToDisable, // Array of field names to disable eg. [SAPs.0.name, specification_doc.name,...] callback: this.setEditorOutput, parentFunction: this.setEditorFunction, - observationType: template.name, + observationType: template?.name, targetObservation: this.state.targetTask, }); } diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/edit.test.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/edit.test.js index 1f9f8ec0e84463d3691b0235e07ce14c5a8dca90..56100573a50883e7b32b0d965ec5b3d55b3498b9 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/edit.test.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/edit.test.js @@ -6,6 +6,7 @@ import mockConsole from 'jest-mock-console' import _ from 'lodash'; import { TaskEdit } from './edit'; import TaskService from '../../services/task.service'; +import UtilService from '../../services/util.service'; import TaskServiceMock from '../../__mocks__/task.service.data'; import AuthService from '../../services/auth.service'; import AuthServiceMock from '../../__mocks__/auth.service.data'; @@ -29,7 +30,7 @@ afterEach(() => { /** * To set mock spy for Services that have API calls to the back end to fetch data */ -const setMockSpy = (() => { +const setMockSpy = ( () => { taskPermissionSpy = jest.spyOn(AuthService, 'getAccessControlMethod'); taskPermissionSpy.mockImplementation((url) => { if (_.startsWith(url, "task_draft")) { @@ -61,7 +62,12 @@ const setMockSpy = (() => { taskTemplateSpy = jest.spyOn(TaskService, 'getTaskTemplate'); taskTemplateSpy.mockImplementation((templateId) => { - return Promise.resolve(_.find(TaskServiceMock.getTaskTemplates(), {"id":templateId})); + let template = _.find(TaskServiceMock.getTaskTemplates(), {"id":templateId}); + return Promise.resolve(template); + //let resolvedtemplate = UtilService.resolveSchema(template); + + //return resolvedtemplate + // }); taskTemplatesSpy = jest.spyOn(TaskService, 'getTaskTemplates'); diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/view.test.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/view.test.js index 58da93b8083498502af34cbbe849a56ff9581256..3c754e4bc45018274dc82bf28df31132711ab8f5 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/view.test.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Task/view.test.js @@ -9,10 +9,11 @@ import { TaskView } from './view'; import TaskService from '../../services/task.service'; import TaskServiceMock from '../../__mocks__/task.service.data'; import AuthService from '../../services/auth.service'; + import AuthServiceMock from '../../__mocks__/auth.service.data'; -let taskPermissionSpy, taskFilterDefSpy, subtaskTypesSpy, taskDetailsSpy, taskTemplateSpy, -schedulingUnitSpy; +let taskPermissionSpy, taskFilterDefSpy, subtaskTypesSpy, taskDetailsSpy, taskTemplateSpy, + schedulingUnitSpy; let restoreConsole; beforeEach(() => { @@ -35,34 +36,35 @@ const setMockSpy = (() => { taskPermissionSpy.mockImplementation((url) => { if (_.startsWith(url, "task_draft")) { return Promise.resolve(AuthServiceMock.task["1"]); - } else if (_.startsWith(url, "task_blueprint")) { + } else if (_.startsWith(url, "task_blueprint")) { return Promise.resolve(AuthServiceMock.task_blueprint["9"]); - } else if (_.startsWith(url, "subtask")) { + } else if (_.startsWith(url, "subtask")) { return Promise.resolve(AuthServiceMock.subtask["2000011"]); } }); taskFilterDefSpy = jest.spyOn(TaskService, 'getTaskFilterDefinition'); - taskFilterDefSpy.mockImplementation(() => { return Promise.resolve(TaskServiceMock.getTaskFilterDefinition)}); + taskFilterDefSpy.mockImplementation(() => { return Promise.resolve(TaskServiceMock.getTaskFilterDefinition) }); subtaskTypesSpy = jest.spyOn(TaskService, 'getSubtaskType'); - subtaskTypesSpy.mockImplementation(() => { return Promise.resolve(TaskServiceMock.subTaskTypes)}); + subtaskTypesSpy.mockImplementation(() => { return Promise.resolve(TaskServiceMock.subTaskTypes) }); taskDetailsSpy = jest.spyOn(TaskService, 'getTaskDetails'); - taskDetailsSpy.mockImplementation((taskType, taskId, fetchSubtask) => { + taskDetailsSpy.mockImplementation((taskType, taskId, fetchSubtask) => { if (taskType === "draft") { - return Promise.resolve(_.find(TaskServiceMock.taskDrafts, {"id": parseInt(taskId)})); - } else { - return Promise.resolve(_.find(TaskServiceMock.taskBlueprints, {"id": parseInt(taskId)})); + return Promise.resolve(_.find(TaskServiceMock.taskDrafts, { "id": parseInt(taskId) })); + } else { + return Promise.resolve(_.find(TaskServiceMock.taskBlueprints, { "id": parseInt(taskId) })); } }); taskTemplateSpy = jest.spyOn(TaskService, 'getTaskTemplate'); taskTemplateSpy.mockImplementation((templateId) => { - return Promise.resolve(_.find(TaskServiceMock.getTaskTemplates(), {"id":templateId})); + let template = _.find(TaskServiceMock.getTaskTemplates(), { "id": templateId }); + return Promise.resolve(template); }); schedulingUnitSpy = jest.spyOn(TaskService, "getSchedulingUnit"); schedulingUnitSpy.mockImplementation((type, id, loadTasks) => { if (type === "draft") { - return Promise.resolve(_.find(TaskServiceMock.schedulingUnitDrafts, {"id": id})); - } else { - return Promise.resolve(_.find(TaskServiceMock.schedulingUnitBlueprints, {"id": id})); + return Promise.resolve(_.find(TaskServiceMock.schedulingUnitDrafts, { "id": id })); + } else { + return Promise.resolve(_.find(TaskServiceMock.schedulingUnitBlueprints, { "id": id })); } }); }); @@ -72,24 +74,24 @@ const clearMockSpy = (() => { taskFilterDefSpy.mockRestore(); subtaskTypesSpy.mockRestore(); taskDetailsSpy.mockRestore(); - taskTemplateSpy.mockRestore(); + taskTemplateSpy.mockRestore(); schedulingUnitSpy.mockRestore(); }); it("renders Task details page", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "9", type:"draft"}}} history={{}} location="/task/view/draft/9" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "9", type: "draft" } }} history={{}} location="/task/view/draft/9" /></Router>); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); }); - + it("test Combined Observation Task Draft view of IM LBA Survey - 3 Beams", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "9", type:"draft"}}} history={{}} location="/task/view/draft/9" key="CombinedTest"/></Router>); + content = render(<Router><TaskView match={{ params: { id: "9", type: "draft" } }} history={{}} location="/task/view/draft/9" key="CombinedTest" /></Router>); await new Promise((r) => setTimeout(r, 5000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -102,38 +104,38 @@ it("test Combined Observation Task Draft view of IM LBA Survey - 3 Beams", async expect(content.getByText("Pipeline target2")).toBeInTheDocument(); expect(content.getByText("Pipeline target1")).toBeInTheDocument(); expect(content.getByText("parallel calibrator target observation")).toBeInTheDocument(); - await waitFor(()=>expect(content.getByText("Auto-select")).toBeInTheDocument()); - expect(content.getByText("Auto-select")).toBeInTheDocument(); - expect(content.getByLabelText("specification[calibrator][name]")).toBeInTheDocument(); - expect(content.getByLabelText("specification[calibrator][pointing][angle1]")).toBeInTheDocument(); - expect(content.getByLabelText("specification[calibrator][pointing][angle2]")).toBeInTheDocument(); - expect(content.getAllByText("Reference frame").length).toBe(5); - expect(content.getByLabelText("specification[calibrator][pointing][target]")).toBeInTheDocument(); - expect(content.getByLabelText("specification[duration]")).toBeInTheDocument(); - expect(content.getByLabelText("specification[correlator][integration_time]")).toBeInTheDocument(); - expect(content.getByText("Storage cluster")).toBeInTheDocument(); - expect(content.getByText("Topocentric Frequency Correction")).toBeInTheDocument(); - expect(content.getByText("Channels/subband")).toBeInTheDocument(); - expect(content.getByLabelText("specification[correlator][frequency_resolution]")).toBeInTheDocument(); - expect(content.getByLabelText("specification[correlator][time_resolution]")).toBeInTheDocument(); - expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][angle1]")).toBeInTheDocument(); - expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][angle2]")).toBeInTheDocument(); - expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][target]")).toBeInTheDocument(); - expect(content.getByLabelText("specification[station_configuration][SAPs][0][name]")).toBeInTheDocument(); - await waitFor(()=> expect(content.getByLabelText("specification[station_configuration][SAPs][0][subbands]")).toBeInTheDocument()); - await waitFor(()=>expect(content.getByLabelText("specification[station_configuration][SAPs][0][frequency]")).toBeInTheDocument()); - await waitFor(()=>expect(content.getByLabelText("specification[station_configuration][SAPs][1][digital_pointing][angle1]")).toBeInTheDocument()); - await waitFor(()=> expect(content.getByLabelText("specification[station_configuration][SAPs][1][digital_pointing][angle2]")).toBeInTheDocument()); - await waitFor(()=>expect(content.getByLabelText("specification[station_configuration][SAPs][1][digital_pointing][target]")).toBeInTheDocument()); - await waitFor(()=>expect(content.getByLabelText("specification[station_configuration][SAPs][1][name]")).toBeInTheDocument()); - await waitFor(()=>expect(content.getByLabelText("specification[station_configuration][SAPs][1][subbands]")).toBeInTheDocument()); - await waitFor(()=>expect(content.getByLabelText("specification[station_configuration][SAPs][1][frequency]")).toBeInTheDocument()); - await waitFor(()=>expect(content.getByLabelText("specification[station_configuration][SAPs][2][digital_pointing][angle1]")).toBeInTheDocument()); - await waitFor(()=>expect(content.getByLabelText("specification[station_configuration][SAPs][2][digital_pointing][angle2]")).toBeInTheDocument()); - await waitFor(()=> expect(content.getByLabelText("specification[station_configuration][SAPs][2][digital_pointing][target]")).toBeInTheDocument()); - await waitFor(()=>expect(content.getByLabelText("specification[station_configuration][SAPs][2][name]")).toBeInTheDocument()); - await waitFor(()=>expect(content.getByLabelText("specification[station_configuration][SAPs][2][subbands]")).toBeInTheDocument()); - await waitFor(()=>expect(content.getByLabelText("specification[station_configuration][SAPs][2][frequency]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByText("Auto-select")).toBeInTheDocument()); + await waitFor(() => expect(content.getByText("Auto-select")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[calibrator][name]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[calibrator][pointing][angle1]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[calibrator][pointing][angle2]")).toBeInTheDocument()); + await waitFor(() => expect(content.getAllByText("Reference frame").length).toBe(5)); + await waitFor(() => expect(content.getByLabelText("specification[calibrator][pointing][target]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[duration]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[correlator][integration_time]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByText("Storage cluster")).toBeInTheDocument()); + await waitFor(() => expect(content.getByText("Topocentric Frequency Correction")).toBeInTheDocument()); + await waitFor(() => expect(content.getByText("Channels/subband")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[correlator][frequency_resolution]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[correlator][time_resolution]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][angle1]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][angle2]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][target]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][0][name]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][0][subbands]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][0][frequency]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][1][digital_pointing][angle1]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][1][digital_pointing][angle2]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][1][digital_pointing][target]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][1][name]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][1][subbands]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][1][frequency]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][2][digital_pointing][angle1]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][2][digital_pointing][angle2]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][2][digital_pointing][target]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][2][name]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][2][subbands]")).toBeInTheDocument()); + await waitFor(() => expect(content.getByLabelText("specification[station_configuration][SAPs][2][frequency]")).toBeInTheDocument()); expect(content.getByLabelText("specification[calibrator][name]")).toBeInTheDocument(); expect(content.getByText("Antenna set")).toBeInTheDocument(); expect(content.getByText("Band-pass filter")).toBeInTheDocument(); @@ -156,7 +158,7 @@ it("test Combined Observation Task Draft view of IM LBA Survey - 3 Beams", async it("test Combined Observation Task Draft view of IM LBA LoDSS - 5 Beams", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "1", type:"draft"}}} history={{}} location="/task/view/draft/1" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "1", type: "draft" } }} history={{}} location="/task/view/draft/1" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -170,7 +172,7 @@ it("test Combined Observation Task Draft view of IM LBA LoDSS - 5 Beams", async expect(content.getByText("Pipeline target2")).toBeInTheDocument(); expect(content.getByText("Pipeline target1")).toBeInTheDocument(); expect(content.getByText("parallel calibrator target observation")).toBeInTheDocument(); - await waitFor(()=>expect(content.getByText("Task Specification")).toBeInTheDocument()); + await waitFor(() => expect(content.getByText("Task Specification")).toBeInTheDocument()); expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByText("Auto-select")).toBeInTheDocument(); expect(content.getByLabelText("specification[calibrator][name]")).toBeInTheDocument(); @@ -236,7 +238,7 @@ it("test Combined Observation Task Draft view of IM LBA LoDSS - 5 Beams", async it("test Calibrator Pipeline Task Draft view of IM LBA LoDSS - 5 Beams", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "2", type:"draft"}}} history={{}} location="/task/view/draft/2" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "2", type: "draft" } }} history={{}} location="/task/view/draft/2" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -246,7 +248,7 @@ it("test Calibrator Pipeline Task Draft view of IM LBA LoDSS - 5 Beams", async ( expect(content.getByText("preprocessing pipeline")).toBeInTheDocument(); expect(content.getByText("Combined Observation")).toBeInTheDocument(); expect(content.getByText("Ingest")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[average][time_steps]")).toBeInTheDocument(); expect(content.getByLabelText("specification[average][frequency_steps]")).toBeInTheDocument(); expect(content.getByLabelText("specification[average][time_resolution]")).toBeInTheDocument(); @@ -274,7 +276,7 @@ it("test Calibrator Pipeline Task Draft view of IM LBA LoDSS - 5 Beams", async ( it("test Target Pipeline Task Draft view of IM LBA LoDSS - 5 Beams", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "7", type:"draft"}}} history={{}} location="/task/view/draft/7" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "7", type: "draft" } }} history={{}} location="/task/view/draft/7" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -299,11 +301,11 @@ it("test Target Pipeline Task Draft view of IM LBA LoDSS - 5 Beams", async () => expect(content.getByText("Ignore target")).toBeInTheDocument(); expect(content.getByLabelText("specification[demix][frequency_steps]")).toBeInTheDocument(); expect(content.getByText("RFI flagging strategy")).toBeInTheDocument(); - + expect(content.getByText("Flag outer channels")).toBeInTheDocument(); expect(content.getByText("Flag auto correlations")).toBeInTheDocument(); - + expect(content.getByText("Storage Manager")).toBeInTheDocument(); expect(content.getByLabelText("specification[cluster_resources][cores_per_task]")).toBeInTheDocument(); expect(content.getByLabelText("specification[cluster_resources][parallel_tasks]")).toBeInTheDocument(); @@ -314,13 +316,12 @@ it("test Target Pipeline Task Draft view of IM LBA LoDSS - 5 Beams", async () => it("test IM BF Cal&Tgt Task Draft view", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "68", type:"draft"}}} history={{}} location="/task/view/draft/68" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "68", type: "draft" } }} history={{}} location="/task/view/draft/68" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); expect(content.getByText("IM BF Cal&Tgt")).toBeInTheDocument(); expect(content.getByText("Observation")).toBeInTheDocument(); - // expect(content.getByText("oXXX Paaa+01 3Cabc")).toBeInTheDocument(); expect(content.getByText("parallel calibrator target and beamforming observation")).toBeInTheDocument(); expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByText("Auto-select")).toBeInTheDocument(); @@ -330,10 +331,10 @@ it("test IM BF Cal&Tgt Task Draft view", async () => { expect(content.getAllByText("Reference frame").length).toBe(3); expect(content.getByLabelText("specification[calibrator][pointing][target]")).toBeInTheDocument(); expect(content.getByLabelText("specification[duration]")).toBeInTheDocument(); - + expect(content.getByText("Beamformer")).toBeInTheDocument(); expect(content.getByText("Pipelines")).toBeInTheDocument(); - + expect(content.getByText("Coherent Tied-Array Beams")).toBeInTheDocument(); expect(content.getAllByText("SAPs").length).toBe(3); expect(content.getAllByText("Output quantisation settings").length).toBe(3); @@ -347,7 +348,7 @@ it("test IM BF Cal&Tgt Task Draft view", async () => { expect(content.getAllByText("Channels/subband").length).toBe(4); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][time_resolution]")).toBeInTheDocument(); - + expect(content.getByText("Enable Fly's Eye")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][quantisation][scale_max]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][quantisation][scale_min]")).toBeInTheDocument(); @@ -355,7 +356,7 @@ it("test IM BF Cal&Tgt Task Draft view", async () => { expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][time_integration_factor]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][time_resolution]")).toBeInTheDocument(); - + expect(content.getByText("Incoherent Tied-Array Beams")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][quantisation][scale_max]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][quantisation][scale_min]")).toBeInTheDocument(); @@ -363,32 +364,32 @@ it("test IM BF Cal&Tgt Task Draft view", async () => { expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][time_integration_factor]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][time_resolution]")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[beamformer][pipelines][0][name]")).toBeInTheDocument(); expect(content.getAllByText("Station groups").length).toBe(2); expect(content.getAllByRole("selected_stations").length).toBe(1); expect(content.getAllByRole("selected_stations")[0].children.length).toBe(21); expect(content.getByLabelText("specification[beamformer][pipelines][0][station_groups][0][max_nr_missing]")).toBeInTheDocument(); expect(content.getByText("Use PPF when beamforming")).toBeInTheDocument(); - - + + expect(content.getByLabelText("specification[correlator][integration_time]")).toBeInTheDocument(); expect(content.getByText("Storage cluster")).toBeInTheDocument(); expect(content.getByText("Topocentric Frequency Correction")).toBeInTheDocument(); expect(content.getByLabelText("specification[correlator][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[correlator][time_resolution]")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][angle1]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][angle2]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][target]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][name]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][subbands]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][frequency]")).toBeInTheDocument(); - + expect(content.getByText("Antenna set")).toBeInTheDocument(); expect(content.getByText("Band-pass filter")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][station_groups][0][max_nr_missing]")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[station_configuration][tile_beam][angle1]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][tile_beam][angle2]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][tile_beam][target]")).toBeInTheDocument(); @@ -406,20 +407,19 @@ it("test IM BF Cal&Tgt Task Draft view", async () => { it("test Simple Beamforming Observation Task Draft view", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "53", type:"draft"}}} history={{}} location="/task/view/draft/53" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "53", type: "draft" } }} history={{}} location="/task/view/draft/53" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); expect(content.getByText("Simple Beamforming Observation")).toBeInTheDocument(); expect(content.getByText("Observation")).toBeInTheDocument(); - // expect(content.getByText("oXXX Paaa+01 3Cabc")).toBeInTheDocument(); expect(content.getByText("beamforming observation")).toBeInTheDocument(); expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByLabelText("specification[duration]")).toBeInTheDocument(); - + expect(content.getByText("Beamformer")).toBeInTheDocument(); expect(content.getByText("Pipelines")).toBeInTheDocument(); - + expect(content.getByText("Coherent Tied-Array Beams")).toBeInTheDocument(); expect(content.getAllByText("SAPs").length).toBe(3); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][SAPs][0][name]")).toBeInTheDocument(); @@ -440,13 +440,13 @@ it("test Simple Beamforming Observation Task Draft view", async () => { expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][quantisation][scale_max]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][quantisation][scale_min]")).toBeInTheDocument(); expect(content.getAllByText("Stokes").length).toBe(3); - + expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][subbands_per_file]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][time_integration_factor]")).toBeInTheDocument(); expect(content.getAllByText("Channels/subband").length).toBe(3); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][time_resolution]")).toBeInTheDocument(); - + expect(content.getByText("Enable Fly's Eye")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][quantisation][scale_max]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][quantisation][scale_min]")).toBeInTheDocument(); @@ -454,7 +454,7 @@ it("test Simple Beamforming Observation Task Draft view", async () => { expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][time_integration_factor]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][time_resolution]")).toBeInTheDocument(); - + expect(content.getByText("Incoherent Tied-Array Beams")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][quantisation][scale_max]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][quantisation][scale_min]")).toBeInTheDocument(); @@ -462,23 +462,23 @@ it("test Simple Beamforming Observation Task Draft view", async () => { expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][time_integration_factor]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][time_resolution]")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[beamformer][pipelines][0][name]")).toBeInTheDocument(); expect(content.getAllByText("Station groups").length).toBe(2); expect(content.getByLabelText("specification[beamformer][pipelines][0][station_groups][0][max_nr_missing]")).toBeInTheDocument(); expect(content.getByText("Use PPF when beamforming")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][angle1]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][angle2]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][target]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][name]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][subbands]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][frequency]")).toBeInTheDocument(); - + expect(content.getByText("Antenna set")).toBeInTheDocument(); expect(content.getByText("Band-pass filter")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][station_groups][0][max_nr_missing]")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[station_configuration][tile_beam][angle1]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][tile_beam][angle2]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][tile_beam][target]")).toBeInTheDocument(); @@ -487,7 +487,7 @@ it("test Simple Beamforming Observation Task Draft view", async () => { it("test Target Observation Task Draft vew of IM HBA LoTSS - 2 Beams strategy", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "23", type:"draft"}}} history={{}} location="/task/view/draft/23" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "23", type: "draft" } }} history={{}} location="/task/view/draft/23" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -498,7 +498,7 @@ it("test Target Observation Task Draft vew of IM HBA LoTSS - 2 Beams strategy", expect(content.getByText('Pipeline target2')).toBeInTheDocument(); expect(content.getByText('Pipeline target1')).toBeInTheDocument(); expect(content.getByText("target observation")).toBeInTheDocument(); - + expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByLabelText("specification[duration]")).toBeInTheDocument(); expect(content.getByLabelText("specification[correlator][integration_time]")).toBeInTheDocument(); @@ -545,12 +545,12 @@ it("test Target Observation Task Draft vew of IM HBA LoTSS - 2 Beams strategy", expect(content.getByText("Inspection Plots")).toBeInTheDocument(); expect(content.getByText("autocorrelation")).toBeInTheDocument(); expect(content.getByText("crosscorrelation")).toBeInTheDocument(); -}); +}); it("test Calibrator Observation Task Draft vew of IM HBA LoTSS - 2 Beams strategy", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "21", type:"draft"}}} history={{}} location="/task/view/draft/21" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "21", type: "draft" } }} history={{}} location="/task/view/draft/21" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -561,7 +561,7 @@ it("test Calibrator Observation Task Draft vew of IM HBA LoTSS - 2 Beams strateg expect(content.getByText('Cal1 3Cabc')).toBeInTheDocument(); expect(content.getByText('Calibrator Pipeline 1')).toBeInTheDocument(); expect(content.getByText("calibrator observation")).toBeInTheDocument(); - + expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByText("Auto-select")).toBeInTheDocument(); expect(content.getByLabelText("specification[calibrator][name]")).toBeInTheDocument(); @@ -575,7 +575,7 @@ it("test Calibrator Observation Task Draft vew of IM HBA LoTSS - 2 Beams strateg it("test Calibrator Pipeline Task Draft view of IM HBA LoTSS - 2 Beams", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "22", type:"draft"}}} history={{}} location="/task/view/draft/22" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "22", type: "draft" } }} history={{}} location="/task/view/draft/22" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -585,7 +585,7 @@ it("test Calibrator Pipeline Task Draft view of IM HBA LoTSS - 2 Beams", async ( expect(content.getByText("preprocessing pipeline")).toBeInTheDocument(); expect(content.getByText("Calibrator Observation 1")).toBeInTheDocument(); expect(content.getByText("Ingest")).toBeInTheDocument(); - await waitFor(()=>expect(content.getByText("Task Specification")).toBeInTheDocument()); + await waitFor(() => expect(content.getByText("Task Specification")).toBeInTheDocument()); expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByLabelText("specification[average][time_steps]")).toBeInTheDocument(); expect(content.getByLabelText("specification[average][frequency_steps]")).toBeInTheDocument(); @@ -613,7 +613,7 @@ it("test Calibrator Pipeline Task Draft view of IM HBA LoTSS - 2 Beams", async ( it("test Pulsar Pipeline Task Draft view", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "50", type:"draft"}}} history={{}} location="/task/view/draft/50" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "50", type: "draft" } }} history={{}} location="/task/view/draft/50" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -621,13 +621,12 @@ it("test Pulsar Pipeline Task Draft view", async () => { expect(content.getByText("BF Pulsar Timing")).toBeInTheDocument(); expect(content.getByText("Ingest")).toBeInTheDocument(); expect(content.getByText("Cleanup")).toBeInTheDocument(); - // expect(content.getByText("oXXX Paaa+01 3Cabc")).toBeInTheDocument(); expect(content.getByText("pulsar pipeline")).toBeInTheDocument(); expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByLabelText("specification[dspsr][digifil][dm]")).toBeInTheDocument(); expect(content.getByLabelText("specification[dspsr][digifil][channels_per_part]")).toBeInTheDocument(); expect(content.getByLabelText("specification[dspsr][digifil][integration_time_factor]")).toBeInTheDocument(); - + expect(content.getAllByText("Coherent Dedispersion").length).toBe(2); expect(content.getAllByText("Enabled").length).toBe(5); expect(content.getByLabelText("specification[dspsr][filterbank][channels_per_part]")).toBeInTheDocument(); @@ -637,7 +636,7 @@ it("test Pulsar Pipeline Task Draft view", async () => { expect(content.getByText("Single pulse subintegration")).toBeInTheDocument(); expect(content.getByLabelText("specification[output][quantisation][scale]")).toBeInTheDocument(); expect(content.getByLabelText("specification[output][dynamic_spectrum][time_average]")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[presto][input][nr_blocks]")).toBeInTheDocument(); expect(content.getByLabelText("specification[presto][input][decode_sigma]")).toBeInTheDocument(); expect(content.getByLabelText("specification[presto][input][samples_per_block]")).toBeInTheDocument(); @@ -646,10 +645,10 @@ it("test Pulsar Pipeline Task Draft view", async () => { expect(content.getByLabelText("specification[presto][prepdata][dm]")).toBeInTheDocument(); expect(content.getByText("Enable prepfold")).toBeInTheDocument(); expect(content.getByText("Fold")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[pulsar][name]")).toBeInTheDocument(); expect(content.getByText("Strategy")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[cluster_resources][cores_per_task]")).toBeInTheDocument(); expect(content.getByLabelText("specification[cluster_resources][parallel_tasks]")).toBeInTheDocument(); expect(content.getByText("Cluster")).toBeInTheDocument(); @@ -661,7 +660,7 @@ it("test Combined Observation Task Blueprint view of IM LBA Survey - 3 Beams", a jest.setTimeout(120000) let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "9", type:"blueprint"}}} history={{}} isUnitTest={true} location="/task/view/blueprint/9" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "9", type: "blueprint" } }} history={{}} isUnitTest={true} location="/task/view/blueprint/9" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -680,9 +679,6 @@ it("test Combined Observation Task Blueprint view of IM LBA Survey - 3 Beams", a expect(content.getAllByRole("tablehead").length).toBe(13); expect(content.getAllByRole("row").length).toBe(4); expect(content.getByTitle("Cancel Subtasks")).toBeInTheDocument(); - - // expect(content.getByTitle("Don't have permission to cancel ")).not.toBeInTheDocument(); - // expect(content.getByTitle("Don't have permission to mark as obsolete")).not.toBeInTheDocument(); expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByText("Auto-select")).toBeInTheDocument(); expect(content.getByLabelText("specification[calibrator][name]")).toBeInTheDocument(); @@ -735,7 +731,7 @@ it("test Combined Observation Task Blueprint view of IM LBA Survey - 3 Beams", a it("test Combined Observation Task Blueprint view of IM LBA LoDSS - 5 Beams", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "1", type:"blueprint"}}} history={{}} isUnitTest={true} location="/task/view/blueprint/1" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "1", type: "blueprint" } }} history={{}} isUnitTest={true} location="/task/view/blueprint/1" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -756,8 +752,6 @@ it("test Combined Observation Task Blueprint view of IM LBA LoDSS - 5 Beams", as expect(content.getAllByRole("row").length).toBe(4); expect(content.getByTitle("Cancel Subtasks")).toBeInTheDocument(); expect(content.getAllByTitle("Mark as Obsolete").length).toBe(1); - // expect(content.getByTitle("Don't have permission to cancel ")).not.toBeInTheDocument(); - // expect(content.getByTitle("Don't have permission to mark as obsolete")).not.toBeInTheDocument(); expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByText("Auto-select")).toBeInTheDocument(); expect(content.getByLabelText("specification[calibrator][name]")).toBeInTheDocument(); @@ -821,7 +815,7 @@ it("test Combined Observation Task Blueprint view of IM LBA LoDSS - 5 Beams", as it("test Calibrator Pipeline Task Blueprint view of IM LBA LoDSS - 5 Beams", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "2", type:"blueprint"}}} history={{}} isUnitTest={true} location="/task/view/draft/blueprint" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "2", type: "blueprint" } }} history={{}} isUnitTest={true} location="/task/view/draft/blueprint" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -838,7 +832,7 @@ it("test Calibrator Pipeline Task Blueprint view of IM LBA LoDSS - 5 Beams", asy expect(content.getAllByRole("row").length).toBe(2); expect(content.getByTitle("Cancel Subtasks")).toBeInTheDocument(); expect(content.getAllByTitle("Mark as Obsolete").length).toBe(1); - await waitFor(()=>expect(content.getByText("Task Specification")).toBeInTheDocument()); + await waitFor(() => expect(content.getByText("Task Specification")).toBeInTheDocument()); expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByLabelText("specification[average][time_steps]")).toBeInTheDocument(); expect(content.getByLabelText("specification[average][frequency_steps]")).toBeInTheDocument(); @@ -866,7 +860,7 @@ it("test Calibrator Pipeline Task Blueprint view of IM LBA LoDSS - 5 Beams", asy it("test Target Pipeline Task Blueprint view of IM LBA LoDSS - 5 Beams", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "7", type:"blueprint"}}} history={{}} isUnitTest={true} location="/task/view/blueprint/7" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "7", type: "blueprint" } }} history={{}} isUnitTest={true} location="/task/view/blueprint/7" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -883,7 +877,7 @@ it("test Target Pipeline Task Blueprint view of IM LBA LoDSS - 5 Beams", async ( expect(content.getAllByRole("row").length).toBe(2); expect(content.getByTitle("Cancel Subtasks")).toBeInTheDocument(); expect(content.getAllByTitle("Mark as Obsolete").length).toBe(1); - await waitFor(()=>expect(content.getByText("Task Specification")).toBeInTheDocument()); + await waitFor(() => expect(content.getByText("Task Specification")).toBeInTheDocument()); expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByLabelText("specification[average][time_steps]")).toBeInTheDocument(); expect(content.getByLabelText("specification[average][frequency_steps]")).toBeInTheDocument(); @@ -911,13 +905,12 @@ it("test Target Pipeline Task Blueprint view of IM LBA LoDSS - 5 Beams", async ( it("test IM BF Cal&Tgt Task Blueprint view", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "68", type:"blueprint"}}} history={{}} isUnitTest={true} location="/task/view/blueprint/68" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "68", type: "blueprint" } }} history={{}} isUnitTest={true} location="/task/view/blueprint/68" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); expect(content.getByText("IM BF Cal&Tgt")).toBeInTheDocument(); expect(content.getAllByText("Observation").length).toBe(3); - // expect(content.getByText("oXXX Paaa+01 3Cabc")).toBeInTheDocument(); expect(content.getByText("parallel calibrator target and beamforming observation")).toBeInTheDocument(); expect(content.getAllByText("Observation Start Time").length).toBe(1); expect(content.getAllByText("Observation End Time").length).toBe(1); @@ -928,9 +921,7 @@ it("test IM BF Cal&Tgt Task Blueprint view", async () => { expect(content.getAllByRole("row").length).toBe(4); expect(content.getByTitle("Cancel Subtasks")).toBeInTheDocument(); expect(content.getAllByTitle("Mark as Obsolete").length).toBe(1); - // expect(content.getByTitle("Don't have permission to cancel ")).not.toBeInTheDocument(); - // expect(content.getByTitle("Don't have permission to mark as obsolete")).not.toBeInTheDocument(); - + expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByText("Auto-select")).toBeInTheDocument(); expect(content.getByLabelText("specification[calibrator][name]")).toBeInTheDocument(); @@ -939,10 +930,10 @@ it("test IM BF Cal&Tgt Task Blueprint view", async () => { expect(content.getAllByText("Reference frame").length).toBe(3); expect(content.getByLabelText("specification[calibrator][pointing][target]")).toBeInTheDocument(); expect(content.getByLabelText("specification[duration]")).toBeInTheDocument(); - + expect(content.getByText("Beamformer")).toBeInTheDocument(); expect(content.getByText("Pipelines")).toBeInTheDocument(); - + expect(content.getByText("Coherent Tied-Array Beams")).toBeInTheDocument(); expect(content.getAllByText("SAPs").length).toBe(3); expect(content.getAllByText("Output quantisation settings").length).toBe(3); @@ -956,7 +947,7 @@ it("test IM BF Cal&Tgt Task Blueprint view", async () => { expect(content.getAllByText("Channels/subband").length).toBe(4); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][time_resolution]")).toBeInTheDocument(); - + expect(content.getByText("Enable Fly's Eye")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][quantisation][scale_max]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][quantisation][scale_min]")).toBeInTheDocument(); @@ -964,7 +955,7 @@ it("test IM BF Cal&Tgt Task Blueprint view", async () => { expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][time_integration_factor]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][time_resolution]")).toBeInTheDocument(); - + expect(content.getByText("Incoherent Tied-Array Beams")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][quantisation][scale_max]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][quantisation][scale_min]")).toBeInTheDocument(); @@ -972,32 +963,32 @@ it("test IM BF Cal&Tgt Task Blueprint view", async () => { expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][time_integration_factor]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][time_resolution]")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[beamformer][pipelines][0][name]")).toBeInTheDocument(); expect(content.getAllByText("Station groups").length).toBe(2); expect(content.getAllByRole("selected_stations").length).toBe(1); expect(content.getAllByRole("selected_stations")[0].children.length).toBe(21); expect(content.getByLabelText("specification[beamformer][pipelines][0][station_groups][0][max_nr_missing]")).toBeInTheDocument(); expect(content.getByText("Use PPF when beamforming")).toBeInTheDocument(); - - + + expect(content.getByLabelText("specification[correlator][integration_time]")).toBeInTheDocument(); expect(content.getByText("Storage cluster")).toBeInTheDocument(); expect(content.getByText("Topocentric Frequency Correction")).toBeInTheDocument(); expect(content.getByLabelText("specification[correlator][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[correlator][time_resolution]")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][angle1]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][angle2]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][target]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][name]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][subbands]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][frequency]")).toBeInTheDocument(); - + expect(content.getByText("Antenna set")).toBeInTheDocument(); expect(content.getByText("Band-pass filter")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][station_groups][0][max_nr_missing]")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[station_configuration][tile_beam][angle1]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][tile_beam][angle2]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][tile_beam][target]")).toBeInTheDocument(); @@ -1016,13 +1007,12 @@ it("test IM BF Cal&Tgt Task Blueprint view", async () => { it("test Simple Beamforming Observation Task Blueprint view", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "53", type:"blueprint"}}} history={{}} isUnitTest={true} location="/task/view/blueprint/53" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "53", type: "blueprint" } }} history={{}} isUnitTest={true} location="/task/view/blueprint/53" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); expect(content.getByText("Simple Beamforming Observation")).toBeInTheDocument(); expect(content.getAllByText("Observation").length).toBe(3); - // expect(content.getByText("oXXX Paaa+01 3Cabc")).toBeInTheDocument(); expect(content.getByText("beamforming observation")).toBeInTheDocument(); expect(content.getAllByText("Observation Start Time").length).toBe(1); expect(content.getAllByText("Observation End Time").length).toBe(1); @@ -1033,15 +1023,13 @@ it("test Simple Beamforming Observation Task Blueprint view", async () => { expect(content.getAllByRole("row").length).toBe(2); expect(content.getByTitle("Cancel Subtasks")).toBeInTheDocument(); expect(content.getAllByTitle("Mark as Obsolete").length).toBe(1); - // expect(content.getByTitle("Don't have permission to cancel ")).not.toBeInTheDocument(); - // expect(content.getByTitle("Don't have permission to mark as obsolete")).not.toBeInTheDocument(); - + expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByLabelText("specification[duration]")).toBeInTheDocument(); - + expect(content.getByText("Beamformer")).toBeInTheDocument(); expect(content.getByText("Pipelines")).toBeInTheDocument(); - + expect(content.getByText("Coherent Tied-Array Beams")).toBeInTheDocument(); expect(content.getAllByText("SAPs").length).toBe(3); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][SAPs][0][name]")).toBeInTheDocument(); @@ -1064,13 +1052,13 @@ it("test Simple Beamforming Observation Task Blueprint view", async () => { expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][quantisation][scale_max]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][quantisation][scale_min]")).toBeInTheDocument(); expect(content.getAllByText("Stokes").length).toBe(3); - + expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][subbands_per_file]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][time_integration_factor]")).toBeInTheDocument(); expect(content.getAllByText("Channels/subband").length).toBe(3); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][coherent][settings][time_resolution]")).toBeInTheDocument(); - + expect(content.getByText("Enable Fly's Eye")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][quantisation][scale_max]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][quantisation][scale_min]")).toBeInTheDocument(); @@ -1078,7 +1066,7 @@ it("test Simple Beamforming Observation Task Blueprint view", async () => { expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][time_integration_factor]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][flys eye][settings][time_resolution]")).toBeInTheDocument(); - + expect(content.getByText("Incoherent Tied-Array Beams")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][quantisation][scale_max]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][quantisation][scale_min]")).toBeInTheDocument(); @@ -1086,23 +1074,23 @@ it("test Simple Beamforming Observation Task Blueprint view", async () => { expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][time_integration_factor]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][frequency_resolution]")).toBeInTheDocument(); expect(content.getByLabelText("specification[beamformer][pipelines][0][incoherent][settings][time_resolution]")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[beamformer][pipelines][0][name]")).toBeInTheDocument(); expect(content.getAllByText("Station groups").length).toBe(2); expect(content.getByLabelText("specification[beamformer][pipelines][0][station_groups][0][max_nr_missing]")).toBeInTheDocument(); expect(content.getByText("Use PPF when beamforming")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][angle1]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][angle2]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][digital_pointing][target]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][name]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][subbands]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][SAPs][0][frequency]")).toBeInTheDocument(); - + expect(content.getByText("Antenna set")).toBeInTheDocument(); expect(content.getByText("Band-pass filter")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][station_groups][0][max_nr_missing]")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[station_configuration][tile_beam][angle1]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][tile_beam][angle2]")).toBeInTheDocument(); expect(content.getByLabelText("specification[station_configuration][tile_beam][target]")).toBeInTheDocument(); @@ -1111,7 +1099,7 @@ it("test Simple Beamforming Observation Task Blueprint view", async () => { it("test Target Observation Task Blueprint vew of IM HBA LoTSS - 2 Beams strategy", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "24", type:"blueprint"}}} history={{}} isUnitTest={true} location="/task/view/blueprint/24" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "24", type: "blueprint" } }} history={{}} isUnitTest={true} location="/task/view/blueprint/24" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -1131,9 +1119,6 @@ it("test Target Observation Task Blueprint vew of IM HBA LoTSS - 2 Beams strateg expect(content.getAllByRole("row").length).toBe(4); expect(content.getByTitle("Cancel Subtasks")).toBeInTheDocument(); expect(content.getAllByTitle("Mark as Obsolete").length).toBe(1); - // expect(content.getByTitle("Don't have permission to cancel ")).not.toBeInTheDocument(); - // expect(content.getByTitle("Don't have permission to mark as obsolete")).not.toBeInTheDocument(); - expect(content.getByText("Task Specification")).toBeInTheDocument(); expect(content.getByLabelText("specification[duration]")).toBeInTheDocument(); expect(content.getByLabelText("specification[correlator][integration_time]")).toBeInTheDocument(); @@ -1185,7 +1170,7 @@ it("test Target Observation Task Blueprint vew of IM HBA LoTSS - 2 Beams strateg it("test Calibrator Observation Task Blueprint vew of IM HBA LoTSS - 2 Beams strategy", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "22", type:"blueprint"}}} history={{}} isUnitTest={true} location="/task/view/blueprint/22" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "22", type: "blueprint" } }} history={{}} isUnitTest={true} location="/task/view/blueprint/22" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -1205,7 +1190,7 @@ it("test Calibrator Observation Task Blueprint vew of IM HBA LoTSS - 2 Beams str expect(content.getAllByRole("row").length).toBe(4); expect(content.getByTitle("Cancel Subtasks")).toBeInTheDocument(); expect(content.getAllByTitle("Mark as Obsolete").length).toBe(1); - await waitFor(()=>expect(content.getByText("Task Specification")).toBeInTheDocument()); + await waitFor(() => expect(content.getByText("Task Specification")).toBeInTheDocument()); expect(content.getByText("Auto-select")).toBeInTheDocument(); expect(content.getByLabelText("specification[calibrator][name]")).toBeInTheDocument(); expect(content.getByLabelText("specification[calibrator][pointing][angle1]")).toBeInTheDocument(); @@ -1218,7 +1203,7 @@ it("test Calibrator Observation Task Blueprint vew of IM HBA LoTSS - 2 Beams str it("test Calibrator Pipeline Task Blueprint view of IM HBA LoTSS - 2 Beams", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "23", type:"blueprint"}}} history={{}} isUnitTest={true} location="/task/view/blueprint/23" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "23", type: "blueprint" } }} history={{}} isUnitTest={true} location="/task/view/blueprint/23" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -1235,8 +1220,8 @@ it("test Calibrator Pipeline Task Blueprint view of IM HBA LoTSS - 2 Beams", asy expect(content.getAllByRole("row").length).toBe(2); expect(content.getByTitle("Cancel Subtasks")).toBeInTheDocument(); expect(content.getAllByTitle("Mark as Obsolete").length).toBe(1); - - await waitFor(()=>expect(content.getByText("Task Specification")).toBeInTheDocument()); + + await waitFor(() => expect(content.getByText("Task Specification")).toBeInTheDocument()); expect(content.getByLabelText("specification[average][time_steps]")).toBeInTheDocument(); expect(content.getByLabelText("specification[average][frequency_steps]")).toBeInTheDocument(); expect(content.getByLabelText("specification[average][time_resolution]")).toBeInTheDocument(); @@ -1263,7 +1248,7 @@ it("test Calibrator Pipeline Task Blueprint view of IM HBA LoTSS - 2 Beams", asy it("test Pulsar Pipeline Task Blueprint view", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "50", type:"blueprint"}}} history={{}} isUnitTest={true} location="/task/view/blueprint/50" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "50", type: "blueprint" } }} history={{}} isUnitTest={true} location="/task/view/blueprint/50" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -1271,7 +1256,6 @@ it("test Pulsar Pipeline Task Blueprint view", async () => { expect(content.getByText("BF Pulsar Timing")).toBeInTheDocument(); expect(content.getAllByText("Ingest").length).toBe(2); expect(content.getAllByText("Cleanup").length).toBe(2); - // expect(content.getByText("oXXX Paaa+01 3Cabc")).toBeInTheDocument(); expect(content.getByText("pulsar pipeline")).toBeInTheDocument(); expect(content.getAllByText("Process Start Time").length).toBe(2); expect(content.getAllByText("Process End Time").length).toBe(2); @@ -1280,14 +1264,11 @@ it("test Pulsar Pipeline Task Blueprint view", async () => { expect(content.getAllByRole("row").length).toBe(2); expect(content.getByTitle("Cancel Subtasks")).toBeInTheDocument(); expect(content.getAllByTitle("Mark as Obsolete").length).toBe(1); - // expect(content.getByTitle("Don't have permission to cancel ")).not.toBeInTheDocument(); - // expect(content.getByTitle("Don't have permission to mark as obsolete")).not.toBeInTheDocument(); - - await waitFor(()=>expect(content.getByText("Task Specification")).toBeInTheDocument()); + await waitFor(() => expect(content.getByText("Task Specification")).toBeInTheDocument()); expect(content.getByLabelText("specification[dspsr][digifil][dm]")).toBeInTheDocument(); expect(content.getByLabelText("specification[dspsr][digifil][channels_per_part]")).toBeInTheDocument(); expect(content.getByLabelText("specification[dspsr][digifil][integration_time_factor]")).toBeInTheDocument(); - + expect(content.getAllByText("Coherent Dedispersion").length).toBe(2); expect(content.getAllByText("Enabled").length).toBe(5); expect(content.getByLabelText("specification[dspsr][filterbank][channels_per_part]")).toBeInTheDocument(); @@ -1297,7 +1278,7 @@ it("test Pulsar Pipeline Task Blueprint view", async () => { expect(content.getByText("Single pulse subintegration")).toBeInTheDocument(); expect(content.getByLabelText("specification[output][quantisation][scale]")).toBeInTheDocument(); expect(content.getByLabelText("specification[output][dynamic_spectrum][time_average]")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[presto][input][nr_blocks]")).toBeInTheDocument(); expect(content.getByLabelText("specification[presto][input][decode_sigma]")).toBeInTheDocument(); expect(content.getByLabelText("specification[presto][input][samples_per_block]")).toBeInTheDocument(); @@ -1306,10 +1287,10 @@ it("test Pulsar Pipeline Task Blueprint view", async () => { expect(content.getByLabelText("specification[presto][prepdata][dm]")).toBeInTheDocument(); expect(content.getByText("Enable prepfold")).toBeInTheDocument(); expect(content.getByText("Fold")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[pulsar][name]")).toBeInTheDocument(); expect(content.getByText("Strategy")).toBeInTheDocument(); - + expect(content.getByLabelText("specification[cluster_resources][cores_per_task]")).toBeInTheDocument(); expect(content.getByLabelText("specification[cluster_resources][parallel_tasks]")).toBeInTheDocument(); expect(content.getByText("Cluster")).toBeInTheDocument(); @@ -1320,7 +1301,7 @@ it("test Pulsar Pipeline Task Blueprint view", async () => { it("test IM+BF Observation Task Draft vew of Solar Campaign strategy", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "69", type:"draft"}}} history={{}} location="/task/view/draft/69" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "69", type: "draft" } }} history={{}} location="/task/view/draft/69" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -1328,7 +1309,7 @@ it("test IM+BF Observation Task Draft vew of Solar Campaign strategy", async () expect(content.getAllByText("IM+BF").length).toBe(2); expect(content.getByText('IM+BF Observation')).toBeInTheDocument(); expect(content.getByText("parallel calibrator target and beamforming observation")).toBeInTheDocument(); - await waitFor(()=>expect(content.getByText("Task Specification")).toBeInTheDocument(), { timeout:2000}); + await waitFor(() => expect(content.getByText("Task Specification")).toBeInTheDocument(), { timeout: 2000 }); expect(content.getByText("Auto-select")).toBeInTheDocument(); expect(content.getByLabelText("specification[calibrator][name]")).toBeInTheDocument(); expect(content.getByLabelText("specification[calibrator][pointing][angle1]")).toBeInTheDocument(); @@ -1399,14 +1380,14 @@ it("test IM+BF Observation Task Draft vew of Solar Campaign strategy", async () expect(content.getByText("Inspection Plots")).toBeInTheDocument(); expect(content.getByText("autocorrelation")).toBeInTheDocument(); expect(content.getByText("crosscorrelation")).toBeInTheDocument(); -}); +}); it("test IM+BF Observation Task Blueprint vew of IM Solar Campaign strategy", async () => { - + jest.setTimeout(120000); let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "69", type:"blueprint"}}} history={{}} isUnitTest={true} location="/task/view/blueprint/69" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "69", type: "blueprint" } }} history={{}} isUnitTest={true} location="/task/view/blueprint/69" /></Router>); await new Promise((r) => setTimeout(r, 500)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -1421,8 +1402,8 @@ it("test IM+BF Observation Task Blueprint vew of IM Solar Campaign strategy", as expect(content.getAllByRole("tablehead").length).toBe(13); expect(content.getAllByRole("row").length).toBe(2); expect(content.getByTitle("Cancel Subtasks")).toBeInTheDocument(); - expect(content.getAllByTitle("Mark as Obsolete").length).toBe(1); - await waitFor(()=>expect(content.getByText("Task Specification")).toBeInTheDocument()); + expect(content.getAllByTitle("Mark as Obsolete").length).toBe(1); + await waitFor(() => expect(content.getByText("Task Specification")).toBeInTheDocument()); expect(content.getByLabelText("specification[duration]")).toBeInTheDocument(); expect(content.getByText("Auto-select")).toBeInTheDocument(); expect(content.getByLabelText("specification[calibrator][name]")).toBeInTheDocument(); @@ -1492,13 +1473,13 @@ it("test IM+BF Observation Task Blueprint vew of IM Solar Campaign strategy", as expect(content.getByLabelText("specification[QA][file_conversion][nr_of_timestamps]")).toBeInTheDocument(); expect(content.getByText("Inspection Plots")).toBeInTheDocument(); expect(content.getByText("autocorrelation")).toBeInTheDocument(); - expect(content.getByText("crosscorrelation")).toBeInTheDocument(); + expect(content.getByText("crosscorrelation")).toBeInTheDocument(); }); it("Checking Correctness of Custom fields in JEditor using Simple Observation draft", async () => { let content; await act(async () => { - content = render(<Router><TaskView match={{params:{id: "70", type:"draft"}}} history={{}} isUnitTest={true} location="/task/view/draft/70" /></Router>); + content = render(<Router><TaskView match={{ params: { id: "70", type: "draft" } }} history={{}} isUnitTest={true} location="/task/view/draft/70" /></Router>); await new Promise((r) => setTimeout(r, 2000)); }); expect(content.getByText("Task - Details")).toBeInTheDocument(); @@ -1506,7 +1487,7 @@ it("Checking Correctness of Custom fields in JEditor using Simple Observation dr expect(content.getAllByText('Observation').length).toBe(1); expect(content.getByText('Observation')).toBeInTheDocument(); - + expect(content.getByLabelText("specification[correlator][frequency_resolution]")).toBeInTheDocument(); const freqRes = content.getByLabelText("specification[correlator][frequency_resolution]"); expect(freqRes.value).toBe('3.05'); @@ -1518,11 +1499,11 @@ it("Checking Correctness of Custom fields in JEditor using Simple Observation dr expect(freqSAP.value).toBe('99.9-147.6'); - - await waitFor(()=>expect(content.getByRole("textbox",{name: "specification[station_configuration][SAPs][0][digital_pointing][angle1]"})).toBeInTheDocument()); - await waitFor(()=>expect(content.getByRole("textbox",{name: "specification[station_configuration][SAPs][0][digital_pointing][angle2]"})).toBeInTheDocument()); - const angle1El =content.getByRole("textbox",{name: "specification[station_configuration][SAPs][0][digital_pointing][angle1]"}); - const angle1E2 =content.getByRole("textbox",{name: "specification[station_configuration][SAPs][0][digital_pointing][angle2]"}); + + await waitFor(() => expect(content.getByRole("textbox", { name: "specification[station_configuration][SAPs][0][digital_pointing][angle1]" })).toBeInTheDocument()); + await waitFor(() => expect(content.getByRole("textbox", { name: "specification[station_configuration][SAPs][0][digital_pointing][angle2]" })).toBeInTheDocument()); + const angle1El = content.getByRole("textbox", { name: "specification[station_configuration][SAPs][0][digital_pointing][angle1]" }); + const angle1E2 = content.getByRole("textbox", { name: "specification[station_configuration][SAPs][0][digital_pointing][angle2]" }); expect(angle1El.value).toBe('03h06m00s'); expect(angle1E2.value).toBe('89d59m00s'); diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/CalendarTimeline.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/CalendarTimeline.js index a525af14cc6ffb502ba9c54674980c8777e0d0e3..13e5b5559b42a1ec677cb95fcfec74cb8ef970e0 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/CalendarTimeline.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/CalendarTimeline.js @@ -69,8 +69,6 @@ export class CalendarTimeline extends Component { weekDay = moment.utc(moment(weekDay).format(UTC_DATE_FORMAT)); } const defaultZoomLevel = _.find(ZOOM_LEVELS, { name: DEFAULT_ZOOM_LEVEL }); - // const defaultStartTime = props.startTime?(weekDay?weekDay.clone():props.startTime.clone()):null || moment().utc().add(-1 * defaultZoomLevel.value/2, 'seconds'); - // const defaultEndTime = props.endTime?(weekDay?weekDay.clone().hours(23).minutes(59).seconds(59):props.endTime.clone()):null || moment().utc().add(1 * defaultZoomLevel.value/2, 'seconds'); const defaultStartTime = props.startTime ? props.startTime.clone() : null || moment().utc().add(-1 * defaultZoomLevel.value / 2, 'seconds'); const defaultEndTime = props.endTime ? props.endTime.clone() : null || moment().utc().add(1 * defaultZoomLevel.value / 2, 'seconds'); this.state = { @@ -1593,7 +1591,6 @@ export class CalendarTimeline extends Component { this.changeWeek(null, true); } - // console.log("rendering: ", this.state.showTimelineItems) return ( <React.Fragment> <div className="timeline-tools"> @@ -1671,16 +1668,7 @@ export class CalendarTimeline extends Component { <DateHeader unit={this.state.lstDateHeaderUnit} intervalRenderer={({ getIntervalProps, intervalContext, data }) => { return this.renderLSTDateHeader({ getIntervalProps, intervalContext, data }) }}> </DateHeader> - // This method will render once but will not update the values after fetching from server - // <DateHeader unit={this.state.lstDateHeaderUnit} intervalRenderer={this.renderLSTDateHeader}></DateHeader> } - {/* Suntime Header in normal view with sunrise, sunset and night time */} - {/* {this.props.showSunTimings && this.state.viewType === UIConstants.timeline.types.NORMAL && this.state.sunTimeMap && - <CustomHeader height={30} unit="minute" - children={({ headerContext: { intervals }, getRootProps, getIntervalProps, showPeriod, data})=> { - return this.renderNormalSuntimeHeader({ headerContext: { intervals }, getRootProps, getIntervalProps, showPeriod, data})}}> - </CustomHeader> - } */} </TimelineHeaders> <TimelineMarkers> diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/WeekView.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/WeekView.js index 3fc61eb1dbcf0c35af7dca91c5d68b7069094c61..4419d0f6c8ccd33d930fe555e1ab1d047acbe2e8 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/WeekView.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/WeekView.js @@ -1,5 +1,5 @@ import Filters from "./components/toolbar/Filters"; -import {useEffect, useRef, useState} from "react"; +import { useEffect, useRef, useState } from "react"; //TODO: this import does something magical for the timeline; find out what import CalendarTimeline from './CalendarTimeline'; import Timeline, { @@ -11,33 +11,33 @@ import Timeline, { TimelineMarkers } from "react-calendar-timeline"; import moment from "moment"; -import {getIntervalRendererLST} from "./helpers/timeline.headers.helper"; +import { getIntervalRendererLST } from "./helpers/timeline.headers.helper"; import UIConstants from "../../utils/ui.constants"; -import {groupRenderer, itemRenderer} from "./helpers/timeline.renderer.helper"; +import { groupRenderer, itemRenderer } from "./helpers/timeline.renderer.helper"; import containerResizeDetector from "react-calendar-timeline/lib/resize-detector/container"; import TimelineItemPopover from "./components/TimelineItemPopover"; import { - calculateSizeAndSetPanelClassName, createGroups, getCursorDateTimes, getHeaderActions, getPageHeaderOptionsMenuItems, getSchedulerActions, + getNavigationActions, + getGroupedByActions, updateSchedulerStatuses, } from "./helpers/week.view.helper"; -import {getStore} from "../../services/store.helper"; +import { getStore } from "../../services/store.helper"; import DateTimeNavigator from "./components/toolbar/DateTimeNavigator"; import ZoomAndMove from "./components/toolbar/ZoomAndMove"; -import {ProgressBar} from "primereact/progressbar"; +import { ProgressBar } from "primereact/progressbar"; import Legendbar from "./components/Legendbar"; -import PanelButtons from "./components/PanelButtons"; import SchedulingUnitSummary from "../Scheduling/summary"; -import {useLocation} from "react-router-dom"; -import {editConstraintSettings, updateSUConstraintTemplate} from "../Scheduling/summary.helper"; +import { useLocation } from "react-router-dom"; +import { editConstraintSettings, updateSUConstraintTemplate } from "../Scheduling/summary.helper"; import PageHeader from "../../layout/components/PageHeader"; -import {CustomDialog} from "../../layout/components/CustomDialog"; +import { CustomDialog } from "../../layout/components/CustomDialog"; import DynamicScheduler from "../../components/DynamicScheduler"; -import {TieredMenu} from "primereact/tieredmenu"; +import { TieredMenu } from "primereact/tieredmenu"; import { ProgressSpinner } from 'primereact/progressspinner'; import ReservationSummary from "../Reservation/reservation.summary"; @@ -57,17 +57,17 @@ import ReservationService from "../../services/reservation.service"; function getTimelineHeaders(headerSettings) { return <TimelineHeaders className="sticky"> <SidebarHeader> - {({getRootProps}) => { //getRootProps is mandatory for the library + {({ getRootProps }) => { //getRootProps is mandatory for the library return <div {...getRootProps()} className="sidebar-header"> <div className="sidebar-header-row">UTC</div> <div className="sidebar-header-row" title="Approximate LST">~ LST</div> </div> }} </SidebarHeader> - <DateHeader unit={headerSettings.unit} labelFormat="HH:mm"/> - <DateHeader unit={headerSettings.unit} intervalRenderer={({getIntervalProps, intervalContext}) => { - return getIntervalRendererLST({getIntervalProps, intervalContext}, headerSettings.lstShiftInSeconds) - }}/> + <DateHeader unit={headerSettings.unit} labelFormat="HH:mm" /> + <DateHeader unit={headerSettings.unit} intervalRenderer={({ getIntervalProps, intervalContext }) => { + return getIntervalRendererLST({ getIntervalProps, intervalContext }, headerSettings.lstShiftInSeconds) + }} /> </TimelineHeaders>; } @@ -75,17 +75,17 @@ function getTimelineMarkers(setCursorDate) { const now = moment(moment().utc(false).format(UIConstants.UTC_DATE_TIME_FORMAT)) return <TimelineMarkers> <CustomMarker date={now.valueOf()}> - {({styles}) => { + {({ styles }) => { const customStyles = { ...styles, backgroundColor: 'var(--green)', zIndex: 998 } - return <div style={customStyles}/> + return <div style={customStyles} /> }} </CustomMarker> <CursorMarker> - {({styles, date}) => { + {({ styles, date }) => { setCursorDate(date) //TODO: don't do this but find a better solution const customStyles = { ...styles, @@ -93,7 +93,7 @@ function getTimelineMarkers(setCursorDate) { zIndex: 998, height: "100%" } - return <div style={customStyles}/> + return <div style={customStyles} /> }} </CursorMarker> </TimelineMarkers>; @@ -119,15 +119,20 @@ export default function WeekView() { }) const [showSchedulerSettingsDialog, setShowSchedulerSettingsDialog] = useState(false) + const [grouping, setGrouping] = useState("Date") + //data info const [isLoading, setIsLoading] = useState(false) const [refetchToggle, setRefetchToggle] = useState(false) + const [isExpanded, setIsExpanded] = useState(true) const [data, setData] = useState({ schedulingUnits: [], reservations: [], }) //timeline component + + const [weekNumbers, setWeekNumbers] = useState(""); const [startTime, setStartTime] = useState(moment().startOf('day')) const [endTime, setEndTime] = useState(moment().endOf('day').add(UIConstants.WEEKVIEW_SHOW_NUMBER_OF_DAYS, 'days')) const [groups, setGroups] = useState(createGroups(moment().startOf('day'))) @@ -148,7 +153,7 @@ export default function WeekView() { //timeline item pop-over component const [mouseOverItem, setMouseOverItem] = useState() - const [popPosition, setPopPosition] = useState({display: 'none'}) + const [popPosition, setPopPosition] = useState({ display: 'none' }) const [summaryItem, setSummaryItem] = useState() //marker that also displays time information on thge group @@ -158,15 +163,10 @@ export default function WeekView() { lst: undefined, }) - //left-right panel elements TODO: combine states (into left + right sections) - const [showLegendbar, setShowLegendbar] = useState(false) + const [showLegendbar, setShowLegendbar] = useState(false) const [showSummary, setShowSummary] = useState(false) - const [panelClassNames, setPanelClassNames] = useState({ - leftPanelClassName: "timeline-panel", - middlePanelClassName: "timeline-panel", - rightPanelClassName: "timeline-panel" - }) - const [leftPanelSize, setLeftPanelSize] = useState(30) //30% of the screen + + //details summary const [summarySettings, setSummarySettings] = useState({ @@ -183,7 +183,7 @@ export default function WeekView() { useEffect(() => { //TODO: extract const currentGroupIndex = groups.findIndex(group => group.title === mouseOverItem?.group) if (currentGroupIndex >= 0) { - const currentGroupDate = moment(groups[currentGroupIndex].title, UIConstants.CALENDAR_GROUP_FORMAT).format(UIConstants.CALENDAR_DEFAULTDATE_FORMAT) + const currentGroupDate =groups[currentGroupIndex].date; getCursorDateTimes(cursorTimeUTC, currentGroupIndex, currentGroupDate, headerSettings.lstShiftInSeconds, setCursorInformation); let newGroups = groups.map(group => Object.assign({}, group)); newGroups.forEach(group => delete group.cursorInfo) @@ -194,6 +194,7 @@ export default function WeekView() { useEffect(() => { //initializer + setIsLoading(true) setGroups(createGroups(startTime)) if (!Object.values(visibleTime).some(value => value === undefined)) { //TODO: extract @@ -207,7 +208,7 @@ export default function WeekView() { end: startDateWithVisibleEndTime }) } - + setWeekString( startTime, endTime); const loadingStates = [] loadingStates.push(fetchTimelineData(startTime, endTime, setData).catch(e => console.error("Couldn't get scheduling units and/or reservations", e))) loadingStates.push(fetchSunTimings(startTime, setItems).catch(e => console.error("Couldn't retrieve sun timings", e))) @@ -221,10 +222,7 @@ export default function WeekView() { Promise.all(loadingStates).then(() => setIsLoading(false)) }, [startTime, endTime, refetchToggle]) - useEffect(() => { //resizing - calculateSizeAndSetPanelClassName(showLegendbar, showSummary, leftPanelSize, setPanelClassNames) - }, [showLegendbar, showSummary, leftPanelSize]) - + useEffect(() => { //summary information if (summaryItem === undefined) { setShowSummary(false) @@ -248,21 +246,35 @@ export default function WeekView() { } }, [summaryItem]); + function setWeekString( newStart, newEnd) { + let weekString = newStart.week() === newEnd.week() ? newStart.week() : newStart.week() + "," + newEnd.week(); + weekString = "Week " + weekString; + setWeekNumbers(weekString); + } + + function navigateToWeek(addingWeeks) { + const newStart = moment(startTime).endOf('day').add(addingWeeks, 'weeks') + setStartTime(newStart); + const newEnd = moment(endTime).endOf('day').add(addingWeeks, 'weeks') + setEndTime(newEnd); + setWeekString( newStart, newEnd); + + } // websocket handling /** * Function to call wnen websocket is connected */ function onConnect() { - try{ + try { console.log("WS Opened"); const userDets = localStorage.getItem("user"); if (userDets) { - sendMessage(JSON.stringify({"token": JSON.parse(userDets).websocket_token})); + sendMessage(JSON.stringify({ "token": JSON.parse(userDets).websocket_token })); console.log("Auth token submitted"); } - }catch (err) { - console.log('err',err) + } catch (err) { + console.log('err', err) } } @@ -284,7 +296,7 @@ export default function WeekView() { switch (jsonData.action) { case 'delete': { const schedulingUnits = data.schedulingUnits - _.remove(schedulingUnits, function (su) { return su.id === jsonData.object_details.id}); + _.remove(schedulingUnits, function (su) { return su.id === jsonData.object_details.id }); setData(prevData => ({ ...prevData, schedulingUnits: schedulingUnits @@ -298,7 +310,7 @@ export default function WeekView() { setData(prevData => ({ ...prevData, schedulingUnits: prevData.schedulingUnits.map( - unit => unit.id === jsonData.object_details.id? {...unit, ...jsonData.object_details}: unit + unit => unit.id === jsonData.object_details.id ? { ...unit, ...jsonData.object_details } : unit ) })); if (summaryItem?.id === jsonData.object_details.id) { @@ -313,19 +325,19 @@ export default function WeekView() { // })); // // Instead, trigger a full refresh of the details panel: - setSummaryItem({id: jsonData.object_details.id, type: "SCHEDULE"}); + setSummaryItem({ id: jsonData.object_details.id, type: "SCHEDULE" }); } break; } case 'create': { // The websocket message only contains a subset of the details we need, so fetch the full set ScheduleService.getTimelineSlimBlueprints(undefined, undefined, jsonData.object_details.id) // todo: check time - .then((response) => { - setData(prevData => ({ - ...prevData, - schedulingUnits: prevData.schedulingUnits.concat(response) - })); - }); + .then((response) => { + setData(prevData => ({ + ...prevData, + schedulingUnits: prevData.schedulingUnits.concat(response) + })); + }); break; } default: { break; } @@ -336,7 +348,7 @@ export default function WeekView() { switch (jsonData.action) { case 'delete': { const reservations = data.reservations - _.remove(reservations, function (res) { return res.id === jsonData.object_details.id}); + _.remove(reservations, function (res) { return res.id === jsonData.object_details.id }); setData(prevData => ({ ...prevData, reservations: reservations @@ -350,12 +362,12 @@ export default function WeekView() { setData(prevData => ({ ...prevData, reservations: prevData.reservations.map( - res => res.id === jsonData.object_details.id? {...res, ...jsonData.object_details}: res + res => res.id === jsonData.object_details.id ? { ...res, ...jsonData.object_details } : res ), })); if (summaryItem?.id === jsonData.object_details.id) { // Trigger a full refresh of the details panel - setSummaryItem({id: jsonData.object_details.id, type: "RESERVATION"}); + setSummaryItem({ id: jsonData.object_details.id, type: "RESERVATION" }); } break; } @@ -364,12 +376,12 @@ export default function WeekView() { if (shouldFetchReservations) { // The websocket message only contains a subset of the details we need, so fetch the full set ReservationService.getTimelineReservations(undefined, undefined, jsonData.object_details.id) // todo: check time - .then((response) => { - setData(prevData => ({ - ...prevData, - reservations: prevData.reservations.concat(response) - })); - }); + .then((response) => { + setData(prevData => ({ + ...prevData, + reservations: prevData.reservations.concat(response) + })); + }); } break; } @@ -381,66 +393,77 @@ export default function WeekView() { } } + + /** + * Toggles Legend, and when not expanded , expand + * @param {boolean} newState - State of Legend + */ + + function toggleLegend(newState) { + if (newState&&!isExpanded) { + setIsExpanded(true); + } + setShowLegendbar(newState); + } + + // websocket hook that opens and allows interaction via the wss connection const { - sendMessage, - sendJsonMessage, - lastMessage, - lastJsonMessage, - readyState, - getWebSocket, + sendMessage, + sendJsonMessage, + lastMessage, + lastJsonMessage, + readyState, + getWebSocket, } = useWebSocket(process.env.REACT_APP_WEBSOCKET_URL, { - onOpen: () => onConnect(), - onClose: () => onDisconnect(), - onMessage: (event) => handleData(event), - onError: (event) => { console.error(event); }, - shouldReconnect: (closeEvent) => true, + onOpen: () => onConnect(), + onClose: () => onDisconnect(), + onMessage: (event) => handleData(event), + onError: (event) => { console.error(event); }, + shouldReconnect: (closeEvent) => true, }); return <div> - <div className={(isLoading ? "" : "hide-element")}> + <div className={(isLoading ? "fix-element" : "hide-element")}> <ProgressBar className={isLoading ? "" : "hide-element"} mode="indeterminate" - style={{height: '0.25rem'}}/> + style={{ height: '0.25rem' }} /> </div> - {!permissions ? <ProgressSpinner className="m-4" style={{color: "var(--primary-300)"}}/> : + {!permissions ? <ProgressSpinner className="m-4" style={{ color: "var(--primary-300)" }} /> : <TieredMenu className="app-header-menu" popup ref={actionsMenuRef} - model={getPageHeaderOptionsMenuItems(permissions)}/>} - <PageHeader location={location} title={'Scheduling Units - Week View'} - actions={getSchedulerActions(schedulerSettings, setShowSchedulerSettingsDialog) - .concat(getHeaderActions(isLoading, setRefetchToggle, actionsMenuRef))}/> + model={getPageHeaderOptionsMenuItems(permissions)} />} + <PageHeader location={location} title={'Scheduling Units - ' + weekNumbers + ' View' } + actions={getNavigationActions(navigateToWeek).concat(getSchedulerActions(schedulerSettings, setShowSchedulerSettingsDialog)) + .concat(getHeaderActions(isLoading, setRefetchToggle, actionsMenuRef, isExpanded, setIsExpanded, showLegendbar, toggleLegend))} /> <div className="p-grid"> - <div className={panelClassNames.leftPanelClassName}> - <Legendbar className={showLegendbar ? undefined : "hide-element"}/> - </div> + + + <div className="timeline-panel"> + + <div className="timeline-tools" style={{display: isExpanded? 'flex': 'none'}}> + + <Filters timelineStore={timelineStore} + visibleStartTime={visibleTime.start} + setItems={setItems} + data={data} + setRefetchToggle={setRefetchToggle} + /> + <DateTimeNavigator timelineStore={timelineStore} + startTime={startTime} + setStartTime={setStartTime} + setEndTime={setEndTime} + /> + <ZoomAndMove timelineStore={timelineStore} + startTime={startTime} + setVisibleTime={setVisibleTime} + visibleTime={visibleTime} + headerSettings={headerSettings} + setHeaderSettings={setHeaderSettings} + /> + <Legendbar className={showLegendbar ? undefined : "hide-element"} /> + + </div> + - <div className={panelClassNames.middlePanelClassName}> - <PanelButtons showLegendbar={showLegendbar} - setShowLegendbar={setShowLegendbar} - leftPanelSize={leftPanelSize} - setLeftPanelSize={setLeftPanelSize}/> - - <div className="timeline-tools"> - <Filters timelineStore={timelineStore} - visibleStartTime={visibleTime.start} - setItems={setItems} - data={data} - setRefetchToggle={setRefetchToggle} - - /> - <DateTimeNavigator timelineStore={timelineStore} - startTime={startTime} - endTime={endTime} - setStartTime={setStartTime} - setEndTime={setEndTime} - /> - <ZoomAndMove timelineStore={timelineStore} - startTime={startTime} - setVisibleTime={setVisibleTime} - visibleTime={visibleTime} - headerSettings={headerSettings} - setHeaderSettings={setHeaderSettings} - /> - </div> {Object.values(visibleTime).some(value => value === undefined) ? <ProgressSpinner /> : <Timeline groups={groups} @@ -460,14 +483,14 @@ export default function WeekView() { canResize={false} stackItems={true} //render settings - groupRenderer={({group}) => groupRenderer({group})} + groupRenderer={({ group }) => groupRenderer({ group })} itemRenderer={({ - item, - timelineContext, - itemContext, - getItemProps, - getResizeProps - }) => itemRenderer({ + item, + timelineContext, + itemContext, + getItemProps, + getResizeProps + }) => itemRenderer({ item, timelineContext, itemContext, @@ -479,54 +502,57 @@ export default function WeekView() { {getTimelineMarkers(setCursorTimeUTC)} </Timeline>} </div> - <div className={panelClassNames.rightPanelClassName + " summary"}> + {showSummary && ( + <div className="timeline-panel summary"> {showSummary && - (summarySettings.isLoading ? <ProgressSpinner className="m-4" style={{color: "var(--primary-300)"}}/> - : (summaryItem.type === "RESERVATION" ? - (summarySettings.reservationItem === undefined ? - <ProgressSpinner className="m-4" style={{color: "var(--primary-300)"}}/> : - <ReservationSummary reservation={summarySettings.reservationItem} - viewInNewWindow - location={location} - closeCallback={() => setShowSummary(false)}> - </ReservationSummary>) : - (summarySettings.schedulingUnitItem === undefined ? - <ProgressSpinner className="m-4" style={{color: "var(--primary-300)"}}/> : - <SchedulingUnitSummary - schedulingUnit={summarySettings.schedulingUnitItem} - viewInNewWindow - constraintsTemplate={summarySettings.summaryConstraintTemplate} - onUpdate={(suId, updatedConstraintTemplate) => - updateSUConstraintTemplate(suId, updatedConstraintTemplate, setOnClose, setOnSaveDisabled, setShowSummary)} - newPopupvalue={() => { - }} - onClose={onClose} - onSavedisable={onSaveDisabled} - onCloseFn={(val) => editConstraintSettings(val, setOnClose, setOnSaveDisabled, setCancelStatus)} - closeCallback={() => setShowSummary(false)} - cancelCheckstatus={(val) => setCancelStatus(val)} - cancelStatus={cancelStatus} - location={location}> - </SchedulingUnitSummary>)) + (summarySettings.isLoading ? <ProgressSpinner className="m-4" style={{ color: "var(--primary-300)" }} /> + : (summaryItem.type === "RESERVATION" ? + (summarySettings.reservationItem === undefined ? + <ProgressSpinner className="m-4" style={{ color: "var(--primary-300)" }} /> : + <ReservationSummary reservation={summarySettings.reservationItem} + viewInNewWindow + location={location} + closeCallback={() => setShowSummary(false)}> + </ReservationSummary>) : + (summarySettings.schedulingUnitItem === undefined ? + <ProgressSpinner className="m-4" style={{ color: "var(--primary-300)" }} /> : + <SchedulingUnitSummary + schedulingUnit={summarySettings.schedulingUnitItem} + viewInNewWindow + constraintsTemplate={summarySettings.summaryConstraintTemplate} + onUpdate={(suId, updatedConstraintTemplate) => + updateSUConstraintTemplate(suId, updatedConstraintTemplate, setOnClose, setOnSaveDisabled, setShowSummary)} + newPopupvalue={() => { + }} + onClose={onClose} + onSavedisable={onSaveDisabled} + onCloseFn={(val) => editConstraintSettings(val, setOnClose, setOnSaveDisabled, setCancelStatus)} + closeCallback={() => setShowSummary(false)} + cancelCheckstatus={(val) => setCancelStatus(val)} + cancelStatus={cancelStatus} + location={location}> + </SchedulingUnitSummary>)) )} - </div> + </div> )} </div> {mouseOverItem && mouseOverItem.type !== "SUNTIME" ? <div className="p-overlaypanel p-component timeline-popover" - style={{...popPosition}}> - <TimelineItemPopover mouseOverItem={mouseOverItem}/> + style={{ ...popPosition }}> + <TimelineItemPopover mouseOverItem={mouseOverItem} /> </div> : null} <div className="p-grid" data-testid="confirm_dialog"> <CustomDialog type="success" - visible={showSchedulerSettingsDialog} - showIcon={false} - header="Scheduling Settings" - message={<DynamicScheduler callBack={async (val, status) => - await updateSchedulerStatuses(val, status, setSchedulerSettings)} - />} - onClose={() => setShowSchedulerSettingsDialog(false)} + visible={showSchedulerSettingsDialog} + showIcon={false} + header="Scheduling Settings" + message={<DynamicScheduler callBack={async (val, status) => + await updateSchedulerStatuses(val, status, setSchedulerSettings)} + />} + onClose={() => setShowSchedulerSettingsDialog(false)} /> </div> </div> -} \ No newline at end of file +} + + diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/Legendbar.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/Legendbar.js index 858df58df428d85e8805b0d2032a64ccca15d674..02459eae6f780b76a0e6faa282745ff5d0ed5d03 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/Legendbar.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/Legendbar.js @@ -1,8 +1,8 @@ import UIConstants from "../../../utils/ui.constants"; - +import { Panel } from 'primereact/panel'; function getLegendItem(section, index) { return <div className="section" key={"section-" + index}> - <label className="col-2" + <label className="sectiontitle col-2" title={section.subtitle ? section.subtitle : section.title}>{section.title}:</label> {section.elements.map((element, index) => <div className={`su-legend ${element.classKey}`} key={element.classKey + "-" + index} @@ -13,8 +13,7 @@ function getLegendItem(section, index) { } export default function Legendbar(props) { - return <div className={props.className}> - <div className="legend-header">Legend</div> + return <Panel header="Legend" className={props.className}> <div className="p-grid legendbar"> <div className="left"> {UIConstants.LEGEND_INFO.slice(0, 4).map((section, index) => getLegendItem(section, index))} @@ -23,5 +22,5 @@ export default function Legendbar(props) { {UIConstants.LEGEND_INFO.slice(4).map((section, index) => getLegendItem(section, index))} </div> </div> - </div> + </Panel> } \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeNavigator.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeNavigator.js index 1e73d8049f3dadbb5b692d3a6c6ea74e1376b861..237378696f0dda2396e34d90f7ac95fb6e8d8811 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeNavigator.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeNavigator.js @@ -1,12 +1,13 @@ import Flatpickr from "react-flatpickr"; import {Button} from "primereact/button"; import {useEffect, useState} from "react"; -import DateTimeInfo from "./DateTimeInfo"; +import JumpToSUId from "./JumpToSuid"; import moment from "moment"; import UIConstants from "../../../../utils/ui.constants"; -import {InputNumber} from "primereact/inputnumber"; + import axios from "axios"; import {getStore} from "../../../../services/store.helper"; +import { Panel } from 'primereact/panel'; function DateSelector(props) { //TODO: extract to separate class const { @@ -62,72 +63,9 @@ function DateSelector(props) { //TODO: extract to separate class </div> } -function WeekChanger(props) { //TODO: extract to separate class - const { - isRange, - startTime, - endTime, - setStartAndEndTimeCallback - } = props - if (isRange || !startTime || !endTime) { - return null - } - const weekNumbers = startTime.week() === endTime.week() ? startTime.week() : startTime.week() + "," + endTime.week() - - return <div className="week-changer" data-testid="nav-week-changer"> - <label>Week: </label><span className="h5 text-normal">{weekNumbers}</span> - <div> - <Button className="p-button-icon-only week-button" - data-testid="nav-week-previous" - icon="pi pi-angle-double-left" - title="Previous 7 days" - onClick={() => { - const newStartTime = moment(startTime).startOf('day').subtract(1, 'weeks'); - const newEndTIme = moment(endTime).endOf('day').subtract(1, 'weeks'); - setStartAndEndTimeCallback(newStartTime, newEndTIme) - }}/> - <Button className="p-button-icon-only week-button" - data-testid="nav-week-next" - icon="pi pi-angle-double-right" - title="Next 7 days" - onClick={() => { - const newStartTime = moment(startTime).startOf('day').add(1, 'weeks'); - const newEndTIme = moment(endTime).endOf('day').add(1, 'weeks'); - setStartAndEndTimeCallback(newStartTime, newEndTIme) - }}/> - </div> - - </div> -} - -function JumpToSUId(props) { //TODO: extract to separate class - const { - suId, - setSUId, - setSearchForSUIdTrigger - } = props - - return <div data-testid="nav-jump-to-suid"> - <label>Jump to SU id</label> - <div> - <InputNumber data-testid="jump-to-input" - className="jump-to-input" - value={suId} - format={false} - onValueChange={(e) => setSUId(e.value)} - /> - <Button className="p-button-icon-only calendar-button" - title="Set the week to the scheduling unit's on sky or process start time." - data-testid="nav-jump-to-button" - onClick={() => setSearchForSUIdTrigger(prevState => !prevState)}> - <i className="fas fa-search"></i> - </Button> - </div> - </div> -} function changeStartAndEndTimeCallback(setStartTime, setEndTime) { return (newStartTime, newEndTime) => { @@ -139,7 +77,6 @@ function changeStartAndEndTimeCallback(setStartTime, setEndTime) { export default function DateTimeNavigator(props) { const { startTime, - endTime, setStartTime, setEndTime } = props @@ -169,14 +106,9 @@ export default function DateTimeNavigator(props) { }, [searchForSUIdTrigger]) return <div className="p-grid timeline-datetime-navigator"> - <div className="section"> - <div className="header">Navigation</div> + <Panel header="Navigation"> <div className="group"> - <div className="info-container"> - <DateTimeInfo/> - <WeekChanger isRange={false} startTime={startTime} endTime={endTime} - setStartAndEndTimeCallback={changeStartAndEndTimeCallback(setStartTime, setEndTime)}/> - </div> + <div className="selector-container"> <DateSelector isRange={false} startTime={startTime} setStartAndEndTimeCallback={changeStartAndEndTimeCallback(setStartTime, setEndTime)}/> @@ -184,6 +116,6 @@ export default function DateTimeNavigator(props) { setSearchForSUIdTrigger={setSearchForSUIdTrigger}/> </div> </div> - </div> + </Panel> </div> } \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeNavigator.test.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeNavigator.test.js index c9bc7b482acfffb75be5a42cd784fdbcbd1e9dd7..0b74d484eb25c25f098dc99c7eb947aa07e1c9c9 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeNavigator.test.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/DateTimeNavigator.test.js @@ -1,11 +1,13 @@ import moment from "moment"; -import DateTimeNavigator from "./DateTimeNavigator"; -import { fireEvent, render ,act, waitFor} from "@testing-library/react"; +import DateTimeNavigator from "./DateTimeNavigator"; +import { render } from "@testing-library/react"; import { clickItem, removeReact18ConsoleErrors } from "../../../../utils/test.helper"; -import UtilService from "../../../../services/util.service"; + removeReact18ConsoleErrors() + + describe('DateTimeNavigator', () => { const mockSetStartTime = jest.fn(); const mockSetEndTime = jest.fn(); @@ -14,7 +16,6 @@ describe('DateTimeNavigator', () => { const pageContent = render( <DateTimeNavigator startTime={moment()} - endTime={moment()} setStartTime={mockSetStartTime} setEndTime={mockSetEndTime} /> @@ -22,89 +23,41 @@ describe('DateTimeNavigator', () => { const dateSelector = pageContent.getByTestId('nav-datetime-selector'); const resetButton = pageContent.getByTestId('nav-reset-button'); - const nextWeekButton = pageContent.getByTestId('nav-week-next'); - const previousWeekButton = pageContent.getByTestId('nav-week-previous'); const jumpToSUIdButton = pageContent.getByTestId('nav-jump-to-button'); expect(dateSelector).toBeInTheDocument(); expect(dateSelector.textContent).toBe("Showing week from"); expect(resetButton).toBeInTheDocument(); expect(resetButton.title).toBe("Reset to the current week"); - expect(nextWeekButton).toBeInTheDocument(); - expect(nextWeekButton.title).toBe("Next 7 days"); - expect(previousWeekButton).toBeInTheDocument(); - expect(previousWeekButton.title).toBe("Previous 7 days"); expect(jumpToSUIdButton).toBeInTheDocument(); expect(jumpToSUIdButton.title).toBe("Set the week to the scheduling unit's on sky or process start time.") }); it('Clicks buttons; reset, previous+next week', () => { const mockStartTime = moment('2023-08-15'); - const mockEndTime = moment('2023-08-22'); const pageContent = render( <DateTimeNavigator startTime={mockStartTime} - endTime={mockEndTime} setStartTime={mockSetStartTime} setEndTime={mockSetEndTime} /> ); const resetButton = pageContent.getByTestId('nav-reset-button'); - const nextWeekButton = pageContent.getByTestId('nav-week-next'); - const previousWeekButton = pageContent.getByTestId('nav-week-previous'); - - + clickItem(resetButton) expect(mockSetStartTime).toHaveBeenCalledTimes(1); expect(mockSetEndTime).toHaveBeenCalledTimes(1); - - clickItem(previousWeekButton) - expect(mockSetStartTime).toHaveBeenCalledTimes(2); - expect(mockSetEndTime).toHaveBeenCalledTimes(2); - - clickItem(nextWeekButton) - expect(mockSetStartTime).toHaveBeenCalledTimes(3); - expect(mockSetEndTime).toHaveBeenCalledTimes(3); }); - // TODO : Fix Unit Test Sets the start time for an SU ID upon search click - it.skip('Sets the start time for an SU ID upon search click', async () => { - - const utcTime = '2023-08-11 06:20:45'; - let utcSpy = jest.spyOn(UtilService, 'getUTC').mockResolvedValue(utcTime); - - let pageContent; - act(() => - pageContent = render( - <DateTimeNavigator - startTime={moment('2023-08-15')} - endTime={moment('2023-08-22')} - setStartTime={mockSetStartTime} - setEndTime={mockSetEndTime} - /> - )); - await waitFor (() => expect (pageContent.queryByTestId('jump-to-input')).toBeInTheDocument()); - const suIdInput = pageContent.getByTestId('jump-to-input'); - const jumpToButton = pageContent.getByTestId('nav-jump-to-button'); - - const suId = 456 - clickItem(suIdInput) - - act(() => fireEvent.change(suIdInput, { target: { value: suId } })); - clickItem(jumpToButton) - - expect(mockSetStartTime).toHaveBeenCalledWith(expect.any(Date)); - expect(utcSpy).toHaveBeenCalled(); - }) + it('does not render week changer or date selector when startTime is not provided', () => { const pageContent = render( <DateTimeNavigator startTime={undefined} - endTime={moment()} setStartTime={mockSetStartTime} setEndTime={mockSetEndTime} /> diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/Filters.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/Filters.js index c0f3c27dfb159fee4b1fd57781b1e513418644aa..6ceda45009b748886ebf8b53e8b2d98ee527f924 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/Filters.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/Filters.js @@ -3,6 +3,7 @@ import {MultiSelect} from "primereact/multiselect"; import {useEffect, useState} from "react"; import {updateStore} from "../../../../services/store.helper"; import UIConstants from "../../../../utils/ui.constants"; +import { Panel } from 'primereact/panel'; import { getReservationItem, getTimelineItem, @@ -172,9 +173,8 @@ export default function Filters(props) { return <div className="p-grid timeline-view-toolbar"> {multiSelectAllOptions.isLoading ? <ProgressSpinner className="m-5" style={{color: "var(--primary-300)"}}/> : - <div className="section"> - <div className="header">Filters</div> - <div className="group"> + <Panel className="section" header="Filters"> + <div className="group"> <Toggle labelName="On Sky" tooltipText="Show on-sky system durations" checkedValue={onSkyToggle} onChangeCallback={setOnSkyToggle}/> </div> @@ -255,7 +255,7 @@ export default function Filters(props) { /> </div> </div> - </div> + </Panel> } </div> } \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/JumpToSuid.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/JumpToSuid.js new file mode 100644 index 0000000000000000000000000000000000000000..4656714d330b0d8966b67d3510f0527da3666a45 --- /dev/null +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/JumpToSuid.js @@ -0,0 +1,36 @@ +import { Button } from "primereact/button"; +import { InputNumber } from "primereact/inputnumber"; +import PropTypes from 'prop-types'; + +const JumpToSUId = (props) => { + const { + suId, + setSUId, + setSearchForSUIdTrigger + } = props + + return <div data-testid="nav-jump-to-suid"> + <label>Jump to SU id</label> + <div> + <InputNumber data-testid="jump-to-input" + className="jump-to-input" + value={suId} + format={false} + onValueChange={(e) => setSUId(e.value)} + /> + <Button className="p-button-icon-only calendar-button" + title="Set the week to the scheduling unit's on sky or process start time." + data-testid="nav-jump-to-button" + onClick={() => setSearchForSUIdTrigger(prevState => !prevState) }> + <i className="fas fa-search"></i> + </Button> + </div> + </div> +} +JumpToSUId.propTypes = { + suId: PropTypes.number, + setSUId:PropTypes.func, + setSearchForSUIdTrigger:PropTypes.func +}; + +export default JumpToSUId \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/JumpToSuid.test.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/JumpToSuid.test.js new file mode 100644 index 0000000000000000000000000000000000000000..e66f6b3a0acbd03f6c487ff16668f2ddc7637250 --- /dev/null +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/JumpToSuid.test.js @@ -0,0 +1,37 @@ +import JumpToSUId from "./JumpToSuid"; +import { fireEvent, render, act, waitFor } from "@testing-library/react"; +import { clickItem, removeReact18ConsoleErrors } from "../../../../utils/test.helper"; + + +removeReact18ConsoleErrors() + +describe('JumpToSUId', () => { + + it('Triggers function for an jump to input change', async () => { + const mockSetSUId = jest.fn(); + const mockSetSearchForSUIdTrigger = jest.fn(); + let pageContent; + act(() => + pageContent = render( + <JumpToSUId + suid="1" + setSUId={mockSetSUId} + setSearchForSUIdTrigger={mockSetSearchForSUIdTrigger} + /> + )); + await waitFor(() => expect(pageContent.queryByTestId('jump-to-input')).toBeInTheDocument()); + const suIdInput = pageContent.getByTestId('jump-to-input'); + const jumpToButton = pageContent.getByTestId('nav-jump-to-button'); + + const suId = 456 + clickItem(suIdInput) + expect(mockSetSUId).toHaveBeenCalled(); + + act(() => fireEvent.change(suIdInput, { target: { value: suId } })); + clickItem(jumpToButton) + + + expect(mockSetSearchForSUIdTrigger).toHaveBeenCalled(); + }) +}); + diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/ZoomAndMove.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/ZoomAndMove.js index 2d34a0bb0b97a0e0ac6ddb03f4609e91eab7bbfc..8e4ea1914020230d5b462526336fa7a297128123 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/ZoomAndMove.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/components/toolbar/ZoomAndMove.js @@ -4,6 +4,8 @@ import { ProgressSpinner } from 'primereact/progressspinner'; import UIConstants from "../../../../utils/ui.constants"; import { Button } from "primereact/button"; import { Dropdown } from "primereact/dropdown"; +import { Panel } from 'primereact/panel'; +import { Ripple } from 'primereact/ripple'; import { getMovePossibilities, getTimeStepsForZoom, @@ -197,6 +199,31 @@ export default function ZoomAndMove(props) { setHeaderSettings } = props + + const template = (options) => { + const UndoIcon = 'pi pi-undo'; + const className = `${options.className} justify-content-start`; + const titleClassName = `${options.titleClassName} p-panel-title`; + + + return ( + <div className={className}> + + <span className={titleClassName} >Zoom</span> + <button data-testid="zoom-reset-button" className={options.togglerClassName} title="Reset span to 1 day, time steps to 1 hour and time to now." onClick={() => setZoomSettings({ + zoomLevelName: UIConstants.DEFAULT_ZOOM_LEVEL.name, + selectedTime: undefined + })}> + <span className={UndoIcon}></span> + <Ripple /> + </button> + </div> + ); + + + }; + + const [zoomSettings, setZoomSettings] = useState({ zoomLevelName: timelineStore.zoomLevelName ?? UIConstants.DEFAULT_ZOOM_LEVEL.name, selectedTime: timelineStore.selectedTime, @@ -262,19 +289,8 @@ export default function ZoomAndMove(props) { </div> } - return <div className="timeline-zoom-and-move section"> - <div className="header"> - Zoom - <Button icon="fas fa-undo" - className="p-button p-button-primary reset-button" - onClick={() => setZoomSettings({ - zoomLevelName: UIConstants.DEFAULT_ZOOM_LEVEL.name, - selectedTime: undefined - })} - title="Reset span to 1 day, time steps to 1 hour and time to now." - data-testid="zoom-reset-button" - /> - </div> + return <Panel className="timeline-zoom-and-move section" headerTemplate={template}> + <div className="group group--row"> <ZoomSelect currentZoomLevelName={zoomSettings.zoomLevelName} allOptions={UIConstants.ALL_ZOOM_LEVELS_WEEK} @@ -309,5 +325,5 @@ export default function ZoomAndMove(props) { setVisibleTime={setVisibleTime} timeSteps={headerSettings.timeSteps} /> </div> - </div> + </Panel> } \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/helpers/toolbar/filters.helper.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/helpers/toolbar/filters.helper.js index cb2b097c2e06810e55341e13738a7b5c937e1aa6..498f6249c1a58d0fb407e2335abb678513ced0e0 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/helpers/toolbar/filters.helper.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/helpers/toolbar/filters.helper.js @@ -115,10 +115,10 @@ export function getStationsInfo(stations) { export function getTimelineItem(suBlueprint, displayDate, shouldShowOnSkyTimes = false) { const duration = `${(UnitConverter.getSecsToHrsWithFractionDigits(suBlueprint.duration))}Hrs`; const onSkyDuration = `${(UnitConverter.getSecsToHrsWithFractionDigits(suBlueprint.on_sky_duration))}Hrs`; - const startTimeWithDisplayDate = moment(`${displayDate.format('YYYY-MM-DD')} ${suBlueprint.process_start_time.split('T')[1]}`); - const endTimeWithDisplayDate = moment(`${displayDate.format('YYYY-MM-DD')} ${suBlueprint.process_stop_time.split('T')[1]}`) - const onSkyStartTimeWithDisplayDate = moment(`${displayDate.format('YYYY-MM-DD')} ${suBlueprint.on_sky_start_time.split('T')[1]}`); - const onSkyEndTimeWithDisplayDate = moment(`${displayDate.format('YYYY-MM-DD')} ${suBlueprint.on_sky_stop_time.split('T')[1]}`) + const startTimeWithDisplayDate = moment(`${displayDate.format('YYYY-MM-DD')} ${suBlueprint.process_start_time?.split('T')[1]}`); + const endTimeWithDisplayDate = moment(`${displayDate.format('YYYY-MM-DD')} ${suBlueprint.process_stop_time?.split('T')[1]}`) + const onSkyStartTimeWithDisplayDate = moment(`${displayDate.format('YYYY-MM-DD')} ${suBlueprint.on_sky_start_time?.split('T')[1]}`); + const onSkyEndTimeWithDisplayDate = moment(`${displayDate.format('YYYY-MM-DD')} ${suBlueprint.on_sky_stop_time?.split('T')[1]}`) const band = suBlueprint.antenna_set?.split("_")[0] //Example: antenna sets LBA_OUTER -> band = LBA const currentGroup = moment(shouldShowOnSkyTimes ? suBlueprint.on_sky_start_time : suBlueprint.process_start_time).format(UIConstants.CALENDAR_GROUP_FORMAT) const stations = getStationsInfo(suBlueprint.specified_stations); diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/helpers/week.view.helper.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/helpers/week.view.helper.js index 4f5c4d292520f26c24675f6a0f493806bb3e550b..f957af7fd8f3d307c64f03b19c1e4202a14a0953 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/helpers/week.view.helper.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/helpers/week.view.helper.js @@ -8,42 +8,11 @@ export function createGroups(startTime, amountOfGroups = 7) { for (let groupIndex = 0; groupIndex < amountOfGroups; groupIndex++) { const group = moment(startDate).add(groupIndex, "days"); const groupTitle = group.format(UIConstants.CALENDAR_GROUP_FORMAT) - groups.push({id: groupTitle, title: groupTitle}) + groups.push({id: groupTitle, title: groupTitle, date:group}) } return groups } -const MAX_COLUMNS_WHOLE_PAGE = 12; - -function getClassName(size) { - if (size === 0) { - return "hide-element" - } - if (size === MAX_COLUMNS_WHOLE_PAGE) { //max columns for a whole page; so no columns needs to be set - return "" - } - return `col-lg-${size} col-md-${size} col-sm-${size}` -} - -export function calculateSizeAndSetPanelClassName(showLeft, showRight, leftPanelSize, setPanelClassNames) { - if (!showLeft) { - leftPanelSize = 0 - } - if (showRight) { //set it to a fixed column size (resizing is not possible) - leftPanelSize = 10 - } - - const mapForSize = UIConstants.PANEL_SIZE_CLASS_MAP.find(panelMapper => panelMapper.size === leftPanelSize); - const leftSize = showLeft ? mapForSize.left : 0; - const rightSize = showRight ? mapForSize.right : 0; - const middleSize = MAX_COLUMNS_WHOLE_PAGE - leftSize - rightSize - setPanelClassNames({ - leftPanelClassName: "timeline-panel " + getClassName(leftSize), - middlePanelClassName: "timeline-panel " + getClassName(middleSize), - rightPanelClassName: "timeline-panel " + getClassName(rightSize), - }) -} - export async function updateSchedulerStatuses(switchValue, status, setSchedulerSettings) { if (status === "fixed") { setSchedulerSettings(prevState => ({ @@ -65,7 +34,7 @@ export async function updateSchedulerStatuses(switchValue, status, setSchedulerS } } -const actionObject = (title, icon, classes, className, callbackProp, content, type, actOn) => ({ +const actionObject = (title, icon, classes, className, callbackProp, content, type, actOn,options,selected) => ({ title: title, icon: icon, classes: classes, @@ -73,31 +42,99 @@ const actionObject = (title, icon, classes, className, callbackProp, content, ty content: content, type: type, actOn: actOn, - props: callbackProp + props: callbackProp, + options:options, + selected:selected }) const actionButtonObject = (title, icon, classes, callbackProp) => ( - actionObject(title, icon, classes, undefined, callbackProp, undefined, "button", "click") + actionObject(title, icon, classes, undefined, callbackProp, undefined, "buttonv2", "click",undefined,undefined) ) const actionTagObject = (title, content, className) => ( - actionObject(title, undefined, undefined, className, undefined, content, "tag", "click") + actionObject(title, undefined, undefined, className, undefined, content, "tagv2", "click",undefined,undefined) +) + +const actionDropDownObject = (title, options, callbackProp,selected,classes) => ( + actionObject(title, undefined, classes, undefined, callbackProp, undefined, "dropdown", "select",options,selected) ) -export function getHeaderActions(isLoading, setRefetchToggle, actionsMenuRef) { +const actionDivider = (title) => ( + actionObject(title, undefined, undefined, undefined, undefined, undefined, "divider", undefined,undefined,undefined) +) + +export function getHeaderActions(isLoading, setRefetchToggle, actionsMenuRef,isExpanded, setIsExpanded, isLegendVisible, setIsLegendVisable) { return [ actionButtonObject( isLoading ? "System is already reloading the timeline data" : "Reload the timeline data", - "fa-" + (isLoading ? "hourglass fa-spin" : "sync-alt"), + (isLoading ? "pi-spin pi-hourglass " : "pi-sync"), `subsystem subsystem--${isLoading ? "on" : "standard"}`, {callback: () => setRefetchToggle(prevState => !prevState)} ), actionButtonObject( "Options", - "fa-bars", - "subsystem subsystem--standard", + "pi-bars", + "", {callback: (ev) => actionsMenuRef.current.toggle(ev)} ), + actionButtonObject( + (isLegendVisible? "Hide Legend" : "Show Legend"), + (isLegendVisible? "pi-bookmark":"pi-bookmark-fill"), + (isLegendVisible? "":"color:grey"), + {callback: () => setIsLegendVisable(prevState=>!prevState)} + ), + + actionButtonObject( + (isExpanded? "Hide Filters" : "Show Filter"), + (isExpanded? "pi-chevron-up":"pi-chevron-down"), + "", + {callback: () => setIsExpanded(prevState=>!prevState)} + ), + + + ]; +} + /** + * getGroupedByActions + * Returns actions used to group by + * @param {function}setGroupedBy { + */ +export function getGroupedByActions(selected , setGroupedBy) { + return [ + actionDropDownObject( + "Group By", + [ + { label:"Date" , value: "Date"}, + { label:"Priority Queue", value: "Priority Queue"}, + {label:"Project", value: "Project"}, + {label:"Station", value: "Station"}, + {label:"Station Group", value: "Station Group"} , + {label:"Scheduling Unit", value: "Scheduling Unit"}, + {label:"Scheduler Type", value: "Scheduler Type"} + ], + {callback: (groupingby) => setGroupedBy(groupingby)}, + selected, + "timeline-header-dropdown" + ), + ] + +} + +export function getNavigationActions(AddWeeks,currentweeks) { + return [ + actionButtonObject( + "previous 7 days", + "pi pi-angle-double-left", + "", + {callback: () => AddWeeks(-1)} + ), + actionButtonObject( + "next 7 days", + "pi pi-angle-double-right", + "", + {callback: () => AddWeeks(1)} + ), + actionDivider("navigationbreaker") ]; } @@ -117,10 +154,13 @@ export function getSchedulerActions(schedulerSettings, setShowSchedulerSettingsD actionButtonObject( (schedulerSettings.isDynamicSchedulerActive ? "Dynamic Scheduler is Active" : (schedulerSettings.isDynamicSchedulerOn ? "Dynamic Scheduler is Idle" : "Dynamic Scheduler is stopped")) + ". Click to change the scheduler", - "fa-" + (schedulerSettings.isDynamicSchedulerActive ? "play" : (schedulerSettings.isDynamicSchedulerOn ? "pause" : "stop")), + "pi-" + (schedulerSettings.isDynamicSchedulerActive ? "play" : (schedulerSettings.isDynamicSchedulerOn ? "pause" : "stop")), "subsystem subsystem--" + (schedulerSettings.isDynamicSchedulerActive ? "on" : (schedulerSettings.isDynamicSchedulerOn ? "paused" : "off")), {callback: () => setShowSchedulerSettingsDialog(true)} - ) + ), + + + ]; } @@ -169,11 +209,11 @@ export function getPageHeaderOptionsMenuItems(permissions) { //TODO factory meth } export function getCursorDateTimes(cursorTimeUTC, groupIndex, groupDate, lstShiftInSeconds, setCursorDateTimes) { - const cursorTime = moment(cursorTimeUTC).format(UIConstants.CALENDAR_TIME_FORMAT); + const cursorTime = moment(cursorTimeUTC) if (groupIndex >= 0) { - const cursorDateTimeUTC = moment(groupDate + " " + cursorTime) + const cursorDateTimeUTC = groupDate.set({hour:cursorTime.get('hour'), minute:cursorTime.get('minute'), second:cursorTime.get('second') }); const shiftForGroup = {'minute': 3 * groupIndex, 'second': 45 * groupIndex}; - const cursorDateTimeLST = moment(moment(cursorDateTimeUTC).add(lstShiftInSeconds, 'second')).add(shiftForGroup) + const cursorDateTimeLST = moment(cursorDateTimeUTC).add(lstShiftInSeconds, 'second').add(shiftForGroup) setCursorDateTimes({ utc: cursorDateTimeUTC.format("HH:mm"), lst: cursorDateTimeLST.format("HH:mm"), diff --git a/SAS/TMSS/frontend/tmss_webapp/src/services/auth.service.js b/SAS/TMSS/frontend/tmss_webapp/src/services/auth.service.js index 38137e19b403174672c7ffd5647c2e361f8e9909..438faf40677fc16d97e704d9c8e234a413c3b079 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/services/auth.service.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/services/auth.service.js @@ -4,7 +4,8 @@ const AuthService = { authenticate: async(user, pass) => { try { delete axios.defaults.headers.common['Authorization']; - const response = await axios.post("/api/token-auth/", {username: user, password: pass}); + delete axios.defaults.headers.common['X-Csrftoken']; + const response = await axios.post("/api/token-auth/", {username: user, password: pass} ); axios.defaults.headers.common['Authorization'] = `Token ${response.data.token}`; return response.data; } catch(error) { diff --git a/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js b/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js index cba11c84d761e28a1bb9e94c3541e2f6beffbcaf..44b70ccea21ab7b4040d77e0f6d95659d37a14d2 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js @@ -103,7 +103,7 @@ const UIConstants = { { name: '2 Hours', value: { minute: 0, - hour: 3, + hour: 2, } }, {