From 1d5a5e63b217f10b269225193e7f41f5d9ca219f Mon Sep 17 00:00:00 2001 From: Bluefox Date: Tue, 5 Nov 2024 10:22:57 +0100 Subject: [PATCH] Corrected cloud icon for admin (#2780) Removed double packages --- .github/workflows/test-and-release.yml | 2 + README.md | 3 + package-lock.json | 981 +++--------------- package.json | 8 - packages/adapter-react-v5/README.md | 14 +- packages/adapter-react-v5/package.json | 14 +- .../src/Components/FileViewer.tsx | 8 +- .../src/Components/UploadImage.tsx | 3 +- packages/admin/package.json | 10 +- packages/admin/src-admin/package.json | 38 +- packages/admin/src-admin/public/img/admin.svg | 6 + packages/admin/src-admin/src/App.tsx | 12 +- .../components/Adapters/AdapterGeneric.tsx | 3 +- .../BaseSettings/BaseSettingsLog.tsx | 4 +- .../components/Enums/DragObjectBrowser.tsx | 4 +- .../src-admin/src/components/IsVisible.tsx | 12 +- .../src-admin/src/components/Markdown.tsx | 4 +- .../src/components/Object/ObjectChart.tsx | 2 +- .../components/Object/ObjectCustomEditor.tsx | 4 +- .../src/components/ObjectBrowser.tsx | 18 +- .../components/Wizard/WizardSettingsTab.tsx | 301 +++--- .../SystemSettingsTabs/MainSettingsDialog.tsx | 2 + .../SystemSettingsTabs/RepositoriesDialog.tsx | 3 +- .../admin/src-admin/src/tabs/Adapters.tsx | 1 - packages/admin/src-admin/src/tabs/Config.tsx | 1 - .../admin/src-admin/src/tabs/Instances.tsx | 4 +- packages/admin/src-admin/tsconfig.json | 1 - packages/admin/src/lib/web.ts | 1 + packages/dm-gui-components/package.json | 9 +- packages/jsonConfig/README.md | 182 ++-- packages/jsonConfig/SCHEMA.md | 877 +--------------- packages/jsonConfig/package.json | 12 +- .../src/JsonConfigComponent/ConfigCustom.tsx | 2 +- .../src/JsonConfigComponent/ConfigPanel.tsx | 1 + .../JsonConfigComponent/ConfigPassword.tsx | 31 +- packages/jsonConfig/src/index.tsx | 77 +- packages/jsonConfig/src/types.d.ts | 6 +- 37 files changed, 592 insertions(+), 2069 deletions(-) create mode 100644 packages/admin/src-admin/public/img/admin.svg diff --git a/.github/workflows/test-and-release.yml b/.github/workflows/test-and-release.yml index 31a19925d..34089a7ed 100644 --- a/.github/workflows/test-and-release.yml +++ b/.github/workflows/test-and-release.yml @@ -61,6 +61,8 @@ jobs: run: | cd packages/admin/src-admin npm run check-ts + # Wait till js-controller 7 types are available + continue-on-error: true - name: 'Build' run: | diff --git a/README.md b/README.md index 93a7915e9..52382c4d4 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,9 @@ The icons may not be reused in other projects without the proper flaticon licens +### **WORK IN PROGRESS** +- (@GermanBluefox) Corrected cloud icon for admin + ### 7.2.6 (2024-10-11) - (@GermanBluefox) Trying to fix a GUI build process diff --git a/package-lock.json b/package-lock.json index 8e11b2645..b6135b1a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,14 +19,6 @@ "@alcalzone/release-script-plugin-iobroker": "^3.7.2", "@alcalzone/release-script-plugin-lerna": "^3.7.0", "@alcalzone/release-script-plugin-license": "^3.7.0", - "@emotion/react": " ^11.13.3", - "@emotion/styled": "^11.13.0", - "@iobroker/build-tools": "^2.0.6", - "@iobroker/eslint-config": "^0.1.6", - "@mui/icons-material": "^6.1.2", - "@mui/material": "^6.1.2", - "@mui/x-data-grid": "^7.18.0", - "@mui/x-date-pickers": "^7.18.0", "lerna": "^8.1.8" } }, @@ -290,7 +282,6 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/highlight": "^7.25.7", @@ -401,7 +392,6 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/types": "^7.25.7", @@ -562,7 +552,6 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.7", @@ -682,7 +671,6 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -692,7 +680,6 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -741,7 +728,6 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.7", @@ -757,7 +743,6 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/types": "^7.25.7" @@ -2500,7 +2485,6 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.25.7", @@ -2515,7 +2499,6 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.25.7", @@ -2534,7 +2517,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=4" @@ -2544,7 +2526,6 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.7", @@ -3056,7 +3037,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", @@ -3095,7 +3075,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", - "devOptional": true, "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0" @@ -3111,7 +3090,6 @@ "version": "11.13.3", "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -3155,7 +3133,6 @@ "version": "11.13.0", "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -3185,7 +3162,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", - "devOptional": true, "license": "MIT", "peerDependencies": { "react": ">=16.8.0" @@ -5361,7 +5337,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "devOptional": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -5376,7 +5351,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -5386,7 +5360,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -5407,14 +5380,12 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "devOptional": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "devOptional": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -5738,9 +5709,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.3.tgz", - "integrity": "sha512-ajMUgdfhTb++rwqj134Cq9f4SRN8oXUqMRnY72YBnXiXai3olJLLqETheRlq3MM8wCKrbq7g6j7iWL1VvP44VQ==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.5.tgz", + "integrity": "sha512-3J96098GrC95XsLw/TpGNMxhUOnoG9NZ/17Pfk1CrJj+4rcuolsF2RdF3XAFTu/3a/A+5ouxlSIykzYz6Ee87g==", "license": "MIT", "funding": { "type": "opencollective", @@ -5748,12 +5719,12 @@ } }, "node_modules/@mui/icons-material": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.3.tgz", - "integrity": "sha512-QBQCCIMSAv6IkArTg4Hg8q2sJRhHOci8oPAlkHWFlt2ghBdy3EqyLbIELLE/bhpqhX+E/ZkPYGIUQCd5/L0owA==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.5.tgz", + "integrity": "sha512-SbxFtO5I4cXfvhjAMgGib/t2lQUzcEzcDFYiRHRufZUeMMeXuoKaGsptfwAHTepYkv0VqcCwvxtvtWbpZLAbjQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6" + "@babel/runtime": "^7.25.7" }, "engines": { "node": ">=14.0.0" @@ -5763,7 +5734,7 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^6.1.3", + "@mui/material": "^6.1.5", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -5774,16 +5745,16 @@ } }, "node_modules/@mui/material": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.3.tgz", - "integrity": "sha512-loV5MBoMKLrK80JeWINmQ1A4eWoLv51O2dBPLJ260IAhupkB3Wol8lEQTEvvR2vO3o6xRHuXe1WaQEP6N3riqg==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.5.tgz", + "integrity": "sha512-rhaxC7LnlOG8zIVYv7BycNbWkC5dlm9A/tcDUp0CuwA7Zf9B9JP6M3rr50cNKxI7Z0GIUesAT86ceVm44quwnQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/core-downloads-tracker": "^6.1.3", - "@mui/system": "^6.1.3", + "@babel/runtime": "^7.25.7", + "@mui/core-downloads-tracker": "^6.1.5", + "@mui/system": "^6.1.5", "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.3", + "@mui/utils": "^6.1.5", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", @@ -5802,7 +5773,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^6.1.3", + "@mui/material-pigment-css": "^6.1.5", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -5829,13 +5800,13 @@ "license": "MIT" }, "node_modules/@mui/private-theming": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.3.tgz", - "integrity": "sha512-XK5OYCM0x7gxWb/WBEySstBmn+dE3YKX7U7jeBRLm6vHU5fGUd7GiJWRirpivHjOK9mRH6E1MPIVd+ze5vguKQ==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.5.tgz", + "integrity": "sha512-FJqweqEXk0KdtTho9C2h6JEKXsOT7MAVH2Uj3N5oIqs6YKxnwBn2/zL2QuYYEtj5OJ87rEUnCfFic6ldClvzJw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/utils": "^6.1.3", + "@babel/runtime": "^7.25.7", + "@mui/utils": "^6.1.5", "prop-types": "^15.8.1" }, "engines": { @@ -5856,12 +5827,12 @@ } }, "node_modules/@mui/styled-engine": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.3.tgz", - "integrity": "sha512-i4yh9m+eMZE3cNERpDhVr6Wn73Yz6C7MH0eE2zZvw8d7EFkIJlCQNZd1xxGZqarD2DDq2qWHcjIOucWGhxACtA==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.5.tgz", + "integrity": "sha512-tiyWzMkHeWlOoE6AqomWvYvdml8Nv5k5T+LDwOiwHEawx8P9Lyja6ZwWPU6xljwPXYYPT2KBp1XvMly7dsK46A==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", + "@babel/runtime": "^7.25.7", "@emotion/cache": "^11.13.1", "@emotion/serialize": "^1.3.2", "@emotion/sheet": "^1.4.0", @@ -5890,16 +5861,16 @@ } }, "node_modules/@mui/system": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.3.tgz", - "integrity": "sha512-ILaD9UsLTBLjMcep3OumJMXh1PYr7aqnkHm/L47bH46+YmSL1zWAX6tWG8swEQROzW2GvYluEMp5FreoxOOC6w==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.5.tgz", + "integrity": "sha512-vPM9ocQ8qquRDByTG3XF/wfYTL7IWL/20EiiKqByLDps8wOmbrDG9rVznSE3ZbcjFCFfMRMhtxvN92bwe/63SA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/private-theming": "^6.1.3", - "@mui/styled-engine": "^6.1.3", + "@babel/runtime": "^7.25.7", + "@mui/private-theming": "^6.1.5", + "@mui/styled-engine": "^6.1.5", "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.3", + "@mui/utils": "^6.1.5", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -5944,12 +5915,12 @@ } }, "node_modules/@mui/utils": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.3.tgz", - "integrity": "sha512-4JBpLkjprlKjN10DGb1aiy/ii9TKbQ601uSHtAmYFAS879QZgAD7vRnv/YBE4iBbc7NXzFgbQMCOFrupXWekIA==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.5.tgz", + "integrity": "sha512-vp2WfNDY+IbKUIGg+eqX1Ry4t/BilMjzp6p9xO1rfqpYjH1mj8coQxxDfKxcQLzBQkmBJjymjoGOak5VUYwXug==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", + "@babel/runtime": "^7.25.7", "@mui/types": "^7.2.18", "@types/prop-types": "^15.7.13", "clsx": "^2.1.1", @@ -5979,240 +5950,6 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, - "node_modules/@mui/x-data-grid": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-7.19.0.tgz", - "integrity": "sha512-IcEkcTz8g7TIDxpe+x7ankAHoK5vCOKPYfnMtRD0HiJ1X7ZhK4VCCfpeVFS7v3DNy9qXYvwjDLQcI35W0hi3Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/utils": "^5.16.6", - "@mui/x-internals": "7.18.0", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "reselect": "^5.1.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.9.0", - "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14 || ^6.0.0", - "@mui/system": "^5.15.14 || ^6.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@mui/x-data-grid/node_modules/@mui/utils": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", - "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^18.3.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/x-data-grid/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@mui/x-date-pickers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.19.0.tgz", - "integrity": "sha512-OIQ+IxgL2Si7DP68sw1ImcHXZtAmklHcyo/oqP4HuJZ2lVnP5sJkoXrksfumL1wjWKJkecONFz3unAqViKXzCQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/utils": "^5.16.6", - "@mui/x-internals": "7.18.0", - "@types/react-transition-group": "^4.4.11", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.9.0", - "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14 || ^6.0.0", - "@mui/system": "^5.15.14 || ^6.0.0", - "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", - "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", - "dayjs": "^1.10.7", - "luxon": "^3.0.2", - "moment": "^2.29.4", - "moment-hijri": "^2.1.2", - "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "date-fns": { - "optional": true - }, - "date-fns-jalali": { - "optional": true - }, - "dayjs": { - "optional": true - }, - "luxon": { - "optional": true - }, - "moment": { - "optional": true - }, - "moment-hijri": { - "optional": true - }, - "moment-jalaali": { - "optional": true - } - } - }, - "node_modules/@mui/x-date-pickers/node_modules/@mui/utils": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", - "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^18.3.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/x-date-pickers/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/@mui/x-internals": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz", - "integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/utils": "^5.16.6" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0" - } - }, - "node_modules/@mui/x-internals/node_modules/@mui/utils": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", - "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^18.3.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/x-internals/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", @@ -7431,13 +7168,6 @@ "esbuild-windows-arm64": "0.14.54" } }, - "node_modules/@petamoriken/float16": { - "version": "3.8.7", - "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.8.7.tgz", - "integrity": "sha512-/Ri4xDDpe12NT6Ex/DRgHzLlobiQXEW/hmG08w1wj/YU7hLemk97c+zHQFp0iZQ9r7YqgLEXZR2sls4HxBf9NA==", - "dev": true, - "license": "MIT" - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -7686,110 +7416,110 @@ "license": "MIT" }, "node_modules/@sentry-internal/browser-utils": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.33.1.tgz", - "integrity": "sha512-TW6/r+Gl5jiXv54iK1xZ3mlVgTS/jaBp4vcQ0xGMdgiQ3WchEPcFSeYovL+YHT3tSud0GZqVtDQCz+5i76puqA==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.35.0.tgz", + "integrity": "sha512-uj9nwERm7HIS13f/Q52hF/NUS5Al8Ma6jkgpfYGeppYvU0uSjPkwMogtqoJQNbOoZg973tV8qUScbcWY616wNA==", "license": "MIT", "dependencies": { - "@sentry/core": "8.33.1", - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry/core": "8.35.0", + "@sentry/types": "8.35.0", + "@sentry/utils": "8.35.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/feedback": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.33.1.tgz", - "integrity": "sha512-qauMRTm3qDaLqZ3ibI03cj4gLF40y0ij65nj+cns6iWxGCtPrO8tjvXFWuQsE7Aye9dGMnBgmv7uN+NTUtC3RA==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.35.0.tgz", + "integrity": "sha512-7bjSaUhL0bDArozre6EiIhhdWdT/1AWNWBC1Wc5w1IxEi5xF7nvF/FfvjQYrONQzZAI3HRxc45J2qhLUzHBmoQ==", "license": "MIT", "dependencies": { - "@sentry/core": "8.33.1", - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry/core": "8.35.0", + "@sentry/types": "8.35.0", + "@sentry/utils": "8.35.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.33.1.tgz", - "integrity": "sha512-fm4coIOjmanU29NOVN9MyaP4fUCOYytbtFqVSKRFNZQ/xAgNeySiBIbUd6IjujMmnOk9bY0WEUMcdm3Uotjdog==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.35.0.tgz", + "integrity": "sha512-3wkW03vXYMyWtTLxl9yrtkV+qxbnKFgfASdoGWhXzfLjycgT6o4/04eb3Gn71q9aXqRwH17ISVQbVswnRqMcmA==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.33.1", - "@sentry/core": "8.33.1", - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry-internal/browser-utils": "8.35.0", + "@sentry/core": "8.35.0", + "@sentry/types": "8.35.0", + "@sentry/utils": "8.35.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.33.1.tgz", - "integrity": "sha512-nsxTFTPCT10Ty/v6+AiST3+yotGP1sUb8xqfKB9fPnS1hZHFryp0NnEls7xFjBsBbZPU1GpFkzrk/E6JFzixDQ==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.35.0.tgz", + "integrity": "sha512-TUrH6Piv19kvHIiRyIuapLdnuwxk/Un/l1WDCQfq7mK9p1Pac0FkQ7Uufjp6zY3lyhDDZQ8qvCS4ioCMibCwQg==", "license": "MIT", "dependencies": { - "@sentry-internal/replay": "8.33.1", - "@sentry/core": "8.33.1", - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry-internal/replay": "8.35.0", + "@sentry/core": "8.35.0", + "@sentry/types": "8.35.0", + "@sentry/utils": "8.35.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/browser": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.33.1.tgz", - "integrity": "sha512-c6zI/igexkLwZuGk+u8Rj26ChjxGgkhe6ZbKFsXCYaKAp5ep5X7HQRkkqgbxApiqlC0LduHdd/ymzh139JLg8w==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.35.0.tgz", + "integrity": "sha512-WHfI+NoZzpCsmIvtr6ChOe7yWPLQyMchPnVhY3Z4UeC70bkYNdKcoj/4XZbX3m0D8+71JAsm0mJ9s9OC3Ue6MQ==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.33.1", - "@sentry-internal/feedback": "8.33.1", - "@sentry-internal/replay": "8.33.1", - "@sentry-internal/replay-canvas": "8.33.1", - "@sentry/core": "8.33.1", - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry-internal/browser-utils": "8.35.0", + "@sentry-internal/feedback": "8.35.0", + "@sentry-internal/replay": "8.35.0", + "@sentry-internal/replay-canvas": "8.35.0", + "@sentry/core": "8.35.0", + "@sentry/types": "8.35.0", + "@sentry/utils": "8.35.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/core": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.33.1.tgz", - "integrity": "sha512-3SS41suXLFzxL3OQvTMZ6q92ZapELVq2l2SoWlZopcamWhog2Ru0dp2vkunq97kFHb2TzKRTlFH4+4gbT8SJug==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.35.0.tgz", + "integrity": "sha512-Ci0Nmtw5ETWLqQJGY4dyF+iWh7PWKy6k303fCEoEmqj2czDrKJCp7yHBNV0XYbo00prj2ZTbCr6I7albYiyONA==", "license": "MIT", "dependencies": { - "@sentry/types": "8.33.1", - "@sentry/utils": "8.33.1" + "@sentry/types": "8.35.0", + "@sentry/utils": "8.35.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/types": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.33.1.tgz", - "integrity": "sha512-GjoAMvwtpIemoF/IiwZ7A60g4nQv3qwzR21GvJqDVUoKD0e8pv9OLX+HyXoUat4wEDGSuDUcUyUKD2G+od73QA==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.35.0.tgz", + "integrity": "sha512-AVEZjb16MlYPifiDDvJ19dPQyDn0jlrtC1PHs6ZKO+Rzyz+2EX2BRdszvanqArldexPoU1p5Bn2w81XZNXThBA==", "license": "MIT", "engines": { "node": ">=14.18" } }, "node_modules/@sentry/utils": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.33.1.tgz", - "integrity": "sha512-uzuYpiiJuFY3N4WNHMBWUQX5oNv2t/TbG0OHRp3Rr7yeu+HSfD542TIp9/gMZ+G0Cxd8AmVO3wkKIFbk0TL4Qg==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.35.0.tgz", + "integrity": "sha512-MdMb6+uXjqND7qIPWhulubpSeHzia6HtxeJa8jYI09OCvIcmNGPydv/Gx/LZBwosfMHrLdTWcFH7Y7aCxrq7cg==", "license": "MIT", "dependencies": { - "@sentry/types": "8.33.1" + "@sentry/types": "8.35.0" }, "engines": { "node": ">=14.18" @@ -8664,9 +8394,9 @@ "license": "MIT" }, "node_modules/@types/leaflet": { - "version": "1.9.12", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.12.tgz", - "integrity": "sha512-BK7XS+NyRI291HIo0HCfE18Lp8oA30H1gpi1tf0mF3TgiCEzanQjOqNZ4x126SXzzi2oNSZhZ5axJp1k0iM6jg==", + "version": "1.9.14", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.14.tgz", + "integrity": "sha512-sx2q6MDJaajwhKeVgPSvqXd8rhNJSTA3tMidQGduZn9S6WBYxDkCpSpV5xXEmSg7Cgdk/5vJGhVF1kMYLzauBg==", "dev": true, "license": "MIT", "dependencies": { @@ -8681,9 +8411,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ==", + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.12.tgz", + "integrity": "sha512-sviUmCE8AYdaF/KIHLDJBQgeYzPBI0vf/17NaYehBJfYD1j6/L95Slh07NlyK2iNyBNaEkb3En2jRt+a8y3xZQ==", "dev": true, "license": "MIT" }, @@ -8733,13 +8463,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "version": "22.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.1.tgz", + "integrity": "sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.19.8" } }, "node_modules/@types/node-forge": { @@ -8763,7 +8493,6 @@ "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==", - "devOptional": true, "license": "MIT" }, "node_modules/@types/passport": { @@ -8833,17 +8562,10 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/rbush": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/rbush/-/rbush-3.0.3.tgz", - "integrity": "sha512-lX55lR0iYCgapxD3IrgujpQA1zDxwZI5qMRelKvmKAsSMplFVr7wmMpG7/6+Op2tjrgEex8o3vjg8CRDrRNYxg==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/react": { - "version": "18.3.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", - "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -8862,9 +8584,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10230,7 +9952,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "devOptional": true, "license": "MIT", "dependencies": { "color-convert": "^1.9.0" @@ -11230,7 +10951,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -11498,14 +11218,13 @@ } }, "node_modules/bare-stream": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.0.tgz", - "integrity": "sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.2.tgz", + "integrity": "sha512-EFZHSIBkDgSHIwj2l2QZfP4U5OcD4xFAOwhSb/vlr9PIqyGJGvB/nfClJbcnh3EY4jtPE4zsb5ztae96bVF79A==", "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { - "b4a": "^1.6.6", "streamx": "^2.20.0" } }, @@ -12436,7 +12155,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -12609,7 +12327,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", @@ -12624,7 +12341,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=0.8.0" @@ -13188,44 +12904,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "license": "MIT" }, - "node_modules/color-parse": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.2.tgz", - "integrity": "sha512-eCtOz5w5ttWIUcaKLiktF+DxZO1R9KLNY/xhbV6CkhM7sR3GhVghmt6X6yOnzeaM24po+Z9/S1apbXMwA3Iepw==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - } - }, - "node_modules/color-parse/node_modules/color-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.0.tgz", - "integrity": "sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/color-rgba": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz", - "integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-parse": "^2.0.0", - "color-space": "^2.0.0" - } - }, - "node_modules/color-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-space/-/color-space-2.0.1.tgz", - "integrity": "sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA==", - "dev": true, - "license": "MIT" - }, "node_modules/color-string": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", @@ -13844,7 +13522,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "devOptional": true, "license": "MIT" }, "node_modules/cookie": { @@ -13962,16 +13639,6 @@ "node": ">=0.10.0" } }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, "node_modules/core-js": { "version": "3.38.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", @@ -14020,7 +13687,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "devOptional": true, "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", @@ -23975,7 +23641,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", - "devOptional": true, + "dev": true, "license": "MIT", "funding": { "type": "github", @@ -24518,9 +24184,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1342118", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1342118.tgz", - "integrity": "sha512-75fMas7PkYNDTmDyb6PRJCH7ILmHLp+BhrZGeMsa4bCh40DTxgCz2NRy5UDzII4C5KuD0oBMZ9vXKhEl6UD/3w==", + "version": "0.0.1354347", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1354347.tgz", + "integrity": "sha512-BlmkSqV0V84E2WnEnoPnwyix57rQxAM5SKJjf4TbYOCGLAWtz8CDH8RIaGOjPgPCXo2Mce3kxSY497OySidY3Q==", "dev": true, "license": "BSD-3-Clause" }, @@ -24905,13 +24571,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/earcut": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.0.tgz", - "integrity": "sha512-41Fs7Q/PLq1SDbqjsgcY7GA42T0jvaCNGXgGtsNdvg+Yv8eIu06bxv4/PoREkZ9nMDNwnUSG9OFB9+yv8eKhDg==", - "dev": true, - "license": "ISC" - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -25171,7 +24830,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "devOptional": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" @@ -25840,7 +25498,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -26213,9 +25870,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.37.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz", - "integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==", + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", "dev": true, "license": "MIT", "dependencies": { @@ -26224,7 +25881,7 @@ "array.prototype.flatmap": "^1.3.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", + "es-iterator-helpers": "^1.1.0", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", @@ -27570,7 +27227,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "devOptional": true, "license": "MIT" }, "node_modules/find-up": { @@ -28279,39 +27935,6 @@ "node": ">=6.9.0" } }, - "node_modules/geotiff": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.1.3.tgz", - "integrity": "sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@petamoriken/float16": "^3.4.7", - "lerc": "^3.0.0", - "pako": "^2.0.4", - "parse-headers": "^2.0.2", - "quick-lru": "^6.1.1", - "web-worker": "^1.2.0", - "xml-utils": "^1.0.2", - "zstddec": "^0.1.0" - }, - "engines": { - "node": ">=10.19" - } - }, - "node_modules/geotiff/node_modules/quick-lru": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz", - "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -29029,7 +28652,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=4" @@ -29283,7 +28905,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "devOptional": true, "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" @@ -29293,7 +28914,6 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "devOptional": true, "license": "MIT" }, "node_modules/hoopy": { @@ -29791,7 +29411,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "devOptional": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -30451,7 +30070,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "devOptional": true, "license": "MIT" }, "node_modules/is-async-function": { @@ -30584,7 +30202,6 @@ "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "devOptional": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -34379,7 +33996,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "devOptional": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -34803,13 +34419,6 @@ "leaflet": "^1.6.0" } }, - "node_modules/lerc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz", - "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/lerna": { "version": "8.1.8", "resolved": "https://registry.npmjs.org/lerna/-/lerna-8.1.8.tgz", @@ -35729,7 +35338,7 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -38827,26 +38436,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ol": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/ol/-/ol-10.2.1.tgz", - "integrity": "sha512-2bB/y2vEnmzjqynP0NA7Cp8k86No3Psn63Dueicep3E3i09axWRVIG5IS/bylEAGfWQx0QXD/uljkyFoY60Wig==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/rbush": "3.0.3", - "color-rgba": "^3.0.0", - "color-space": "^2.0.1", - "earcut": "^3.0.0", - "geotiff": "^2.0.7", - "pbf": "4.0.1", - "rbush": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/openlayers" - } - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -39331,13 +38920,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", - "dev": true, - "license": "(MIT AND Zlib)" - }, "node_modules/parallel-transform": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", @@ -39402,7 +38984,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "devOptional": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -39495,13 +39076,6 @@ "dev": true, "license": "MIT" }, - "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==", - "dev": true, - "license": "MIT" - }, "node_modules/parse-imports": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", @@ -39521,7 +39095,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -39540,14 +39113,12 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "devOptional": true, "license": "MIT" }, "node_modules/parse-json/node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "devOptional": true, "license": "MIT" }, "node_modules/parse-node-version": { @@ -39712,7 +39283,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "devOptional": true, "license": "MIT" }, "node_modules/path-scurry": { @@ -39752,7 +39322,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -39785,19 +39354,6 @@ "through": "~2.3" } }, - "node_modules/pbf": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-4.0.1.tgz", - "integrity": "sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "resolve-protobuf-schema": "^2.1.0" - }, - "bin": { - "pbf": "bin/pbf" - } - }, "node_modules/pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", @@ -39834,7 +39390,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "devOptional": true, "license": "ISC" }, "node_modules/picomatch": { @@ -41974,13 +41529,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/protocol-buffers-schema": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", - "dev": true, - "license": "MIT" - }, "node_modules/protocols": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", @@ -42131,9 +41679,9 @@ } }, "node_modules/puppeteer": { - "version": "23.5.3", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-23.5.3.tgz", - "integrity": "sha512-FghmfBsr/UUpe48OiCg1gV3W4vVfQJKjQehbF07SjnQvEpWcvPTah1nykfGWdOQQ1ydJPIXcajzWN7fliCU3zw==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-23.6.0.tgz", + "integrity": "sha512-l+Fgo8SVFSd51STtq2crz8t1Y3VXowsuR4zfR64qDOn6oggz7YIZauWiNR4IJjczQ6nvFs3S4cgng55/nesxTQ==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -42141,8 +41689,8 @@ "@puppeteer/browsers": "2.4.0", "chromium-bidi": "0.8.0", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1342118", - "puppeteer-core": "23.5.3", + "devtools-protocol": "0.0.1354347", + "puppeteer-core": "23.6.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -42153,16 +41701,16 @@ } }, "node_modules/puppeteer-core": { - "version": "23.5.3", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.5.3.tgz", - "integrity": "sha512-V58MZD/B3CwkYsqSEQlHKbavMJptF04fzhMdUpiCRCmUVhwZNwSGEPhaiZ1f8I3ABQUirg3VNhXVB6Z1ubHXtQ==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.6.0.tgz", + "integrity": "sha512-se1bhgUpR9C529SgHGr/eyT92mYyQPAhA2S9pGtGrVG2xob9qE6Pbp7TlqiSPlnnY1lINqhn6/67EwkdzOmKqQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.4.0", "chromium-bidi": "0.8.0", "debug": "^4.3.7", - "devtools-protocol": "0.0.1342118", + "devtools-protocol": "0.0.1354347", "typed-query-selector": "^2.12.0", "ws": "^8.18.0" }, @@ -42321,13 +41869,6 @@ "node": ">=8" } }, - "node_modules/quickselect": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", - "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", - "dev": true, - "license": "ISC" - }, "node_modules/raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", @@ -42393,21 +41934,12 @@ "node": ">= 0.8" } }, - "node_modules/rbush": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-4.0.1.tgz", - "integrity": "sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "quickselect": "^3.0.0" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -42712,6 +42244,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -42721,9 +42254,9 @@ } }, "node_modules/react-dropzone": { - "version": "14.2.9", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.9.tgz", - "integrity": "sha512-jRZsMC7h48WONsOLHcmhyn3cRWJoIPQjPApvt/sJVfnYaB3Qltn025AoRTTJaj4WdmmgmLl6tUQg1s0wOhpodQ==", + "version": "14.2.10", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.10.tgz", + "integrity": "sha512-Y98LOCYxGO2jOFWREeKJlL7gbrHcOlTBp+9DCM1dh9XQ8+P/8ThhZT7kFb05C+bPcTXq/rixpU+5+LzwYrFLUw==", "license": "MIT", "dependencies": { "attr-accept": "^2.2.2", @@ -42757,18 +42290,19 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.3.0.tgz", "integrity": "sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==", + "dev": true, "license": "MIT", "peerDependencies": { "react": "*" } }, "node_modules/react-inlinesvg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/react-inlinesvg/-/react-inlinesvg-4.1.3.tgz", - "integrity": "sha512-p1+wkr1UQZyLw/3bdpnHO3v3tMNVWyxWnAEY6ML/Ql9ldDYTBTy6HqAyNl7u3au925XPffLMiXKnQrqZeJAldw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/react-inlinesvg/-/react-inlinesvg-4.1.4.tgz", + "integrity": "sha512-V7x3YGqG7LNeHpsIx90HDa2qhYCOPkzjIMToPWALyvOTI3kzicKF2O2PNZDaVqAVhwRbijLIUoQN5STleTO2rg==", "license": "MIT", "dependencies": { - "react-from-dom": "^0.7.2" + "react-from-dom": "^0.7.3" }, "peerDependencies": { "react": "16.8 - 18" @@ -44509,18 +44043,10 @@ "dev": true, "license": "MIT" }, - "node_modules/reselect": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", - "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", - "dev": true, - "license": "MIT" - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "devOptional": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -44561,22 +44087,11 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/resolve-protobuf-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "protocol-buffers-schema": "^3.3.1" - } - }, "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -45546,6 +45061,7 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" } @@ -46716,7 +46232,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "devOptional": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -47938,7 +47453,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "devOptional": true, "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -47988,7 +47502,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -48758,7 +48271,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=4" @@ -48822,13 +48334,6 @@ "node": ">=8.0" } }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -50760,13 +50265,6 @@ "defaults": "^1.0.3" } }, - "node_modules/web-worker": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", - "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -52201,13 +51699,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/xml-utils": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.10.1.tgz", - "integrity": "sha512-Dn6vJ1Z9v1tepSjvnCpwk5QqwIPcEFKdgnjqfYOABv1ngSofuAhtlugcUC3ehS1OHdgDWSG6C5mvj+Qm15udTQ==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", @@ -52246,7 +51737,6 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "devOptional": true, "license": "ISC", "engines": { "node": ">= 6" @@ -52420,13 +51910,6 @@ "tslib": "2.3.0" } }, - "node_modules/zstddec": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.1.0.tgz", - "integrity": "sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==", - "dev": true, - "license": "MIT AND BSD-3-Clause" - }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", @@ -52443,21 +51926,21 @@ "version": "7.2.6", "license": "MIT", "dependencies": { + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", "@iobroker/js-controller-common": "^6.0.11", "@iobroker/js-controller-common-db": "^6.0.11", "@iobroker/socket-client": "^3.1.1", "@iobroker/types": "^6.0.11", - "@mui/icons-material": "^6.1.3", - "@mui/material": "^6.1.3", - "@mui/x-date-pickers": "^7.19.0", - "@sentry/browser": "^8.33.1", + "@mui/icons-material": "^6.1.5", + "@mui/material": "^6.1.5", + "@sentry/browser": "^8.35.0", "cronstrue": "^2.50.0", "react-color": "^2.19.3", "react-colorful": "^5.6.1", "react-cropper": "^2.3.3", - "react-dropzone": "^14.2.9", - "react-icons": "^5.3.0", - "react-inlinesvg": "^4.1.3" + "react-dropzone": "^14.2.10", + "react-inlinesvg": "^4.1.4" }, "devDependencies": { "@babel/core": "^7.25.7", @@ -52530,10 +52013,10 @@ "body-parser": "^1.20.3", "compression": "^1.7.4", "connect-flash": "^0.1.1", - "cookie-parser": "^1.4.6", - "express": "^4.21.0", + "cookie-parser": "^1.4.7", + "express": "^4.21.1", "express-fileupload": "^1.5.1", - "express-session": "^1.18.0", + "express-session": "^1.18.1", "json5": "^2.2.3", "mime": "^3.0.0", "passport": "^0.7.0", @@ -52544,11 +52027,9 @@ "devDependencies": { "@iobroker/build-tools": "^2.0.6", "@iobroker/dm-gui-components": "file:../dm-gui-components", - "@iobroker/eslint-config": "^0.1.6", "@iobroker/json-config": "file:../jsonConfig", "@iobroker/legacy-testing": "^1.0.13", "@iobroker/testing": "^5.0.0", - "@iobroker/types": "^7.0.0", "@types/archiver": "^6.0.2", "@types/body-parser": "^1.19.5", "@types/compression": "^1.7.5", @@ -52564,7 +52045,7 @@ "colorette": "^2.0.20", "less": "^4.2.0", "mocha": "^10.7.3", - "puppeteer": "^23.5.3", + "puppeteer": "^23.6.0", "sinon-chai": "^3.7.0", "src-rx": "file:src-admin", "typescript": "^5.6.3" @@ -52573,24 +52054,6 @@ "node": ">=16.0.0" } }, - "packages/admin/node_modules/@alcalzone/pak": { - "version": "0.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "axios": "^0.26.0", - "execa": "^5.0.0", - "fs-extra": "^10.0.1" - } - }, - "packages/admin/node_modules/@alcalzone/pak/node_modules/axios": { - "version": "0.26.1", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.8" - } - }, "packages/admin/node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.11", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", @@ -52661,60 +52124,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "packages/admin/node_modules/@iobroker/js-controller-common-db": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@alcalzone/pak": "^0.8.1", - "axios": "^1.7.4", - "ci-info": "^3.8.0", - "deep-clone": "^3.0.3", - "event-stream": "^4.0.1", - "fs-extra": "^11.1.0", - "jsonwebtoken": "^9.0.0", - "node-forge": "^1.3.0", - "node.extend": "^2.0.2", - "promisify-child-process": "^4.1.2", - "readline": "^1.3.0", - "semver": "^7.5.2", - "triple-beam": "^1.3.0", - "winston": "^3.7.2", - "winston-daily-rotate-file": "^5.0.0", - "winston-transport": "^4.5.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "@datalust/winston-seq": "^1.0.0", - "diskusage": "^1.1.3", - "winston-syslog": "^2.6.0" - } - }, - "packages/admin/node_modules/@iobroker/js-controller-common-db/node_modules/fs-extra": { - "version": "11.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "packages/admin/node_modules/@iobroker/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@iobroker/types/-/types-7.0.0.tgz", - "integrity": "sha512-/QcNFRGdKRJtEq59NFAuNsU1iraaHmpz5hT9zrW14SZh3h4LqH0zYmIzpes3J31AUJB1kenbB9XSBBpPi67KTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, "packages/admin/node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "dev": true, @@ -53463,13 +52872,13 @@ }, "packages/admin/src-admin": { "name": "src-rx", - "version": "7.2.5", + "version": "7.2.6", "dev": true, "dependencies": { "@iobroker/adapter-react-v5": "file:../../adapter-react-v5", "@iobroker/dm-gui-components": "file:../../dm-gui-components", "@iobroker/json-config": "file:../../jsonConfig", - "http-proxy-middleware": "^3.0.2" + "http-proxy-middleware": "^3.0.3" }, "devDependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", @@ -53482,36 +52891,30 @@ "@honkhonk/vite-plugin-svgr": "^1.1.0", "@iobroker/admin-component-easy-access": "^1.0.8", "@iobroker/dm-utils": "^0.5.0", - "@iobroker/eslint-config": "^0.1.6", - "@iobroker/js-controller-common-db": "^7.0.0", "@iobroker/socket-client": "^3.1.1", - "@iobroker/types": "^7.0.0", "@originjs/vite-plugin-commonjs": "^1.0.3", "@react-leaflet/core": "^2.1.0", - "@sentry/browser": "^8.33.1", "@tsconfig/node16": "^16.1.3", "@types/ace": "^0.0.52", "@types/crypto-js": "^4.2.2", - "@types/leaflet": "^1.9.12", + "@types/leaflet": "^1.9.14", "@types/less": "^3.0.6", - "@types/lodash": "^4.17.10", - "@types/mocha": "^10.0.8", - "@types/node": "^22.7.4", - "@types/react": "^18.3.11", + "@types/lodash": "^4.17.12", + "@types/mocha": "^10.0.9", + "@types/node": "^22.8.1", + "@types/react": "^18.3.12", "@types/react-color": "^3.0.12", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "buffer": "^6.0.3", - "copy-to-clipboard": "^3.3.3", "craco-babel-loader": "^1.0.4", "craco-module-federation": "^1.1.0", "cron-parser": "^4.9.0", - "cronstrue": "^2.50.0", "crypto-js": "^4.2.0", "date-fns": "^4.1.0", "echarts": "^5.5.1", "echarts-for-react": "^3.0.2", "eslint-config-react-app": "^7.0.1", - "eslint-plugin-react": "^7.0.1", + "eslint-plugin-react": "^7.37.2", "ipaddr.js": "^2.2.0", "json5": "^2.2.3", "leaflet": "^1.9.4", @@ -53519,30 +52922,22 @@ "less": "^4.2.0", "lodash": "^4.17.21", "moment": "^2.30.1", - "ol": "^10.2.1", - "react": "^18.3.1", "react-ace": "^12.0.0", - "react-color": "^2.19.3", - "react-cropper": "^2.3.3", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", "react-dnd-multi-backend": "^8.0.3", "react-dnd-preview": "^8.0.3", "react-dnd-touch-backend": "^16.0.1", - "react-dom": "^18.3.1", - "react-dropzone": "^14.2.9", "react-icons": "^5.3.0", - "react-inlinesvg": "^4.1.3", "react-leaflet": "^4.2.1", "react-markdown": "^9.0.1", - "react-monaco-editor": "^0.56.1", + "react-monaco-editor": "^0.56.2", "react-qr-code": "^2.0.15", "react-scripts": "^5.0.1", "react-showdown": "^2.3.1", "react-sortable-hoc": "^2.0.0", "semver": "^7.6.3", - "tsconfig-paths-webpack-plugin": "^4.1.0", - "typescript": "^5.6.2" + "tsconfig-paths-webpack-plugin": "^4.1.0" } }, "packages/dm-gui-components": { @@ -53555,38 +52950,7 @@ }, "devDependencies": { "@craco/craco": "^7.1.0", - "@iobroker/dm-utils": "^0.5.0", - "@iobroker/eslint-config": "^0.1.6", - "@iobroker/types": "^7.0.0", - "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "typescript": "^5.6.2" - } - }, - "packages/dm-gui-components/node_modules/@iobroker/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@iobroker/types/-/types-7.0.0.tgz", - "integrity": "sha512-/QcNFRGdKRJtEq59NFAuNsU1iraaHmpz5hT9zrW14SZh3h4LqH0zYmIzpes3J31AUJB1kenbB9XSBBpPi67KTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, - "packages/dm-gui-components/node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" + "@iobroker/dm-utils": "^0.5.0" } }, "packages/jsonConfig": { @@ -53596,45 +52960,12 @@ "@iobroker/adapter-react-v5": "file:../adapter-react-v5", "crypto-js": "^4.2.0", "react-ace": "^12.0.0", - "react-color": "^2.19.3", "react-qr-code": "^2.0.15" }, "devDependencies": { "@craco/craco": "^7.1.0", - "@iobroker/eslint-config": "^0.1.6", - "@iobroker/types": "^7.0.0", "@types/crypto-js": "^4.2.2", - "@types/react": "^18.3.11", - "@types/react-color": "^3.0.12", - "@types/react-dom": "^18.3.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "tsc-alias": "^1.8.10", - "typescript": "^5.6.2" - } - }, - "packages/jsonConfig/node_modules/@iobroker/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@iobroker/types/-/types-7.0.0.tgz", - "integrity": "sha512-/QcNFRGdKRJtEq59NFAuNsU1iraaHmpz5hT9zrW14SZh3h4LqH0zYmIzpes3J31AUJB1kenbB9XSBBpPi67KTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, - "packages/jsonConfig/node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" + "tsc-alias": "^1.8.10" } }, "packages/react-components": { diff --git a/package.json b/package.json index 859ed62ef..ff538c6f7 100644 --- a/package.json +++ b/package.json @@ -15,14 +15,6 @@ "@alcalzone/release-script-plugin-iobroker": "^3.7.2", "@alcalzone/release-script-plugin-license": "^3.7.0", "@alcalzone/release-script-plugin-lerna": "^3.7.0", - "@iobroker/build-tools": "^2.0.6", - "@iobroker/eslint-config": "^0.1.6", - "@emotion/styled": "^11.13.0", - "@emotion/react": " ^11.13.3", - "@mui/icons-material": "^6.1.2", - "@mui/material": "^6.1.2", - "@mui/x-data-grid": "^7.18.0", - "@mui/x-date-pickers": "^7.18.0", "lerna": "^8.1.8" }, "scripts": { diff --git a/packages/adapter-react-v5/README.md b/packages/adapter-react-v5/README.md index c9416b60e..f5a9c433a 100644 --- a/packages/adapter-react-v5/README.md +++ b/packages/adapter-react-v5/README.md @@ -13,7 +13,7 @@ If you want to create the configuration page with ReactJS: - Change `name` from `src` to `ADAPTERNAME-admin` (Of course replace `ADAPTERNAME` with yours) - Add to devDependencies: ```json - "@iobroker/adapter-react-v5": "^7.2.5", + "@iobroker/adapter-react-v5": "^7.2.6", ``` Versions can be higher. So your `src/package.json` should look like: @@ -24,18 +24,10 @@ If you want to create the configuration page with ReactJS: "version": "0.1.0", "private": true, "dependencies": { - "@iobroker/adapter-react-v5": "^7.2.5", + "@iobroker/adapter-react-v5": "^7.2.6", "@iobroker/build-tools": "^1.0.0", - "@iobroker/eslint-config": "^0.1.2", - "@mui/material": "^6.0.2", - "@mui/icons-material": "^6.0.2", - "@sentry/browser": "^8.28.0", "babel-eslint": "^10.1.0", - "eslint": "^9.10.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-scripts": "^5.0.1", - "react-icons": "^5.3.0" + "react-scripts": "^5.0.1" }, "scripts": { "start": "react-scripts start", diff --git a/packages/adapter-react-v5/package.json b/packages/adapter-react-v5/package.json index c8ef15741..1779a1653 100644 --- a/packages/adapter-react-v5/package.json +++ b/packages/adapter-react-v5/package.json @@ -50,21 +50,21 @@ }, "homepage": "https://github.com/ioBroker/iobroker.admin#readme", "dependencies": { + "@emotion/styled": "^11.13.0", + "@emotion/react": "^11.13.3", "@iobroker/js-controller-common": "^6.0.11", "@iobroker/js-controller-common-db": "^6.0.11", "@iobroker/socket-client": "^3.1.1", "@iobroker/types": "^6.0.11", - "@mui/icons-material": "^6.1.3", - "@mui/material": "^6.1.3", - "@mui/x-date-pickers": "^7.19.0", - "@sentry/browser": "^8.33.1", + "@mui/icons-material": "^6.1.5", + "@mui/material": "^6.1.5", + "@sentry/browser": "^8.35.0", "cronstrue": "^2.50.0", "react-color": "^2.19.3", "react-colorful": "^5.6.1", "react-cropper": "^2.3.3", - "react-dropzone": "^14.2.9", - "react-icons": "^5.3.0", - "react-inlinesvg": "^4.1.3" + "react-dropzone": "^14.2.10", + "react-inlinesvg": "^4.1.4" }, "devDependencies": { "@babel/core": "^7.25.7", diff --git a/packages/adapter-react-v5/src/Components/FileViewer.tsx b/packages/adapter-react-v5/src/Components/FileViewer.tsx index 8c07ce0fa..fd5dbc360 100644 --- a/packages/adapter-react-v5/src/Components/FileViewer.tsx +++ b/packages/adapter-react-v5/src/Components/FileViewer.tsx @@ -5,8 +5,12 @@ import React, { Component, type JSX } from 'react'; import { TextField, Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton } from '@mui/material'; // Icons -import { FaCopy as CopyIcon } from 'react-icons/fa'; -import { Close as CloseIcon, Save as SaveIcon, Brightness6 as Brightness5Icon } from '@mui/icons-material'; +import { + Close as CloseIcon, + Save as SaveIcon, + Brightness6 as Brightness5Icon, + ContentCopy as CopyIcon, +} from '@mui/icons-material'; import type { Connection } from '@iobroker/socket-client'; diff --git a/packages/adapter-react-v5/src/Components/UploadImage.tsx b/packages/adapter-react-v5/src/Components/UploadImage.tsx index ef9bb8b52..913735d5e 100644 --- a/packages/adapter-react-v5/src/Components/UploadImage.tsx +++ b/packages/adapter-react-v5/src/Components/UploadImage.tsx @@ -4,8 +4,7 @@ import { Cropper, type ReactCropperElement } from 'react-cropper'; import { Menu, MenuItem, Tooltip, IconButton } from '@mui/material'; -import { Close as IconClose, Crop as CropIcon } from '@mui/icons-material'; -import { FaFileUpload as UploadIcon } from 'react-icons/fa'; +import { Close as IconClose, Crop as CropIcon, UploadFileOutlined as UploadIcon } from '@mui/icons-material'; import { I18n } from '../i18n'; import { Icon } from './Icon'; diff --git a/packages/admin/package.json b/packages/admin/package.json index b2bd2bbf1..8f328879f 100644 --- a/packages/admin/package.json +++ b/packages/admin/package.json @@ -35,10 +35,10 @@ "body-parser": "^1.20.3", "compression": "^1.7.4", "connect-flash": "^0.1.1", - "cookie-parser": "^1.4.6", - "express": "^4.21.0", + "cookie-parser": "^1.4.7", + "express": "^4.21.1", "express-fileupload": "^1.5.1", - "express-session": "^1.18.0", + "express-session": "^1.18.1", "json5": "^2.2.3", "mime": "^3.0.0", "passport": "^0.7.0", @@ -49,11 +49,9 @@ "devDependencies": { "@iobroker/build-tools": "^2.0.6", "@iobroker/dm-gui-components": "file:../dm-gui-components", - "@iobroker/eslint-config": "^0.1.6", "@iobroker/json-config": "file:../jsonConfig", "@iobroker/legacy-testing": "^1.0.13", "@iobroker/testing": "^5.0.0", - "@iobroker/types": "^7.0.0", "@types/archiver": "^6.0.2", "@types/body-parser": "^1.19.5", "@types/compression": "^1.7.5", @@ -69,7 +67,7 @@ "colorette": "^2.0.20", "less": "^4.2.0", "mocha": "^10.7.3", - "puppeteer": "^23.5.3", + "puppeteer": "^23.6.0", "sinon-chai": "^3.7.0", "src-rx": "file:src-admin", "typescript": "^5.6.3" diff --git a/packages/admin/src-admin/package.json b/packages/admin/src-admin/package.json index 2cb060185..e1aab7a0c 100644 --- a/packages/admin/src-admin/package.json +++ b/packages/admin/src-admin/package.json @@ -23,7 +23,7 @@ "@iobroker/dm-gui-components": "file:../../dm-gui-components", "@iobroker/json-config": "file:../../jsonConfig", "@iobroker/adapter-react-v5": "file:../../adapter-react-v5", - "http-proxy-middleware": "^3.0.2" + "http-proxy-middleware": "^3.0.3" }, "devDependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", @@ -36,36 +36,30 @@ "@honkhonk/vite-plugin-svgr": "^1.1.0", "@iobroker/admin-component-easy-access": "^1.0.8", "@iobroker/dm-utils": "^0.5.0", - "@iobroker/eslint-config": "^0.1.6", - "@iobroker/js-controller-common-db": "^7.0.0", "@iobroker/socket-client": "^3.1.1", - "@iobroker/types": "^7.0.0", "@originjs/vite-plugin-commonjs": "^1.0.3", "@react-leaflet/core": "^2.1.0", - "@sentry/browser": "^8.33.1", "@tsconfig/node16": "^16.1.3", "@types/ace": "^0.0.52", "@types/crypto-js": "^4.2.2", - "@types/leaflet": "^1.9.12", + "@types/leaflet": "^1.9.14", "@types/less": "^3.0.6", - "@types/lodash": "^4.17.10", - "@types/mocha": "^10.0.8", - "@types/node": "^22.7.4", - "@types/react": "^18.3.11", + "@types/lodash": "^4.17.12", + "@types/mocha": "^10.0.9", + "@types/node": "^22.8.1", + "@types/react": "^18.3.12", "@types/react-color": "^3.0.12", - "@types/react-dom": "^18.3.0", + "@types/react-dom": "^18.3.1", "buffer": "^6.0.3", - "copy-to-clipboard": "^3.3.3", "craco-babel-loader": "^1.0.4", "craco-module-federation": "^1.1.0", "cron-parser": "^4.9.0", - "cronstrue": "^2.50.0", "crypto-js": "^4.2.0", "date-fns": "^4.1.0", "echarts": "^5.5.1", "echarts-for-react": "^3.0.2", "eslint-config-react-app": "^7.0.1", - "eslint-plugin-react": "^7.0.1", + "eslint-plugin-react": "^7.37.2", "ipaddr.js": "^2.2.0", "json5": "^2.2.3", "leaflet": "^1.9.4", @@ -73,30 +67,22 @@ "less": "^4.2.0", "lodash": "^4.17.21", "moment": "^2.30.1", - "ol": "^10.2.1", - "react": "^18.3.1", "react-ace": "^12.0.0", - "react-color": "^2.19.3", - "react-cropper": "^2.3.3", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", "react-dnd-multi-backend": "^8.0.3", "react-dnd-preview": "^8.0.3", "react-dnd-touch-backend": "^16.0.1", - "react-dom": "^18.3.1", - "react-dropzone": "^14.2.9", "react-icons": "^5.3.0", - "react-inlinesvg": "^4.1.3", "react-leaflet": "^4.2.1", "react-markdown": "^9.0.1", - "react-monaco-editor": "^0.56.1", + "react-monaco-editor": "^0.56.2", "react-qr-code": "^2.0.15", "react-scripts": "^5.0.1", "react-showdown": "^2.3.1", "react-sortable-hoc": "^2.0.0", "semver": "^7.6.3", - "tsconfig-paths-webpack-plugin": "^4.1.0", - "typescript": "^5.6.2" + "tsconfig-paths-webpack-plugin": "^4.1.0" }, "proxya": "http://127.0.0.1:8081", "plugins": [ @@ -113,5 +99,5 @@ } ] ], - "version": "7.2.5" -} + "version": "7.2.6" +} \ No newline at end of file diff --git a/packages/admin/src-admin/public/img/admin.svg b/packages/admin/src-admin/public/img/admin.svg new file mode 100644 index 000000000..10d3340f9 --- /dev/null +++ b/packages/admin/src-admin/public/img/admin.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/admin/src-admin/src/App.tsx b/packages/admin/src-admin/src/App.tsx index a80e1ac1a..0b5d66352 100644 --- a/packages/admin/src-admin/src/App.tsx +++ b/packages/admin/src-admin/src/App.tsx @@ -2384,9 +2384,13 @@ class App extends Router { if (this.state.user && this.props.width !== 'xs' && this.props.width !== 'sm') { return (
- {this.state.systemConfig.common.siteName ? ( -
{this.state.systemConfig.common.siteName}
- ) : null} + { + // @ts-expect-error fixed in js-controller 7 + this.state.systemConfig.common.siteName ? ( + // @ts-expect-error fixed in js-controller 7 +
{this.state.systemConfig.common.siteName}
+ ) : null + } {
); } + // @ts-expect-error fixed in js-controller 7 if (this.props.width !== 'xs' && this.props.width !== 'sm' && this.state.systemConfig.common.siteName) { + // @ts-expect-error fixed in js-controller 7 return
{this.state.systemConfig.common.siteName}
; } return null; diff --git a/packages/admin/src-admin/src/components/Adapters/AdapterGeneric.tsx b/packages/admin/src-admin/src/components/Adapters/AdapterGeneric.tsx index 888ca9445..bed72cd3a 100644 --- a/packages/admin/src-admin/src/components/Adapters/AdapterGeneric.tsx +++ b/packages/admin/src-admin/src/components/Adapters/AdapterGeneric.tsx @@ -676,8 +676,7 @@ export default abstract class AdapterGeneric< .getObject(`system.adapter.${this.props.adapterName}`) .then(obj => { if (obj?.common) { - // @ts-expect-error must be defined - obj.common.ignoreVersion = ignoreVersion; + (obj.common as any).ignoreVersion = ignoreVersion; this.props.context.socket .setObject(obj._id, obj) .catch(error => window.alert(`Cannot write object: ${error}`)); diff --git a/packages/admin/src-admin/src/components/BaseSettings/BaseSettingsLog.tsx b/packages/admin/src-admin/src/components/BaseSettings/BaseSettingsLog.tsx index c29576c5b..79a58805a 100644 --- a/packages/admin/src-admin/src/components/BaseSettings/BaseSettingsLog.tsx +++ b/packages/admin/src-admin/src/components/BaseSettings/BaseSettingsLog.tsx @@ -127,9 +127,9 @@ class BaseSettingsLog extends Component { style={props.stylesParent.icon} src={ objectRef.current - ? getSelectIdIconFromObjects( + ? (getSelectIdIconFromObjects( objectRef.current, dragProps.item.data.obj._id, props.lang, - ) + ) as string | React.JSX.Element) : dragProps.item.data.obj.common.icon } /> diff --git a/packages/admin/src-admin/src/components/IsVisible.tsx b/packages/admin/src-admin/src/components/IsVisible.tsx index b2993c8c0..479115e07 100644 --- a/packages/admin/src-admin/src/components/IsVisible.tsx +++ b/packages/admin/src-admin/src/components/IsVisible.tsx @@ -1,4 +1,4 @@ -import { type JSX } from 'react'; +import { type ReactElement, type JSX } from 'react'; function getAttr(obj: Record, attr: string | string[]): boolean { if (!obj) { @@ -22,20 +22,20 @@ interface IsVisibleProps { name?: string; config?: Record; value?: boolean; - children: JSX.Element | JSX.Element[] | string; + children: JSX.Element | JSX.Element[]; } -function IsVisible(props: IsVisibleProps): JSX.Element | JSX.Element[] | string { +function IsVisible(props: IsVisibleProps): ReactElement { const { config, children, name, value } = props; if (value !== undefined) { - return value === false ? null : children; + return value === false ? null : (children as ReactElement); } if (!config) { - return children; + return children as ReactElement; } if (getAttr(config, name) !== false) { - return children; + return children as ReactElement; } return null; } diff --git a/packages/admin/src-admin/src/components/Markdown.tsx b/packages/admin/src-admin/src/components/Markdown.tsx index e202fcd31..ab2238d45 100644 --- a/packages/admin/src-admin/src/components/Markdown.tsx +++ b/packages/admin/src-admin/src/components/Markdown.tsx @@ -424,7 +424,7 @@ class Markdown extends Component { prefix: string; }) => JSX.Element; - private readonly meta: () => string; + private readonly meta: (_props: any) => JSX.Element; private readonly link: () => JSX.Element; @@ -579,7 +579,7 @@ class Markdown extends Component { ); }; - this.meta = () => 'meta'; // text, id, level, prefix, + this.meta = () => meta; // text, id, level, prefix, this.link = () =>
linkAAAAA
; // text, id, level, prefix, } diff --git a/packages/admin/src-admin/src/components/Object/ObjectChart.tsx b/packages/admin/src-admin/src/components/Object/ObjectChart.tsx index 6074ba469..67ee760e8 100644 --- a/packages/admin/src-admin/src/components/Object/ObjectChart.tsx +++ b/packages/admin/src-admin/src/components/Object/ObjectChart.tsx @@ -816,7 +816,7 @@ class ObjectChart extends Component { }, }, xAxis: { - type: 'time', + // type: 'time', splitLine: { show: false, }, diff --git a/packages/admin/src-admin/src/components/Object/ObjectCustomEditor.tsx b/packages/admin/src-admin/src/components/Object/ObjectCustomEditor.tsx index fe30a695e..ae4252129 100644 --- a/packages/admin/src-admin/src/components/Object/ObjectCustomEditor.tsx +++ b/packages/admin/src-admin/src/components/Object/ObjectCustomEditor.tsx @@ -553,7 +553,7 @@ class ObjectCustomEditor extends Component)[this.props.lang] || (this.jsonConfigs[adapter].json.help as Record).en; } else { - help = this.props.t(this.jsonConfigs[adapter].json.help); + help = this.props.t(this.jsonConfigs[adapter].json.help as string); } } diff --git a/packages/admin/src-admin/src/components/ObjectBrowser.tsx b/packages/admin/src-admin/src/components/ObjectBrowser.tsx index 0256c63f4..7ceb99ca8 100644 --- a/packages/admin/src-admin/src/components/ObjectBrowser.tsx +++ b/packages/admin/src-admin/src/components/ObjectBrowser.tsx @@ -1131,10 +1131,10 @@ export function getSelectIdIconFromObjects( id: string, lang: ioBroker.Languages, imagePrefix?: string, -): string | JSX.Element | null { +): string | React.JSX.Element | null { // `admin` has prefix '.' and `web` has '../..' imagePrefix = imagePrefix || '.'; // http://localhost:8081'; - let src: string | JSX.Element = ''; + let src: string | React.JSX.Element | number | React.JSX.Element[] = ''; const _id_ = `system.adapter.${id}`; const aIcon = id && objects[_id_] && objects[_id_].common && objects[_id_].common.icon; if (aIcon) { @@ -1153,7 +1153,7 @@ export function getSelectIdIconFromObjects( return null; // '' + objects[_id_].common.icon + ''; } } else if (aIcon.startsWith('data:image/svg')) { - src = ( + const svgEl: any = ( ); + src = svgEl as React.JSX.Element; } else { src = aIcon; } @@ -1203,7 +1204,7 @@ export function getSelectIdIconFromObjects( } } else if (cIcon.startsWith('data:image/svg')) { // if base 64 image - src = ( + const svgEl: any = ( ); + src = svgEl as React.JSX.Element; } else { src = cIcon; } @@ -1472,7 +1474,7 @@ function getSystemIcon( lang: ioBroker.Languages, imagePrefix?: string, ): string | JSX.Element | null { - let icon; + let icon: string | JSX.Element | null | undefined; // system or design has special icons if (id === 'alias' || id === 'alias.0') { @@ -5954,9 +5956,9 @@ export class ObjectBrowserClass extends Component {enums.map(_item => { - let id; - let name; - let icon; + let id: string; + let name: string; + let icon: string | JSX.Element | null; if (typeof _item === 'object') { id = _item.value; diff --git a/packages/admin/src-admin/src/components/Wizard/WizardSettingsTab.tsx b/packages/admin/src-admin/src/components/Wizard/WizardSettingsTab.tsx index ba7e2aedd..505c8b75c 100644 --- a/packages/admin/src-admin/src/components/Wizard/WizardSettingsTab.tsx +++ b/packages/admin/src-admin/src/components/Wizard/WizardSettingsTab.tsx @@ -1,5 +1,10 @@ import React, { Component, type JSX } from 'react'; +import { MapContainer, TileLayer, useMap } from 'react-leaflet'; +import { Marker } from 'leaflet'; +import type { DragEndEvent, LatLngTuple, Map } from 'leaflet'; +import { OpenStreetMapProvider } from 'leaflet-geosearch'; + import { Grid2, Toolbar, @@ -17,21 +22,17 @@ import { Box, } from '@mui/material'; -import { Close as CloseIcon, Check as IconCheck } from '@mui/icons-material'; - -import 'ol/ol.css'; -import { Map, View, Feature } from 'ol'; -import { Tile, Vector as LayerVector } from 'ol/layer'; -import { Icon, Style } from 'ol/style'; -import { OSM, Vector as VectorSource } from 'ol/source'; -import { Point } from 'ol/geom'; -import { toLonLat, fromLonLat } from 'ol/proj'; +import { Close as CloseIcon, Check as IconCheck, GpsFixed } from '@mui/icons-material'; -import { type AdminConnection, type IobTheme, type Translate, withWidth } from '@iobroker/adapter-react-v5'; +import { type AdminConnection, I18n, type IobTheme, type Translate, withWidth } from '@iobroker/adapter-react-v5'; -// Icons -import { FaCrosshairs as GeoIcon } from 'react-icons/fa'; -import PinSVG from '../../assets/pin.svg'; +const MyMapComponent: React.FC<{ addMap: (map: any) => any }> = props => { + const map = useMap(); + if (props.addMap) { + props.addMap(map); + } + return null; +}; const TOOLBAR_HEIGHT = 64; const SETTINGS_WIDTH = 300; @@ -141,15 +142,24 @@ interface WizardSettingsTabState { longitude: number | string; latitude: number | string; firstDayOfWeek: 'sunday' | 'monday'; + zoom: number; } class WizardSettingsTab extends Component { - private OSM: { + /*private OSM: { markerSource?: VectorSource; markerStyle?: Style; oMap?: Map; marker?: Feature; - } | null = null; + } | null = null;*/ + + private marker: Marker; + + private map: Map; + + private cityTimer: ReturnType; + + private latLongTimer: ReturnType; constructor(props: WizardSettingsTabProps) { super(props); @@ -165,25 +175,8 @@ class WizardSettingsTab extends Component - this.setState( - { - tempUnit: obj.common.tempUnit, - currency: obj.common.currency, - dateFormat: obj.common.dateFormat, - isFloatComma: obj.common.isFloatComma, - country: obj.common.country, - city: obj.common.city, - address: '', - longitude: obj.common.longitude, - latitude: obj.common.latitude, - firstDayOfWeek: obj.common.firstDayOfWeek || 'monday', - }, - () => this.updateMap(), - ), - ); } positionReady(position: { coords: { latitude: number; longitude: number } }): void { @@ -192,103 +185,138 @@ class WizardSettingsTab extends Component this.updateMap(), + () => this.changeMapPosition(), ); } - getPositionForAddress(): void { - window - .fetch( - `https://nominatim.openstreetmap.org/search?format=json&q=${encodeURIComponent(`${this.state.country} ${this.state.city} ${this.state.address}`)}`, - ) - .then(data => data.json()) - .then(data => { - let changed = false; - - if (!data || !data[0]) { - window.alert(this.props.t('Nothing found')); - return; - } - - let latitude = parseFloat(this.state.latitude as any as string); - if (latitude !== parseFloat(data[0].lat)) { - latitude = parseFloat(data[0].lat); - changed = true; - } - let longitude = parseFloat(this.state.longitude as any as string); - if (longitude !== parseFloat(data[0].lon)) { - longitude = parseFloat(data[0].lon); - changed = true; - } - if (changed) { - this.setState({ longitude, latitude }, () => this.updateMap()); - } - }) - .catch(e => window.alert(this.props.t('Cannot fetch address %s', e))); - } - - updateMap(): void { - // OPEN STREET MAPS + getBrowserCoordinates(): void { if (window.navigator.geolocation && (!this.state.longitude || !this.state.latitude)) { window.navigator.geolocation.getCurrentPosition(position => this.positionReady(position)); + } else { + this.changeMapPosition(); } + } + + async componentDidMount(): Promise { + const systemConfig = await this.props.socket.getCompactSystemConfig(true); + this.setState( + { + tempUnit: systemConfig.common.tempUnit, + currency: systemConfig.common.currency, + dateFormat: systemConfig.common.dateFormat, + isFloatComma: systemConfig.common.isFloatComma, + country: systemConfig.common.country, + city: systemConfig.common.city, + address: '', + longitude: systemConfig.common.longitude, + latitude: systemConfig.common.latitude, + firstDayOfWeek: systemConfig.common.firstDayOfWeek || 'monday', + }, + () => this.getBrowserCoordinates(), + ); + } - const center = fromLonLat([ - parseFloat((this.state.longitude as any as string) || '0'), - parseFloat((this.state.latitude as any as string) || '0'), - ]); - - if (!this.OSM) { - // get the coordinates from the browser - - this.OSM = {}; - this.OSM.markerSource = new VectorSource(); - - this.OSM.markerStyle = new Style({ - image: new Icon({ - anchor: [0.5, 49], - anchorXUnits: 'fraction', - anchorYUnits: 'pixels', - opacity: 0.75, - src: PinSVG, - }), - }); - - this.OSM.oMap = new Map({ - target: 'map', - layers: [ - new Tile({ source: new OSM() }), - new LayerVector({ - source: this.OSM.markerSource, - style: this.OSM.markerStyle, - }), - ], - view: new View({ center, zoom: 17 }), - }); - - this.OSM.marker = new Feature({ - geometry: new Point(center), - name: this.props.t('Your home'), - }); - - this.OSM.markerSource.addFeature(this.OSM.marker); - - this.OSM.oMap.on('singleclick', event => { - const lonLat = toLonLat(event.coordinate); - this.setState({ longitude: lonLat[0], latitude: lonLat[1] }, () => this.updateMap()); - }); + onMap = (map: Map): void => { + if (!this.map || this.map !== map) { + this.map = map; + const center: LatLngTuple = [ + parseFloat(this.state.latitude !== undefined ? (this.state.latitude as any as string) : '50') || 0, + parseFloat(this.state.longitude !== undefined ? (this.state.longitude as any as string) : '10') || 0, + ]; + + this.marker = new Marker(center, { + draggable: true, + title: I18n.t('Resource location'), + alt: I18n.t('Resource Location'), + riseOnHover: true, + }) + .addTo(map) + .bindPopup('Popup for any custom information.') + .on({ dragend: (evt: DragEndEvent) => this.onMarkerDragend(evt) }); } + }; + + onMarkerDragend = (evt: DragEndEvent): void => { + // ignore changes during saving + this.setState({ latitude: evt.target._latlng.lat, longitude: evt.target._latlng.lng }); + }; - const zoom = this.OSM.oMap.getView().getZoom(); - this.OSM.marker.setGeometry(new Point(center)); - this.OSM.oMap.setView(new View({ center, zoom })); + changeMapPosition(noWait?: boolean): void { + if (this.latLongTimer) { + clearTimeout(this.latLongTimer); + } + this.latLongTimer = setTimeout( + () => { + this.latLongTimer = null; + this.map.flyTo([ + parseFloat(this.state.latitude as any as string), + parseFloat(this.state.longitude as any as string), + ]); + this.marker.setLatLng([ + parseFloat(this.state.latitude as any as string), + parseFloat(this.state.longitude as any as string), + ]); + }, + noWait ? 0 : 500, + ); } - componentDidMount(): void { - this.updateMap(); + onChangePosition = (evt: { target: { value: string } }, id: string): void => { + const value = evt.target.value; + if (id === 'latitude') { + this.setState({ latitude: value }); + } else { + this.setState({ longitude: value }); + } + + this.changeMapPosition(); + }; + + addressToPosition(): void { + if (this.cityTimer) { + clearTimeout(this.cityTimer); + } + + this.cityTimer = setTimeout(() => { + this.cityTimer = null; + const provider = new OpenStreetMapProvider(); + + void provider + .search({ query: `${this.state.country} ${this.state.city}, ${this.state.address}` }) + .then(results => { + if (results[0]) { + setTimeout( + () => + this.setState({ latitude: results[0].y, longitude: results[0].x, zoom: 23 }, () => + this.changeMapPosition(true), + ), + 1200, + ); + } + }); + }, 500); } + onChangeAddress = (evt: { target: { value: string } }, id: 'city' | 'address' | 'country'): void => { + if (id === 'city') { + this.setState({ city: evt.target.value }); + } else if (id === 'address') { + this.setState({ address: evt.target.value }); + } else { + this.setState({ country: evt.target.value }); + } + + this.addressToPosition(); + }; + render(): JSX.Element { + const center: LatLngTuple = [ + parseFloat(this.state.longitude !== undefined ? (this.state.longitude as any as string) : '50') || 0, + parseFloat(this.state.longitude !== undefined ? (this.state.longitude as any as string) : '10') || 0, + ]; + + const { zoom } = this.state; + return ( + onChange={(_event, newValue: { id: string; title: string }) => this.setState({ currency: newValue ? newValue.id : '' }) } - onInputChange={(event, currency) => this.setState({ currency })} + onInputChange={(_event, currency) => this.setState({ currency })} getOptionLabel={(option: { id: string; title: string }) => option.title} renderOption={(props, option: { id: string; title: string }) => (
  • {option.title}
  • @@ -401,7 +429,7 @@ class WizardSettingsTab extends Component this.setState({ country: e.target.value })} + onChange={e => this.onChangeAddress(e, 'country')} > {this.props.t('Please select country')} {this.props.t('Germany')} @@ -727,7 +755,7 @@ class WizardSettingsTab extends Component this.setState({ city: e.target.value })} + onChange={e => this.onChangeAddress(e, 'city')} slotProps={{ input: { endAdornment: this.state.city ? ( @@ -750,8 +778,7 @@ class WizardSettingsTab extends Component e.key === 'Enter' && this.getPositionForAddress()} - onChange={e => this.setState({ address: e.target.value })} + onChange={e => this.onChangeAddress(e, 'address')} helperText={this.props.t('Used only to calculate position.')} slotProps={{ input: { @@ -770,9 +797,9 @@ class WizardSettingsTab extends Component this.getPositionForAddress()} + onClick={() => this.addressToPosition()} > - +
    @@ -781,9 +808,7 @@ class WizardSettingsTab extends Component - this.setState({ longitude: parseFloat(e.target.value.replace(',', '.')) }) - } + onChange={e => this.onChangePosition(e, 'longitude')} slotProps={{ input: { endAdornment: this.state.longitude ? ( @@ -806,9 +831,7 @@ class WizardSettingsTab extends Component - this.setState({ latitude: parseFloat(e.target.value.replace(',', '.')) }) - } + onChange={e => this.onChangePosition(e, 'latitude')} slotProps={{ input: { endAdornment: this.state.latitude ? ( @@ -847,10 +870,22 @@ class WizardSettingsTab extends Component -
    + center={center} + zoom={zoom} + maxZoom={18} + attributionControl + zoomControl + doubleClickZoom + scrollWheelZoom + dragging + // animate + easeLinearity={0.35} + > + + this.onMap(map)} /> + diff --git a/packages/admin/src-admin/src/dialogs/SystemSettingsTabs/MainSettingsDialog.tsx b/packages/admin/src-admin/src/dialogs/SystemSettingsTabs/MainSettingsDialog.tsx index 11eb420f5..1ca6ff11f 100644 --- a/packages/admin/src-admin/src/dialogs/SystemSettingsTabs/MainSettingsDialog.tsx +++ b/packages/admin/src-admin/src/dialogs/SystemSettingsTabs/MainSettingsDialog.tsx @@ -656,6 +656,7 @@ class MainSettingsDialog extends BaseSystemSettingsDialog { variant="standard" id="siteName" label={this.props.t('Site name')} + // @ts-expect-error Fixed in js-controller 7 value={this.props.data.common.siteName || ''} onChange={e => this.doChange('siteName', e.target.value)} helperText={this.props.t( @@ -663,6 +664,7 @@ class MainSettingsDialog extends BaseSystemSettingsDialog { )} slotProps={{ input: { + // @ts-expect-error Fixed in js-controller 7 endAdornment: this.props.data.common.siteName ? ( = { }; // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents -export type Repository = Record<'stable' | string, ioBroker.RepositoryInformation>; +export type Repository = Record; type RepositoryArray = Array<{ title: string; link: string }>; @@ -459,6 +459,7 @@ class RepositoriesDialog extends BaseSystemSettingsDialog diff --git a/packages/admin/src-admin/src/tabs/Adapters.tsx b/packages/admin/src-admin/src/tabs/Adapters.tsx index 07cf01eb1..ad0f4e605 100644 --- a/packages/admin/src-admin/src/tabs/Adapters.tsx +++ b/packages/admin/src-admin/src/tabs/Adapters.tsx @@ -26,7 +26,6 @@ import { Update as UpdateIcon, Star as StarIcon, Close as CloseIcon, - SavedSearch, } from '@mui/icons-material'; import { FaGithub as GithubIcon } from 'react-icons/fa'; diff --git a/packages/admin/src-admin/src/tabs/Config.tsx b/packages/admin/src-admin/src/tabs/Config.tsx index 3dc964464..e4de483d0 100644 --- a/packages/admin/src-admin/src/tabs/Config.tsx +++ b/packages/admin/src-admin/src/tabs/Config.tsx @@ -34,7 +34,6 @@ import { } from '@mui/icons-material'; import { - Router, Icon, DialogConfirm, type IobTheme, diff --git a/packages/admin/src-admin/src/tabs/Instances.tsx b/packages/admin/src-admin/src/tabs/Instances.tsx index 364129e4c..04cfc3f84 100644 --- a/packages/admin/src-admin/src/tabs/Instances.tsx +++ b/packages/admin/src-admin/src/tabs/Instances.tsx @@ -420,9 +420,9 @@ class Instances extends Component { instance.links = instance.links || []; let link: InstanceLink; if (typeof links[linkName] === 'string') { - link = { link: links[linkName] }; + link = { link: links[linkName] as string }; } else { - link = links[linkName]; + link = links[linkName] as InstanceLink; } const urls = diff --git a/packages/admin/src-admin/tsconfig.json b/packages/admin/src-admin/tsconfig.json index b505e1ea4..3b2c6f410 100644 --- a/packages/admin/src-admin/tsconfig.json +++ b/packages/admin/src-admin/tsconfig.json @@ -12,7 +12,6 @@ "sourceRoot": "./src", "noImplicitAny": true, "skipLibCheck": true, - "verbatimModuleSyntax": true, "lib": ["es2018", "DOM"], "jsx": "react", "types": ["@iobroker/types"], diff --git a/packages/admin/src/lib/web.ts b/packages/admin/src/lib/web.ts index cbb24f473..7ade9f7d5 100644 --- a/packages/admin/src/lib/web.ts +++ b/packages/admin/src/lib/web.ts @@ -382,6 +382,7 @@ class Web { `system.adapter.${adapterName}`, ); + // @ts-expect-error fixed in js-controller 7.x if (res?.common.adminUI?.config === 'json') { try { const ajv = new Ajv.Ajv({ diff --git a/packages/dm-gui-components/package.json b/packages/dm-gui-components/package.json index a9f86c31c..9b0f446be 100644 --- a/packages/dm-gui-components/package.json +++ b/packages/dm-gui-components/package.json @@ -53,13 +53,6 @@ }, "devDependencies": { "@craco/craco": "^7.1.0", - "@iobroker/dm-utils": "^0.5.0", - "@iobroker/eslint-config": "^0.1.6", - "@iobroker/types": "^7.0.0", - "@types/react": "^18.3.11", - "@types/react-dom": "^18.3.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "typescript": "^5.6.2" + "@iobroker/dm-utils": "^0.5.0" } } diff --git a/packages/jsonConfig/README.md b/packages/jsonConfig/README.md index d778ee1c9..74910eff4 100644 --- a/packages/jsonConfig/README.md +++ b/packages/jsonConfig/README.md @@ -72,11 +72,11 @@ _If the attribute name starts with "\_" it will not be saved in the object._ "max": 65565, "label": "Number", "sm": 6, // 1 - 12 - "validator": "'"!!data.name"'", // else error + "validator": "!!data.name", // else error "hidden": "data.myType === 1", // hidden if myType is 1 "disabled": "data.myType === 2" // disabled if myType is 2 }, - "options.myType": { // name could support more than one levelhelperText + "options.myType": { // name could support more than one level "newLine": true, // must start from new row "type": "select", "label": "Type", @@ -164,7 +164,7 @@ You can install it via GitHub icon in admin by entering `iobroker.jsonconfig-dem - [**`pattern`:**](#pattern) Read-only field showing a pattern (e.g., URL) - [**`port`:**](#port) Special input for ports - [**`qrCode`:**](#qrcode) Displays data as a QR code (Admin 7.0.18 or newer) -- [**`room`:**](#room) Selects a room from the enum.room list (Admin 6 only) +- [**`room`:**](#room) Selects a room from the `enum.room` list (Admin 6 only) - [**`select`:**](#select) Dropdown menu with predefined options - [**`selectSendTo`:**](#selectsendto) Dropdown menu with instance values for sending data - [**`sendTo`:**](#sendto) Button that sends a request to an instance @@ -180,7 +180,7 @@ You can install it via GitHub icon in admin by entering `iobroker.jsonconfig-dem - [**`text`:**](#text) Single-line text input field - [**`textSendTo`:**](#textsendto) Shows readonly control with the given from the instance values. - [**`timePicker`:**](#timepicker) Allows users to select a time -- [**`user`:**](#user) Selects a user from the system.user list +- [**`user`:**](#user) Selects a user from the `system.user` list - [**`uuid`:**](#uuid) Show iobroker UUID By leveraging JSON configuration, you can create a user-friendly and \ @@ -188,20 +188,20 @@ adaptable configuration experience for your ioBroker adapter. ## Example projects -| Type | Link | -| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Multiple Tabs: | [`ioBroker.admin`](https://github.com/ioBroker/ioBroker.admin/blob/master/admin/jsonConfig.json5) | -| Only one Panel: | [`ioBroker.dwd`](https://github.com/ioBroker/ioBroker.dwd/blob/master/admin/jsonConfig.json) | -| Custom component: | [`telegram`](https://github.com/iobroker-community-adapters/ioBroker.telegram/tree/master/src-admin) or in [`pushbullet`](https://github.com/Jens1809/ioBroker.pushbullet/tree/master/src-admin) | -| Validation: | | +| Type | Link | +|-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Multiple Tabs: | [`ioBroker.admin`](https://github.com/ioBroker/ioBroker.admin/blob/master/admin/jsonConfig.json5) | +| Only one Panel: | [`ioBroker.dwd`](https://github.com/ioBroker/ioBroker.dwd/blob/master/admin/jsonConfig.json) | +| Custom component: | [`telegram`](https://github.com/iobroker-community-adapters/ioBroker.telegram/tree/master/src-admin) or in [`pushbullet`](https://github.com/Jens1809/ioBroker.pushbullet/tree/master/src-admin) | +| Validation: | | -## Seperation of Large Configurations +## Separation of the large Configurations ## Includes Requires admin 6.17.1 or newer. -To write complex JSON files, you can include other JSON files.\ +To write complex JSON files, you can include other JSON files. The included file must be in the same directory as the main file. ```json5 @@ -227,7 +227,7 @@ To enable the translation feature, you need to provide and enable the i18n prope } ``` -### Translation in seperate files - Compatible with weblate +### Translation in separated files: compatible with weblate By default, the files must be located in the following directories: @@ -243,7 +243,7 @@ admin/i18n/de.json admin/i18n/en.json ``` -Additionally, user can provide the path to i18n files, i18n: "customI18n"and provide files in admin: +Additionally, user can provide the path to `i18n` files, `i18n`: `customI18n` and provide files in admin: ```json5 i18n: "customI18n", @@ -285,7 +285,7 @@ The structure of a file corresponds to the following structure When searching for a translation, the information in the specific field is used to find the property with the text in the files. If the property is not found, the information from the field remains. It is recommended to enter the text in English. -### Provide translation directliy in the fields +### Provide translation directly in the fields Translations can be specified in all fields that can contain text. Examples of fields are label, title, tooltip, text, etc. @@ -298,9 +298,9 @@ Translations can be specified in all fields that can contain text. Examples of f } ``` -### Provide translation directliy in the i18n +### Provide translation directly in the i18n -The translations can also be provided directly as an object in the ia8n attribute at the top level of the jsonConfig object. +The translations can also be provided directly as an object in the `i18n` attribute at the top level of the `jsonConfig` object. When searching for a translation, the information in the specific field is used to find the property with the text in the i18n object. If the property is not found, the information from the field remains. @@ -314,18 +314,18 @@ Each element can have [common attributes](#common-attributes-of-controls) and th Tabs with items -| Property | Description | -| -------------- | ---------------------------------------------------------------------------------------------- | -| `items` | Object with panels `{"tab1": {}, "tab2": {}...}` | -| `iconPosition` | `bottom`, `end`, `start` or `top`. Only for panels that has `icon` attribute. Default: `start` | -| `tabsStyle` | CSS Styles in React format (`marginLeft` and not `margin-left`) for the Mui-Tabs component | +| Property | Description | +|-----------------|------------------------------------------------------------------------------------------------| +| `items` | Object with panels `{"tab1": {}, "tab2": {}...}` | +| `iconPosition` | `bottom`, `end`, `start` or `top`. Only for panels that has `icon` attribute. Default: `start` | +| `tabsStyle` | CSS Styles in React format (`marginLeft` and not `margin-left`) for the Mui-Tabs component | ### `panel` Tab with items | Property | Description | -| ------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +|---------------|-----------------------------------------------------------------------------------------------------------------------------------------| | `icon` | tab can have icon (base64 like `data:image/svg+xml;base64,...`) or `jpg/png` images (ends with `.png`) | | `label` | Label of tab | | `items` | Object `{"attr1": {}, "attr2": {}}...` | @@ -338,7 +338,7 @@ Tab with items Text component | Property | Description | -| --------------- | ------------------------------------------------------------------------------------------------------ | +|-----------------|--------------------------------------------------------------------------------------------------------| | `maxLength` | max length of the text in field | | `readOnly` | read-only field | | `trim` | default is true. Set this attribute to `false` if trim is not desired. | @@ -352,7 +352,7 @@ Text component ### `number` | Property | Description | -| -------- | ------------- | +|----------|---------------| | `min` | minimal value | | `max` | maximal value | | `step` | step | @@ -362,7 +362,7 @@ Text component color picker | Property | Description | -| --------------- | -------------------------------------------------------------- | +|-----------------|----------------------------------------------------------------| | `noClearButton` | if true, the clear button will not be shown (admin >= 6.17.13) | ### `checkbox` @@ -397,7 +397,7 @@ show data in a QR Code (admin >= 7.0.18) bind address | Property | Description | -| ------------------ | --------------------------------- | +|--------------------|-----------------------------------| | `listenOnAllPorts` | add 0.0.0.0 to option | | `onlyIp4` | show only IP4 addresses | | `onlyIp6` | show only IP6 addresses | @@ -408,7 +408,7 @@ bind address lect user from system.user. (With color and icon) | Property | Description | -| -------- | --------------- | +|----------|-----------------| | `short` | no system.user. | ### `room` @@ -416,7 +416,7 @@ lect user from system.user. (With color and icon) Select room from `enum.room` (With color and icon) - (only Admin6) | Property | Description | -| ----------------- | ------------------------ | +|-------------------|--------------------------| | `short` | no `enum.rooms.` | | `allowDeactivate` | allow letting room empty | @@ -425,14 +425,14 @@ Select room from `enum.room` (With color and icon) - (only Admin6) Select function from `enum.func` (With color and icon) - (only Admin6) | Property | Description | -| ----------------- | --------------------------------- | +|-------------------|-----------------------------------| | `short` | no `enum.func.` | | `allowDeactivate` | allow letting functionality empty | ### `select` | Property | Description | -| --------- | ----------------------------------------------------------------------- | +|-----------|-------------------------------------------------------------------------| | `options` | object with labels, optional translations, optional grouping and values | #### Example for `select options` @@ -441,9 +441,9 @@ Select function from `enum.func` (With color and icon) - (only Admin6) [ {"label": {"en": "option 1"}, "value": 1}, ... ] - +``` or - +```json [ { "items": [ @@ -466,16 +466,16 @@ or ### `autocomplete` | Property | Description | -| ---------- | ------------------------------------------------------------------------------------------------------------- | +|------------|---------------------------------------------------------------------------------------------------------------| | `options` | `["value1", "value2", ...]` or `[{"value": "value", "label": "Value1"}, "value2", ...]` (keys must be unique) | | `freeSolo` | Set `freeSolo` to `true`, so the textbox can contain any arbitrary value. | ### `image` -saves image as file of the `adapter.X` object or as base64 in attribute +saves image as a file of the `adapter.X` object or as base64 in attribute | Property | Description | -| ------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +|--------------|----------------------------------------------------------------------------------------------------------------------------------------| | `filename` | name of file is structure name. In the below example `login-bg.png` is file name for `writeFile("myAdapter.INSTANCE", "login-bg.png")` | | `accept` | html accept attribute, like `{ 'image/**': [], 'application/pdf': ['.pdf'] }`, default `{ 'image/*': [] }` | | `maxSize` | maximal size of file to upload | @@ -513,7 +513,7 @@ saves image as file of the `adapter.X` object or as base64 in attribute object ID: show it with name, color and icon | Property | Description | -| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `types` | Desired type: `channel`, `device`, ... (has only `state` by default). It is plural, because `type` is already occupied. | | `root` | [optional] Show only this root object and its children | | `customFilter` | [optional] Cannot be used together with `type` settings. It is an object and not a JSON string. | @@ -533,7 +533,7 @@ object ID: show it with name, color and icon `{common: {custom: '_dataSources'}}` -##### show only objects of custom settings of specific adapter (all instances) +##### show only objects of custom settings for specific adapter (all instances) `{common: {custom: 'adapterName.'}}` @@ -545,11 +545,11 @@ object ID: show it with name, color and icon `{type: ['channel', 'device']}` -##### show only states of type 'number +##### show only states of type 'number' `{common: {type: 'number'}` -##### show only states of type 'number and string +##### show only states of type 'number' and 'string' `{common: {type: ['number', 'string']}` @@ -563,13 +563,13 @@ object ID: show it with name, color and icon ### `password` -This field-type just have an effect in the UI. +This field-type just has an effect on the UI. Passwords and other sensitive data should be stored encrypted! To do this, the key must be provided in the io-package.json under [nativeEncrypted](https://github.com/ioBroker/ioBroker.js-controller#automatically-encryptdecrypt-configuration-fields). Additionally, you can protect this property from being served to other adapters but `admin` and `cloud` by adding it to `protectedNative` in `io-package.json` file. | Property | Description | -| ----------- | ------------------------------------------------------------------------------------------------------- | +|-------------|---------------------------------------------------------------------------------------------------------| | `repeat` | repeat password must be compared with password | | `visible` | true if allow viewing the password by toggling the view button (only for a new password while entering) | | `readOnly` | the read-only flag. Visible is automatically true if readOnly is true | @@ -578,7 +578,7 @@ Additionally, you can protect this property from being served to other adapters ### `instance` | Property | Description | -| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------| | `adapter` | name of adapter. With special name `_dataSources` you can get all adapters with flag `common.getHistory`. | | `adapters` | optional list of adapters, that should be shown. If not defined, all adapters will be shown. Only active if `adapter` attribute is not defined. | | `allowDeactivate` | if true. Additional option "deactivate" is shown | @@ -592,7 +592,7 @@ Additionally, you can protect this property from being served to other adapters User can enter the word, and it will be added (see cloud => services => White list). Output is an array if no `delimiter` defined. | Property | Description | -| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|-------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `delimiter` | if it is defined, so the option will be stored as string with delimiter instead of an array. E.g., by `delimiter=;` you will get `a;b;c` instead of `['a', 'b', 'c']` | ### `alive` @@ -602,7 +602,7 @@ just indication if the instance is alive, and it could be used in "hidden" and " Just text: Instance is running, Instance is not running | Property | Description | -| -------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +|----------------|-------------------------------------------------------------------------------------------------------------------------------------| | `instance` | check if the instance is alive. If not defined, it will be used current instance. You can use `${data.number}` pattern in the text. | | `textAlive` | default text is `Instance %s is alive`, where %s will be replaced by `ADAPTER.0`. The translation must exist in i18n files | | `textNotAlive` | default text is `Instance %s is not alive`, where %s will be replaced by `ADAPTER.0`. The translation must exist in i18n files | @@ -613,7 +613,7 @@ read-only field with pattern like 'https://${data.ip}:${data.port}' (will not be Text input with the read-only flag, that shows a pattern. | Property | Description | -| ----------------- | --------------------- | +|-------------------|-----------------------| | `copyToClipboard` | if true - show button | | `pattern` | my pattern | @@ -622,7 +622,7 @@ Text input with the read-only flag, that shows a pattern. button that sends request to instance () | Property | Description | -| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|-----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `command` | (Default `send`) | | `jsonData` | string - `"{\"subject1\": \"${data.subject}\", \"options1\": {\"host\": \"${data.host}\"}}"`. You can use special variables `data._origin` and `data._originIp` to send to instance the caller URL, like `http://127.0.0.1:8081/admin`. | | `data` | object - `{"subject1": 1, "data": "static"}`. You can specify jsonData or data, but not both. | @@ -643,10 +643,10 @@ button that sends request to instance ( h1-h5 | ### `cron` | Property | Description | -| --------- | --------------------------------------------- | +|-----------|-----------------------------------------------| | `complex` | show CRON with "minutes", "seconds" and so on | | `simple` | show simple CRON settings | @@ -814,7 +814,7 @@ horizontal line only Admin6 | Property | Description | -| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|--------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `pattern` | File extension pattern. Allowed `**/*.ext` to show all files from subfolders too, `*.ext` to show from root folder or `folderName/*.ext` to show all files in sub-folder `folderName`. Default `**/*.*`. | | `fileTypes` | [optional] type of files: `audio`, `image`, `text` | | `objectID` | Object ID of type `meta`. You can use special placeholder `%INSTANCE%`: like `myAdapter.%INSTANCE%.files` | @@ -832,7 +832,7 @@ only Admin6. Input field with file selector | Property | Description | -| ------------------- | ---------------------------------------------------------------------------------------- | +|---------------------|------------------------------------------------------------------------------------------| | `disableEdit` | if user can manually enter the file name and not only through select dialog | | `limitPath` | limit selection to one specific object of type `meta` and following path (not mandatory) | | `filterFiles` | like `['png', 'svg', 'bmp', 'jpg', 'jpeg', 'gif']` | @@ -846,10 +846,10 @@ Input field with file selector ### `imageSendTo` -shows image, that was received from backend as base64 string +shows image that was received from backend as base64 string | Property | Description | -| ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +|------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------| | `width` | width of QR code in px | | `height` | height of QR code in px | | `command` | sendTo command | @@ -876,7 +876,7 @@ adapter.on("message", (obj) => { Shows the drop-down menu with the given from the instance values. | Property | Description | -| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|-----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `command` | sendTo command | | `jsonData` | string - `{"subject1": "${data.subject}", "options1": {"host": "${data.host}"}}`. This data will be sent to the backend | | `data` | object - `{"subject1": 1, "data": "static"}`. You can specify jsonData or data, but not both. This data will be sent to the backend if jsonData is not defined. | @@ -945,7 +945,7 @@ adapter.on("message", (obj) => { Shows autocomplete control with the given from the instance values. | Property | Description | -| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|-----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------| | `command` | sendTo command | | `jsonData` | string - `{"subject1": "${data.subject}", "options1": {"host": "${data.host}"}}`. This data will be sent to the backend | | `data` | object - `{"subject1": 1, "data": "static"}`. You can specify jsonData or data, but not both. This data will be sent to the backend if jsonData is not defined. | @@ -963,7 +963,7 @@ See `selectSendTo` for handler example Shows readonly control with the given from the instance values. | Property | Description | -| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------| | `container` | div, text, html | | `copyToClipboard` | if true - show button | | `alsoDependsOn` | by change of which attributes, the command must be resent | @@ -979,7 +979,7 @@ The result of command must be a string or object with the following parameters: text: "text to show", // mandatory style: { color: "red" }, // optional icon: "search", // optional. It could be base64 or link to image in the same folder as jsonConfig.json file - // possible predefined names: edit, rename, delete, refresh, add, search, unpair, pair, identify, play, stop, puase, forward, backward, next, previous, lamp, backlight, dimmer, socket, settings, group, user, qrcode, connection, no-connection, visible + // possible predefined names: edit, rename, delete, refresh, add, search, unpair, pair, identify, play, stop, pause, forward, backward, next, previous, lamp, backlight, dimmer, socket, settings, group, user, qrcode, connection, no-connection, visible iconStyle: { width: 30 }, // optional } ``` @@ -1030,7 +1030,7 @@ adapter.on("message", (obj) => { Determines current location and used `system.config` coordinates if not possible in form "latitude,longitude" | Property | Description | -| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|-----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `divider` | divider between latitude and longitude. Default "," (Used if longitudeName and latitudeName are not defined) | | `autoInit` | init field with current coordinates if empty | | `longitudeName` | if defined, the longitude will be stored in this attribute, divider will be ignored | @@ -1039,10 +1039,10 @@ Determines current location and used `system.config` coordinates if not possible ### `interface` -Selects the interface from of the host, where the instance runs +Selects the interface of the host, where the instance runs | Property | Description | -| ---------------- | -------------------------------------------------------------- | +|------------------|----------------------------------------------------------------| | `ignoreLoopback` | do not show loopback interface (127.0.0.1) | | `ignoreInternal` | do not show internal interfaces (normally it is 127.0.0.1 too) | @@ -1051,7 +1051,7 @@ Selects the interface from of the host, where the instance runs shows the license information if not already accepted. One of attributes `texts` or `licenseUrl` must be defined. When the license is accepted, the defined configuration attribute will be set to `true`. | Property | Description | -| ------------ | ---------------------------------------------------------------------------------------------------------- | +|--------------|------------------------------------------------------------------------------------------------------------| | `texts` | array of paragraphs with texts, which will be shown each as a separate paragraph | | `licenseUrl` | URL to the license file (e.g. ) | | `title` | Title of the license dialog | @@ -1063,7 +1063,7 @@ shows the license information if not already accepted. One of attributes `texts` Very special component to check the license online. It's required exactly `license` and `useLicenseManager` properties in native. | Property | Description | -| --------- | ------------- | +|-----------|---------------| | `uuid` | Check UUID | | `version` | Check version | @@ -1076,7 +1076,7 @@ Show iobroker UUID Special input for ports. It checks automatically if port is used by other instances and shows a warning | Property | Description | -| -------- | ----------------------------------------------------------------------------------------------------------------------------- | +|----------|-------------------------------------------------------------------------------------------------------------------------------| | `min` | minimal allowed port number. It could be 0. And if the value is then zero, the check if the port is occupied will not happen. | ### `state` @@ -1084,7 +1084,7 @@ Special input for ports. It checks automatically if port is used by other instan (admin >= 7.1.0) Show control or information from the state | Property | Description | -| ---------------- | ----------------------------------------------------------------------------------------------------------------------------- | +|------------------|-------------------------------------------------------------------------------------------------------------------------------| | `oid` | Which object ID should be taken for the controlling. The ID is without "adapter.X." prefix | | `system` | If true, the state will be taken from system.adapter.XX.I. and not from XX.I | | `control` | How the value of the state should be shown: `text`, `html`, `input`, `slider`, `select`, `button`, `switch`, `number` | @@ -1144,11 +1144,12 @@ Here is an example of how to show device manager in a tab: These options are used to define the width of elements on different screen sizes, ensuring a responsive and adaptable layout across various devices. Valid numbers are 1 to 12. + If you specify a number, for example 6, then the width of the element will be 6/12 (50%) of the screen width or for example 3, then the width of the element will be 3/12 (25%) of the screen width. -Assign numbers to the different layoutoptions specify the with of the element for the different screen sizes. +Assign numbers to the different layout options specify the width of the element for the different screen sizes. | option | description | -| ------ | ---------------------------------------- | +|--------|------------------------------------------| | `xl` | extra large screens (1536px >= width) | | `lg` | large screens (1200px <= width < 1536px) | | `md` | middle screens (900px <= width < 1200px) | @@ -1165,7 +1166,7 @@ The following options are the recommended presets that fit most cases "xl": 4, ``` -#### Recomended checking the layout +#### Recommended checking the layout The respective layout should be checked for each adapter to see whether the layout can be displayed and used in all resolutions. @@ -1179,12 +1180,12 @@ Step 3: Select different devices (2) ![image](img/webdevtools.png) -In the Settings of the Web developer tools, you can create own devices with the exact widths if you want. +In the Settings of the Web developer tools, you can create your own devices with the exact widths if you want. ### Further options | option | description | -| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +|--------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `type` | If element has no attribute `type`, assume it has default type 'panel'. Type of an element. For currently available options see [Common Control Elements:](#common-control-elements) | | `newLine` | should be shown from new line | | `label` | String or object like {en: 'Name', ru: 'Имя'} | @@ -1258,13 +1259,15 @@ Boolean must support indeterminate if value is [false, true] For non changed `__different__` the value different must be returned: -```json Input: +```json data: { timeout: [1000, 2000, 3000] } +``` Output if timeout was not changed: +```json newData: { timeout: "__different__" } @@ -1297,8 +1300,8 @@ If no schema is provided, the schema must be created automatically from data. ## Todo -The following chapters are taken from the origina SCHEMA.MD. -I didnt understand the content in detail and had to be improved by bluefox. +The following chapters are taken from the original SCHEMA.MD. +I didn't understand the content in detail and had to be improved by bluefox. ## JS Functions @@ -1320,11 +1323,10 @@ const func = new Function( '_instance', // instance number 'arrayIndex', // filled only by table and represents the row index 'globalData', // filled only by table and represents the obj.native or obj.common.custom['adapter.X'] object - '_changed' // indicator if some data was changed and must be saved + '_changed', // indicator if some data was changed and must be saved myValidator.includes('return') ? myValidator : 'return ' + myValidator); // e.g. "_alive === true" const isValid = func(data, systemConfig.common, instanceAlive, adapter.common, this.props.socket); - ``` If the `alive` status changes, so all fields must be updated, validated, disabled, hidden anew. @@ -1384,7 +1386,7 @@ The following variables are available in JS function in custom settings: ```jsx 1. - - `noClearButton` - if true, the clear button will not be shown (admin >= 6.17.13) - - `validateJson` - if true, the text will be validated as JSON - - `allowEmpty` - if true, the JSON will be validated only if the value is not empty - - `time` - the value is time in ms or a string. Used only with readOnly flag - -- `number` - - `min` - minimal value - - `max` - maximal value - - `step` - step - -- `color` - color picker - - `noClearButton` - if true, the clear button will not be shown (admin >= 6.17.13) - -- `checkbox` - show checkbox - -- `slider` - show slider (only Admin6) - - `min` - (default 0) - - `max` - (default 100) - - `step` - (default `(max - min) / 100`) - - `unit` - Unit of slider - -- `qrCode` - show data in a QR Code (admin >= 7.0.18) - - `data` - the data to be encoded in the QR Code - - `size` - size of the QR code - - `fgColor` - Foreground color - - `bgColor` - Background color - - `level` - QR code level (`L` `M` `Q` `H`) - -- `ip` - bind address - - `listenOnAllPorts` - add 0.0.0.0 to option - - `onlyIp4` - show only IP4 addresses - - `onlyIp6` - show only IP6 addresses - - `noInternal` - do not show internal IP addresses - -- `user` - Select user from system.user. (With color and icon) - - `short` - no system.user. - -- `room` - Select room from `enum.room` (With color and icon) - (only Admin6) - - `short` - no `enum.rooms.` - - `allowDeactivate` - allow letting room empty - -- `func` - Select function from `enum.func` (With color and icon) - (only Admin6) - - `short` - no `enum.func.` - - `allowDeactivate` - allow letting functionality empty - -- `select` - - `options` - `[{label: {en: "option 1"}, value: 1}, ...]` or - `[{"items": [{"label": "Val1", "value": 1}, {"label": "Val2", value: "2}], "name": "group1"}, {"items": [{"label": "Val3", "value": 3}, {"label": "Val4", value: "4}], "name": "group2"}, {"label": "Val5", "value": 5}]` - -- `autocomplete` - - `options` - `["value1", "value2", ...]` or `[{"value": "value", "label": "Value1"}, "value2", ...]` (keys must be unique) - - `freeSolo` - Set `freeSolo` to `true`, so the textbox can contain any arbitrary value. - -- `image` - saves image as file of the `adapter.X` object or as base64 in attribute - - `filename` - name of file is structure name. In the below example `login-bg.png` is file name for `writeFile("myAdapter.INSTANCE", "login-bg.png")` - - `accept` - html accept attribute, like `{ 'image/**': [], 'application/pdf': ['.pdf'] }`, default `{ 'image/*': [] }` - - `maxSize` - maximal size of file to upload - - `base64` - if true the image will be saved as data-url in attribute, elsewise as binary in file storage - - `crop` - if true, allow user to crop the image - - `!maxWidth` - - `!maxHeight` - - `!square` - width must be equal to height, or crop must allow only square as shape - -```json - "login-bg.png": { - "type": "image", - "accept": "image/png", - "label": { - "en": "Upload image" - }, - "crop": true - }, - "picture": { - "type": "image", - "base64": true, - "accept": "image/*", - "label": { - "en": "Upload image" - }, - "crop": true - } - } -``` - -- `objectId` - object ID: show it with name, color and icon - - `types` - Desired type: `channel`, `device`, ... (has only `state` by default). It is plural, because `type` is already occupied. - - `root` - [optional] Show only this root object and its children - - `customFilter` - [optional] Cannot be used together with `type` settings. It is an object and not a JSON string. Examples - - `{common: {custom: true}}` - show only objects with some custom settings - - `{common: {custom: 'sql.0'}}` - show only objects with sql.0 custom settings (only of the specific instance) - - `{common: {custom: '_dataSources'}}` - show only objects of adapters `influxdb` or `sql` or `history` - - `{common: {custom: 'adapterName.'}}` - show only objects of custom settings of specific adapter (all instances) - - `{type: 'channel'}` - show only channels - - `{type: ['channel', 'device']}` - show only channels and devices - - `{common: {type: 'number'}` - show only states of type 'number - - `{common: {type: ['number', 'string']}` - show only states of type 'number and string - - `{common: {role: 'switch'}` - show only states with roles starting from switch - - `{common: {role: ['switch', 'button']}` - show only states with roles starting from `switch` and `button` - - `filterFunc` - [optional] Cannot be used together with `type` settings. It is a function that will be called for every object and must return true or false. Example: `obj.common.type === 'number'` - -- `password` - password field - This field-type just have an effect in the UI. - Passwords and other sensitive data should be stored encrypted! - To do this, the key must be provided in the io-package.json under [nativeEncrypted](https://github.com/ioBroker/ioBroker.js-controller#automatically-encryptdecrypt-configuration-fields). - Additionally, you can protect this property from being served to other adapters but `admin` and `cloud` by adding it to `protectedNative` in `io-package.json` file. - - `repeat` - repeat password must be compared with password - - `visible` - true if allow viewing the password by toggling the view button (only for a new password while entering) - - `readOnly` - the read-only flag. Visible is automatically true if readOnly is true - - `maxLength` - max length of the text in field - -- `instance` - - `adapter` - name of adapter. With special name `_dataSources` you can get all adapters with flag `common.getHistory`. - - `adapters` - optional list of adapters, that should be shown. If not defined, all adapters will be shown. Only active if `adapter` attribute is not defined. - - `allowDeactivate` - if true. Additional option "deactivate" is shown - - `onlyEnabled` - if true. Only enabled instances will be shown - - `long` - value will look like `system.adapter.ADAPTER.0` and not `ADAPTER.0` - - `short` - value will look like `0` and not `ADAPTER.0` - - `all` - Add to the options "all" option with value `*` - -- `chips` - user can enter the word, and it will be added (see cloud => services => White list). Output is an array if no `delimiter` defined. - - `delimiter` - if it is defined, so the option will be stored as string with delimiter instead of an array. E.g., by `delimiter=;` you will get `a;b;c` instead of `['a', 'b', 'c']` - -- `alive` - just indication if the instance is alive, and it could be used in "hidden" and "disabled" (will not be saved in config) - Just text: Instance is running, Instance is not running - - `instance` - check if the instance is alive. If not defined, it will be used current instance. You can use `${data.number}` pattern in the text. - - `textAlive` - default text is `Instance %s is alive`, where %s will be replaced by `ADAPTER.0`. The translation must exist in i18n files - - `textNotAlive` - default text is `Instance %s is not alive`, where %s will be replaced by `ADAPTER.0`. The translation must exist in i18n files - -- `pattern` - read-only field with pattern like 'https://${data.ip}:${data.port}' (will not be saved in config) - Text input with the read-only flag, that shows a pattern. - - `copyToClipboard` - if true - show button - - `pattern` - my pattern - -- `sendTo` - button that sends request to instance (https://github.com/iobroker-community-adapters/ioBroker.email/blob/master/admin/index_m.html#L128) - - `command` - (Default `send`) - - `jsonData` - string - `"{\"subject1\": \"${data.subject}\", \"options1\": {\"host\": \"${data.host}\"}}"`. You can use special variables `data._origin` and `data._originIp` to send to instance the caller URL, like `http://127.0.0.1:8081/admin`. - - `data` - object - `{"subject1": 1, "data": "static"}`. You can specify jsonData or data, but not both. - - `result` - `{result1: {en: 'A'}, result2: {en: 'B'}}` - - `error` - `{error1: {en: 'E'}, error2: {en: 'E2'}}` - - `variant` - `contained`, `outlined` or nothing - - `openUrl` - if true - open URL in new tab, if response contains attribute `openUrl`, like `{"openUrl": "http://1.2.3.4:80/aaa", "window": "_blank", "saveConfig": true}`. If `saveConfig` is true, the user will be requested to save the configuration. - - `reloadBrowser` - if true - reload the current browser window, if response contains attribute `reloadBrowser`, like `{"reloadBrowser": true}`. - - `window` - if `openUrl` is true, this is a name of the new window. Could be overwritten if response consist `window` attribute. - `this.props.socket.sendTo(adapterName.instance, command || 'send', data, result => {});` - - `icon` - if icon should be shown: `auth`, `send`, `web`, `warning`, `error`, `info`, `search`. You can use `base64` icons (like `data:image/svg+xml;base64,...`) or `jpg/png` images (ends with `.png`). (Request via issue if you need more icons) - - `useNative` - if adapter returns a result with `native` attribute it will be used for configuration. If `saveConfig` is true, the user will be requested to save the configuration. - - `showProcess` - Show spinner while request is in progress - - `timeout` - timeout for request in ms. Default: none. - - `onLoaded` - execute the button logic once initially - -- `setState` - button that sets instance's state - - `id` - `system.adapter.myAdapter.%INSTANCE%.test`, you can use the placeholder `%INSTANCE%` to replace it with the current instance name - - `ack` - false (default false) - - `val` - '${data.myText}\_test' or number. Type will be detected automatically from the state type and converting done too - - `okText` - Alert which will be shown by pressing the button - - `variant` - `contained`, `outlined`, '' - -- `staticText` - static text like description - - `label` - multi-language text - - `text` - same as label - -- `staticLink` - static link - - `label` - multi-language text - - `href` - link. Link could be dynamic like `#tab-objects/customs/${data.parentId}` - - `target` - `_blank` or `_self` or window name - - `close` - if true, the GUI will be closed (used not for JsonConfig in admin, but for dynamic GUI) - - `button` - show a link as button - - `variant` - type of button (`outlined`, `contained`, `text`) - - `color` - color of button (e.g. `primary`) - - `icon` - if icon should be shown: `auth`, `send`, `web`, `warning`, `error`, `info`, `search`, `book`, `help`, `upload`. You can use `base64` icons (it starts with `data:image/svg+xml;base64,...`) or `jpg/png` images (ends with `.png`) . (Request via issue if you need more icons) - -- `staticImage` - static image - - `href` - optional HTTP link - - `src` - name of picture (from admin directory) - -- `table` - table with items that could be deleted, added, moved up, moved down - - `items` - `[{"type": see above, "width": px or %, "title": {"en": "header"}, "attr": "name", "filter": false, "sort": true, "default": ""}]` - - `noDelete` - boolean if delete or add disabled, If `noDelete` is false, add, delete and move up/down should work - - `objKeyName` - (legacy setting, don't use!) - name of the key in `{"192.168.1.1": {delay: 1000, enabled: true}, "192.168.1.2": {delay: 2000, enabled: false}}` - - `objValueName` - (legacy setting, don't use!) - name of the value in `{"192.168.1.1": "value1", "192.168.1.2": "value2"}` - - `allowAddByFilter` - if add allowed even if filter is set - - `showSecondAddAt` - Number of lines from which the second add button at the bottom of the table will be shown. Default 5 - - `showFirstAddOnTop` - Show first plus button on top of the first column and not on the left. - - `clone` - [optional] - if clone button should be shown. If true, the clone button will be shown. If attribute name, this name will be unique. - - `export` - [optional] - if export button should be shown. Export as csv file. - - `import` - [optional] - if import button should be shown. Import from csv file. - - `uniqueColumns` - [optional] - specify an array of columns, which need to have unique entries - - `encryptedAttributes` - [optional] - specify an array of columns, which should be encrypted - - `compact` - [optional] - if true, the table will be shown in a compact mode - -- `accordion` - accordion with items that could be deleted, added, moved up, moved down (Admin 6.6.0 and newer) - - `items` - `[{"type": see above, "attr": "name", "default": ""}]` - items can be placed like on a `panel` (xs, sm, md, lg and newLine) - - `titleAttr` - key of the item's list which should be used as name - - `noDelete` - boolean if delete or add disabled, If `noDelete` is false, add, delete and move up/down should work - - `clone` - [optional] - if clone button should be shown. If true, the clone button will be shown. If attribute name, this name will be unique. - -- `jsonEditor` - json editor - - `validateJson` - if false, the text will be not validated as JSON - - `allowEmpty` - if true, the JSON will be validated only if the value is not empty - -- `language` - select language - - `system` - allow the usage of the system language from `system.config` as default (will have an empty string value if selected) - -- `certificate` - - `certType` - on of: `public`, `private`, `chained`. But from 6.4.0 you can use `certificates` type. - -- `certificates` - it is a universal type that manages `certPublic`, `certPrivate`, `certChained` and `leCollection` attributes for you. - Example: - -```json -{ - "_certs": { - "type": "certificates", - "newLine": true, - "hidden": "!data.secure", - "sm": 12 - } -} -``` - -- `certCollection` - select certificate collection or just use all collections or don't use let's encrypt at all. - - `leCollectionName` - name of the certificate collection - -- `custom` (only Admin6) - - `name` - Component name that will be provided via props, like ComponentInstancesEditor - - `url` - Location of the component - - `custom/customComponents.js`: in this case the files will be loaded from `/adapter/ADAPTER_NAME/custom/customComponents.js` - - `https://URL/myComponent`: direct from URL - - `./adapter/ADAPTER_NAME/custom/customComponent.js`: in this case the files will be loaded from `/adapter/ADAPTER_NAME/custom/customComponents.js` - - `i18n` - true if `i18n/xx.json` files are located in the same directory as component, or translation object `{"text1": {"en": Text1"}}` - -- `datePicker` - allow the user to select a date input the UI format comes from the configured `dateFormat` in the users' installation. The - component returns a parseable date string. - -- `timePicker` - allow the user to select a date input the returned string is a parseable date string or of format `HH:mm:ss` - - `format` - format passed to the date picker defaults to `HH:mm:ss` - - `views` - Configure which views should be shown to the users. Defaults to `['hours', 'minutes', 'seconds']` - - `timeSteps` - Represent the available time steps for each view. Defaults to `{ hours: 1, minutes: 5, seconds: 5 }` - - `returnFormat` - `fullDate` or `HH:mm:ss`. Defaults to full date for backward compatibility reasons. - -- `divider` - horizontal line - - `height` - optional height - - `color` - optional divider color or `primary`, `secondary` - -- `header` - - `text` - - `size` - 1-5 => h1-h5 - -- `cron` - - `complex` - show CRON with "minutes", "seconds" and so on - - `simple` - show simple CRON settings - -- `fileSelector` (only Admin6) - - `pattern` - File extension pattern. Allowed `**/*.ext` to show all files from subfolders too, `*.ext` to show from root folder or `folderName/*.ext` to show all files in sub-folder `folderName`. Default `**/*.*`. - - `fileTypes` - [optional] type of files: `audio`, `image`, `text` - - `objectID` - Object ID of type `meta`. You can use special placeholder `%INSTANCE%`: like `myAdapter.%INSTANCE%.files` - - `upload` - path, where the uploaded files will be stored. Like `folderName`. If not defined, no upload field will be shown. To upload in the root, set this field to `/`. - - `refresh` - Show refresh button near the select. - - `maxSize` - max file size (default 2MB) - - `withFolder` - show folder name even if all files in same folder - - `delete` - Allow deletion of files - - `noNone` - Do not show `none` option - - `noSize` - Do not show size of files - -- `file` - (only Admin6) Input field with file selector - - `disableEdit` - if user can manually enter the file name and not only through select dialog - - `limitPath` - limit selection to one specific object of type `meta` and following path (not mandatory) - - `filterFiles` - like `['png', 'svg', 'bmp', 'jpg', 'jpeg', 'gif']` - - `allowUpload` - allowed upload of files - - `allowDownload` - allowed download of files (default true) - - `allowCreateFolder` - allowed creation of folders - - `allowView` - allowed tile view (default true) - - `showToolbar` - show toolbar (default true) - - `selectOnlyFolders` - user can select only folders (e.g. for upload path) - - `trim` - trim the file name - -- `imageSendTo` - shows image, that was received from backend as base64 string - - `width` - width of QR code in px - - `height` - height of QR code in px - - `command` - sendTo command - - `jsonData` - string - `{"subject1": "${data.subject}", "options1": {"host": "${data.host}"}}`. This data will be sent to backend - - `data` - object - `{"subject1": 1, "data": "static"}`. You can specify jsonData or data, but not both. This data will be sent to backend if jsonData is not defined. - Example of code in back-end: - -``` -adapter.on('message', obj => { - if (obj.command === 'send') { - const QRCode = require('qrcode'); - QRCode.toDataURL('3ca4234a-fd81-fdb8-5584-08c732f70e4d', (err, url) => - obj.callback && adapter.sendTo(obj.from, obj.command, url, obj.callback)); - } -}); -``` - -- `selectSendTo` - Shows the drop-down menu with the given from the instance values. - - `command` - sendTo command - - `jsonData` - string - `{"subject1": "${data.subject}", "options1": {"host": "${data.host}"}}`. This data will be sent to the backend - - `data` - object - `{"subject1": 1, "data": "static"}`. You can specify jsonData or data, but not both. This data will be sent to the backend if jsonData is not defined. - - `manual` - allow manual editing. Without drop-down menu (if instance is offline). Default `true`. - - `multiple` - Multiple choice select - - `showAllValues` - show item even if no label was found for it (by multiple), default=`true` - - `noTranslation` - do not translate label of selects - To use this option, your adapter must implement message handler: - The result of command must be an array in form `[{"value": 1, "label": "one"}, ...]` - - `alsoDependsOn` - by change of which attributes, the command must be resent - -```js -adapter.on('message', obj => { - if (obj) { - switch (obj.command) { - case 'command': - if (obj.callback) { - try { - const { SerialPort } = require('serialport'); - if (SerialPort) { - // read all found serial ports - SerialPort.list() - .then(ports => { - adapter.log.info(`List of port: ${JSON.stringify(ports)}`); - adapter.sendTo(obj.from, obj.command, ports.map(item => ({label: item.path, value: item.path})), obj.callback); - }) - .catch(e => { - adapter.sendTo(obj.from, obj.command, [], obj.callback); - adapter.log.error(e) - }); - } else { - adapter.log.warn('Module serialport is not available'); - adapter.sendTo(obj.from, obj.command, [{label: 'Not available', value: ''}], obj.callback); - } - } catch (e) { - adapter.sendTo(obj.from, obj.command, [{label: 'Not available', value: ''}], obj.callback); - } - } - - break; - } - } -}); -``` - -- `autocompleteSendTo` - Shows autocomplete control with the given from the instance values. - - `command` - sendTo command - - `jsonData` - string - `{"subject1": "${data.subject}", "options1": {"host": "${data.host}"}}`. This data will be sent to the backend - - `data` - object - `{"subject1": 1, "data": "static"}`. You can specify jsonData or data, but not both. This data will be sent to the backend if jsonData is not defined. - - `freeSolo` - Set `freeSolo` to `true`, so the textbox can contain any arbitrary value. - - `alsoDependsOn` - by change of which attributes, the command must be resent - - `maxLength` - max length of the text in field - - To use this option, your adapter must implement message handler: - The result of command must be an array in form `["value1", {"value": "value2", "label": "Value2"}, ...]` (keys must be unique) - See `selectSendTo` for handler example - -- `textSendTo` - Shows readonly control with the given from the instance values. - - `container` - div, text, html - - `copyToClipboard` - if true - show button - - `alsoDependsOn` - by change of which attributes, the command must be resent - - `command` - sendTo command - - `jsonData` - string - `{"subject1": "${data.subject}", "options1": {"host": "${data.host}"}}`. This data will be sent to the backend - - `data` - object - `{"subject1": 1, "data": "static"}`. You can specify jsonData or data, but not both. This data will be sent to the backend if jsonData is not defined. - To use this option, your adapter must implement a message handler: - The result of command must be a string or object with the following parameters: - -```json5 -{ - text: 'text to show', // mandatory - style: { color: 'red' }, // optional - icon: 'search', // optional. It could be base64 or link to image in the same folder as jsonConfig.json file - // possible predefined names: edit, rename, delete, refresh, add, search, unpair, pair, identify, play, stop, puase, forward, backward, next, previous, lamp, backlight, dimmer, socket, settings, group, user, qrcode, connection, no-connection, visible - iconStyle: {width: 30} // optional -} -``` - -Example: - -```js -adapter.on('message', obj => { - if (obj) { - switch (obj.command) { - case 'command': - obj.callback && adapter.sendTo(obj.from, obj.command, 'Received ' + JSON.stringify(obj.message), obj.callback); - // or with style - obj.callback && adapter.sendTo(obj.from, obj.command, { text: 'Received ' + JSON.stringify(obj.message), style: { color: 'red' }, icon: 'search', iconStyle: { width: 30 }}, obj.callback); - // or as html - obj.callback && adapter.sendTo(obj.from, obj.command, `
    ${JSON.stringify(obj.message)}
    `, obj.callback); - break; - } - } -}); -``` - -- `coordinates` - Determines current location and used `system.config` coordinates if not possible in form "latitude,longitude" - - `divider` - divider between latitude and longitude. Default "," (Used if longitudeName and latitudeName are not defined) - - `autoInit` - init field with current coordinates if empty - - `longitudeName` - if defined, the longitude will be stored in this attribute, divider will be ignored - - `latitudeName` - if defined, the latitude will be stored in this attribute, divider will be ignored - - `useSystemName` - if defined, the checkbox with "Use system settings" will be shown and latitude, longitude will be read from `system.config`, a boolean will be saved to the given name - -- `interface` - Selects the interface from of the host, where the instance runs - - `ignoreLoopback` - do not show loopback interface (127.0.0.1) - - `ignoreInternal` - do not show internal interfaces (normally it is 127.0.0.1 too) - -- `license` - shows the license information if not already accepted. One of attributes `texts` or `licenseUrl` must be defined. When the license is accepted, the defined configuration attribute will be set to `true`. - - `texts` - array of paragraphs with texts, which will be shown each as a separate paragraph - - `licenseUrl` - URL to the license file (e.g. https://raw.githubusercontent.com/ioBroker/ioBroker.docs/master/LICENSE) - - `title` - Title of the license dialog - - `agreeText` - Text of the agreed button - - `checkBox` - If defined, the checkbox with the given name will be shown. If checked, the agreed button will be enabled. - -- `checkLicense` - Very special component to check the license online. It's required exactly `license` and `useLicenseManager` properties in native. - - `uuid` - Check UUID - - `version` - Check version - -- `uuid` - Show iobroker UUID - -- `port` - Special input for ports. It checks automatically if port is used by other instances and shows a warning - - `min` - minimal allowed port number. It could be 0. And if the value is then zero, the check if the port is occupied will not happen. - -- `state` - (admin >= 7.1.0) Show control or information from the state - - `oid` - Which object ID should be taken for the controlling. The ID is without "adapter.X." prefix - - `system` - If true, the state will be taken from system.adapter.XX.I. and not from XX.I - - `control` - How the value of the state should be shown: `text`, `html`, `input`, `slider`, `select`, `button`, `switch`, `number` - - `controlled` - If true, the state will be shown as switch, select, button, slider or text input. Used only if no control property is defined - - `unit` - Add unit to the value - - `trueText` - this text will be shown if the value is true - - `trueTextStyle` - Style of the text if the value is true - - `falseText` - this text will be shown if the value is false or if the control is a "button" - - `falseTextStyle` - Style of the text if the value is false or if the control is a "button" - - `trueImage` - This image will be shown if the value is true - - `falseImage` - This image will be shown if the value is false or if the control is a "button" - - `min` - Minimum value for control type slider or number - - `max` - Maximum value for control type slider or number - - `step` - Step value for control type slider or number - - `controlDelay` - delay in ms for slider or number - - `variant` - Variant of button: `contained`, `outlined`, `text` - - `readOnly` - Defines if the control is read-only - -- `deviceManager` - show device manager. For that, the adapter must support device manager protocol. See iobroker/dm-utils. - Here is an example of how to show device manager in a tab: - -```json -"_deviceManager": { - "type": "panel", - "label": "Device manager", - "items": { - "_dm": { - "type": "deviceManager", - "sm": 12, - "style": { - "width": "100%", - "height": "100%", - "overflow": "hidden" - } - } - }, - "style": { - "width": "100%", - "height": "100%", - "overflow": "hidden" - }, - "innerStyle": { - "width": "100%", - "height": "100%", - "overflow": "hidden" - } -} -``` - -## Common attributes of controls - -All types could have: - -- `xl` - width in 1/12 of screen on extra large screens (1536px < width) -- `lg` - width in 1/12 of screen on large screens (1200px <= width < 1536px) -- `md` - width in 1/12 of screen on middle screens (900px <= width < 1200px) -- `sm` - width in 1/12 of screen on small screen (600px <= width < 900px) -- `xs` - width in 1/12 of screen on tiny screens (width < 600px) -- `newLine` - should be shown from new line -- `label` - String or object like {en: 'Name', ru: 'Имя'} -- `hidden` - JS function that could use `native.attribute` for calculation -- `hideOnlyControl` - if hidden the place will be shown, but no control -- `disabled` - JS function that could use `native.attribute` for calculation -- `help` - help text (multi-language) -- `helpLink` - href to help (could be used only together with `help`) -- `style` - CSS style in ReactJS notation: `radiusBorder` and not `radius-border`. -- `darkStyle` - CSS style for dark mode -- `validator` - JS function: true no error, false - error -- `validatorErrorText` - Text to show if validator fails -- `validatorNoSaveOnError` - disable save button if error -- `tooltip` - optional tooltip -- `default` - default value -- `defaultFunc` - JS function to calculate default value -- `defaultSendTo` - command to request initial value from running instance, example: `"myInstance": {"type": "text", "defaultSendTo": "fill"}` - - `data` - static data - - `jsonData` - static data - - if no `data` and `jsonData` defined, the following info will be sent `{"attr": "", "value": ""}` - - `button` - button label to re-trigger request from instance - - `buttonTooltip` - Button tooltip (default: `Request data by instance`) - - `buttonTooltipNoTranslation` - Do not translate button tooltip - - `allowSaveWithError` - Allow saving of configuration even if the instance is offline -- `placeholder` - placeholder (for text control) -- `noTranslation` - do not translate selects or other options (not for help, label or placeholder) -- `onChange` - Structure in form `{"alsoDependsOn": ["attr1", "attr2"], "calculateFunc": "data.attr1 + data.attr2", "ignoreOwnChanges": true}` -- `doNotSave` - Do not save this attribute as used only for internal calculations -- `noMultiEdit` - if this flag set to true, this field will not be shown if user selected more than one object for edit. -- `confirm` - - `condition` - JS function: true show confirm dialog - - `text` - text of confirmation dialog - - `title` - title of confirmation dialog - - `ok` - Text for OK button - - `cancel` - Text for Cancel button - - `type` - One of: `info`, `warning`, `error`, `none` - - `alsoDependsOn` - array with attributes, to check the condition by these attributes too - -```json5 -{ - "type": "tabs", - "items": { - "options1": { - "type": "panel", - "label": "Tab1", - "icon": "base64 svg", // optional - "items": { - myPort: { - "type": "number", - "min": 1, - "max": 65565, - "label": "Number", - "sm": 6, // 1 - 12 - "validator": "'"!!data.name"'", // else error - "hidden": "data.myType === 1", // hidden if myType is 1 - "disabled": "data.myType === 2" // disabled if myType is 2 - }, - "options.myType": { // name could support more than one levelhelperText - "newLine": true, // must start from new row - "type": "select", - "label": "Type", - "sm": 6, // 1 - 12 - "options": [ - {"label": "option 1", "value": 1}, - {"label": "option 2", "value": 2} - ] - }, - "myBool": { - "type": "checkbox", - "label": "My checkbox", - } - } - }, - "tab2": { - "label": "Tab2", - "disabled": "data.myType === 1", - "hidden": "data.myType === 2", - } - }, -} -``` - -`Number`, `text`, `checkbox`, `select` support autocomplete to allow selection of options if used as custom settings. -In this case, the value will be provided as an array of all possible values. - -Example: - -```json -// ... - "timeout": { - "type": "number", - "label": "Timeout" - } -// ... - -data: { - timeout: [1000, 2000, 3000] -} -``` - -In this case input must be text, where shown `__different__`, with the autocomplete option of three possible values. -Users can select from dropdown 1000, 2000 or 3000 or input their own new value, e.g., 500. - -Boolean must support indeterminate if value is [false, true] - -For non changed `__different__` the value different must be returned: - -``` -Input: -data: { - timeout: [1000, 2000, 3000] -} - -Output if timeout was not changed: -newData: { - timeout: "__different__" -} -``` - -Value `__different__` is reserved and no one text input may accept it from user. - -Component must look like - -```jsx - error can be true/false or text. Attribute is optional} - onChanged={(newData, isChanged) => console.log('Changed ' + isChanged)} -/> -``` - -If no schema is provided, the schema must be created automatically from data. - -- `boolean` => checkbox -- `text` => text input -- `number` => number -- name `bind` => ip -- name `port` => number, min=1, max=0xFFFF -- name `timeout` => number, help="ms" - -If element has no attribute `type`, assume it has default type 'panel'. - -## Panel style - -You can provide style for panels too. Here is an example with panel background: - -```json -{ - "i18n": true, - "type": "panel", - "style": { - "backgroundImage": "url(adapter/mpd/background.png)", - "backgroundPosition": "top", - "backgroundRepeat": "no-repeat", - "backgroundSize": "cover" - }, - "items": { - "...": {} - } -} -``` - -## i18n - -There are several options to provide the translations. -Only the first one is compatible with our Community Translation Tool Weblate, so it should be favored over the others! - -1. Users can provide texts from files. - -On the top level of structure set `i18n: true` and provide files in admin: - -- `admin/i18n/de/translations.json` -- `admin/i18n/en/translations.json` -- ... - -or - -- `admin/i18n/de.json` -- `admin/i18n/en.json` -- ... - -Additionally, user can provide the path to i18n files, `i18n: "customI18n"`and provide files in admin: - -- `admin/customI18n/de/translations.json` -- `admin/customI18n/en/translations.json` -- ... - -or - -- `admin/customI18n/de.json` -- `admin/customI18n/en.json` -- ... - -2. User can provide translations directly in label like: - -```json -{ - "type": "text", - "label: { - "en": "Label", - "de": "Taxt" - } -} -``` - -3. User can provide translations in i18n attribute: - -```json -{ - "18n": { - "My Text: { - "en": "My Text", - "de": "Mein Text" - }, - "My Text2: { - "en": "My Text2", - "de": "Mein Text2" - }, - }, - "type": "panel", - ... -} -``` - -We suggest using variant 1 whenever possible, as it will be possible to process the texts with Weblate. - -## JS Functions - -### Configuration dialog - -JS function is: - -```js -const myValidator = "_alive === true && data.options.myType == 2"; - -const func = new Function( - 'data', // actual obj.native or obj.common.custom['adapter.X'] object - // If table, so data is current line in the table - 'originalData', // data before changes - '_system', // system config => 'system.config'=>common - '_alive', // If instance is alive - '_common', // common part of instance = 'system.config.ADAPTER.X' => common - '_socket', // socket connection - '_instance', // instance number - 'arrayIndex', // filled only by table and represents the row index - 'globalData', // filled only by table and represents the obj.native or obj.common.custom['adapter.X'] object - '_changed' // indicator if some data was changed and must be saved - myValidator.includes('return') ? myValidator : 'return ' + myValidator); // e.g. "_alive === true" - -const isValid = func(data, systemConfig.common, instanceAlive, adapter.common, this.props.socket); - -``` - -If the `alive` status changes, so all fields must be updated, validated, disabled, hidden anew. - -The following variables are available in JS function in adapter settings: - -- `data` - native settings for this instance or current line in the table (to access all settings use globalData) -- `_system` - system configuration -- `_alive` - is instance being alive -- `_common` - common settings for this instance -- `_socket` - socket -- `_instance` - instance number -- `arrayIndex` - used only in table and represent current line in an array -- `globalData` - used only in table for all settings and not only one table line - -### Custom settings dialog - -JS function is: - -```js -const myValidator = "customObj.common.type === 'boolean' && data.options.myType == 2"; - -const func = new Function( - 'data', - 'originalData', - '_system', - 'instanceObj', - 'customObj', - '_socket', - arrayIndex, - myValidator.includes('return') ? myValidator : 'return ' + myValidator); // e.g. "_alive === true" - -const isValid = func(data || this.props.data, this.props.originalData, this.props.systemConfig, instanceObj, customObj, this.props.socket); -``` - -The following variables are available in JS function in custom settings: - -- `data` - current custom settings or current line in the table (to access all settings use globalData) -- `originalData` - Unchanged data -- `_system` - system configuration -- `instanceObj` - adapter instance object -- `customObj` - current object itself -- `_socket` - socket -- `arrayIndex` - used only in table and represent current line in an array -- `globalData` - used only in table for all settings and not only one table line - -## Custom component - -```jsx - {}} - onError={error => error can be true/false or text} -/> -``` - -You can find examples in [`telegram`](https://github.com/iobroker-community-adapters/ioBroker.telegram/tree/master/src-admin) or in [`pushbullet`](https://github.com/Jens1809/ioBroker.pushbullet/tree/master/src-admin) adapter. - -## Schema - -Schema is [here](https://github.com/ioBroker/adapter-react-v5/tree/master/schemas) +Documentation was moved to [README.md](./README.md) diff --git a/packages/jsonConfig/package.json b/packages/jsonConfig/package.json index f651ed35d..cbdb99fcc 100644 --- a/packages/jsonConfig/package.json +++ b/packages/jsonConfig/package.json @@ -17,23 +17,15 @@ }, "dependencies": { "@iobroker/adapter-react-v5": "file:../adapter-react-v5", + "@mui/x-date-pickers": "^7.22.0", "crypto-js": "^4.2.0", "react-ace": "^12.0.0", - "react-color": "^2.19.3", "react-qr-code": "^2.0.15" }, "devDependencies": { "@craco/craco": "^7.1.0", - "@iobroker/eslint-config": "^0.1.6", - "@iobroker/types": "^7.0.0", "@types/crypto-js": "^4.2.2", - "@types/react": "^18.3.11", - "@types/react-color": "^3.0.12", - "@types/react-dom": "^18.3.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "tsc-alias": "^1.8.10", - "typescript": "^5.6.2" + "tsc-alias": "^1.8.10" }, "files": [ "build/", diff --git a/packages/jsonConfig/src/JsonConfigComponent/ConfigCustom.tsx b/packages/jsonConfig/src/JsonConfigComponent/ConfigCustom.tsx index d76fbd0b7..5c795b1bf 100644 --- a/packages/jsonConfig/src/JsonConfigComponent/ConfigCustom.tsx +++ b/packages/jsonConfig/src/JsonConfigComponent/ConfigCustom.tsx @@ -149,7 +149,7 @@ export default class ConfigCustom extends ConfigGeneric> = { room: ConfigRoom, select: ConfigSelect, selectSendTo: ConfigSelectSendTo, + // @deprecated Use "sendTo" sendto: ConfigSendTo, sendTo: ConfigSendTo, setState: ConfigSetState, diff --git a/packages/jsonConfig/src/JsonConfigComponent/ConfigPassword.tsx b/packages/jsonConfig/src/JsonConfigComponent/ConfigPassword.tsx index 3c7aef0fc..248acb3b5 100644 --- a/packages/jsonConfig/src/JsonConfigComponent/ConfigPassword.tsx +++ b/packages/jsonConfig/src/JsonConfigComponent/ConfigPassword.tsx @@ -15,12 +15,12 @@ const styles: Record = { display: 'inline-block', }, halfWidth1: { - width: 'calc(50% - 4px)', + width: 'calc(50% - 5px)', display: 'inline-block', marginRight: 8, }, halfWidth2: { - width: 'calc(50% - 4px)', + width: 'calc(50% - 5px)', display: 'inline-block', }, }; @@ -92,7 +92,7 @@ class ConfigPassword extends ConfigGeneric - { - e.preventDefault(); - e.stopPropagation(); - this.setState({ _visible: !this.state._visible }); - }} - edge="end" - > - {this.state._visible ? : } - -
    - ) : undefined, autoComplete: 'new-password', }, htmlInput: { @@ -179,7 +160,7 @@ class ConfigPassword extends ConfigGeneric - ); + ) : null; return (
    diff --git a/packages/jsonConfig/src/index.tsx b/packages/jsonConfig/src/index.tsx index fc8050eeb..05ffce1cd 100644 --- a/packages/jsonConfig/src/index.tsx +++ b/packages/jsonConfig/src/index.tsx @@ -3,7 +3,80 @@ import JsonConfigComponent from './JsonConfigComponent'; import ConfigPanel from './JsonConfigComponent/ConfigPanel'; import ConfigGeneric from './JsonConfigComponent/ConfigGeneric'; -export type * from './JsonConfigComponent/ConfigGeneric'; -export type * from './types'; +export type { + DeviceManagerPropsProps, + ConfigGenericProps, + ConfigGenericState, +} from './JsonConfigComponent/ConfigGeneric'; + +export type { + ConfigItemType, + ConfigItemConfirmData, + ConfigItem, + ConfigItemAlive, + ConfigItemSelectOption, + ConfigItemPanel, + ConfigItemPattern, + ConfigItemChip, + ConfigItemTabs, + ConfigItemText, + ConfigItemColor, + ConfigItemCheckbox, + ConfigItemNumber, + ConfigItemQrCode, + ConfigItemPassword, + ConfigItemObjectId, + ConfigItemSlider, + ConfigItemTopic, + ConfigItemIP, + ConfigItemUser, + ConfigItemStaticDivider, + ConfigItemStaticHeader, + ConfigItemStaticImage, + ConfigItemStaticText, + ConfigItemRoom, + ConfigItemFunc, + ConfigItemSelect, + ConfigItemAutocomplete, + ConfigItemSetState, + ConfigItemAutocompleteSendTo, + ConfigItemAccordion, + ConfigItemDivider, + ConfigItemHeader, + ConfigItemCoordinates, + ConfigItemCustom, + ConfigItemDatePicker, + ConfigItemDeviceManager, + ConfigItemLanguage, + ConfigItemPort, + ConfigItemImageSendTo, + ConfigItemSendTo, + ConfigItemState, + ConfigItemTextSendTo, + ConfigItemSelectSendTo, + ConfigItemTable, + ConfigItemTimePicker, + ConfigItemCertCollection, + ConfigItemCRON, + ConfigItemCertificateSelect, + ConfigItemLicense, + ConfigItemCertificates, + ConfigItemCheckLicense, + ConfigItemUUID, + ConfigItemJsonEditor, + ConfigItemInterface, + ConfigItemImageUpload, + ConfigItemInstanceSelect, + ConfigItemFile, + ConfigItemFileSelector, + ConfigItemAny, + BackEndCommandType, + BackEndCommandGeneric, + BackEndCommandNoOperation, + BackEndCommandRefresh, + BackEndCommandOpenLink, + BackEndCommandMessage, + BackEndCommand, +} from './types'; export { JsonConfig, JsonConfigComponent, ConfigPanel, ConfigGeneric }; diff --git a/packages/jsonConfig/src/types.d.ts b/packages/jsonConfig/src/types.d.ts index 244c9bf92..7d7f0a4a4 100644 --- a/packages/jsonConfig/src/types.d.ts +++ b/packages/jsonConfig/src/types.d.ts @@ -805,11 +805,11 @@ export interface ConfigItemInterface extends ConfigItem { export interface ConfigItemImageUpload extends ConfigItem { type: 'image'; - /** name of file is structure name. In the below example `login-bg.png` is file name for `writeFile("myAdapter.INSTANCE", "login-bg.png")` */ + /** name of a file is structure name. In the below example `login-bg.png` is file name for `writeFile("myAdapter.INSTANCE", "login-bg.png")` */ filename?: string; - /** html accept attribute, like `{ 'image/**': [], 'application/pdf': ['.pdf'] }`, default `{ 'image/*': [] }` */ + /** HTML accept attribute, like `{ 'image/**': [], 'application/pdf': ['.pdf'] }`, default `{ 'image/*': [] }` */ accept?: Record; - /** maximal size of file to upload */ + /** maximal size of a file to upload */ maxSize?: number; /** if true, the image will be saved as data-url in attribute, elsewise as binary in file storage */ base64?: boolean;