diff --git a/interface/package-lock.json b/interface/package-lock.json index 3272ddc92..eec53f3ca 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -11,10 +11,11 @@ "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.6.0", - "@mui/material": "^5.6.0", + "@mui/icons-material": "^5.6.1", + "@mui/material": "^5.6.1", + "@table-library/react-table-library": "^2.0.32", "@types/lodash": "^4.14.181", - "@types/node": "^17.0.23", + "@types/node": "^17.0.24", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", @@ -23,15 +24,15 @@ "http-proxy-middleware": "^2.0.4", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", - "notistack": "^2.0.3", + "notistack": "^2.0.4", "parse-ms": "^3.0.0", "react": "^17.0.2", "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", - "react-dropzone": "^12.0.4", + "react-dropzone": "^12.0.5", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", - "react-scripts": "5.0.0", + "react-scripts": "5.0.1", "sockette": "^2.0.6", "typescript": "^4.6.3" }, @@ -2855,15 +2856,15 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.75", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.75.tgz", - "integrity": "sha512-eQ8SP2ML5nJyOdSqmk26ezg/eEP1k42Z+k6uMfNbgHZc8iZwgw9iVe+6g5j/qZPKS88AtxVG8YsLLZkXT82/Bw==", + "version": "5.0.0-alpha.76", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.76.tgz", + "integrity": "sha512-Pd0l4DvjXiGRyipn/CTDlYB2XrJwhpLktVXvbvcmzL2SMDaNprSarZqBkPHIubkulmRDZEEcnFDrpKgeSJDg4A==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.0", - "@popperjs/core": "^2.11.4", + "@mui/utils": "^5.6.1", + "@popperjs/core": "^2.11.5", "clsx": "^1.1.1", "prop-types": "^15.7.2", "react-is": "^17.0.2" @@ -2876,7 +2877,7 @@ "url": "https://opencollective.com/mui" }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0" }, @@ -2887,9 +2888,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.6.0.tgz", - "integrity": "sha512-2GDGt+/BbwM3oVkF84b9FFKQdQ9TxBJIRnTwT99vO2mimdfJaojxMRB2lkysm9tUY4HOf0yoU6O//X6GTC0Zhw==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.6.1.tgz", + "integrity": "sha512-I1x8u+FRLOmoJpRJASMx9UG+jZrSkNLyRQmBXivQQwXu3m3iasMoaKYhhI0J18t8+FWktbkNTp63oEUHE9Gw0Q==", "dependencies": { "@babel/runtime": "^7.17.2" }, @@ -2902,7 +2903,7 @@ }, "peerDependencies": { "@mui/material": "^5.0.0", - "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { @@ -2912,15 +2913,15 @@ } }, "node_modules/@mui/material": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.0.tgz", - "integrity": "sha512-yh4FoRRPTgJWjv1oIu3YuvfYGD/WOEnyGizQ9fKs+hlMjIc0rzFpyUCo++P/3BUd0/hRKcI8D8mrpJK9OiOy1g==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.1.tgz", + "integrity": "sha512-xg6pPq+1jxWupwmPpnfmsHNjrsOe2xynUQWrRfcH8WHrrr1sQulq0VF4gORq/l8DD8a/jb4s8SsC20e/e6mHKQ==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.75", - "@mui/system": "^5.6.0", + "@mui/base": "5.0.0-alpha.76", + "@mui/system": "^5.6.1", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.0", + "@mui/utils": "^5.6.1", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.11", @@ -2939,7 +2940,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0" }, @@ -2956,12 +2957,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.0.tgz", - "integrity": "sha512-62jUFaMGfW3nvq/worcOAEiY++rWd44tpWShq4o97DybWmmWvEFYlBIuHEcXrtBIK/cloaQw8jqelQIFZeiVdw==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.1.tgz", + "integrity": "sha512-8lgh+tUt/3ftStfvml3dwAzhW3fe/cUFjLcBViOTnWk7UixWR79me4qehsO4NVj0THpu3d2qclrLzdD8qBAWAQ==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.6.0", + "@mui/utils": "^5.6.1", "prop-types": "^15.7.2" }, "engines": { @@ -2972,7 +2973,7 @@ "url": "https://opencollective.com/mui" }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { @@ -2982,9 +2983,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.0.tgz", - "integrity": "sha512-K1WPKTruJTPA49cub0HtDCBBvosPKizqgZ4RenAfWz/ldlFtM4p7e7Mt3YEnNWTOJMHvDGcEke1tCuELkVAMyA==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.1.tgz", + "integrity": "sha512-jEhH6TBY8jc9S8yVncXmoTYTbATjEu44RMFXj6sIYfKr5NArVwTwRo3JexLL0t3BOAiYM4xsFLgfKEIvB9SAeQ==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/cache": "^11.7.1", @@ -3012,15 +3013,15 @@ } }, "node_modules/@mui/system": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.0.tgz", - "integrity": "sha512-FoytH73hY78Dll6F0fg7AI/hnpplygbFeW0HsqBfwFWrt2PMc2YSq2ICqHzd2CZPIhzEgRHDTSI8bMTLtG9W7A==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.1.tgz", + "integrity": "sha512-Y5pDvEOK6VOY+0vgNeyDuEEO5QCinhXbZQDyLOlaGLKuAoRGLXO9pcSsjZoGkewYZitXD44EDfgBQ+BqsAfgUA==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.6.0", - "@mui/styled-engine": "^5.6.0", + "@mui/private-theming": "^5.6.1", + "@mui/styled-engine": "^5.6.1", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.0", + "@mui/utils": "^5.6.1", "clsx": "^1.1.1", "csstype": "^3.0.11", "prop-types": "^15.7.2" @@ -3035,7 +3036,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { @@ -3064,9 +3065,9 @@ } }, "node_modules/@mui/utils": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.0.tgz", - "integrity": "sha512-LbZKkCOn4243vbEVGbaKV7t6eN6kz7t95DR6AcUCRk4daH3l7CXPYkWsyzysRWdXgSzHmIyrgg4FZKzTy0dTHQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.1.tgz", + "integrity": "sha512-CPrzrkiBusCZBLWu0Sg5MJvR3fKJyK3gKecLVX012LULyqg2U64Oz04BKhfkbtBrPBbSQxM+DWW9B1c9hmV9nQ==", "dependencies": { "@babel/runtime": "^7.17.2", "@types/prop-types": "^15.7.4", @@ -3258,9 +3259,9 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, "node_modules/@rushstack/eslint-patch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.1.tgz", - "integrity": "sha512-BUyKJGdDWqvWC5GEhyOiUrGNi9iJUr4CU0O2WxJL6QJhHeeA/NVBalH+FeK0r/x/W0rPymXt5s78TDS7d6lCwg==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.2.tgz", + "integrity": "sha512-oe5WJEDaVsW8fBlGT7udrSCgOwWfoYHQOmSpnh8X+0GXpqqcRCP8k4y+Dxb0taWJDPpB+rdDUtumIiBwkY9qGA==" }, "node_modules/@sindresorhus/is": { "version": "0.14.0", @@ -3547,6 +3548,22 @@ "node": ">=6" } }, + "node_modules/@table-library/react-table-library": { + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-2.0.32.tgz", + "integrity": "sha512-hHxR5DkAdU+62rRukjId1XqdI1ZkWQhdmvYwJM60StrFpah0nbpk8/HG21k7mFdlwjoO7HtDgWDDReLDUbPS7Q==", + "dependencies": { + "clsx": "1.1.1", + "react-virtualized-auto-sizer": "1.0.6", + "react-window": "1.8.6", + "use-double-click": "1.0.5" + }, + "peerDependencies": { + "@emotion/react": ">= 11", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -3746,9 +3763,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -3908,13 +3925,13 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz", - "integrity": "sha512-tzrmdGMJI/uii9/V6lurMo4/o+dMTKDH82LkNjhJ3adCW22YQydoRs5MwTiqxGF9CSYxPxQ7EYb4jLNlIs+E+A==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.19.0.tgz", + "integrity": "sha512-w59GpFqDYGnWFim9p6TGJz7a3qWeENJuAKCqjGSx+Hq/bwq3RZwXYqy98KIfN85yDqz9mq6QXiY5h0FjGQLyEg==", "dependencies": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/type-utils": "5.18.0", - "@typescript-eslint/utils": "5.18.0", + "@typescript-eslint/scope-manager": "5.19.0", + "@typescript-eslint/type-utils": "5.19.0", + "@typescript-eslint/utils": "5.19.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -3939,26 +3956,37 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "node_modules/@typescript-eslint/eslint-plugin/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": { - "lru-cache": "^7.4.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=10" } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.18.0.tgz", - "integrity": "sha512-hypiw5N0aM2aH91/uMmG7RpyUH3PN/iOhilMwkMFZIbm/Bn/G3ZnbaYdSoAN4PG/XHQjdhBYLi0ZoRZsRYT4hA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.19.0.tgz", + "integrity": "sha512-F+X/TTzmb2UXbghY1LrNLNDjMcGZMhKzXuzvu0xD+YEB77EamLM7zMOLuz2kP5807IJRDLBoAFFPYa7HT62sYg==", "dependencies": { - "@typescript-eslint/utils": "5.18.0" + "@typescript-eslint/utils": "5.19.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3972,13 +4000,13 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.18.0.tgz", - "integrity": "sha512-+08nYfurBzSSPndngnHvFw/fniWYJ5ymOrn/63oMIbgomVQOvIDhBoJmYZ9lwQOCnQV9xHGvf88ze3jFGUYooQ==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.19.0.tgz", + "integrity": "sha512-yhktJjMCJX8BSBczh1F/uY8wGRYrBeyn84kH6oyqdIJwTGKmzX5Qiq49LRQ0Jh0LXnWijEziSo6BRqny8nqLVQ==", "dependencies": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", + "@typescript-eslint/scope-manager": "5.19.0", + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/typescript-estree": "5.19.0", "debug": "^4.3.2" }, "engines": { @@ -3998,12 +4026,12 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.18.0.tgz", - "integrity": "sha512-C0CZML6NyRDj+ZbMqh9FnPscg2PrzSaVQg3IpTmpe0NURMVBXlghGZgMYqBw07YW73i0MCqSDqv2SbywnCS8jQ==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.19.0.tgz", + "integrity": "sha512-Fz+VrjLmwq5fbQn5W7cIJZ066HxLMKvDEmf4eu1tZ8O956aoX45jAuBB76miAECMTODyUxH61AQM7q4/GOMQ5g==", "dependencies": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0" + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/visitor-keys": "5.19.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4014,11 +4042,11 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.18.0.tgz", - "integrity": "sha512-vcn9/6J5D6jtHxpEJrgK8FhaM8r6J1/ZiNu70ZUJN554Y3D9t3iovi6u7JF8l/e7FcBIxeuTEidZDR70UuCIfA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.19.0.tgz", + "integrity": "sha512-O6XQ4RI4rQcBGshTQAYBUIGsKqrKeuIOz9v8bckXZnSeXjn/1+BDZndHLe10UplQeJLXDNbaZYrAytKNQO2T4Q==", "dependencies": { - "@typescript-eslint/utils": "5.18.0", + "@typescript-eslint/utils": "5.19.0", "debug": "^4.3.2", "tsutils": "^3.21.0" }, @@ -4039,9 +4067,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.18.0.tgz", - "integrity": "sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.19.0.tgz", + "integrity": "sha512-zR1ithF4Iyq1wLwkDcT+qFnhs8L5VUtjgac212ftiOP/ZZUOCuuF2DeGiZZGQXGoHA50OreZqLH5NjDcDqn34w==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4051,12 +4079,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.18.0.tgz", - "integrity": "sha512-wa+2VAhOPpZs1bVij9e5gyVu60ReMi/KuOx4LKjGx2Y3XTNUDJgQ+5f77D49pHtqef/klglf+mibuHs9TrPxdQ==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.19.0.tgz", + "integrity": "sha512-dRPuD4ocXdaE1BM/dNR21elSEUPKaWgowCA0bqJ6YbYkvtrPVEvZ+zqcX5a8ECYn3q5iBSSUcBBD42ubaOp0Hw==", "dependencies": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0", + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/visitor-keys": "5.19.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -4076,29 +4104,40 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "node_modules/@typescript-eslint/typescript-estree/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": { - "lru-cache": "^7.4.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=10" } }, "node_modules/@typescript-eslint/utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.18.0.tgz", - "integrity": "sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.19.0.tgz", + "integrity": "sha512-ZuEckdupXpXamKvFz/Ql8YnePh2ZWcwz7APICzJL985Rp5C2AYcHO62oJzIqNhAMtMK6XvrlBTZeNG8n7gS3lQ==", "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", + "@typescript-eslint/scope-manager": "5.19.0", + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/typescript-estree": "5.19.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -4134,11 +4173,11 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.18.0.tgz", - "integrity": "sha512-Hf+t+dJsjAKpKSkg3EHvbtEpFFb/1CiOHnvI8bjHgOD4/wAw3gKrA0i94LrbekypiZVanJu3McWJg7rWDMzRTg==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.19.0.tgz", + "integrity": "sha512-Ym7zZoMDZcAKWsULi2s7UMLREdVQdScPQ/fKWMYefarCztWlHPFVJo8racf8R0Gc8FAEJ2eD4of8As1oFtnQlQ==", "dependencies": { - "@typescript-eslint/types": "5.18.0", + "@typescript-eslint/types": "5.19.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -4601,13 +4640,14 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4617,13 +4657,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", "dependencies": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6848,6 +6889,14 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dependencies": { + "has": "^1.0.3" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -7026,9 +7075,9 @@ } }, "node_modules/eslint-config-react-app": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz", - "integrity": "sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", "dependencies": { "@babel/core": "^7.16.0", "@babel/eslint-parser": "^7.16.3", @@ -7327,9 +7376,9 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.2.1.tgz", - "integrity": "sha512-88qJv6uzYALtiYJDzhelP3ov0Px/GLgnu+UekjjDxL2nMyvgdTyboKqcDBsvFPmAeizlCoSWOjeBN4DxO0BxaA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.3.1.tgz", + "integrity": "sha512-OfF4dlG/q6ck6DL3P8Z0FPdK0dU5K57gsBu7eUcaVbwYKaNzjgejnXiM9CCUevppORkvfek+9D3Uj/9ZZ8Vz8g==", "dependencies": { "@typescript-eslint/utils": "^5.13.0" }, @@ -8071,9 +8120,9 @@ } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", - "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz", + "integrity": "sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==", "dependencies": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -8175,6 +8224,17 @@ "node": ">=8" } }, + "node_modules/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -8193,17 +8253,17 @@ } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { - "lru-cache": "^7.4.0" + "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=10" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { @@ -11695,6 +11755,11 @@ "node": ">= 4.0.0" } }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -12078,9 +12143,9 @@ } }, "node_modules/notistack": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.3.tgz", - "integrity": "sha512-krmVFtTO9kEY1Pa4NrbyexrjiRcV6TqBM2xLx8nuDea1g96Z/OZfkvVLmYKkTvoSJ3jyQntWK16z86ssW5kt4A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.4.tgz", + "integrity": "sha512-kOJmKvTG91ElMzi4aHu82BDe1liQ0zMrBp+TnWJptgowDsTbeTKbZmsRqJNIj145BmlOtZsEE9xjcrN46zVo3w==", "dependencies": { "clsx": "^1.1.0", "hoist-non-react-statics": "^3.3.0" @@ -12093,8 +12158,8 @@ "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", "@mui/material": "^5.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -14192,9 +14257,9 @@ } }, "node_modules/react-dev-utils": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz", - "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", "dependencies": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -14215,7 +14280,7 @@ "open": "^8.4.0", "pkg-up": "^3.1.0", "prompts": "^2.4.2", - "react-error-overlay": "^6.0.10", + "react-error-overlay": "^6.0.11", "recursive-readdir": "^2.2.2", "shell-quote": "^1.7.3", "strip-ansi": "^6.0.1", @@ -14365,9 +14430,9 @@ } }, "node_modules/react-dropzone": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.4.tgz", - "integrity": "sha512-fcqHEYe1MzAghU6/Hz86lHDlBNsA+lO48nAcm7/wA+kIzwS6uuJbUG33tBZjksj7GAZ1iUQ6NHwjUURPmSGang==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.5.tgz", + "integrity": "sha512-zUjZigD0VJ91CSm9T1h7ErxFReBLaa9sjS2dUL0+inb0RROZpSJTNDHPY1rrBES5V2NXhF8v0kghmaHc81BMFg==", "dependencies": { "attr-accept": "^2.2.2", "file-selector": "^0.4.0", @@ -14381,9 +14446,9 @@ } }, "node_modules/react-error-overlay": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz", - "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==" + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, "node_modules/react-icons": { "version": "4.3.1", @@ -14431,9 +14496,9 @@ } }, "node_modules/react-scripts": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz", - "integrity": "sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", "dependencies": { "@babel/core": "^7.16.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", @@ -14451,7 +14516,7 @@ "dotenv": "^10.0.0", "dotenv-expand": "^5.1.0", "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.0", + "eslint-config-react-app": "^7.0.1", "eslint-webpack-plugin": "^3.1.1", "file-loader": "^6.2.0", "fs-extra": "^10.0.0", @@ -14468,7 +14533,7 @@ "postcss-preset-env": "^7.0.1", "prompts": "^2.4.2", "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.0", + "react-dev-utils": "^12.0.1", "react-refresh": "^0.11.0", "resolve": "^1.20.0", "resolve-url-loader": "^4.0.0", @@ -14531,6 +14596,34 @@ "react-dom": ">=16.6.0" } }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz", + "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==", + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0" + } + }, + "node_modules/react-window": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz", + "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -16583,6 +16676,19 @@ "node": ">=4" } }, + "node_modules/use-double-click": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/use-double-click/-/use-double-click-1.0.5.tgz", + "integrity": "sha512-71LUca6NtzpzHYlcfM/dOdmwvmvpMbzeIVQpN87w+DctpLiMCXtZpsN8FNWPgHpPBtNhvucPUHIDh5al8D8C7w==", + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -17541,6 +17647,11 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", @@ -19525,38 +19636,38 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.75", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.75.tgz", - "integrity": "sha512-eQ8SP2ML5nJyOdSqmk26ezg/eEP1k42Z+k6uMfNbgHZc8iZwgw9iVe+6g5j/qZPKS88AtxVG8YsLLZkXT82/Bw==", + "version": "5.0.0-alpha.76", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.76.tgz", + "integrity": "sha512-Pd0l4DvjXiGRyipn/CTDlYB2XrJwhpLktVXvbvcmzL2SMDaNprSarZqBkPHIubkulmRDZEEcnFDrpKgeSJDg4A==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.0", - "@popperjs/core": "^2.11.4", + "@mui/utils": "^5.6.1", + "@popperjs/core": "^2.11.5", "clsx": "^1.1.1", "prop-types": "^15.7.2", "react-is": "^17.0.2" } }, "@mui/icons-material": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.6.0.tgz", - "integrity": "sha512-2GDGt+/BbwM3oVkF84b9FFKQdQ9TxBJIRnTwT99vO2mimdfJaojxMRB2lkysm9tUY4HOf0yoU6O//X6GTC0Zhw==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.6.1.tgz", + "integrity": "sha512-I1x8u+FRLOmoJpRJASMx9UG+jZrSkNLyRQmBXivQQwXu3m3iasMoaKYhhI0J18t8+FWktbkNTp63oEUHE9Gw0Q==", "requires": { "@babel/runtime": "^7.17.2" } }, "@mui/material": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.0.tgz", - "integrity": "sha512-yh4FoRRPTgJWjv1oIu3YuvfYGD/WOEnyGizQ9fKs+hlMjIc0rzFpyUCo++P/3BUd0/hRKcI8D8mrpJK9OiOy1g==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.1.tgz", + "integrity": "sha512-xg6pPq+1jxWupwmPpnfmsHNjrsOe2xynUQWrRfcH8WHrrr1sQulq0VF4gORq/l8DD8a/jb4s8SsC20e/e6mHKQ==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.75", - "@mui/system": "^5.6.0", + "@mui/base": "5.0.0-alpha.76", + "@mui/system": "^5.6.1", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.0", + "@mui/utils": "^5.6.1", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.11", @@ -19567,19 +19678,19 @@ } }, "@mui/private-theming": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.0.tgz", - "integrity": "sha512-62jUFaMGfW3nvq/worcOAEiY++rWd44tpWShq4o97DybWmmWvEFYlBIuHEcXrtBIK/cloaQw8jqelQIFZeiVdw==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.1.tgz", + "integrity": "sha512-8lgh+tUt/3ftStfvml3dwAzhW3fe/cUFjLcBViOTnWk7UixWR79me4qehsO4NVj0THpu3d2qclrLzdD8qBAWAQ==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.6.0", + "@mui/utils": "^5.6.1", "prop-types": "^15.7.2" } }, "@mui/styled-engine": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.0.tgz", - "integrity": "sha512-K1WPKTruJTPA49cub0HtDCBBvosPKizqgZ4RenAfWz/ldlFtM4p7e7Mt3YEnNWTOJMHvDGcEke1tCuELkVAMyA==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.1.tgz", + "integrity": "sha512-jEhH6TBY8jc9S8yVncXmoTYTbATjEu44RMFXj6sIYfKr5NArVwTwRo3JexLL0t3BOAiYM4xsFLgfKEIvB9SAeQ==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/cache": "^11.7.1", @@ -19587,15 +19698,15 @@ } }, "@mui/system": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.0.tgz", - "integrity": "sha512-FoytH73hY78Dll6F0fg7AI/hnpplygbFeW0HsqBfwFWrt2PMc2YSq2ICqHzd2CZPIhzEgRHDTSI8bMTLtG9W7A==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.1.tgz", + "integrity": "sha512-Y5pDvEOK6VOY+0vgNeyDuEEO5QCinhXbZQDyLOlaGLKuAoRGLXO9pcSsjZoGkewYZitXD44EDfgBQ+BqsAfgUA==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.6.0", - "@mui/styled-engine": "^5.6.0", + "@mui/private-theming": "^5.6.1", + "@mui/styled-engine": "^5.6.1", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.0", + "@mui/utils": "^5.6.1", "clsx": "^1.1.1", "csstype": "^3.0.11", "prop-types": "^15.7.2" @@ -19608,9 +19719,9 @@ "requires": {} }, "@mui/utils": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.0.tgz", - "integrity": "sha512-LbZKkCOn4243vbEVGbaKV7t6eN6kz7t95DR6AcUCRk4daH3l7CXPYkWsyzysRWdXgSzHmIyrgg4FZKzTy0dTHQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.1.tgz", + "integrity": "sha512-CPrzrkiBusCZBLWu0Sg5MJvR3fKJyK3gKecLVX012LULyqg2U64Oz04BKhfkbtBrPBbSQxM+DWW9B1c9hmV9nQ==", "requires": { "@babel/runtime": "^7.17.2", "@types/prop-types": "^15.7.4", @@ -19719,9 +19830,9 @@ } }, "@rushstack/eslint-patch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.1.tgz", - "integrity": "sha512-BUyKJGdDWqvWC5GEhyOiUrGNi9iJUr4CU0O2WxJL6QJhHeeA/NVBalH+FeK0r/x/W0rPymXt5s78TDS7d6lCwg==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.2.tgz", + "integrity": "sha512-oe5WJEDaVsW8fBlGT7udrSCgOwWfoYHQOmSpnh8X+0GXpqqcRCP8k4y+Dxb0taWJDPpB+rdDUtumIiBwkY9qGA==" }, "@sindresorhus/is": { "version": "0.14.0", @@ -19902,6 +20013,17 @@ "defer-to-connect": "^1.0.1" } }, + "@table-library/react-table-library": { + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-2.0.32.tgz", + "integrity": "sha512-hHxR5DkAdU+62rRukjId1XqdI1ZkWQhdmvYwJM60StrFpah0nbpk8/HG21k7mFdlwjoO7HtDgWDDReLDUbPS7Q==", + "requires": { + "clsx": "1.1.1", + "react-virtualized-auto-sizer": "1.0.6", + "react-window": "1.8.6", + "use-double-click": "1.0.5" + } + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -20095,9 +20217,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" }, "@types/parse-json": { "version": "4.0.0", @@ -20257,13 +20379,13 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz", - "integrity": "sha512-tzrmdGMJI/uii9/V6lurMo4/o+dMTKDH82LkNjhJ3adCW22YQydoRs5MwTiqxGF9CSYxPxQ7EYb4jLNlIs+E+A==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.19.0.tgz", + "integrity": "sha512-w59GpFqDYGnWFim9p6TGJz7a3qWeENJuAKCqjGSx+Hq/bwq3RZwXYqy98KIfN85yDqz9mq6QXiY5h0FjGQLyEg==", "requires": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/type-utils": "5.18.0", - "@typescript-eslint/utils": "5.18.0", + "@typescript-eslint/scope-manager": "5.19.0", + "@typescript-eslint/type-utils": "5.19.0", + "@typescript-eslint/utils": "5.19.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -20272,66 +20394,74 @@ "tsutils": "^3.21.0" }, "dependencies": { - "semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "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==", "requires": { - "lru-cache": "^7.4.0" + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" } } } }, "@typescript-eslint/experimental-utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.18.0.tgz", - "integrity": "sha512-hypiw5N0aM2aH91/uMmG7RpyUH3PN/iOhilMwkMFZIbm/Bn/G3ZnbaYdSoAN4PG/XHQjdhBYLi0ZoRZsRYT4hA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.19.0.tgz", + "integrity": "sha512-F+X/TTzmb2UXbghY1LrNLNDjMcGZMhKzXuzvu0xD+YEB77EamLM7zMOLuz2kP5807IJRDLBoAFFPYa7HT62sYg==", "requires": { - "@typescript-eslint/utils": "5.18.0" + "@typescript-eslint/utils": "5.19.0" } }, "@typescript-eslint/parser": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.18.0.tgz", - "integrity": "sha512-+08nYfurBzSSPndngnHvFw/fniWYJ5ymOrn/63oMIbgomVQOvIDhBoJmYZ9lwQOCnQV9xHGvf88ze3jFGUYooQ==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.19.0.tgz", + "integrity": "sha512-yhktJjMCJX8BSBczh1F/uY8wGRYrBeyn84kH6oyqdIJwTGKmzX5Qiq49LRQ0Jh0LXnWijEziSo6BRqny8nqLVQ==", "requires": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", + "@typescript-eslint/scope-manager": "5.19.0", + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/typescript-estree": "5.19.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.18.0.tgz", - "integrity": "sha512-C0CZML6NyRDj+ZbMqh9FnPscg2PrzSaVQg3IpTmpe0NURMVBXlghGZgMYqBw07YW73i0MCqSDqv2SbywnCS8jQ==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.19.0.tgz", + "integrity": "sha512-Fz+VrjLmwq5fbQn5W7cIJZ066HxLMKvDEmf4eu1tZ8O956aoX45jAuBB76miAECMTODyUxH61AQM7q4/GOMQ5g==", "requires": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0" + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/visitor-keys": "5.19.0" } }, "@typescript-eslint/type-utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.18.0.tgz", - "integrity": "sha512-vcn9/6J5D6jtHxpEJrgK8FhaM8r6J1/ZiNu70ZUJN554Y3D9t3iovi6u7JF8l/e7FcBIxeuTEidZDR70UuCIfA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.19.0.tgz", + "integrity": "sha512-O6XQ4RI4rQcBGshTQAYBUIGsKqrKeuIOz9v8bckXZnSeXjn/1+BDZndHLe10UplQeJLXDNbaZYrAytKNQO2T4Q==", "requires": { - "@typescript-eslint/utils": "5.18.0", + "@typescript-eslint/utils": "5.19.0", "debug": "^4.3.2", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.18.0.tgz", - "integrity": "sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw==" + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.19.0.tgz", + "integrity": "sha512-zR1ithF4Iyq1wLwkDcT+qFnhs8L5VUtjgac212ftiOP/ZZUOCuuF2DeGiZZGQXGoHA50OreZqLH5NjDcDqn34w==" }, "@typescript-eslint/typescript-estree": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.18.0.tgz", - "integrity": "sha512-wa+2VAhOPpZs1bVij9e5gyVu60ReMi/KuOx4LKjGx2Y3XTNUDJgQ+5f77D49pHtqef/klglf+mibuHs9TrPxdQ==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.19.0.tgz", + "integrity": "sha512-dRPuD4ocXdaE1BM/dNR21elSEUPKaWgowCA0bqJ6YbYkvtrPVEvZ+zqcX5a8ECYn3q5iBSSUcBBD42ubaOp0Hw==", "requires": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0", + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/visitor-keys": "5.19.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -20339,25 +20469,33 @@ "tsutils": "^3.21.0" }, "dependencies": { - "semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "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==", "requires": { - "lru-cache": "^7.4.0" + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" } } } }, "@typescript-eslint/utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.18.0.tgz", - "integrity": "sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.19.0.tgz", + "integrity": "sha512-ZuEckdupXpXamKvFz/Ql8YnePh2ZWcwz7APICzJL985Rp5C2AYcHO62oJzIqNhAMtMK6XvrlBTZeNG8n7gS3lQ==", "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", + "@typescript-eslint/scope-manager": "5.19.0", + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/typescript-estree": "5.19.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -20379,11 +20517,11 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.18.0.tgz", - "integrity": "sha512-Hf+t+dJsjAKpKSkg3EHvbtEpFFb/1CiOHnvI8bjHgOD4/wAw3gKrA0i94LrbekypiZVanJu3McWJg7rWDMzRTg==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.19.0.tgz", + "integrity": "sha512-Ym7zZoMDZcAKWsULi2s7UMLREdVQdScPQ/fKWMYefarCztWlHPFVJo8racf8R0Gc8FAEJ2eD4of8As1oFtnQlQ==", "requires": { - "@typescript-eslint/types": "5.18.0", + "@typescript-eslint/types": "5.19.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -20757,23 +20895,25 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" } }, "asap": { @@ -22420,6 +22560,14 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "requires": { + "has": "^1.0.3" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -22664,9 +22812,9 @@ } }, "eslint-config-react-app": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz", - "integrity": "sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", "requires": { "@babel/core": "^7.16.0", "@babel/eslint-parser": "^7.16.3", @@ -22891,9 +23039,9 @@ "requires": {} }, "eslint-plugin-testing-library": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.2.1.tgz", - "integrity": "sha512-88qJv6uzYALtiYJDzhelP3ov0Px/GLgnu+UekjjDxL2nMyvgdTyboKqcDBsvFPmAeizlCoSWOjeBN4DxO0BxaA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.3.1.tgz", + "integrity": "sha512-OfF4dlG/q6ck6DL3P8Z0FPdK0dU5K57gsBu7eUcaVbwYKaNzjgejnXiM9CCUevppORkvfek+9D3Uj/9ZZ8Vz8g==", "requires": { "@typescript-eslint/utils": "^5.13.0" } @@ -23302,9 +23450,9 @@ "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, "fork-ts-checker-webpack-plugin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", - "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz", + "integrity": "sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==", "requires": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -23367,6 +23515,14 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, "schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -23378,11 +23534,11 @@ } }, "semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { - "lru-cache": "^7.4.0" + "lru-cache": "^6.0.0" } }, "supports-color": { @@ -25913,6 +26069,11 @@ "fs-monkey": "1.0.3" } }, + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -26192,9 +26353,9 @@ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" }, "notistack": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.3.tgz", - "integrity": "sha512-krmVFtTO9kEY1Pa4NrbyexrjiRcV6TqBM2xLx8nuDea1g96Z/OZfkvVLmYKkTvoSJ3jyQntWK16z86ssW5kt4A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.4.tgz", + "integrity": "sha512-kOJmKvTG91ElMzi4aHu82BDe1liQ0zMrBp+TnWJptgowDsTbeTKbZmsRqJNIj145BmlOtZsEE9xjcrN46zVo3w==", "requires": { "clsx": "^1.1.0", "hoist-non-react-statics": "^3.3.0" @@ -27566,9 +27727,9 @@ } }, "react-dev-utils": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz", - "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", "requires": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -27589,7 +27750,7 @@ "open": "^8.4.0", "pkg-up": "^3.1.0", "prompts": "^2.4.2", - "react-error-overlay": "^6.0.10", + "react-error-overlay": "^6.0.11", "recursive-readdir": "^2.2.2", "shell-quote": "^1.7.3", "strip-ansi": "^6.0.1", @@ -27693,9 +27854,9 @@ } }, "react-dropzone": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.4.tgz", - "integrity": "sha512-fcqHEYe1MzAghU6/Hz86lHDlBNsA+lO48nAcm7/wA+kIzwS6uuJbUG33tBZjksj7GAZ1iUQ6NHwjUURPmSGang==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.5.tgz", + "integrity": "sha512-zUjZigD0VJ91CSm9T1h7ErxFReBLaa9sjS2dUL0+inb0RROZpSJTNDHPY1rrBES5V2NXhF8v0kghmaHc81BMFg==", "requires": { "attr-accept": "^2.2.2", "file-selector": "^0.4.0", @@ -27703,9 +27864,9 @@ } }, "react-error-overlay": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz", - "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==" + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, "react-icons": { "version": "4.3.1", @@ -27741,9 +27902,9 @@ } }, "react-scripts": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz", - "integrity": "sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", "requires": { "@babel/core": "^7.16.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", @@ -27761,7 +27922,7 @@ "dotenv": "^10.0.0", "dotenv-expand": "^5.1.0", "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.0", + "eslint-config-react-app": "^7.0.1", "eslint-webpack-plugin": "^3.1.1", "file-loader": "^6.2.0", "fs-extra": "^10.0.0", @@ -27779,7 +27940,7 @@ "postcss-preset-env": "^7.0.1", "prompts": "^2.4.2", "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.0", + "react-dev-utils": "^12.0.1", "react-refresh": "^0.11.0", "resolve": "^1.20.0", "resolve-url-loader": "^4.0.0", @@ -27816,6 +27977,21 @@ "prop-types": "^15.6.2" } }, + "react-virtualized-auto-sizer": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz", + "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==", + "requires": {} + }, + "react-window": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz", + "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", + "requires": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + } + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -29346,6 +29522,12 @@ "prepend-http": "^2.0.0" } }, + "use-double-click": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/use-double-click/-/use-double-click-1.0.5.tgz", + "integrity": "sha512-71LUca6NtzpzHYlcfM/dOdmwvmvpMbzeIVQpN87w+DctpLiMCXtZpsN8FNWPgHpPBtNhvucPUHIDh5al8D8C7w==", + "requires": {} + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -30103,6 +30285,11 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", diff --git a/interface/package.json b/interface/package.json index c3688025f..5001fd899 100644 --- a/interface/package.json +++ b/interface/package.json @@ -7,10 +7,11 @@ "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.6.0", - "@mui/material": "^5.6.0", + "@mui/icons-material": "^5.6.1", + "@mui/material": "^5.6.1", + "@table-library/react-table-library": "^2.0.32", "@types/lodash": "^4.14.181", - "@types/node": "^17.0.23", + "@types/node": "^17.0.24", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", @@ -19,15 +20,15 @@ "http-proxy-middleware": "^2.0.4", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", - "notistack": "^2.0.3", + "notistack": "^2.0.4", "parse-ms": "^3.0.0", "react": "^17.0.2", - "react-dom": "^17.0.2", "react-app-rewired": "^2.2.1", - "react-dropzone": "^12.0.4", + "react-dom": "^17.0.2", + "react-dropzone": "^12.0.5", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", - "react-scripts": "5.0.0", + "react-scripts": "5.0.1", "sockette": "^2.0.6", "typescript": "^4.6.3" }, diff --git a/interface/src/framework/ap/APSettingsForm.tsx b/interface/src/framework/ap/APSettingsForm.tsx index f15c6b802..8080f4f0f 100644 --- a/interface/src/framework/ap/APSettingsForm.tsx +++ b/interface/src/framework/ap/APSettingsForm.tsx @@ -14,6 +14,7 @@ import { ValidatedPasswordField, ValidatedTextField } from '../../components'; + import { APProvisionMode, APSettings } from '../../types'; import { numberValue, updateValue, useRest } from '../../utils'; import * as APApi from '../../api/ap'; diff --git a/interface/src/framework/security/ManageUsersForm.tsx b/interface/src/framework/security/ManageUsersForm.tsx index f5dbfaae2..16c30560d 100644 --- a/interface/src/framework/security/ManageUsersForm.tsx +++ b/interface/src/framework/security/ManageUsersForm.tsx @@ -1,6 +1,6 @@ import { FC, useContext, useState } from 'react'; -import { Button, IconButton, Table, TableBody, TableCell, TableFooter, TableHead, TableRow } from '@mui/material'; +import { Button, IconButton, Box } from '@mui/material'; import SaveIcon from '@mui/icons-material/Save'; import DeleteIcon from '@mui/icons-material/Delete'; import PersonAddIcon from '@mui/icons-material/PersonAdd'; @@ -9,6 +9,10 @@ import CheckIcon from '@mui/icons-material/Check'; import CloseIcon from '@mui/icons-material/Close'; import VpnKeyIcon from '@mui/icons-material/VpnKey'; +import { Table } from '@table-library/react-table-library/table'; +import { useTheme } from '@table-library/react-table-library/theme'; +import { Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-library/react-table-library/table'; + import * as SecurityApi from '../../api/security'; import { SecuritySettings, User } from '../../types'; import { ButtonRow, FormLoader, MessageBox, SectionContent } from '../../components'; @@ -19,16 +23,6 @@ import { AuthenticatedContext } from '../../contexts/authentication'; import GenerateToken from './GenerateToken'; import UserForm from './UserForm'; -function compareUsers(a: User, b: User) { - if (a.username < b.username) { - return -1; - } - if (a.username > b.username) { - return 1; - } - return 0; -} - const ManageUsersForm: FC = () => { const { loadData, saving, data, setData, saveData, errorMessage } = useRest({ read: SecurityApi.readSecuritySettings, @@ -40,6 +34,45 @@ const ManageUsersForm: FC = () => { const [generatingToken, setGeneratingToken] = useState(); const authenticatedContext = useContext(AuthenticatedContext); + const table_theme = useTheme({ + BaseRow: ` + font-size: 14px; + color: white; + `, + HeaderRow: ` + text-transform: uppercase; + background-color: black; + color: #90CAF9; + border-bottom: 1px solid #e0e0e0; + `, + Row: ` + &:nth-of-type(odd) { + background-color: #303030; + } + &:nth-of-type(even) { + background-color: #1e1e1e; + } + border-top: 1px solid #565656; + border-bottom: 1px solid #565656; + position: relative; + z-index: 1; + &:not(:last-of-type) { + margin-bottom: -1px; + } + &:not(:first-of-type) { + margin-top: -1px; + } + &:hover { + color: white; + } + `, + BaseCell: ` + border-top: 1px solid transparent; + border-right: 1px solid transparent; + border-bottom: 1px solid transparent; + ` + }); + const content = () => { if (!data) { return ; @@ -48,13 +81,14 @@ const ManageUsersForm: FC = () => { const noAdminConfigured = () => !data.users.find((u) => u.admin); const removeUser = (toRemove: User) => { - const users = data.users.filter((u) => u.username !== toRemove.username); + const users = data.users.filter((u) => u.id !== toRemove.id); setData({ ...data, users }); }; const createUser = () => { setCreating(true); setUser({ + id: '', username: '', password: '', admin: true @@ -72,7 +106,7 @@ const ManageUsersForm: FC = () => { const doneEditingUser = () => { if (user) { - const users = [...data.users.filter((u) => u.username !== user.username), user]; + const users = [...data.users.filter((u) => u.id !== user.id), user]; setData({ ...data, users }); setUser(undefined); } @@ -82,8 +116,8 @@ const ManageUsersForm: FC = () => { setGeneratingToken(undefined); }; - const generateToken = (username: string) => { - setGeneratingToken(username); + const generateToken = (id: string) => { + setGeneratingToken(id); }; const onSubmit = async () => { @@ -93,66 +127,71 @@ const ManageUsersForm: FC = () => { return ( <> - - - - Username - is Admin? - - - - - {data.users.sort(compareUsers).map((u) => ( - - - {u.username} - - {u.admin ? : } - - generateToken(u.username)} - > - - - removeUser(u)}> - - - editUser(u)}> - - - - - ))} - - - - - - - - - +
+ {(tableList: any) => ( + <> +
+ + USERNAME + IS ADMIN + + +
+ + {tableList.map((u: User, index: number) => ( + + {u.id} + {u.admin ? : } + + generateToken(u.id)} + > + + + removeUser(u)}> + + + editUser(u)}> + + + + + ))} + + + )}
+ {noAdminConfigured() && ( )} - - - + + + + + + + + + + + + + ({ - [`&.${tableCellClasses.head}`]: { - backgroundColor: theme.palette.common.black, - color: theme.palette.common.white, - fontSize: 14 - } -})); - -const StyledTableRow = styled(TableRow)(({ theme }) => ({ - '&:nth-of-type(odd)': { - backgroundColor: theme.palette.action.hover - }, - '&:hover': { - backgroundColor: theme.palette.info.light - } -})); - const DashboardData: FC = () => { - const { loadData, data, errorMessage } = useRest({ read: EMSESP.readCoreData }); - const { me } = useContext(AuthenticatedContext); const { enqueueSnackbar } = useSnackbar(); - const [deviceData, setDeviceData] = useState(); - const [sensorData, setSensorData] = useState(); + const [coreData, setCoreData] = useState({ devices: [], active_sensors: 0, analog_enabled: false }); + const [deviceData, setDeviceData] = useState({ label: '', data: [] }); + const [sensorData, setSensorData] = useState({ sensors: [], analogs: [] }); const [deviceValue, setDeviceValue] = useState(); const [sensor, setSensor] = useState(); const [analog, setAnalog] = useState(); - const [selectedDevice, setSelectedDevice] = useState(); const [deviceDialog, setDeviceDialog] = useState(-1); + const [onlyFav, setOnlyFav] = useState(false); - const desktopWindow = useMediaQuery('(min-width:600px)'); + const device_theme = useTheme({ + BaseRow: ` + font-size: 14px; + color: white; + height: 46px; + &:focus { + z-index: 2; + border-top: 1px solid #177ac9; + border-bottom: 1px solid #177ac9; + } + `, + HeaderRow: ` + text-transform: uppercase; + background-color: black; + border-bottom: 1px solid #e0e0e0; + `, + Row: ` + background-color: #1e1e1e; + border-top: 1px solid #565656; + border-bottom: 1px solid #565656; + position: relative; + z-index: 1; + &:not(:last-of-type) { + margin-bottom: -1px; + } + &:not(:first-of-type) { + margin-top: -1px; + } + &:hover { + z-index: 2; + color: white; + border-top: 1px solid #177ac9; + border-bottom: 1px solid #177ac9; + }, + &.tr.tr-body.row-select.row-select-single-selected, &.tr.tr-body.row-select.row-select-selected { + background-color: #3d4752; + color: white; + font-weight: normal; + z-index: 2; + border-top: 1px solid #177ac9; + border-bottom: 1px solid #177ac9; + } + `, + BaseCell: ` + border-top: 1px solid transparent; + border-right: 1px solid transparent; + border-bottom: 1px solid transparent; + &:nth-of-type(1) { + min-width: 42px; + width: 42px; + div { + width: 100%; + } + } + &:nth-of-type(2) { + min-width: 120px; + width: 120px; + } + &:nth-of-type(3) { + flex: 1; + } + &:nth-of-type(4) { + text-align: center; + max-width: 100px; + } + &:last-of-type { + text-align: right; + min-width: 64px; + } + ` + }); - const refreshAllData = () => { - if (analog || sensor || deviceValue) { - return; + const data_theme = useTheme({ + BaseRow: ` + font-size: 14px; + color: white; + height: 32px; + `, + HeaderRow: ` + text-transform: uppercase; + background-color: black; + color: #90CAF9; + border-bottom: 1px solid #e0e0e0; + `, + Row: ` + &:nth-of-type(odd) { + background-color: #303030; + } + &:nth-of-type(even) { + background-color: #1e1e1e; + } + border-top: 1px solid #565656; + border-bottom: 1px solid #565656; + position: relative; + z-index: 1; + &:not(:last-of-type) { + margin-bottom: -1px; + } + &:not(:first-of-type) { + margin-top: -1px; + } + &:hover { + z-index: 2; + border-top: 1px solid #177ac9; + border-bottom: 1px solid #177ac9; + color: white; + cursor: 'pointer', + } + `, + BaseCell: ` + padding-left: 8px; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + border-bottom: 1px solid transparent; + &:last-of-type { + text-align: right; + min-width: 64px; + } + `, + HeaderCell: ` + padding-left: 0px; + ` + }); + + const getSortIcon = (state: any, sortKey: any) => { + if (state.sortKey === sortKey && state.reverse) { + return ; } - loadData(); - if (sensorData) { - fetchSensorData(); - } else if (selectedDevice) { - fetchDeviceData(selectedDevice); + + if (state.sortKey === sortKey && !state.reverse) { + return ; } }; + const analog_sort = useSort( + { nodes: sensorData.analogs }, + { + state: { + sortKey: 'GPIO', + reverse: false + } + }, + { + sortIcon: { + iconDefault: null, + iconUp: , + iconDown: + }, + sortFns: { + GPIO: (array) => array.sort((a, b) => a.g - b.g), + NAME: (array) => array.sort((a, b) => a.n.localeCompare(b.n)), + TYPE: (array) => array.sort((a, b) => a.t - b.t), + VALUE: (array) => array.sort((a, b) => a.v.toString().localeCompare(b.v.toString())) + } + } + ); + + const sensor_sort = useSort( + { nodes: sensorData.sensors }, + { + state: { + sortKey: 'NAME', + reverse: false + } + }, + { + sortIcon: { + iconDefault: null, + iconUp: , + iconDown: + }, + sortFns: { + NAME: (array) => array.sort((a, b) => a.id.localeCompare(b.id)), + TEMPERATURE: (array) => array.sort((a, b) => a.id.localeCompare(b.id)) + } + } + ); + + const dv_sort = useSort( + { nodes: deviceData.data }, + { + state: { + sortKey: 'NAME', + reverse: false + } + }, + { + sortIcon: { + iconDefault: null, + iconUp: , + iconDown: + }, + sortFns: { + NAME: (array) => array.sort((a, b) => a.id.slice(2).localeCompare(b.id.slice(2))), + VALUE: (array) => array.sort((a, b) => a.v.toString().localeCompare(b.v.toString())) + } + } + ); + + const device_select = useRowSelect( + { nodes: coreData.devices }, + { + onChange: onSelectChange + } + ); + + function onSelectChange(action: any, state: any) { + if (action.type === 'ADD_BY_ID_EXCLUSIVELY') { + refreshData(); + } else { + setSensorData({ sensors: [], analogs: [] }); + } + } + + const escapeCsvCell = (cell: any) => { + if (cell == null) { + return ''; + } + const sc = cell.toString().trim(); + if (sc === '' || sc === '""') { + return sc; + } + if (sc.includes('"') || sc.includes(',') || sc.includes('\n') || sc.includes('\r')) { + return '"' + sc.replace(/"/g, '""') + '"'; + } + return sc; + }; + + const makeCsvData = (columns: any, data: any) => { + return data.reduce((csvString: any, rowItem: any) => { + return csvString + columns.map(({ accessor }: any) => escapeCsvCell(accessor(rowItem))).join(',') + '\r\n'; + }, columns.map(({ name }: any) => escapeCsvCell(name)).join(',') + '\r\n'); + }; + + const downloadAsCsv = (columns: any, data: any, filename: string) => { + const csvData = makeCsvData(columns, data); + const csvFile = new Blob([csvData], { type: 'text/csv' }); + const downloadLink = document.createElement('a'); + + downloadLink.download = filename; + downloadLink.href = window.URL.createObjectURL(csvFile); + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + }; + + const hasMask = (id: string, mask: number) => (parseInt(id.slice(0, 2), 16) & mask) === mask; + + const handleDownloadCsv = () => { + const columns = [ + { accessor: (dv: any) => dv.id.slice(2), name: 'Entity' }, + { accessor: (dv: any) => dv.v, name: 'Value' }, + { accessor: (dv: any) => (dv.u >= 1 && dv.u <= 2 ? 'C' : DeviceValueUOM_s[dv.u]), name: 'UoM' } + ]; + downloadAsCsv( + columns, + onlyFav ? deviceData.data.filter((dv) => hasMask(dv.id, DeviceEntityMask.DV_FAVORITE)) : deviceData.data, + 'device_entities' + ); + }; + const refreshData = () => { - if (analog || sensor || deviceValue) { + const selectedDevice = device_select.state.id; + if (selectedDevice === 'sensor') { + fetchSensorData(); return; } - if (sensorData) { - fetchSensorData(); - } else if (selectedDevice) { + + setSensorData({ sensors: [], analogs: [] }); + if (selectedDevice) { fetchDeviceData(selectedDevice); } else { - loadData(); + fetchCoreData(); } }; + const fetchCoreData = useCallback(async () => { + try { + setCoreData((await EMSESP.readCoreData()).data); + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Failed to fetch core data'), { variant: 'error' }); + } + }, [enqueueSnackbar]); + + useEffect(() => { + fetchCoreData(); + }, [fetchCoreData]); + useEffect(() => { const timer = setInterval(() => refreshData(), 60000); return () => { clearInterval(timer); }; // eslint-disable-next-line - }, [analog, sensor, deviceValue, sensorData, selectedDevice]); + }, [analog, sensor, deviceValue, sensorData]); - const fetchDeviceData = async (unique_id: number) => { + const fetchDeviceData = async (id: string) => { + const unique_id = parseInt(id); try { setDeviceData((await EMSESP.readDeviceData({ id: unique_id })).data); } catch (error: any) { enqueueSnackbar(extractErrorMessage(error, 'Problem fetching device data'), { variant: 'error' }); - } finally { - setSelectedDevice(unique_id); - setSensorData(undefined); } }; @@ -153,8 +396,6 @@ const DashboardData: FC = () => { setSensorData((await EMSESP.readSensorData()).data); } catch (error: any) { enqueueSnackbar(extractErrorMessage(error, 'Problem fetching sensor data'), { variant: 'error' }); - } finally { - setSelectedDevice(undefined); } }; @@ -192,10 +433,10 @@ const DashboardData: FC = () => { } const sendDeviceValue = async () => { - if (selectedDevice && deviceValue) { + if (deviceValue) { try { const response = await EMSESP.writeValue({ - id: selectedDevice, + id: Number(device_select.state.id), devicevalue: deviceValue }); if (response.status === 204) { @@ -209,9 +450,8 @@ const DashboardData: FC = () => { } catch (error: any) { enqueueSnackbar(extractErrorMessage(error, 'Problem writing value'), { variant: 'error' }); } finally { + refreshData(); setDeviceValue(undefined); - fetchDeviceData(selectedDevice); - loadData(); } } }; @@ -225,7 +465,7 @@ const DashboardData: FC = () => { {deviceValue.l && ( { {!deviceValue.l && ( { }; const addAnalogSensor = () => { - setAnalog({ i: 0, n: '', u: 0, v: 0, o: 0, t: 0, f: 1 }); + setAnalog({ id: '0', g: 0, n: '', u: 0, v: 0, o: 0, t: 0, f: 1 }); }; const sendSensor = async () => { if (sensor) { try { const response = await EMSESP.writeSensor({ - id_str: sensor.is, + id: sensor.id, name: sensor.n, offset: sensor.o }); @@ -314,7 +554,7 @@ const DashboardData: FC = () => { Edit Temperature Sensor - Sensor ID {sensor.is} + Sensor ID {sensor.id} @@ -369,32 +609,32 @@ const DashboardData: FC = () => { }; const renderDeviceDialog = () => { - if (data && data.devices.length > 0 && deviceDialog !== -1) { + if (coreData && coreData.devices.length > 0 && deviceDialog !== -1) { return ( setDeviceDialog(-1)}> Device Details - + - + - + - + - + @@ -408,104 +648,76 @@ const DashboardData: FC = () => { } }; - const toggleDeviceData = (index: number) => { - loadData(); - if (selectedDevice === index) { - setSelectedDevice(undefined); - } else { - fetchDeviceData(index); - } - }; + const renderCoreData = () => ( + + {coreData.devices.length === 0 && } - const toggleSensorData = () => { - loadData(); - if (sensorData) { - setSensorData(undefined); - } else { - fetchSensorData(); - } - }; - - const renderCoreData = () => { - if (!data) { - return ; - } - - return ( - - {data.devices.length === 0 && } - - - - - TYPE - - {desktopWindow && DESCRIPTION} - ENTITIES - - - - - {data.devices.map((device, index) => ( - device.e && toggleDeviceData(device.i)} - > - - - - {device.t} - {desktopWindow && {device.n}} - {device.e} - - setDeviceDialog(index)}> - - - - - ))} - {(data.active_sensors > 0 || data.analog_enabled) && ( - toggleSensorData()}> - - - - Sensors - {desktopWindow && Attached EMS-ESP Sensors} - {data.active_sensors} - - addAnalogSensor()} disabled={!data.analog_enabled}> - - - - - )} - -
-
- ); - }; + + {(tableList: any) => ( + <> +
+ + + TYPE + DESCRIPTION + ENTITIES + + +
+ + {tableList.map((device: Device, index: number) => ( + + + + + {device.t} + {device.n} + {device.e} + + setDeviceDialog(index)}> + + + + + ))} + {(coreData.active_sensors > 0 || coreData.analog_enabled) && ( + + + + + Sensors + Attached EMS-ESP Sensors + {coreData.active_sensors} + + addAnalogSensor()}> + + + + + )} + + + )} +
+
+ ); const renderDeviceData = () => { - if (data?.devices.length === 0 || !deviceData || !selectedDevice) { + if (!device_select.state.id || device_select.state.id === 'sensor') { return; } - const hasMask = (entityName: string, mask: number) => (parseInt(entityName.slice(0, 2), 16) & mask) === mask; - const sendCommand = (dv: DeviceValue) => { - if (dv.c && me.admin && !hasMask(dv.n, DeviceEntityMask.DV_READONLY)) { + if (dv.c && me.admin && !hasMask(dv.id, DeviceEntityMask.DV_READONLY)) { setDeviceValue(dv); } }; const renderNameCell = (dv: DeviceValue) => ( <> - {dv.n.slice(2)}  - {hasMask(dv.n, DeviceEntityMask.DV_FAVORITE) && } - {hasMask(dv.n, DeviceEntityMask.DV_READONLY) && } - {hasMask(dv.n, DeviceEntityMask.DV_API_MQTT_EXCLUDE) && ( + {dv.id.slice(2)}  + {hasMask(dv.id, DeviceEntityMask.DV_READONLY) && } + {hasMask(dv.id, DeviceEntityMask.DV_API_MQTT_EXCLUDE) && ( )} @@ -516,47 +728,83 @@ const DashboardData: FC = () => { {deviceData.label} - - - - - ENTITY NAME - VALUE - - - - {deviceData.data.map((dv, i) => ( - sendCommand(dv)}> - - {dv.c && me.admin && !hasMask(dv.n, DeviceEntityMask.DV_READONLY) && ( - - - - )} - - - {renderNameCell(dv)} - - - {isCmdOnly(dv) ? : formatValue(dv.v, dv.u)} - - - ))} - + + setOnlyFav(!onlyFav)} />} + label={favorites only} + /> + +
hasMask(dv.id, DeviceEntityMask.DV_FAVORITE)) + : deviceData.data + }} + theme={data_theme} + sort={dv_sort} + > + {(tableList: any) => ( + <> +
+ + + + + + + + + +
+ + {tableList.map((dv: DeviceValue) => ( + sendCommand(dv)}> + {renderNameCell(dv)} + {formatValue(dv.v, dv.u)} + + {dv.c && me.admin && !hasMask(dv.id, DeviceEntityMask.DV_READONLY) && ( + sendCommand(dv)}> + {isCmdOnly(dv) ? ( + + ) : ( + + )} + + )} + + + ))} + + + )}
); }; - const updateSensor = (sensordata: Sensor) => { - if (sensordata && me.admin) { - setSensor(sensordata); + const updateSensor = (s: Sensor) => { + if (s && me.admin) { + setSensor(s); } }; - const updateAnalog = (analogdata: Analog) => { + const updateAnalog = (a: Analog) => { if (me.admin) { - setAnalog(analogdata); + setAnalog(a); } }; @@ -565,31 +813,52 @@ const DashboardData: FC = () => { Temperature Sensors - - - - - NAME - TEMPERATURE - - - - {sensorData?.sensors.map((sensor_data) => ( - updateSensor(sensor_data)}> - - {me.admin && ( - - - - )} - - - {sensor_data.n} - - {formatValue(sensor_data.t, sensor_data.u)} - - ))} - + +
+ {(tableList: any) => ( + <> +
+ + + + + + + + + +
+ + {tableList.map((s: Sensor) => ( + updateSensor(s)}> + {s.n} + {formatValue(s.t, s.u)} + + {me.admin && ( + updateSensor(s)}> + + + )} + + + ))} + + + )}
); @@ -599,35 +868,74 @@ const DashboardData: FC = () => { Analog Sensors - - - - - GPIO - NAME - TYPE - VALUE - - - - {sensorData?.analogs.map((analog_data) => ( - updateAnalog(analog_data)}> - - {me.admin && ( - - - - )} - - - {analog_data.i} - - {analog_data.n} - {AnalogTypeNames[analog_data.t]} - {formatValue(analog_data.v, analog_data.u)} - - ))} - + +
+ {(tableList: any) => ( + <> +
+ + + + + + + + + + + + + + + +
+ + {tableList.map((a: Analog) => ( + updateAnalog(a)}> + {a.g} + {a.n} + {AnalogTypeNames[a.t]} + {a.t ? formatValue(a.v, a.u) : ''} + + {me.admin && ( + updateAnalog(a)}> + + + )} + + + ))} + + + )}
); @@ -636,7 +944,7 @@ const DashboardData: FC = () => { if (analog) { try { const response = await EMSESP.writeAnalog({ - id: analog.i, + gpio: analog.g, name: analog.n, offset: analog.o, factor: analog.f, @@ -664,7 +972,7 @@ const DashboardData: FC = () => { if (analog) { try { const response = await EMSESP.writeAnalog({ - id: analog.i, + gpio: analog.g, name: analog.n, offset: analog.o, factor: analog.f, @@ -697,9 +1005,9 @@ const DashboardData: FC = () => { { )} - {analog.t === AnalogType.DIGITAL_OUT && (analog.i === 25 || analog.i === 26) && ( + {analog.t === AnalogType.DIGITAL_OUT && (analog.id === '25' || analog.id === '26') && ( <> { )} - {analog.t === AnalogType.DIGITAL_OUT && analog.i !== 25 && analog.i !== 26 && ( + {analog.t === AnalogType.DIGITAL_OUT && analog.id !== '25' && analog.id !== '26' && ( <> { } }; - const content = () => { - if (!data) { - return ; - } - - return ( - <> - {renderCoreData()} - {renderDeviceData()} - {renderDeviceDialog()} - {sensorData && sensorData.sensors.length > 0 && renderDallasData()} - {sensorData && sensorData.analogs.length > 0 && renderAnalogData()} - {renderDeviceValueDialog()} - {renderSensorDialog()} - {renderAnalogDialog()} - - - - - ); - }; - return ( - {content()} + {renderCoreData()} + {renderDeviceData()} + {renderDeviceDialog()} + {sensorData.sensors.length !== 0 && renderDallasData()} + {sensorData.analogs.length !== 0 && renderAnalogData()} + {renderDeviceValueDialog()} + {renderSensorDialog()} + {renderAnalogDialog()} + + + {device_select.state.id && device_select.state.id !== 'sensor' && ( + + )} + ); }; diff --git a/interface/src/project/DashboardStatus.tsx b/interface/src/project/DashboardStatus.tsx index 6f81074ad..1397f9797 100644 --- a/interface/src/project/DashboardStatus.tsx +++ b/interface/src/project/DashboardStatus.tsx @@ -3,25 +3,23 @@ import { useSnackbar } from 'notistack'; import { Avatar, Button, - Table, - TableContainer, - TableBody, - TableCell, - TableHead, - TableRow, List, ListItem, ListItemAvatar, ListItemText, - Theme, - useTheme, Box, Dialog, DialogActions, DialogContent, - DialogTitle + DialogTitle, + Theme, + useTheme } from '@mui/material'; +import { Table } from '@table-library/react-table-library/table'; +import { useTheme as tableTheme } from '@table-library/react-table-library/theme'; +import { Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-library/react-table-library/table'; + import DeviceHubIcon from '@mui/icons-material/DeviceHub'; import RefreshIcon from '@mui/icons-material/Refresh'; import PermScanWifiIcon from '@mui/icons-material/PermScanWifi'; @@ -32,14 +30,12 @@ import { AuthenticatedContext } from '../contexts/authentication'; import { ButtonRow, FormLoader, SectionContent } from '../components'; -import { Status, busConnectionStatus } from './types'; +import { Status, busConnectionStatus, Stat } from './types'; -import { formatDurationSec, pluralize } from '../utils'; +import { formatDurationSec, pluralize, extractErrorMessage, useRest } from '../utils'; import * as EMSESP from './api'; -import { extractErrorMessage, useRest } from '../utils'; - export const isConnected = ({ status }: Status) => status !== busConnectionStatus.BUS_STATUS_OFFLINE; const busStatusHighlight = ({ status }: Status, theme: Theme) => { @@ -60,7 +56,7 @@ const busStatus = ({ status }: Status) => { case busConnectionStatus.BUS_STATUS_CONNECTED: return 'Connected'; case busConnectionStatus.BUS_STATUS_TX_ERRORS: - return 'Tx issues - try a different Tx-Mode'; + return 'Tx issues - try a different Tx Mode'; case busConnectionStatus.BUS_STATUS_OFFLINE: return 'Disconnected'; default: @@ -68,41 +64,17 @@ const busStatus = ({ status }: Status) => { } }; -const formatRow = (name: string, success: number, fail: number, quality: number) => { - if (success === 0 && fail === 0) { - return ( - - {name} - - - - - ); +const showQuality = (stat: Stat) => { + if (stat.q === 0 || stat.s + stat.f === 0) { + return; } - - return ( - - {name} - {Intl.NumberFormat().format(success)} - {Intl.NumberFormat().format(fail)} - {showQuality(quality)} - - ); -}; - -const showQuality = (quality: number) => { - if (quality === 0) { - return ; + if (stat.q === 100) { + return
{stat.q}%
; } - - if (quality === 100) { - return {quality}%; - } - - if (quality >= 95) { - return {quality}%; + if (stat.q >= 95) { + return
{stat.q}%
; } else { - return {quality}%; + return
{stat.q}%
; } }; @@ -115,6 +87,48 @@ const DashboardStatus: FC = () => { const { me } = useContext(AuthenticatedContext); + const stats_theme = tableTheme({ + BaseRow: ` + font-size: 14px; + color: white; + `, + HeaderRow: ` + text-transform: uppercase; + background-color: black; + color: #90CAF9; + border-bottom: 1px solid #e0e0e0; + `, + Row: ` + &:nth-of-type(odd) { + background-color: #303030; + } + &:nth-of-type(even) { + background-color: #1e1e1e; + } + border-top: 1px solid #565656; + border-bottom: 1px solid #565656; + position: relative; + z-index: 1; + &:not(:last-of-type) { + margin-bottom: -1px; + } + &:not(:first-of-type) { + margin-top: -1px; + } + &:hover { + color: white; + } + `, + BaseCell: ` + border-top: 1px solid transparent; + border-right: 1px solid transparent; + border-bottom: 1px solid transparent; + &:nth-of-type(1) { + flex: 1; + } + ` + }); + useEffect(() => { const timer = setInterval(() => loadData(), 30000); return () => { @@ -183,27 +197,30 @@ const DashboardStatus: FC = () => { /> - - - - - - SUCCESS - FAIL - QUALITY - - - - {formatRow('EMS Telegrams Received (Rx)', data.rx_received, data.rx_fails, data.rx_quality)} - {formatRow('EMS Reads (Tx)', data.tx_reads, data.tx_read_fails, data.tx_read_quality)} - {formatRow('EMS Writes (Tx)', data.tx_writes, data.tx_write_fails, data.tx_write_quality)} - {formatRow('Temperature Sensor Reads', data.sensor_reads, data.sensor_fails, data.sensor_quality)} - {formatRow('Analog Sensor Reads', data.analog_reads, data.analog_fails, data.analog_quality)} - {formatRow('MQTT Publishes', data.mqtt_count, data.mqtt_fails, data.mqtt_quality)} - {formatRow('API Calls', data.api_calls, data.api_fails, data.api_quality)} - -
-
+ + {(tableList: any) => ( + <> +
+ + + SUCCESS + FAIL + QUALITY + +
+ + {tableList.map((stat: Stat, index: number) => ( + + {stat.id} + {Intl.NumberFormat().format(stat.s)} + {Intl.NumberFormat().format(stat.f)} + {showQuality(stat)} + + ))} + + + )} +
{renderScanDialog()} diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 3eba6cbc2..ca7077c0c 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -2,10 +2,6 @@ import { FC, useState, useEffect, useCallback } from 'react'; import { Button, - Table, - TableBody, - TableHead, - TableRow, Typography, Box, MenuItem, @@ -14,22 +10,27 @@ import { DialogContent, DialogTitle, ToggleButton, - ToggleButtonGroup + ToggleButtonGroup, + Tooltip, + Grid } from '@mui/material'; -import TableCell, { tableCellClasses } from '@mui/material/TableCell'; - -import { styled } from '@mui/material/styles'; +import { Table } from '@table-library/react-table-library/table'; +import { useTheme } from '@table-library/react-table-library/theme'; +import { useSort } from '@table-library/react-table-library/sort'; +import { Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-library/react-table-library/table'; import { useSnackbar } from 'notistack'; import SaveIcon from '@mui/icons-material/Save'; import CancelIcon from '@mui/icons-material/Cancel'; import EditOffOutlinedIcon from '@mui/icons-material/EditOffOutlined'; -import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; +import StarIcon from '@mui/icons-material/Star'; import VisibilityOffOutlinedIcon from '@mui/icons-material/VisibilityOffOutlined'; import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined'; import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore'; +import KeyboardArrowUpOutlinedIcon from '@mui/icons-material/KeyboardArrowUpOutlined'; +import KeyboardArrowDownOutlinedIcon from '@mui/icons-material/KeyboardArrowDownOutlined'; import { ButtonRow, FormLoader, ValidatedTextField, SectionContent } from '../components'; @@ -37,26 +38,109 @@ import * as EMSESP from './api'; import { extractErrorMessage } from '../utils'; -import { DeviceShort, Devices, DeviceEntity } from './types'; - -const StyledTableCell = styled(TableCell)(({ theme }) => ({ - [`&.${tableCellClasses.head}`]: { - backgroundColor: '#607d8b' - } -})); +import { DeviceShort, Devices, DeviceEntity, DeviceEntityMask } from './types'; const SettingsCustomization: FC = () => { const { enqueueSnackbar } = useSnackbar(); - const [deviceEntities, setDeviceEntities] = useState(); + const [deviceEntities, setDeviceEntities] = useState([{ id: '', v: 0, s: '', m: 0, w: false }]); const [devices, setDevices] = useState(); const [errorMessage, setErrorMessage] = useState(); const [selectedDevice, setSelectedDevice] = useState(0); const [confirmReset, setConfirmReset] = useState(false); + const [selectedFilters, setSelectedFilters] = useState(0); // eslint-disable-next-line const [masks, setMasks] = useState(() => ['']); + const entities_theme = useTheme({ + Table: ` + height: 100%; + `, + BaseRow: ` + font-size: 14px; + color: white; + height: 32px; + `, + HeaderRow: ` + text-transform: uppercase; + background-color: black; + border-bottom: 1px solid #e0e0e0; + color: #90CAF9; + `, + Row: ` + background-color: #1e1e1e; + border-top: 1px solid #565656; + border-bottom: 1px solid #565656; + position: relative; + z-index: 1; + &:not(:last-of-type) { + margin-bottom: -1px; + } + &:not(:first-of-type) { + margin-top: -1px; + } + &:hover { + z-index: 2; + color: white; + border-top: 1px solid #177ac9; + border-bottom: 1px solid #177ac9; + }, + &.tr.tr-body.row-select.row-select-single-selected, &.tr.tr-body.row-select.row-select-selected { + background-color: #3d4752; + color: white; + font-weight: normal; + z-index: 2; + border-top: 1px solid #177ac9; + border-bottom: 1px solid #177ac9; + } + `, + BaseCell: ` + border-top: 1px solid transparent; + border-right: 1px solid transparent; + border-bottom: 1px solid transparent; + &:nth-of-type(1) { + width: 130px; + } + &:nth-of-type(2) { + flex: 1; + } + &:last-of-type { + text-align: right; + } + ` + }); + + const getSortIcon = (state: any, sortKey: any) => { + if (state.sortKey === sortKey && state.reverse) { + return ; + } + + if (state.sortKey === sortKey && !state.reverse) { + return ; + } + }; + + const entity_sort = useSort( + { nodes: deviceEntities }, + { + state: { + sortKey: 'NAME', + reverse: false + } + }, + { + sortIcon: { + iconDefault: null, + iconUp: , + iconDown: + }, + sortFns: { + NAME: (array) => array.sort((a, b) => a.id.localeCompare(b.id)) + } + } + ); + const fetchDevices = useCallback(async () => { try { setDevices((await EMSESP.readDevices()).data); @@ -117,23 +201,7 @@ const SettingsCustomization: FC = () => { return ( <> - Select a device and customize each of its entities using the options: - - -  mark it as favorite to be listed at the top of the Dashboard - - - -  make it read-only, only if it has write operation available - - - -  excluded it from MQTT and API outputs - - - -  hide it from the Dashboard - + Select a device and customize each of its entities using the options. { }; const renderDeviceData = () => { - if (devices?.devices.length === 0 || !deviceEntities) { + if (devices?.devices.length === 0 || deviceEntities[0].id === '') { return; } - const setMask = (de: DeviceEntity, newMask: string[]) => { + const getMaskNumber = (newMask: string[]) => { var new_mask = 0; for (let entry of newMask) { new_mask |= Number(entry); } - de.m = new_mask; - setMasks(newMask); + return new_mask; }; - const getMask = (de: DeviceEntity) => { + const getMaskString = (m: number) => { var new_masks = []; - if ((de.m & 1) === 1 || de.n === '') { + if ((m & 1) === 1) { new_masks.push('1'); } - if ((de.m & 2) === 2) { + if ((m & 2) === 2) { new_masks.push('2'); } - if ((de.m & 4) === 4 && de.w) { + if ((m & 4) === 4) { new_masks.push('4'); } - if ((de.m & 8) === 8) { + if ((m & 8) === 8) { new_masks.push('8'); } - return new_masks; }; + const maskDisabled = (set: boolean) => { + setDeviceEntities( + deviceEntities + .filter((de) => de.m & selectedFilters || !selectedFilters) + .map(({ m, ...entities }) => ({ + ...entities, + m: set + ? m | (DeviceEntityMask.DV_API_MQTT_EXCLUDE | DeviceEntityMask.DV_WEB_EXCLUDE) + : m & ~(DeviceEntityMask.DV_API_MQTT_EXCLUDE | DeviceEntityMask.DV_WEB_EXCLUDE) + })) + ); + }; + return ( - - - - OPTIONS - ENTITY NAME (CODE) - VALUE - - - - {deviceEntities.map((de) => ( - - - { - setMask(de, mask); - }} - > - - - - - - - - - - - - - - - - {de.n} ({de.s}) - - {formatValue(de.v)} - - ))} - -
+ <> + + + + Apply filter:  + + + + { + setSelectedFilters(getMaskNumber(mask)); + }} + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + de.m & selectedFilters || !selectedFilters) }} + theme={entities_theme} + sort={entity_sort} + layout={{ custom: true }} + > + {(tableList: any) => ( + <> +
+ + OPTIONS + + + + VALUE + + +
+ + {tableList.map((de: DeviceEntity) => ( + + + { + de.m = getMaskNumber(mask); + setMasks(['']); + }} + > + + + + + + + + + + + + + + + + {de.id} ({de.s}) + + {formatValue(de.v)} + + ))} + + + )} +
+ ); }; @@ -282,7 +431,8 @@ const SettingsCustomization: FC = () => { setConfirmReset(false)}> Reset - Are you sure you want remove all customizations? EMS-ESP will then restart. + Are you sure you want remove all customizations including the custom settings of the Temperature and Analog + sensors?