iobroker.admin 7.3.0 → 7.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -5
- package/adminWww/asset-manifest.json +15 -15
- package/adminWww/index.html +1 -1
- package/adminWww/static/js/{288.e785dc66.chunk.js → 288.875210cc.chunk.js} +2 -2
- package/adminWww/static/js/{288.e785dc66.chunk.js.map → 288.875210cc.chunk.js.map} +1 -1
- package/adminWww/static/js/38.d6758029.chunk.js.map +1 -1
- package/adminWww/static/js/{4308.825ae51f.chunk.js → 3946.1d44a5fe.chunk.js} +2 -2
- package/adminWww/static/js/3946.1d44a5fe.chunk.js.map +1 -0
- package/adminWww/static/js/6603.614b4df4.chunk.js +3 -0
- package/adminWww/static/js/6603.614b4df4.chunk.js.map +1 -0
- package/adminWww/static/js/6718.67830d76.chunk.js +2 -0
- package/adminWww/static/js/6718.67830d76.chunk.js.map +1 -0
- package/adminWww/static/js/7302.09345470.chunk.js +2 -0
- package/adminWww/static/js/7302.09345470.chunk.js.map +1 -0
- package/adminWww/static/js/7931.38a8acbc.chunk.js +3 -0
- package/adminWww/static/js/7931.38a8acbc.chunk.js.map +1 -0
- package/adminWww/static/js/css.js +8 -0
- package/adminWww/static/js/html.js +8 -0
- package/adminWww/static/js/javascript.js +8 -0
- package/adminWww/static/js/{main.a079eb4a.js → main.9f62181e.js} +2 -2
- package/adminWww/static/js/{main.a079eb4a.js.map → main.9f62181e.js.map} +1 -1
- package/adminWww/static/js/worker-css.js +1 -0
- package/adminWww/static/js/worker-html.js +1 -0
- package/adminWww/static/js/worker-javascript.js +1 -0
- package/adminWww/static/js/worker-json.js +1 -0
- package/adminWww/static/js/worker-xml.js +1 -0
- package/adminWww/static/js/worker-yaml.js +1 -0
- package/build-backend/lib/checkLinuxPass.js +32 -6
- package/build-backend/lib/checkLinuxPass.js.map +1 -1
- package/build-backend/lib/web.js +4 -1
- package/build-backend/lib/web.js.map +1 -1
- package/io-package.json +26 -13
- package/package.json +4 -4
- package/adminWww/static/js/3868.dd7a3468.chunk.js +0 -3
- package/adminWww/static/js/3868.dd7a3468.chunk.js.map +0 -1
- package/adminWww/static/js/4308.825ae51f.chunk.js.map +0 -1
- package/adminWww/static/js/6309.9b4790c0.chunk.js +0 -2
- package/adminWww/static/js/6309.9b4790c0.chunk.js.map +0 -1
- package/adminWww/static/js/6603.d6aaea6e.chunk.js +0 -3
- package/adminWww/static/js/6603.d6aaea6e.chunk.js.map +0 -1
- package/adminWww/static/js/7302.8bdbcaa8.chunk.js +0 -2
- package/adminWww/static/js/7302.8bdbcaa8.chunk.js.map +0 -1
- /package/adminWww/static/js/{6603.d6aaea6e.chunk.js.LICENSE.txt → 6603.614b4df4.chunk.js.LICENSE.txt} +0 -0
- /package/adminWww/static/js/{3868.dd7a3468.chunk.js.LICENSE.txt → 7931.38a8acbc.chunk.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static/js/7302.8bdbcaa8.chunk.js","mappings":"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","sources":["../../../adapter-react-v5/build/src/Theme.tsx","../../../adapter-react-v5/build/src/Prompt.tsx","../../../adapter-react-v5/build/Components/src/Components/Loader.tsx","../../../adapter-react-v5/build/Components/src/Components/Router.tsx","../../../adapter-react-v5/build/Components/src/Components/CopyToClipboard.tsx","../../../adapter-react-v5/build/src/i18n.ts","../../../adapter-react-v5/build/Components/src/Components/Utils.tsx","../../../adapter-react-v5/build/Components/src/Components/SaveCloseButtons.tsx","../../../adapter-react-v5/build/Dialogs/src/Dialogs/Confirm.tsx","../../../adapter-react-v5/build/Dialogs/src/Dialogs/Error.tsx","../../../adapter-react-v5/build/src/dictionary.ts","../../../adapter-react-v5/build/src/GenericApp.tsx","../../../adapter-react-v5/build/Components/src/Components/ColorPicker.tsx","../../../adapter-react-v5/build/Components/SimpleCron/src/Components/SimpleCron/cronText.tsx","../../../adapter-react-v5/build/Components/src/Components/ComplexCron.tsx","../../../adapter-react-v5/build/Components/src/Components/CustomModal.tsx","../../../adapter-react-v5/build/Components/src/Components/withWidth.tsx","../../../adapter-react-v5/build/Dialogs/src/Dialogs/TextInput.tsx","../../../adapter-react-v5/build/icons/src/icons/IconExpert.tsx","../../../adapter-react-v5/build/icons/src/icons/IconClosed.tsx","../../../adapter-react-v5/build/icons/src/icons/IconOpen.tsx","../../../adapter-react-v5/build/icons/src/icons/IconNoIcon.tsx","../../../adapter-react-v5/build/icons/src/icons/IconAlias.tsx","../../../adapter-react-v5/build/Components/src/Components/Icon.tsx","../../../adapter-react-v5/build/Components/src/Components/FileViewer.tsx","../../../adapter-react-v5/build/Components/src/Components/FileBrowser.tsx","../../../adapter-react-v5/build/Components/src/Components/IconSelector.tsx","../../../adapter-react-v5/build/Components/src/Components/IconPicker.tsx","../../../adapter-react-v5/build/Components/src/Components/Image.tsx","../../../adapter-react-v5/build/Components/src/Components/Logo.tsx","../../../adapter-react-v5/build/Components/src/Components/MDUtils.tsx","../../../adapter-react-v5/build/icons/src/icons/IconAdapter.tsx","../../../adapter-react-v5/build/icons/src/icons/IconChannel.tsx","../../../adapter-react-v5/build/icons/src/icons/IconCopy.tsx","../../../adapter-react-v5/build/icons/src/icons/IconDevice.tsx","../../../adapter-react-v5/build/icons/src/icons/IconDocument.tsx","../../../adapter-react-v5/build/icons/src/icons/IconDocumentReadOnly.tsx","../../../adapter-react-v5/build/icons/src/icons/IconInstance.tsx","../../../adapter-react-v5/build/icons/src/icons/IconState.tsx","../../../adapter-react-v5/build/icons/src/icons/IconClearFilter.tsx","../../../adapter-react-v5/build/Components/src/Components/TabContainer.tsx","../../../adapter-react-v5/build/Components/src/Components/TabContent.tsx","../../../adapter-react-v5/build/Components/src/Components/TabHeader.tsx","../../../adapter-react-v5/build/Components/src/Components/ObjectBrowser.tsx","../../../adapter-react-v5/build/Components/src/Components/Schedule.tsx","../../../adapter-react-v5/build/Components/src/Components/SelectWithIcon.tsx","../../../adapter-react-v5/build/Components/src/Components/TableResize.tsx","../../../adapter-react-v5/build/Components/src/Components/TextWithIcon.tsx","../../../adapter-react-v5/build/Components/src/Components/ToggleThemeMenu.tsx","../../../adapter-react-v5/build/Dialogs/src/Dialogs/SelectID.tsx","../../../adapter-react-v5/build/Components/src/Components/TreeTable.tsx","../../../adapter-react-v5/build/Components/src/Components/UploadImage.tsx","../../../adapter-react-v5/build/Components/SimpleCron/src/Components/SimpleCron/index.tsx","../../../adapter-react-v5/build/Components/Loaders/src/Components/Loaders/Vendor.tsx","../../../adapter-react-v5/build/Components/Loaders/src/Components/Loaders/PT.tsx","../../../adapter-react-v5/build/Components/Loaders/src/Components/Loaders/MV.tsx","../../../adapter-react-v5/build/icons/src/icons/IconFx.tsx","../../../adapter-react-v5/build/icons/src/icons/IconLogout.tsx","../../../adapter-react-v5/build/Dialogs/src/Dialogs/ComplexCron.tsx","../../../adapter-react-v5/build/Dialogs/src/Dialogs/Cron.tsx","../../../adapter-react-v5/build/Dialogs/src/Dialogs/Message.tsx","../../../adapter-react-v5/build/Dialogs/src/Dialogs/SelectFile.tsx","../../../adapter-react-v5/build/Dialogs/src/Dialogs/SimpleCron.tsx","../../../adapter-react-v5/build/src/LegacyConnection.tsx"],"sourcesContent":["import { type CSSProperties } from 'react';\nimport { createTheme, alpha, type PaletteOptions as PaletteOptionsMui } from '@mui/material/styles';\nimport { orange, grey } from '@mui/material/colors';\n\nimport type { SimplePaletteColorOptions } from '@mui/material/styles/createPalette';\nimport type { ThemeOptions as ThemeOptionsMui } from '@mui/material/styles/createTheme';\nimport type { IobTheme, ThemeName, ThemeType } from './types';\n\nconst step = (16 - 5) / 23 / 100;\n\n/**\n * Convert hex color in the format '#rrggbb' or '#rgb' to an RGB object.\n */\nfunction toInt(hex: string): { r: number; g: number; b: number } {\n const rgb: { r: number; g: number; b: number } = {\n r: 0,\n g: 0,\n b: 0,\n };\n\n if (hex.length === 7) {\n rgb.r = parseInt(hex.substr(1, 2), 16);\n rgb.g = parseInt(hex.substr(3, 2), 16);\n rgb.b = parseInt(hex.substr(5, 2), 16);\n } else if (hex.length === 4) {\n const r = hex.substr(1, 1);\n const g = hex.substr(2, 1);\n const b = hex.substr(3, 1);\n\n rgb.r = parseInt(r + r, 16);\n rgb.g = parseInt(g + g, 16);\n rgb.b = parseInt(b + b, 16);\n }\n\n return rgb;\n}\n\n/**\n * Convert an RGB object to a hex color string in the format '#rrggbb'.\n */\nfunction toHex(int: { r: number; g: number; b: number }): string {\n return `#${Math.round(int.r).toString(16)}${Math.round(int.g).toString(16)}${Math.round(int.b).toString(16)}`;\n}\n\n/** Returns the hex color string in the format '#rrggbb' */\nfunction getElevation(\n /** color in the format '#rrggbb' or '#rgb' */\n color: string,\n /** overlay color in the format '#rrggbb' or '#rgb' */\n overlayColor: string,\n /** elevation as an integer starting with 1 */\n elevation: number,\n): string {\n const rgb: { r: number; g: number; b: number } = toInt(color);\n const overlay: { r: number; g: number; b: number } = toInt(overlayColor);\n\n rgb.r += overlay.r * (0.05 + step * (elevation - 1));\n rgb.g += overlay.g * (0.05 + step * (elevation - 1));\n rgb.b += overlay.b * (0.05 + step * (elevation - 1));\n\n return toHex(rgb);\n}\n\n/**\n * Get all 24 elevations of the given color and overlay.\n *\n * @param color color in the format '#rrggbb' or '#rgb'\n * @param overlay overlay color in the format '#rrggbb' or '#rgb'\n */\nfunction getElevations(color: string, overlay: string): Record<string, CSSProperties> {\n const elevations: Record<string, CSSProperties> = {};\n\n for (let i = 1; i <= 24; i++) {\n elevations[`elevation${i}`] = {\n backgroundColor: getElevation(color, overlay, i),\n };\n }\n\n return elevations;\n}\n\n// const buttonsPalette = () => ({\n// palette: {\n// // mode: \"dark\",\n// grey: {\n// main: grey[300],\n// dark: grey[400],\n// },\n// },\n// });\n\n// const buttonsTheme = theme => ({\n// components: {\n// MuiButton: {\n// variants: [\n// {\n// props: { variant: 'contained', color: 'grey' },\n// style: {\n// color: theme.palette.getContrastText(theme.palette.grey[300]),\n// },\n// },\n// {\n// props: { variant: 'outlined', color: 'grey' },\n// style: {\n// color: theme.palette.text.primary,\n// borderColor:\n// theme.palette.mode === 'light'\n// ? 'rgba(0, 0, 0, 0.23)'\n// : 'rgba(255, 255, 255, 0.23)',\n// '&.Mui-disabled': {\n// border: `1px solid ${theme.palette.action.disabledBackground}`,\n// },\n// '&:hover': {\n// borderColor:\n// theme.palette.mode === 'light'\n// ? 'rgba(0, 0, 0, 0.23)'\n// : 'rgba(255, 255, 255, 0.23)',\n// backgroundColor: alpha(\n// theme.palette.text.primary,\n// theme.palette.action.hoverOpacity,\n// ),\n// },\n// },\n// },\n// {\n// props: { color: 'grey', variant: 'text' },\n// style: {\n// color: 'black',\n// '&:hover': {\n// backgroundColor: alpha(\n// theme.palette.text.primary,\n// theme.palette.action.hoverOpacity,\n// ),\n// },\n// },\n// },\n// ],\n// },\n// },\n// });\n\ninterface PaletteOptions extends PaletteOptionsMui {\n mode: ThemeType;\n expert: string;\n grey?: {\n main?: string;\n dark?: string;\n 50?: string;\n 100?: string;\n 200?: string;\n 300?: string;\n 400?: string;\n 500?: string;\n 600?: string;\n 700?: string;\n 800?: string;\n 900?: string;\n A100?: string;\n A200?: string;\n A400?: string;\n A700?: string;\n };\n}\n\ninterface ThemeOptions extends ThemeOptionsMui {\n name: ThemeName;\n palette?: PaletteOptions;\n toolbar?: CSSProperties;\n saveToolbar?: {\n background: string;\n button: CSSProperties;\n };\n}\n\n/**\n * The theme creation factory function.\n */\nexport function Theme(type: ThemeName, overrides?: Record<string, any>): IobTheme {\n let options: ThemeOptions;\n let localOverrides: Record<string, any>;\n\n if (type === 'dark') {\n localOverrides = {\n MuiAppBar: {\n colorDefault: {\n backgroundColor: '#272727',\n },\n },\n MuiLink: {\n root: {\n textTransform: 'uppercase',\n transition: 'color .3s ease',\n color: orange[200],\n '&:hover': {\n color: orange[100],\n },\n },\n },\n MuiPaper: getElevations('#121212', '#fff'),\n };\n\n options = {\n name: type,\n palette: {\n mode: 'dark',\n background: {\n paper: '#121212',\n default: '#121212',\n },\n primary: {\n main: '#4dabf5',\n },\n secondary: {\n main: '#436a93',\n },\n expert: '#14bb00',\n text: {\n primary: '#ffffff',\n secondary: '#ffffff',\n },\n },\n };\n } else if (type === 'blue') {\n localOverrides = {\n MuiAppBar: {\n colorDefault: {\n backgroundColor: '#3399CC',\n },\n },\n MuiLink: {\n root: {\n textTransform: 'uppercase',\n transition: 'color .3s ease',\n color: orange[400],\n '&:hover': {\n color: orange[300],\n },\n },\n },\n };\n\n options = {\n name: type,\n palette: {\n mode: 'dark',\n background: {\n paper: '#151d21',\n default: '#151d21',\n },\n primary: {\n main: '#4dabf5',\n },\n secondary: {\n main: '#436a93',\n },\n expert: '#14bb00',\n text: {\n primary: '#ffffff',\n secondary: '#ffffff',\n },\n },\n };\n } else if (type === 'colored') {\n localOverrides = {\n MuiAppBar: {\n colorDefault: {\n backgroundColor: '#2a3135',\n },\n },\n MuiLink: {\n root: {\n textTransform: 'uppercase',\n transition: 'color .3s ease',\n color: orange[200],\n '&:hover': {\n color: orange[100],\n },\n },\n },\n MuiPaper: getElevations('#151d21', '#fff'),\n };\n\n options = {\n name: type,\n palette: {\n mode: 'light',\n primary: {\n main: '#3399CC',\n },\n secondary: {\n main: '#164477',\n },\n expert: '#96fc96',\n },\n };\n } else if (type === 'PT') {\n localOverrides = {\n MuiAppBar: {\n colorDefault: {\n backgroundColor: '#0F99DE',\n },\n },\n MuiLink: {\n root: {\n textTransform: 'uppercase',\n transition: 'color .3s ease',\n color: orange[400],\n '&:hover': {\n color: orange[300],\n },\n },\n },\n };\n\n options = {\n name: type,\n palette: {\n mode: 'light',\n primary: {\n main: '#0F99DE',\n },\n secondary: {\n main: '#88A536',\n },\n expert: '#BD1B24',\n },\n };\n } else if (type === 'DX') {\n localOverrides = {\n MuiAppBar: {\n colorDefault: {\n backgroundColor: '#a9a9a9',\n },\n },\n MuiLink: {\n root: {\n textTransform: 'uppercase',\n transition: 'color .3s ease',\n color: orange[400],\n '&:hover': {\n color: orange[300],\n },\n },\n },\n };\n\n options = {\n name: type,\n palette: {\n mode: 'light',\n primary: {\n main: '#F5F5F7',\n },\n secondary: {\n main: '#a9a9a9',\n },\n expert: '#BD1B24',\n text: {\n primary: '#007AFE',\n secondary: '#007AFE',\n disabled: '#007AFEAA',\n },\n },\n };\n } else {\n localOverrides = {\n MuiLink: {\n root: {\n textTransform: 'uppercase',\n transition: 'color .3s ease',\n color: orange[400],\n '&:hover': {\n color: orange[300],\n },\n },\n },\n };\n\n options = {\n name: type,\n palette: {\n mode: 'light',\n primary: {\n main: '#3399CC',\n dark: '#256c97',\n light: '#76d0fd',\n },\n secondary: {\n main: '#164477',\n },\n expert: '#14bb00',\n },\n };\n }\n\n options.toolbar = {\n height: 48,\n };\n\n options.saveToolbar = {\n background: (options.palette?.primary as SimplePaletteColorOptions)?.main,\n button: {\n borderRadius: 3,\n height: 32,\n },\n };\n\n if (options.palette) {\n options.palette.grey = {\n main: grey[300],\n dark: grey[400],\n };\n }\n\n const theme: IobTheme = createTheme(options) as IobTheme;\n\n const palette: PaletteOptions = theme.palette as PaletteOptions;\n\n return createTheme(theme, {\n ...(overrides || undefined),\n components: {\n ...localOverrides,\n MuiButton: {\n variants: [\n {\n props: { variant: 'contained', color: 'grey' },\n style: {\n backgroundColor: palette.grey?.[300],\n color:\n palette.getContrastText && palette.grey?.[300]\n ? palette.getContrastText(palette.grey[300])\n : undefined,\n },\n },\n {\n props: { variant: 'outlined', color: 'grey' },\n style: {\n color: palette.text?.primary,\n borderColor: palette.mode === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)',\n '&.Mui-disabled': {\n border: `1px solid ${palette.action?.disabledBackground}`,\n },\n '&:hover': {\n borderColor:\n palette.mode === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)',\n backgroundColor: alpha(\n palette.text?.primary || '',\n palette.action?.hoverOpacity || 0.04,\n ),\n },\n },\n },\n {\n props: { variant: 'text', color: 'grey' },\n style: {\n color: palette.text?.primary,\n '&:hover': {\n backgroundColor: alpha(\n palette.text?.primary || '',\n palette.action?.hoverOpacity || 0.04,\n ),\n },\n },\n },\n ],\n },\n ...(overrides?.components || undefined),\n },\n }) as IobTheme;\n}\n","/**\n * Print the ioBroker welcome screen to the developer console.\n */\nexport function printPrompt(): void {\n const prompt = `\n██╗ ██████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗███████╗██████╗ \n██║██╔═══██╗██╔══██╗██╔══██╗██╔═══██╗██║ ██╔╝██╔════╝██╔══██╗\n██║██║ ██║██████╔╝██████╔╝██║ ██║█████╔╝ █████╗ ██████╔╝\n██║██║ ██║██╔══██╗██╔══██╗██║ ██║██╔═██╗ ██╔══╝ ██╔══██╗\n██║╚██████╔╝██████╔╝██║ ██║╚██████╔╝██║ ██╗███████╗██║ ██║\n╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝\n`;\n\n console.log(prompt);\n console.log(\n 'Nice to see you here! :) Join our dev community here https://github.com/ioBroker/ioBroker or here https://github.com/iobroker-community-adapters',\n );\n console.log('Help us to create open source project with reactJS!');\n console.log('See you :)');\n}\n\nexport default printPrompt;\n","/**\n * Copyright 2018-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport React, { useEffect } from 'react';\nimport type { ThemeName, ThemeType } from '../types';\n// import './loader.css'\n\ndeclare global {\n interface Window {\n loadingBackgroundImage: undefined | string;\n loadingBackgroundColor: undefined | string;\n loadingHideLogo: undefined | 'true';\n }\n}\n\nconst loaderStyles = `\n/**\n * Copyright 2018-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n **/\n\n.logo-background-light, .logo-background-colored {\n background: white;\n}\n.logo-background-dark, .logo-background-blue {\n background: black;\n}\n.logo-div {\n position: absolute;\n top: 50%;\n left: 50%;\n -ms-transform: translateX(-50%) translateY(-50%);\n -webkit-transform: translate(-50%,-50%);\n transform: translate(-50%,-50%);\n overflow: hidden;\n border-radius: 50%;\n z-index: 2;\n}\n.logo-border {\n /*border-color: #164477;*/\n border-top-color: #3399CC;\n border-left-color: #164477;\n border-bottom-color: #164477;\n border-right-color: #164477;\n border-radius: 50%;\n border-style: solid;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n position: absolute;\n}\n.logo-top {\n position: absolute;\n width: 4.5%;\n height: 16%;\n top: 0;\n z-index: 2;\n}\n.logo-i {\n position: absolute;\n width: 14.5%;\n height: 60%;\n top: 20%;\n left: 42%;\n background: #3399CC;\n}\n.logo-i-top {\n position: absolute;\n width: 14.5%;\n height: 4%;\n left: 42%;\n background: #3399CC;\n border-radius: 100%;\n}\n.logo-back {\n width: 100%;\n height: 100%;\n z-index: 0;\n overflow: hidden;\n}\n@keyframes logo-grow {\n 0% {\n width: 230px;\n height: 230px;\n transform: translate(-50%,-50%) scale(1);\n opacity: 1\n }\n 99% {\n width: 230px;\n height: 230px;\n transform: translate(-50%,-50%) scale(10);\n opacity: 0;\n }\n 100% {\n width: 0;\n height: 0;\n opacity: 0;\n }\n}\n@keyframes logo-spin { 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } }\n@keyframes logo-color-inside-light {\n 0% {\n background: #FEFEFE;\n }\n 100% {\n background: #3399CC;\n }\n}\n@keyframes logo-color-inside-dark {\n 0% {\n background: #030303;\n }\n 100% {\n background: #3399CC;\n }\n}\n@keyframes logo-color-inside-colored {\n 0% {\n background: #FEFEFE;\n }\n 100% {\n background: #3399CC;\n }\n}\n@keyframes logo-color-inside-blue {\n 0% {\n background: #030303;\n }\n 100% {\n background: #3399CC;\n }\n}\n\n@keyframes logo-color-outside-light {\n 0% {\n border-color: #FEFEFE;\n }\n 100% {\n border-top-color: #3399CC;\n border-left-color: #164477;\n border-bottom-color: #164477;\n border-right-color: #164477;\n }\n}\n@keyframes logo-color-outside-dark {\n 0% {\n border-color: #040404;\n }\n 100% {\n border-top-color: #3399CC;\n border-left-color: #164477;\n border-bottom-color: #164477;\n border-right-color: #164477;\n }\n}\n@keyframes logo-color-outside-colored {\n 0% {\n border-color: #FEFEFE;\n }\n 100% {\n border-top-color: #3399CC;\n border-left-color: #164477;\n border-bottom-color: #164477;\n border-right-color: #164477;\n }\n}\n@keyframes logo-color-outside-blue {\n 0% {\n border-color: #040404;\n }\n 100% {\n border-top-color: #3399CC;\n border-left-color: #164477;\n border-bottom-color: #164477;\n border-right-color: #164477;\n }\n}\n\n.logo-animate-wait {\n animation: logo-color-outside 1.5s, logo-spin 1.5s linear infinite;\n}\n\n.logo-animate-grow-light {\n background: #DDD;\n}\n.logo-animate-grow-dark {\n background: #1d1d1d;\n}\n.logo-animate-grow-colored {\n background: #DDD;\n}\n.logo-animate-grow-blue {\n background: #1d1d1d;\n}\n\n.logo-animate-grow {\n display: inline-block;\n text-align: center;\n z-index: 1;\n top: 50%;\n left: 50%;\n -ms-transform: translateX(-50%) translateY(-50%);\n -webkit-transform: translate(-50%,-50%);\n transform: translate(-50%,-50%);\n width: 245px;\n height: 245px;\n border-radius: 50%;\n position: absolute;\n animation: logo-grow 1s 1 ease forwards;\n}\n\n.logo-animate-color-inside-light {\n animation: logo-color-inside-light 2.5s;\n}\n.logo-animate-color-inside-dark {\n animation: logo-color-inside-dark 2.5s;\n}\n.logo-animate-color-inside-colored {\n animation: logo-color-inside-colored 2.5s;\n}\n.logo-animate-color-inside-blue {\n animation: logo-color-inside-blue 2.5s;\n}\n\n.logo-animate-color-outside-light {\n animation: logo-color-outside-light 1.5s;\n}\n.logo-animate-color-outside-dark {\n animation: logo-color-outside-dark 1.5s;\n}\n.logo-animate-color-outside-colored {\n animation: logo-color-outside-colored 1.5s;\n}\n.logo-animate-color-outside-blue {\n animation: logo-color-outside-blue 1.5s;\n}\n`;\n\ninterface LoaderProps {\n /** The size in pixels of this loader. */\n size?: number;\n /** The chosen theme type. */\n themeType?: ThemeType;\n /** Theme name */\n themeName?: ThemeName;\n /** @deprecated Theme name. use themeName instead */\n theme?: ThemeName;\n /** Background color */\n backgroundColor?: string;\n /** Background image URL */\n backgroundImage?: string;\n}\n\nexport function Loader(props: LoaderProps): React.JSX.Element {\n useEffect(() => {\n if (!window.document.getElementById('loader-iobroker-component')) {\n const style = window.document.createElement('style');\n style.setAttribute('id', 'loader-iobroker-component');\n style.innerHTML = loaderStyles;\n window.document.head.appendChild(style);\n }\n }, []);\n\n const size = props.size || 234;\n const theme = props.themeName || props.theme || props.themeType || 'light';\n return (\n <div\n className={`logo-back logo-background-${theme}`}\n style={{\n backgroundImage:\n props.backgroundImage && props.backgroundImage !== '@@loginBackgroundImage@@'\n ? props.backgroundImage\n : window.loadingBackgroundImage && window.loadingBackgroundImage !== '@@loginBackgroundImage@@'\n ? `url(${window.loadingBackgroundImage})`\n : undefined,\n backgroundColor:\n props.backgroundColor && props.backgroundColor !== '@@loginBackgroundColor@@'\n ? props.backgroundColor\n : window.loadingBackgroundColor && window.loadingBackgroundColor !== '@@loginBackgroundColor@@'\n ? window.loadingBackgroundColor\n : undefined,\n backgroundSize: 'cover',\n }}\n >\n {window.loadingHideLogo === 'true' ? null : (\n <>\n <div\n className=\"logo-div\"\n style={{ width: size, height: size }}\n >\n <div\n className={`logo-top logo-background-${theme}`}\n style={{ left: '37%' }}\n />\n <div\n className={`logo-top logo-background-${theme}`}\n style={{ left: '57%' }}\n />\n <div\n className={`logo-border logo-background-${theme} logo-animate-wait`}\n style={{ borderWidth: size * 0.132 }}\n />\n <div className={`logo-i logo-animate-color-inside-${theme}`} />\n <div\n className={`logo-i-top logo-animate-color-inside-${theme}`}\n style={{ top: '18%' }}\n />\n <div\n className={`logo-i-top logo-animate-color-inside-${theme}`}\n style={{ bottom: '18%' }}\n />\n </div>\n <div\n className={`logo-animate-grow logo-animate-grow-${theme}`}\n style={{ width: size + 11, height: size + 11 }}\n />\n </>\n )}\n </div>\n );\n}\n","import { Component } from 'react';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport class Router<P = {}, S = {}> extends Component<P, S> {\n protected onHashChangedBound: () => void;\n\n constructor(props: P) {\n super(props);\n this.onHashChangedBound = this.onHashChanged.bind(this);\n }\n\n componentDidMount(): void {\n window.addEventListener('hashchange', this.onHashChangedBound);\n }\n\n componentWillUnmount(): void {\n window.removeEventListener('hashchange', this.onHashChangedBound);\n }\n\n // eslint-disable-next-line class-methods-use-this\n onHashChanged(): void {\n // override this function\n }\n\n /**\n * Gets the location object.\n */\n static getLocation(): { tab: string; dialog: string; id: string; arg: string } {\n let hash = window.location.hash;\n hash = hash.replace(/^#/, '');\n const parts = hash.split('/').map(item => {\n try {\n return item ? decodeURIComponent(item) : '';\n } catch {\n console.error(`Router: Cannot decode ${item}`);\n return item;\n }\n });\n // #tabName/dialogName/deviceId\n return {\n tab: parts[0] || '',\n dialog: parts[1] || '',\n id: parts[2] || '',\n arg: parts[3] || '',\n };\n }\n\n /**\n * Navigate to a new location. Any parameters that are not set will be taken from the current location.\n */\n static doNavigate(\n tab: string | undefined | null,\n dialog?: string | null,\n id?: string | null,\n arg?: string | null,\n ): void {\n let hash = '';\n const location = Router.getLocation();\n if (arg !== undefined && !id) {\n id = location.id;\n }\n if (id && !dialog) {\n dialog = location.dialog;\n }\n if (dialog && !tab) {\n tab = location.tab;\n } else if (tab === null) {\n tab = location.tab;\n }\n\n if (tab) {\n hash = `#${tab}`;\n if (dialog) {\n hash += `/${dialog}`;\n\n if (id) {\n hash += `/${id}`;\n if (arg !== undefined) {\n hash += `/${arg}`;\n }\n }\n }\n }\n if (window.location.hash !== hash) {\n window.location.hash = hash;\n }\n }\n}\n","/*\nMIT License\n\nCopyright (c) 2017 sudodoki <smd.deluzion@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n */\n// https://github.com/sudodoki/toggle-selection/blob/gh-pages/index.js\nfunction deselectCurrent() {\n const selection = document.getSelection();\n if (!selection?.rangeCount) {\n return () => {};\n }\n let active = document.activeElement as HTMLElement | null;\n\n const ranges: Range[] = [];\n for (let i = 0; i < selection.rangeCount; i++) {\n ranges.push(selection.getRangeAt(i));\n }\n\n switch (\n active?.tagName.toUpperCase() // .toUpperCase handles XHTML\n ) {\n case 'INPUT':\n case 'TEXTAREA':\n active.blur();\n break;\n\n default:\n active = null;\n break;\n }\n\n selection.removeAllRanges();\n return () => {\n selection.type === 'Caret' && selection.removeAllRanges();\n\n if (!selection.rangeCount) {\n ranges.forEach(range => selection.addRange(range));\n }\n\n active && active.focus();\n };\n}\n\n// https://github.com/sudodoki/copy-to-clipboard/blob/master/index.js\n\nconst clipboardToIE11Formatting = {\n 'text/plain': 'Text',\n 'text/html': 'Url',\n default: 'Text',\n};\n\nconst defaultMessage = 'Copy to clipboard: #{key}, Enter';\n\nfunction format(message: string): string {\n const copyKey = `${/mac os x/i.test(navigator.userAgent) ? '⌘' : 'Ctrl'}+C`;\n return message.replace(/#{\\s*key\\s*}/g, copyKey);\n}\n\n/**\n * Copy text to clipboard\n *\n * @param text Text to copy\n * @param options Options\n * @param options.debug Debug mode\n * @param options.format Format of the data\n * @param options.message Message to show in prompt\n */\nexport function copy(\n text: string,\n options?: { debug?: boolean; format?: 'text/plain' | 'text/html'; message?: string },\n): boolean {\n let reselectPrevious;\n let range;\n let selection;\n let mark;\n let success = false;\n options = options || {};\n const debug = options.debug || false;\n try {\n reselectPrevious = deselectCurrent();\n\n range = document.createRange();\n selection = document.getSelection();\n\n mark = document.createElement('span');\n mark.textContent = text;\n // avoid screen readers from reading out loud the text\n mark.ariaHidden = 'true';\n // reset user styles for span element\n mark.style.all = 'unset';\n // prevents scrolling to the end of the page\n mark.style.position = 'fixed';\n mark.style.top = '0px';\n mark.style.clip = 'rect(0, 0, 0, 0)';\n // used to preserve spaces and line breaks\n mark.style.whiteSpace = 'pre';\n // do not inherit user-select (it may be `none`)\n mark.style.userSelect = 'text';\n mark.addEventListener('copy', e => {\n e.stopPropagation();\n if (options?.format) {\n e.preventDefault();\n if (typeof e.clipboardData === 'undefined') {\n // IE 11\n debug && console.warn('unable to use e.clipboardData');\n debug && console.warn('trying IE specific stuff');\n (window as any).clipboardData?.clearData();\n const _format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting.default;\n (window as any).clipboardData?.setData(_format, text);\n } else {\n // all other browsers\n e.clipboardData?.clearData();\n e.clipboardData?.setData(options.format, text);\n }\n }\n });\n\n document.body.appendChild(mark);\n\n range.selectNodeContents(mark);\n selection?.addRange(range);\n\n // there is no alternative for execCommand\n const successful = document.execCommand('copy');\n if (!successful) {\n throw new Error('copy command was unsuccessful');\n }\n success = true;\n } catch (err) {\n debug && console.error('unable to copy using execCommand: ', err);\n debug && console.warn('trying IE specific stuff');\n try {\n (window as any).clipboardData.setData(options.format || 'text', text);\n // options.onCopy && options.onCopy((window as any).clipboardData);\n success = true;\n } catch (error) {\n debug && console.error('unable to copy using clipboardData: ', error);\n debug && console.error('falling back to prompt');\n const message = format('message' in options ? options.message || '' : defaultMessage);\n window.prompt(message, text);\n }\n } finally {\n if (selection) {\n if (range && typeof selection.removeRange === 'function') {\n selection.removeRange(range);\n } else {\n selection.removeAllRanges();\n }\n }\n\n if (mark) {\n document.body.removeChild(mark);\n }\n reselectPrevious && reselectPrevious();\n }\n\n return success;\n}\n","/**\n * Copyright 2018-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\ndeclare global {\n interface Window {\n sysLang: ioBroker.Languages;\n i18nShow: (filter: string | RegExp) => void;\n i18nDisableWarning: (disable: boolean) => void;\n }\n}\n\ntype I18nWordDictionary = Record<ioBroker.Languages, string>;\n\ntype I18nWordsDictionary = Record<string, I18nWordDictionary>;\n\ntype I18nOneLanguageDictionary = Record<string, string>;\n\ntype I18nDictionary = {\n [lang in ioBroker.Languages]?: I18nOneLanguageDictionary;\n};\n\ntype I18nWordsWithPrefix = I18nDictionary & { prefix?: string };\n\n/**\n * Translation string management.\n */\nexport class I18n {\n /** List of all languages with their translations. */\n static translations: I18nDictionary = {};\n\n /** List of unknown translations during development. */\n static unknownTranslations: string[] = [];\n\n /** The currently displayed language. */\n static lang: ioBroker.Languages = window.sysLang || 'en';\n\n static _disableWarning: boolean = false;\n\n /**\n * Set the language to display\n *\n * @param lang The default language for translations.\n */\n static setLanguage(lang: ioBroker.Languages): void {\n if (lang) {\n I18n.lang = lang;\n }\n }\n\n /**\n * Add translations\n * User can provide two types of structures:\n * - {\"word1\": \"translated word1\", \"word2\": \"translated word2\"}, but in this case the lang must be provided\n * - {\"word1\": {\"en\": \"translated en word1\", \"de\": \"translated de word1\"}, \"word2\": {\"en\": \"translated en word2\", \"de\": \"translated de word2\"}}, but no lang must be provided\n *\n * @param words additional words for specific language\n * @param lang language for the words\n */\n static extendTranslations(\n words: I18nWordsWithPrefix | I18nOneLanguageDictionary | I18nWordsDictionary,\n lang?: ioBroker.Languages,\n ): void {\n // automatically extend all languages with prefix\n if ((words as I18nWordsWithPrefix).prefix) {\n const wordsWithPrefix = words as I18nWordsWithPrefix;\n if (typeof wordsWithPrefix.prefix === 'string') {\n const prefix = wordsWithPrefix.prefix;\n delete wordsWithPrefix.prefix;\n Object.keys(wordsWithPrefix).forEach(key => {\n const _lang = key as ioBroker.Languages;\n const _words: I18nOneLanguageDictionary = {};\n const wordsOfOneLanguage = wordsWithPrefix[_lang];\n Object.keys(wordsOfOneLanguage as Record<string, string>).forEach(word => {\n if (!word) {\n return;\n }\n if (wordsOfOneLanguage) {\n if (!word.startsWith(prefix)) {\n _words[`${prefix}${word}`] = wordsOfOneLanguage[word];\n } else {\n _words[word] = wordsOfOneLanguage[word];\n }\n }\n });\n words[_lang] = _words;\n });\n } else {\n console.warn('Found prefix in translations, but it is not a string');\n }\n }\n\n try {\n if (!lang) {\n // if it is a dictionary with all/many languages\n if (words.en && words.de && words.ru) {\n Object.keys(words).forEach(key => {\n const _lang = key as ioBroker.Languages;\n I18n.translations[_lang] = I18n.translations[_lang] || {};\n const wordsOfOneLang: I18nOneLanguageDictionary | undefined = I18n.translations[_lang];\n Object.assign(wordsOfOneLang as Record<string, string>, words[_lang]);\n });\n } else {\n // It could be vice versa: words.word1 = {en: 'translated word1', de: 'übersetztes Wort2'}\n Object.keys(words).forEach(word => {\n const _word: I18nWordDictionary = (words as I18nWordsDictionary)[word];\n Object.keys(_word).forEach(key => {\n const _lang = key as ioBroker.Languages;\n const languageDictionary: I18nOneLanguageDictionary | undefined = I18n.translations[_lang];\n if (!languageDictionary) {\n console.warn(`Used unknown language: ${_lang}`);\n } else if (!languageDictionary[word]) {\n languageDictionary[word] = _word[_lang];\n } else if (languageDictionary[word] !== _word[_lang]) {\n console.warn(\n `Translation for word \"${word}\" in \"${_lang}\" was ignored: existing = \"${languageDictionary[word]}\", new = ${_word[_lang]}`,\n );\n }\n });\n });\n }\n } else {\n // translations for one language\n if (!I18n.translations[lang]) {\n console.warn(`Used unknown language: ${lang}`);\n }\n I18n.translations[lang] = I18n.translations[lang] || {};\n const languageDictionary: I18nOneLanguageDictionary | undefined = I18n.translations[lang];\n if (languageDictionary) {\n Object.keys(words).forEach(word => {\n if (!languageDictionary[word]) {\n languageDictionary[word] = (words as I18nOneLanguageDictionary)[word];\n } else if (languageDictionary[word] !== (words as I18nOneLanguageDictionary)[word]) {\n console.warn(\n `Translation for word \"${word}\" in \"${lang}\" was ignored: existing = \"${languageDictionary[word]}\", new = ${(words as I18nOneLanguageDictionary)[word]}`,\n );\n }\n });\n }\n }\n } catch (e: any) {\n console.error(`Cannot apply translations: ${e}`);\n }\n }\n\n /**\n * Sets all translations (in all languages).\n *\n * @param translations The translations to add.\n */\n static setTranslations(translations: I18nDictionary): void {\n if (translations) {\n I18n.translations = translations;\n }\n }\n\n /**\n * Get the currently chosen language.\n *\n * @returns The current language.\n */\n static getLanguage(): ioBroker.Languages {\n return I18n.lang;\n }\n\n /**\n * Translate the given string to the selected language\n *\n * @param word The (key) word to look up the string.\n * @param args Optional arguments which will replace the first (second, third, ...) occurrences of %s\n */\n static t(word: string, ...args: any[]): string {\n const translation = I18n.translations[I18n.lang];\n if (translation) {\n const w = translation[word];\n if (w) {\n word = w;\n } else {\n if (!I18n.unknownTranslations.includes(word)) {\n I18n.unknownTranslations.push(word);\n !I18n._disableWarning && console.log(`Translate: ${word}`);\n }\n // fallback to english\n if (I18n.lang !== 'en' && I18n.translations.en) {\n const wordEn = I18n.translations.en[word];\n if (wordEn) {\n word = wordEn;\n }\n }\n }\n }\n for (const arg of args) {\n word = word.replace('%s', arg);\n }\n return word;\n }\n\n /**\n * Show non-translated words\n * Required during development\n *\n * @param filter The filter to apply to the list of non-translated words.\n */\n static i18nShow(filter?: string | RegExp): void {\n /** List words with their translations. */\n const result: Record<string, string> = {};\n if (!filter) {\n I18n.unknownTranslations.forEach(word => (result[word] = word));\n console.log(JSON.stringify(result, null, 2));\n } else if (typeof filter === 'string') {\n I18n.unknownTranslations.forEach(word => {\n if (word.startsWith(filter)) {\n result[word] = word.replace(filter, '');\n }\n });\n console.log(JSON.stringify(result, null, 2));\n } else if (typeof filter === 'object') {\n I18n.unknownTranslations.forEach(word => {\n if (filter.test(word)) {\n result[word] = word;\n }\n });\n console.log(JSON.stringify(result, null, 2));\n }\n }\n\n /**\n * Disable warning about non-translated words\n * Required during development\n *\n * @param disable Whether to disable the warning\n */\n static disableWarning(disable: boolean): void {\n I18n._disableWarning = !!disable;\n }\n}\n\n// install global handlers\nwindow.i18nShow = I18n.i18nShow;\nwindow.i18nDisableWarning = I18n.disableWarning;\n\n/*\nI18n.translations = {\n 'en': require('./i18n/en'),\n 'ru': require('./i18n/ru'),\n 'de': require('./i18n/de'),\n};\nI18n.fallbacks = true;\nI18n.t = function () {};\n*/\n","/**\n * Copyright 2018-2024 Denis Haev <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport React from 'react';\n\nimport { copy } from './CopyToClipboard';\nimport { I18n } from '../i18n';\nimport type { IobTheme, ThemeName, ThemeType } from '../types';\n\nconst NAMESPACE = 'material';\nconst days = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst QUALITY_BITS: Record<ioBroker.STATE_QUALITY[keyof ioBroker.STATE_QUALITY], string> = {\n 0x00: '0x00 - good',\n\n 0x01: '0x01 - general problem',\n 0x02: '0x02 - no connection problem',\n\n 0x10: '0x10 - substitute value from controller',\n 0x20: '0x20 - substitute initial value',\n 0x40: '0x40 - substitute value from device or instance',\n 0x80: '0x80 - substitute value from sensor',\n\n 0x11: '0x11 - general problem by instance',\n 0x41: '0x41 - general problem by device',\n 0x81: '0x81 - general problem by sensor',\n\n 0x12: '0x12 - instance not connected',\n 0x42: '0x42 - device not connected',\n 0x82: '0x82 - sensor not connected',\n\n 0x44: '0x44 - device reports error',\n 0x84: '0x84 - sensor reports error',\n};\nconst SIGNATURES: Record<string, string> = {\n JVBERi0: 'pdf',\n R0lGODdh: 'gif',\n R0lGODlh: 'gif',\n iVBORw0KGgo: 'png',\n '/9j/': 'jpg',\n PHN2Zw: 'svg',\n Qk1: 'bmp',\n AAABAA: 'ico', // 00 00 01 00 according to https://en.wikipedia.org/wiki/List_of_file_signatures\n};\n\ntype SmartName =\n | null\n | false\n | string\n | ({ [lang in ioBroker.Languages]?: string } & {\n /** Which kind of device it is */\n smartType?: string | null;\n /** Which value to set when the ON command is issued */\n byON?: string | null;\n });\n\ntype ClassDictionary = Record<string, any>;\ntype ClassValue = ClassArray | ClassDictionary | string | number | null | boolean | undefined;\ntype ClassArray = ClassValue[];\n\nexport class Utils {\n static namespace = NAMESPACE;\n\n static INSTANCES = 'instances';\n\n static dateFormat = ['DD', 'MM'];\n\n static FORBIDDEN_CHARS = /[^._\\-/ :!#$%&()+=@^{}|~\\p{Ll}\\p{Lu}\\p{Nd}]+/gu;\n\n /**\n * Capitalize words.\n */\n static CapitalWords(name: string | null | undefined): string {\n return (name || '')\n .split(/[\\s_]/)\n .filter(item => item)\n .map(word => (word ? word[0].toUpperCase() + word.substring(1).toLowerCase() : ''))\n .join(' ');\n }\n\n static formatSeconds(seconds: number): string {\n const days_ = Math.floor(seconds / (3600 * 24));\n seconds %= 3600 * 24;\n\n const hours = Math.floor(seconds / 3600)\n .toString()\n .padStart(2, '0');\n seconds %= 3600;\n\n const minutes = Math.floor(seconds / 60)\n .toString()\n .padStart(2, '0');\n seconds %= 60;\n\n const secondsStr = Math.floor(seconds).toString().padStart(2, '0');\n\n let text = '';\n if (days_) {\n text += `${days_} ${I18n.t('ra_daysShortText')} `;\n }\n text += `${hours}:${minutes}:${secondsStr}`;\n\n return text;\n }\n\n /**\n * Get the name of the object by id from the name or description.\n */\n static getObjectName(\n objects: Record<string, ioBroker.Object>,\n id: string,\n settings?: { name: ioBroker.StringOrTranslated } | ioBroker.Languages | null,\n options?: { language?: ioBroker.Languages },\n /** Set to true to get the description. */\n isDesc?: boolean,\n ): string {\n const item = objects[id];\n let text: string | undefined;\n\n if (typeof settings === 'string' && !options) {\n options = { language: settings };\n settings = null;\n }\n\n options = options || {};\n if (!options.language) {\n options.language =\n (objects['system.config'] &&\n objects['system.config'].common &&\n objects['system.config'].common.language) ||\n window.sysLang ||\n 'en';\n }\n if ((settings as { name: ioBroker.StringOrTranslated })?.name) {\n const textObj = (settings as { name: ioBroker.StringOrTranslated }).name;\n if (typeof textObj === 'object') {\n text = (options.language && textObj[options.language]) || textObj.en;\n } else {\n text = textObj;\n }\n } else if (isDesc && item?.common?.desc) {\n const textObj = item.common.desc;\n if (typeof textObj === 'object') {\n text = (options.language && textObj[options.language]) || textObj.en || textObj.de || textObj.ru || '';\n } else {\n text = textObj;\n }\n text = (text || '').toString().replace(/[_.]/g, ' ');\n\n if (text === text.toUpperCase()) {\n text = text[0] + text.substring(1).toLowerCase();\n }\n } else if (!isDesc && item?.common) {\n const textObj = item.common.name || item.common.desc;\n if (textObj && typeof textObj === 'object') {\n text = (options.language && textObj[options.language]) || textObj.en || textObj.de || textObj.ru || '';\n } else {\n text = textObj as string;\n }\n text = (text || '').toString().replace(/[_.]/g, ' ');\n\n if (text === text.toUpperCase()) {\n text = text[0] + text.substring(1).toLowerCase();\n }\n } else {\n const pos = id.lastIndexOf('.');\n text = id.substring(pos + 1).replace(/[_.]/g, ' ');\n text = Utils.CapitalWords(text);\n }\n\n return text?.trim() || '';\n }\n\n /**\n * Get the name of the object from the name or description.\n */\n static getObjectNameFromObj(\n obj: ioBroker.PartialObject,\n /** settings or language */\n settings: { name: ioBroker.StringOrTranslated } | ioBroker.Languages | null,\n options?: { language?: ioBroker.Languages },\n /** Set to true to get the description. */\n isDesc?: boolean,\n /** Allow using spaces in name (by edit) */\n noTrim?: boolean,\n ): string {\n const item = obj;\n let text = (obj && obj._id) || '';\n\n if (typeof settings === 'string' && !options) {\n options = { language: settings };\n settings = null;\n }\n\n options = options || {};\n\n if ((settings as { name: ioBroker.StringOrTranslated })?.name) {\n const name = (settings as { name: ioBroker.StringOrTranslated }).name;\n if (typeof name === 'object') {\n text = (options.language && name[options.language]) || name.en;\n } else {\n text = name;\n }\n } else if (isDesc && item?.common?.desc) {\n const desc: ioBroker.StringOrTranslated = item.common.desc;\n if (typeof desc === 'object') {\n text = (options.language && desc[options.language]) || desc.en;\n } else {\n text = desc;\n }\n text = (text || '').toString().replace(/[_.]/g, ' ');\n\n if (text === text.toUpperCase()) {\n text = text[0] + text.substring(1).toLowerCase();\n }\n } else if (!isDesc && item?.common?.name) {\n let name = item.common.name;\n if (!name && item.common.desc) {\n name = item.common.desc;\n }\n if (typeof name === 'object') {\n text = (options.language && name[options.language]) || name.en;\n } else {\n text = name;\n }\n text = (text || '').toString().replace(/[_.]/g, ' ');\n\n if (text === text.toUpperCase()) {\n text = text[0] + text.substring(1).toLowerCase();\n }\n }\n return noTrim ? text : text.trim();\n }\n\n /**\n * Extracts from the object material settings, depends on username\n */\n static getSettingsOrder(\n obj: ioBroker.StateObject | ioBroker.StateCommon,\n forEnumId: string,\n options: { user?: string },\n ): string | null {\n let common: ioBroker.StateCommon | undefined;\n if (obj && Object.prototype.hasOwnProperty.call(obj, 'common')) {\n common = (obj as ioBroker.StateObject).common;\n } else {\n common = obj as any as ioBroker.StateCommon;\n }\n let settings;\n if (common?.custom) {\n settings = common.custom[NAMESPACE];\n const user = options.user || 'admin';\n if (settings && settings[user]) {\n if (forEnumId) {\n if (settings[user].subOrder && settings[user].subOrder[forEnumId]) {\n return JSON.parse(JSON.stringify(settings[user].subOrder[forEnumId]));\n }\n } else if (settings[user].order) {\n return JSON.parse(JSON.stringify(settings[user].order));\n }\n }\n }\n return null;\n }\n\n /**\n Used in material\n */\n static getSettingsCustomURLs(\n obj: ioBroker.StateObject | ioBroker.StateCommon,\n forEnumId: string,\n options: { user?: string },\n ): string | null {\n let common: ioBroker.StateCommon | undefined;\n if (obj && Object.prototype.hasOwnProperty.call(obj, 'common')) {\n common = (obj as ioBroker.StateObject).common;\n } else {\n common = obj as any as ioBroker.StateCommon;\n }\n let settings;\n if (common?.custom) {\n settings = common.custom[NAMESPACE];\n const user = options.user || 'admin';\n if (settings && settings[user]) {\n if (forEnumId) {\n if (settings[user].subURLs && settings[user].subURLs[forEnumId]) {\n return JSON.parse(JSON.stringify(settings[user].subURLs[forEnumId]));\n }\n } else if (settings[user].URLs) {\n return JSON.parse(JSON.stringify(settings[user].URLs));\n }\n }\n }\n return null;\n }\n\n /**\n * Reorder the array items in list between source and dest.\n */\n static reorder(list: Iterable<any> | ArrayLike<any>, source: number, dest: number): Iterable<any> | ArrayLike<any> {\n const result = Array.from(list);\n const [removed] = result.splice(source, 1);\n result.splice(dest, 0, removed);\n return result;\n }\n\n /**\n Get smart name settings for the given object.\n */\n static getSettings(\n obj: ioBroker.StateObject | ioBroker.StateCommon,\n options: {\n id?: string;\n user?: string;\n name?: ioBroker.StringOrTranslated;\n icon?: string;\n color?: string;\n language?: ioBroker.Languages;\n },\n defaultEnabling?: boolean,\n ): {\n name: string;\n enabled?: boolean;\n useCustom?: boolean;\n icon?: string;\n color?: string;\n } {\n let settings;\n const id = (obj as ioBroker.StateObject)?._id || options?.id;\n let common: ioBroker.StateCommon | undefined;\n if (obj && Object.prototype.hasOwnProperty.call(obj, 'common')) {\n common = (obj as ioBroker.StateObject).common;\n } else {\n common = obj as ioBroker.StateCommon;\n }\n if (common?.custom) {\n settings = common.custom;\n settings =\n settings[NAMESPACE] && settings[NAMESPACE][options.user || 'admin']\n ? JSON.parse(JSON.stringify(settings[NAMESPACE][options.user || 'admin']))\n : { enabled: true };\n } else {\n settings = { enabled: defaultEnabling === undefined ? true : defaultEnabling, useCustom: false };\n }\n\n if (!Object.prototype.hasOwnProperty.call(settings, 'enabled')) {\n settings.enabled = defaultEnabling === undefined ? true : defaultEnabling;\n }\n\n if (options) {\n if (!settings.name && options.name) {\n settings.name = options.name;\n }\n if (!settings.icon && options.icon) {\n settings.icon = options.icon;\n }\n if (!settings.color && options.color) {\n settings.color = options.color;\n }\n }\n\n if (common) {\n if (!settings.color && common.color) {\n settings.color = common.color;\n }\n if (!settings.icon && common.icon) {\n settings.icon = common.icon;\n }\n if (!settings.name && common.name) {\n settings.name = common.name;\n }\n }\n\n if (typeof settings.name === 'object') {\n settings.name = (options.language && settings.name[options.language]) || settings.name.en;\n\n settings.name = (settings.name || '').toString().replace(/_/g, ' ');\n\n if (settings.name === settings.name.toUpperCase()) {\n settings.name = settings.name[0] + settings.name.substring(1).toLowerCase();\n }\n }\n if (!settings.name && id) {\n const pos = id.lastIndexOf('.');\n settings.name = id.substring(pos + 1).replace(/[_.]/g, ' ');\n settings.name = (settings.name || '').toString().replace(/_/g, ' ');\n settings.name = Utils.CapitalWords(settings.name);\n }\n\n return settings;\n }\n\n /**\n Sets smartName settings for the given object.\n */\n static setSettings(\n obj: Partial<ioBroker.Object>,\n settings: Record<string, any>,\n options: { user?: string; language?: ioBroker.Languages },\n ): boolean {\n if (obj) {\n obj.common = obj.common || ({} as ioBroker.StateCommon);\n obj.common.custom = obj.common.custom || {};\n obj.common.custom[NAMESPACE] = obj.common.custom[NAMESPACE] || {};\n obj.common.custom[NAMESPACE][options.user || 'admin'] = settings;\n const s = obj.common.custom[NAMESPACE][options.user || 'admin'];\n if (s.useCommon) {\n if (s.color !== undefined) {\n obj.common.color = s.color;\n delete s.color;\n }\n if (s.icon !== undefined) {\n obj.common.icon = s.icon;\n delete s.icon;\n }\n if (s.name !== undefined) {\n if (typeof obj.common.name !== 'object' && options.language) {\n obj.common.name = { [options.language]: s.name } as ioBroker.StringOrTranslated;\n } else if (typeof obj.common.name === 'object' && options.language) {\n obj.common.name[options.language] = s.name;\n }\n delete s.name;\n }\n }\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Get the icon for the given settings.\n */\n static getIcon(\n settings: { icon?: string; name?: string; prefix?: string },\n style?: React.CSSProperties,\n ): React.JSX.Element | null {\n if (settings?.icon) {\n // If UTF-8 icon\n if (settings.icon.length <= 2) {\n return <span style={style || {}}>{settings.icon}</span>;\n }\n if (settings.icon.startsWith('data:image')) {\n return (\n <img\n alt={settings.name}\n src={settings.icon}\n style={style || {}}\n />\n );\n }\n // maybe later some changes for a second type\n return (\n <img\n alt={settings.name}\n src={(settings.prefix || '') + settings.icon}\n style={style}\n />\n );\n }\n return null;\n }\n\n /**\n * Get the icon for the given object.\n */\n static getObjectIcon(id: string | ioBroker.PartialObject, obj?: ioBroker.PartialObject): string | null {\n // If id is Object\n if (typeof id === 'object') {\n obj = id;\n id = obj?._id;\n }\n\n if (obj?.common?.icon) {\n let icon = obj.common.icon;\n // If UTF-8 icon\n if (typeof icon === 'string' && icon.length <= 2) {\n return icon;\n }\n if (icon.startsWith('data:image')) {\n return icon;\n }\n\n const parts = id.split('.');\n if (parts[0] === 'system') {\n icon = `adapter/${parts[2]}${icon.startsWith('/') ? '' : '/'}${icon}`;\n } else {\n icon = `adapter/${parts[0]}${icon.startsWith('/') ? '' : '/'}${icon}`;\n }\n\n if (window.location.pathname.match(/adapter\\/[^/]+\\/[^/]+\\.html/)) {\n icon = `../../${icon}`;\n } else if (window.location.pathname.match(/material\\/[.\\d]+/)) {\n icon = `../../${icon}`;\n } else if (window.location.pathname.match(/material\\//)) {\n icon = `../${icon}`;\n }\n return icon;\n }\n\n return null;\n }\n\n /**\n * Converts word1_word2 to word1Word2.\n */\n static splitCamelCase(text: string | null | undefined): string {\n // if (false && text !== text.toUpperCase()) {\n // const words = text.split(/\\s+/);\n // for (let i = 0; i < words.length; i++) {\n // const word = words[i];\n // if (word.toLowerCase() !== word && word.toUpperCase() !== word) {\n // let z = 0;\n // const ww = [];\n // let start = 0;\n // while (z < word.length) {\n // if (word[z].match(/[A-ZÜÄÖА-Я]/)) {\n // ww.push(word.substring(start, z));\n // start = z;\n // }\n // z++;\n // }\n // if (start !== z) {\n // ww.push(word.substring(start, z));\n // }\n // for (let k = 0; k < ww.length; k++) {\n // words.splice(i + k, 0, ww[k]);\n // }\n // i += ww.length;\n // }\n // }\n //\n // return words.map(w => {\n // w = w.trim();\n // if (w) {\n // return w[0].toUpperCase() + w.substring(1).toLowerCase();\n // }\n // return '';\n // }).join(' ');\n // }\n return text ? Utils.CapitalWords(text) : '';\n }\n\n /**\n * Check if the given color is bright.\n * https://stackoverflow.com/questions/35969656/how-can-i-generate-the-opposite-color-according-to-current-color\n */\n static isUseBright(color: string | null | undefined, defaultValue?: boolean): boolean {\n if (!color) {\n return defaultValue === undefined ? true : defaultValue;\n }\n color = color.toString();\n if (color.startsWith('#')) {\n color = color.slice(1);\n }\n let r;\n let g;\n let b;\n\n const rgb = color.match(/^rgba?[\\s+]?\\([\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?/i);\n if (rgb && rgb.length === 4) {\n r = parseInt(rgb[1], 10);\n g = parseInt(rgb[2], 10);\n b = parseInt(rgb[3], 10);\n } else {\n // convert 3-digit hex to 6-digits.\n if (color.length === 3) {\n color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2];\n }\n // remove alfa channel\n if (color.length === 8) {\n color = color.substring(0, 6);\n } else if (color.length !== 6) {\n return false;\n }\n\n r = parseInt(color.slice(0, 2), 16);\n g = parseInt(color.slice(2, 4), 16);\n b = parseInt(color.slice(4, 6), 16);\n }\n\n // http://stackoverflow.com/a/3943023/112731\n return r * 0.299 + g * 0.587 + b * 0.114 <= 186;\n }\n\n /**\n * Get the time string in the format 00:00.\n */\n static getTimeString(seconds: string | number): string {\n seconds = parseFloat(seconds as string);\n if (Number.isNaN(seconds)) {\n return '--:--';\n }\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60)\n .toString()\n .padStart(2, '0');\n const secs = (seconds % 60).toString().padStart(2, '0');\n if (hours) {\n return `${hours}:${minutes}:${secs}`;\n }\n\n return `${minutes}:${secs}`;\n }\n\n /**\n * Gets the wind direction with the given angle (degrees).\n */\n static getWindDirection(\n /** angle in degrees from 0° to 360° */\n angle: number,\n ): string {\n if (angle >= 0 && angle < 11.25) {\n return 'N';\n }\n if (angle >= 11.25 && angle < 33.75) {\n return 'NNE';\n }\n if (angle >= 33.75 && angle < 56.25) {\n return 'NE';\n }\n if (angle >= 56.25 && angle < 78.75) {\n return 'ENE';\n }\n if (angle >= 78.75 && angle < 101.25) {\n return 'E';\n }\n if (angle >= 101.25 && angle < 123.75) {\n return 'ESE';\n }\n if (angle >= 123.75 && angle < 146.25) {\n return 'SE';\n }\n if (angle >= 146.25 && angle < 168.75) {\n return 'SSE';\n }\n if (angle >= 168.75 && angle < 191.25) {\n return 'S';\n }\n if (angle >= 191.25 && angle < 213.75) {\n return 'SSW';\n }\n if (angle >= 213.75 && angle < 236.25) {\n return 'SW';\n }\n if (angle >= 236.25 && angle < 258.75) {\n return 'WSW';\n }\n if (angle >= 258.75 && angle < 281.25) {\n return 'W';\n }\n if (angle >= 281.25 && angle < 303.75) {\n return 'WNW';\n }\n if (angle >= 303.75 && angle < 326.25) {\n return 'NW';\n }\n if (angle >= 326.25 && angle < 348.75) {\n return 'NNW';\n }\n // if (angle >= 348.75) {\n return 'N';\n }\n\n /**\n * Pad the given number with a zero if it's not two digits long.\n */\n static padding(num: string | number): string {\n if (typeof num === 'string') {\n if (num.length < 2) {\n return `0${num}`;\n }\n return num;\n }\n if (num < 10) {\n return `0${num}`;\n }\n return num.toString();\n }\n\n /**\n * Sets the date format.\n */\n static setDataFormat(format: string): void {\n if (format) {\n Utils.dateFormat = format.toUpperCase().split(/[.-/]/);\n Utils.dateFormat.splice(Utils.dateFormat.indexOf('YYYY'), 1);\n }\n }\n\n /**\n * Converts the date to a string.\n */\n static date2string(now: string | number | Date): string {\n if (typeof now === 'string') {\n now = now.trim();\n if (!now) {\n return '';\n }\n // only letters\n if (now.match(/^[\\w\\s]+$/)) {\n // Day of the week\n return now;\n }\n const m = now.match(/(\\d{1,4})[-./](\\d{1,2})[-./](\\d{1,4})/);\n if (m) {\n const a = [parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10)];\n // We now have 3 numbers. Let's try to detect where is year, where is day and where is month\n const year = a.find(y => y > 31);\n if (year !== undefined) {\n a.splice(a.indexOf(year), 1);\n\n const day = a.find(mm => mm > 12);\n if (day) {\n a.splice(a.indexOf(day), 1);\n now = new Date(year, a[0] - 1, day);\n } else if (Utils.dateFormat[0][0] === 'M' && Utils.dateFormat[1][0] === 'D') {\n // MM DD\n now = new Date(year, a[0] - 1, a[1]);\n if (Math.abs(now.getTime() - Date.now()) > 3600000 * 24 * 10) {\n now = new Date(year, a[1] - 1, a[0]);\n }\n } else if (Utils.dateFormat[0][0] === 'D' && Utils.dateFormat[1][0] === 'M') {\n // DD MM\n now = new Date(year, a[1] - 1, a[0]);\n if (Math.abs(now.getTime() - Date.now()) > 3600000 * 24 * 10) {\n now = new Date(year, a[0] - 1, a[1]);\n }\n } else {\n now = new Date(now);\n }\n } else {\n now = new Date(now);\n }\n } else {\n now = new Date(now);\n }\n } else {\n now = new Date(now);\n }\n\n let date = I18n.t(`ra_dow_${days[now.getDay()]}`).replace('ra_dow_', '');\n date += `. ${now.getDate()} ${I18n.t(`ra_month_${months[now.getMonth()]}`).replace('ra_month_', '')}`;\n return date;\n }\n\n /**\n * Render a text as a link.\n */\n static renderTextWithA(text: string): React.JSX.Element[] | string {\n let m: RegExpMatchArray | null = text.match(/<a [^<]+<\\/a>|<br\\s?\\/?>|<b>[^<]+<\\/b>|<i>[^<]+<\\/i>/);\n if (m) {\n const result: React.JSX.Element[] = [];\n let key = 1;\n do {\n const start = text.substring(0, m.index);\n text = text.substring((m.index || 0) + m[0].length);\n start && result.push(<span key={`a${key++}`}>{start}</span>);\n\n if (m[0].startsWith('<b>')) {\n result.push(<b key={`a${key++}`}>{m[0].substring(3, m[0].length - 4)}</b>);\n } else if (m[0].startsWith('<i>')) {\n result.push(<i key={`a${key++}`}>{m[0].substring(3, m[0].length - 4)}</i>);\n } else if (m[0].startsWith('<br')) {\n result.push(<br key={`a${key++}`} />);\n } else {\n const href = m[0].match(/href=\"([^\"]+)\"/) || m[0].match(/href='([^']+)'/);\n const target = m[0].match(/target=\"([^\"]+)\"/) || m[0].match(/target='([^']+)'/);\n const rel = m[0].match(/rel=\"([^\"]+)\"/) || m[0].match(/rel='([^']+)'/);\n const title = m[0].match(/>([^<]*)</);\n\n result.push(\n // eslint-disable-next-line react/jsx-no-target-blank\n <a\n key={`a${key++}`}\n href={href ? href[1] : ''}\n target={target ? target[1] : '_blank'}\n rel={rel ? rel[1] : 'noreferrer'}\n style={{ color: 'inherit' }}\n >\n {title ? title[1] : ''}\n </a>,\n );\n }\n\n m = text ? text.match(/<a [^<]+<\\/a>|<br\\/?>|<b>[^<]+<\\/b>|<i>[^<]+<\\/i>/) : null;\n if (!m) {\n text && result.push(<span key={`a${key++}`}>{text}</span>);\n }\n } while (m);\n\n return result;\n }\n\n return text;\n }\n\n /**\n * Get the smart name of the given state.\n */\n static getSmartName(\n states: Record<string, ioBroker.StateObject> | ioBroker.StateObject | ioBroker.StateCommon,\n id: string,\n instanceId: string,\n noCommon?: boolean,\n ): SmartName | undefined {\n if (!id) {\n if (!noCommon) {\n if (!(states as ioBroker.StateObject).common) {\n return (states as ioBroker.StateCommon).smartName;\n }\n if (states && !(states as ioBroker.StateObject).common) {\n return (states as ioBroker.StateCommon).smartName;\n }\n return (states as ioBroker.StateObject).common.smartName;\n }\n if (states && !(states as ioBroker.StateObject).common) {\n return (states as ioBroker.StateCommon).smartName;\n }\n const obj = states as ioBroker.StateObject;\n return obj?.common?.custom && obj.common.custom[instanceId]\n ? obj.common.custom[instanceId].smartName\n : undefined;\n }\n if (!noCommon) {\n return (states as Record<string, ioBroker.StateObject>)[id].common.smartName;\n }\n const obj = (states as Record<string, ioBroker.StateObject>)[id];\n\n return obj?.common?.custom && obj.common.custom[instanceId]\n ? obj.common.custom[instanceId].smartName || null\n : null;\n }\n\n /**\n * Get the smart name from a state.\n */\n static getSmartNameFromObj(\n obj: ioBroker.StateObject | ioBroker.StateCommon,\n instanceId: string,\n noCommon?: boolean,\n ): SmartName | undefined {\n if (!noCommon) {\n if (!(obj as ioBroker.StateObject).common) {\n return (obj as ioBroker.StateCommon).smartName;\n }\n if (obj && !(obj as ioBroker.StateObject).common) {\n return (obj as ioBroker.StateCommon).smartName;\n }\n\n return (obj as ioBroker.StateObject).common.smartName;\n }\n if (obj && !(obj as ioBroker.StateObject).common) {\n return (obj as ioBroker.StateCommon).smartName;\n }\n\n const custom: Record<string, string> | undefined | null = (obj as ioBroker.StateObject)?.common?.custom?.[\n instanceId\n ];\n\n return custom ? custom.smartName : undefined;\n }\n\n /**\n * Enable smart name for a state.\n */\n static enableSmartName(obj: ioBroker.StateObject, instanceId: string, noCommon?: boolean): void {\n if (noCommon) {\n obj.common.custom = obj.common.custom || {};\n obj.common.custom[instanceId] = obj.common.custom[instanceId] || {};\n obj.common.custom[instanceId].smartName = {};\n } else {\n obj.common.smartName = {};\n }\n }\n\n /**\n * Completely remove smart name from a state.\n */\n static removeSmartName(obj: ioBroker.StateObject, instanceId: string, noCommon?: boolean): void {\n if (noCommon) {\n if (obj.common && obj.common.custom && obj.common.custom[instanceId]) {\n obj.common.custom[instanceId] = null;\n }\n } else {\n obj.common.smartName = null;\n }\n }\n\n /**\n * Update the smart name of a state.\n */\n static updateSmartName(\n obj: ioBroker.StateObject,\n newSmartName: ioBroker.StringOrTranslated,\n byON: string | null,\n smartType: string | null,\n instanceId: string,\n noCommon?: boolean,\n ): void {\n const language = I18n.getLanguage();\n\n // convert the old format\n if (typeof obj.common.smartName === 'string') {\n const nnn = obj.common.smartName;\n obj.common.smartName = {};\n obj.common.smartName[language] = nnn;\n }\n\n // convert the old settings\n if (obj.native && obj.native.byON) {\n delete obj.native.byON;\n let _smartName: SmartName = obj.common.smartName as SmartName;\n\n if (_smartName && typeof _smartName !== 'object') {\n _smartName = {\n en: _smartName,\n [language]: _smartName,\n };\n }\n obj.common.smartName = _smartName;\n }\n if (smartType !== undefined) {\n if (noCommon) {\n obj.common.custom = obj.common.custom || {};\n obj.common.custom[instanceId] = obj.common.custom[instanceId] || {};\n obj.common.custom[instanceId].smartName = obj.common.custom[instanceId].smartName || {};\n if (!smartType) {\n delete obj.common.custom[instanceId].smartName.smartType;\n } else {\n obj.common.custom[instanceId].smartName.smartType = smartType;\n }\n } else {\n obj.common.smartName = obj.common.smartName || {};\n if (!smartType) {\n // @ts-expect-error fixed in js-controller\n delete obj.common.smartName.smartType;\n } else {\n // @ts-expect-error fixed in js-controller\n obj.common.smartName.smartType = smartType;\n }\n }\n }\n\n if (byON !== undefined) {\n if (noCommon) {\n obj.common.custom = obj.common.custom || {};\n obj.common.custom[instanceId] = obj.common.custom[instanceId] || {};\n obj.common.custom[instanceId].smartName = obj.common.custom[instanceId].smartName || {};\n obj.common.custom[instanceId].smartName.byON = byON;\n } else {\n obj.common.smartName = obj.common.smartName || {};\n // @ts-expect-error fixed in js-controller\n obj.common.smartName.byON = byON;\n }\n }\n\n if (newSmartName !== undefined) {\n let smartName;\n if (noCommon) {\n obj.common.custom = obj.common.custom || {};\n obj.common.custom[instanceId] = obj.common.custom[instanceId] || {};\n obj.common.custom[instanceId].smartName = obj.common.custom[instanceId].smartName || {};\n smartName = obj.common.custom[instanceId].smartName;\n } else {\n obj.common.smartName = obj.common.smartName || {};\n smartName = obj.common.smartName;\n }\n smartName[language] = newSmartName;\n\n // If smart name deleted\n if (\n smartName &&\n (!smartName[language] ||\n (smartName[language] === obj.common.name &&\n (!obj.common.role || obj.common.role.includes('button'))))\n ) {\n delete smartName[language];\n let empty = true;\n // Check if the structure has any definitions\n for (const key in smartName) {\n if (Object.prototype.hasOwnProperty.call(smartName, key)) {\n empty = false;\n break;\n }\n }\n // If empty => delete smartName completely\n if (empty) {\n if (noCommon && obj.common.custom && obj.common.custom[instanceId]) {\n if (obj.common.custom[instanceId].smartName.byON === undefined) {\n delete obj.common.custom[instanceId];\n } else {\n delete obj.common.custom[instanceId].en;\n delete obj.common.custom[instanceId].de;\n delete obj.common.custom[instanceId].ru;\n delete obj.common.custom[instanceId].nl;\n delete obj.common.custom[instanceId].pl;\n delete obj.common.custom[instanceId].it;\n delete obj.common.custom[instanceId].fr;\n delete obj.common.custom[instanceId].pt;\n delete obj.common.custom[instanceId].es;\n delete obj.common.custom[instanceId].uk;\n delete obj.common.custom[instanceId]['zh-cn'];\n }\n // @ts-expect-error fixed in js-controller\n } else if (obj.common.smartName && (obj.common.smartName as SmartName).byON !== undefined) {\n const _smartName: { [lang in ioBroker.Languages]?: string } = obj.common.smartName as {\n [lang in ioBroker.Languages]?: string;\n };\n delete _smartName.en;\n delete _smartName.de;\n delete _smartName.ru;\n delete _smartName.nl;\n delete _smartName.pl;\n delete _smartName.it;\n delete _smartName.fr;\n delete _smartName.pt;\n delete _smartName.es;\n delete _smartName.uk;\n delete _smartName['zh-cn'];\n } else {\n obj.common.smartName = null;\n }\n }\n }\n }\n }\n\n /**\n * Disable the smart name of a state.\n */\n static disableSmartName(obj: ioBroker.StateObject, instanceId: string, noCommon?: boolean): void {\n if (noCommon) {\n obj.common.custom = obj.common.custom || {};\n obj.common.custom[instanceId] = obj.common.custom[instanceId] || {};\n obj.common.custom[instanceId].smartName = false;\n } else {\n obj.common.smartName = false;\n }\n }\n\n /**\n * Copy text to the clipboard.\n */\n static copyToClipboard(text: string, e?: Event): boolean {\n if (e) {\n e.stopPropagation();\n e.preventDefault();\n }\n return copy(text);\n }\n\n /**\n * Gets the extension of a file name.\n *\n * @param fileName the file name.\n * @returns The extension in lower case.\n */\n static getFileExtension(fileName: string): string | null {\n const pos = (fileName || '').lastIndexOf('.');\n if (pos !== -1) {\n return fileName.substring(pos + 1).toLowerCase();\n }\n return null;\n }\n\n /**\n * Format number of bytes as a string with B, KB, MB or GB.\n * The base for all calculations is 1024.\n *\n * @param bytes The number of bytes.\n * @returns The formatted string (e.g. '723.5 KB')\n */\n static formatBytes(bytes: number): string {\n if (Math.abs(bytes) < 1024) {\n return `${bytes} B`;\n }\n\n const units = ['KB', 'MB', 'GB'];\n // const units = ['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'];\n let u = -1;\n\n do {\n bytes /= 1024;\n ++u;\n } while (Math.abs(bytes) >= 1024 && u < units.length - 1);\n\n return `${bytes.toFixed(1)} ${units[u]}`;\n }\n\n /**\n * Invert the given color according to a theme type to get the inverted text color for background\n *\n * @param color Color in the format '#rrggbb' or '#rgb' (or without a hash)\n * @param themeType 'light' or 'dark'\n * @param invert If true, the dark theme has a light color in the control, or the dark theme has a light color in the control\n */\n static getInvertedColor(color: string, themeType: ThemeType, invert?: boolean): string | undefined {\n if (!color) {\n return undefined;\n }\n const invertedColor = Utils.invertColor(color, true);\n if (invertedColor === '#FFFFFF' && (themeType === 'dark' || (invert && themeType === 'light'))) {\n return '#DDD';\n }\n if (invertedColor === '#000000' && (themeType === 'light' || (invert && themeType === 'dark'))) {\n return '#222';\n }\n\n return undefined;\n }\n\n // Big thanks to: https://stackoverflow.com/questions/35969656/how-can-i-generate-the-opposite-color-according-to-current-color\n /**\n * Invert the given color\n *\n * @param hex Color in the format '#rrggbb' or '#rgb' (or without a hash)\n * @param bw Set to black or white.\n */\n static invertColor(hex: string, bw?: boolean): string {\n if (hex === undefined || hex === null || hex === '' || typeof hex !== 'string') {\n return '';\n }\n if (hex.startsWith('rgba')) {\n const m = hex.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*([.\\d]+)\\)/);\n if (m) {\n hex =\n parseInt(m[1], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0');\n }\n } else if (hex.startsWith('rgb')) {\n const m = hex.match(/rgb?\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (m) {\n hex =\n parseInt(m[1], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0');\n }\n } else if (hex.startsWith('#')) {\n hex = hex.slice(1);\n }\n // convert 3-digit hex to 6-digits.\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n let alfa = null;\n if (hex.length === 8) {\n alfa = hex.substring(6, 8);\n hex = hex.substring(0, 6);\n } else if (hex.length !== 6) {\n console.warn(`Cannot invert color: ${hex}`);\n return hex;\n }\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n\n if (bw) {\n // http://stackoverflow.com/a/3943023/112731\n return r * 0.299 + g * 0.587 + b * 0.114 > 186 ? `#000000${alfa || ''}` : `#FFFFFF${alfa || ''}`;\n }\n // invert color components\n const rs = (255 - r).toString(16);\n const gs = (255 - g).toString(16);\n const bd = (255 - b).toString(16);\n // pad each with zeros and return\n return `#${rs.padStart(2, '0')}${gs.padStart(2, '0')}${bd.padStart(2, '0')}${alfa || ''}`;\n }\n\n /**\n * Convert RGB to array [r, g, b]\n *\n * @param hex Color in the format '#rrggbb' or '#rgb' (or without hash) or rgb(r,g,b) or rgba(r,g,b,a)\n * @returns Array with 3 elements [r, g, b]\n */\n static color2rgb(hex: string): false | [number, number, number] | '' {\n if (hex === undefined || hex === null || hex === '' || typeof hex !== 'string') {\n return false;\n }\n if (hex.startsWith('rgba')) {\n const m = hex.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*([.\\d]+)\\)/);\n if (m) {\n hex =\n parseInt(m[1], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0');\n }\n } else if (hex.startsWith('rgb')) {\n const m = hex.match(/rgb?\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (m) {\n hex =\n parseInt(m[1], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0');\n }\n } else if (hex.startsWith('#')) {\n hex = hex.slice(1);\n }\n // convert 3-digit hex to 6-digits.\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n if (hex.length !== 6 && hex.length !== 8) {\n console.warn(`Cannot invert color: ${hex}`);\n return false;\n }\n\n return [parseInt(hex.slice(0, 2), 16), parseInt(hex.slice(2, 4), 16), parseInt(hex.slice(4, 6), 16)];\n }\n\n // Big thanks to: https://github.com/antimatter15/rgb-lab\n /**\n * Convert RGB to LAB\n *\n * @param rgb color in format [r,g,b]\n * @returns lab color in format [l,a,b]\n */\n static rgb2lab(rgb: [number, number, number]): [number, number, number] {\n let r = rgb[0] / 255;\n let g = rgb[1] / 255;\n let b = rgb[2] / 255;\n\n r = r > 0.04045 ? ((r + 0.055) / 1.055) ** 2.4 : r / 12.92;\n g = g > 0.04045 ? ((g + 0.055) / 1.055) ** 2.4 : g / 12.92;\n b = b > 0.04045 ? ((b + 0.055) / 1.055) ** 2.4 : b / 12.92;\n\n let x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;\n let y = r * 0.2126 + g * 0.7152 + b * 0.0722; /* / 1.00000; */\n let z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;\n\n x = x > 0.008856 ? x ** 0.33333333 : 7.787 * x + 0.137931; // 16 / 116;\n y = y > 0.008856 ? y ** 0.33333333 : 7.787 * y + 0.137931; // 16 / 116;\n z = z > 0.008856 ? z ** 0.33333333 : 7.787 * z + 0.137931; // 16 / 116;\n\n return [116 * y - 16, 500 * (x - y), 200 * (y - z)];\n }\n\n /**\n * Calculate the distance between two colors in LAB color space in the range 0-100^2\n * If the distance is less than 1000, the colors are similar\n *\n * @param color1 Color in the format '#rrggbb' or '#rgb' (or without hash) or rgb(r,g,b) or rgba(r,g,b,a)\n * @param color2 Color in the format '#rrggbb' or '#rgb' (or without hash) or rgb(r,g,b) or rgba(r,g,b,a)\n * @returns distance in the range 0-100^2\n */\n static colorDistance(color1: string, color2: string): number {\n const rgb1 = Utils.color2rgb(color1);\n const rgb2 = Utils.color2rgb(color2);\n if (!rgb1 || !rgb2) {\n return 0;\n }\n\n const lab1 = Utils.rgb2lab(rgb1);\n const lab2 = Utils.rgb2lab(rgb2);\n const dltL = lab1[0] - lab2[0];\n const dltA = lab1[1] - lab2[1];\n const dltB = lab1[2] - lab2[2];\n const c1 = Math.sqrt(lab1[1] * lab1[1] + lab1[2] * lab1[2]);\n const c2 = Math.sqrt(lab2[1] * lab2[1] + lab2[2] * lab2[2]);\n const dltC = c1 - c2;\n let dltH = dltA * dltA + dltB * dltB - dltC * dltC;\n dltH = dltH < 0 ? 0 : Math.sqrt(dltH);\n const sc = 1.0 + 0.045 * c1;\n const sh = 1.0 + 0.015 * c1;\n const dltLKlsl = dltL;\n const dltCkcsc = dltC / sc;\n const dltHkhsh = dltH / sh;\n const i = dltLKlsl * dltLKlsl + dltCkcsc * dltCkcsc + dltHkhsh * dltHkhsh;\n return i < 0 ? 0 : i;\n }\n\n // https://github.com/lukeed/clsx/blob/master/src/index.js\n // License\n // MIT © Luke Edwards\n private static _toVal(mix: ClassValue): string {\n let y;\n let str = '';\n\n if (typeof mix === 'string' || typeof mix === 'number') {\n str += mix;\n } else if (typeof mix === 'object') {\n if (Array.isArray(mix)) {\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n y = Utils._toVal(mix[k]);\n if (y) {\n str && (str += ' ');\n str += y;\n }\n }\n }\n } else {\n for (const k in mix) {\n if (mix[k]) {\n str && (str += ' ');\n str += k;\n }\n }\n }\n }\n\n return str;\n }\n\n // https://github.com/lukeed/clsx/blob/master/src/index.js\n // License\n // MIT © Luke Edwards\n /**\n * Convert any object to a string with its values.\n */\n static clsx(...inputs: ClassValue[]): string {\n let i = 0;\n let tmp;\n let x;\n let str = '';\n while (i < inputs.length) {\n tmp = inputs[i++];\n if (tmp) {\n x = Utils._toVal(tmp);\n if (x) {\n str && (str += ' ');\n str += x;\n }\n }\n }\n return str;\n }\n\n /**\n * Get the current theme name (either from local storage or the browser settings).\n */\n static getThemeName(themeName?: ThemeName | null): ThemeName {\n if (\n (window as any).vendorPrefix &&\n (window as any).vendorPrefix !== '@@vendorPrefix@@' &&\n (window as any).vendorPrefix !== 'MV'\n ) {\n return (window as any).vendorPrefix;\n }\n\n themeName = ((window as any)._localStorage || window.localStorage).getItem('App.themeName');\n if (themeName) {\n return themeName;\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'colored';\n }\n\n /**\n * Get the type of theme.\n */\n static getThemeType(themeName?: ThemeName): ThemeType {\n if ((window as any).vendorPrefix && (window as any).vendorPrefix !== '@@vendorPrefix@@') {\n return 'light';\n }\n\n themeName = themeName || Utils.getThemeName();\n return themeName === 'dark' || themeName === 'blue' ? 'dark' : 'light';\n }\n\n /**\n * Set the theme name and theme type.\n */\n static setThemeName(themeName: ThemeName): void {\n const vendorPrefix = (window as any).vendorPrefix;\n if (vendorPrefix && vendorPrefix !== '@@vendorPrefix@@' && vendorPrefix !== 'MV') {\n return; // ignore\n }\n ((window as any)._localStorage || window.localStorage).setItem('App.themeName', themeName);\n ((window as any)._localStorage || window.localStorage).setItem(\n 'App.theme',\n themeName === 'dark' || themeName === 'blue' ? 'dark' : 'light',\n );\n }\n\n /**\n * Toggle the theme name between 'dark' and 'colored'.\n *\n * @returns the new theme name.\n */\n static toggleTheme(themeName?: ThemeName | null): ThemeName {\n if (\n (window as any).vendorPrefix &&\n (window as any).vendorPrefix !== '@@vendorPrefix@@' &&\n (window as any).vendorPrefix !== 'MV'\n ) {\n return (window as any).vendorPrefix as ThemeName;\n }\n themeName =\n themeName || ((window as any)._localStorage || window.localStorage).getItem('App.themeName') || 'light';\n\n // dark => blue => colored => light => dark\n const themes = Utils.getThemeNames();\n const pos = themeName ? themes.indexOf(themeName) : -1;\n let newTheme: ThemeName;\n if (pos !== -1) {\n newTheme = themes[(pos + 1) % themes.length];\n } else {\n newTheme = themes[0];\n }\n Utils.setThemeName(newTheme);\n\n return newTheme;\n }\n\n /**\n * Get the list of themes\n *\n * @returns list of possible themes\n */\n static getThemeNames(): ThemeName[] {\n if (\n (window as any).vendorPrefix &&\n (window as any).vendorPrefix !== '@@vendorPrefix@@' &&\n (window as any).vendorPrefix !== 'MV'\n ) {\n return [(window as any).vendorPrefix as ThemeName];\n }\n\n return ['light', 'dark'];\n }\n\n /**\n * Parse a query string into its parts.\n */\n static parseQuery(query: string): Record<string, string | number | boolean> {\n query = (query || '').toString().replace(/^\\?/, '');\n const result: Record<string, string | number | boolean> = {};\n query.split('&').forEach(part => {\n part = part.trim();\n if (part) {\n const parts = part.split('=');\n const attr = decodeURIComponent(parts[0]).trim();\n if (parts.length > 1) {\n const value = decodeURIComponent(parts[1]);\n if (value === 'true') {\n result[attr] = true;\n } else if (value === 'false') {\n result[attr] = false;\n } else {\n const f = parseFloat(value);\n if (f.toString() === value) {\n result[attr] = f;\n } else {\n result[attr] = value;\n }\n }\n } else {\n result[attr] = true;\n }\n }\n });\n return result;\n }\n\n /**\n * Returns parent ID.\n *\n * @returns parent ID or null if no parent\n */\n static getParentId(id: string): string | null {\n const p = (id || '').toString().split('.');\n if (p.length > 1) {\n p.pop();\n return p.join('.');\n }\n\n return null;\n }\n\n static formatDate(dateObj: Date, dateFormat: string): string {\n // format could be DD.MM.YYYY, YYYY.MM.DD or MM/DD/YYYY\n\n if (!dateObj) {\n return '';\n }\n\n let text;\n const mm = (dateObj.getMonth() + 1).toString().padStart(2, '0');\n const dd = dateObj.getDate().toString().padStart(2, '0');\n\n if (dateFormat === 'MM/DD/YYYY') {\n text = `${mm}/${dd}/${dateObj.getFullYear()}`;\n } else {\n text = `${dateObj.getFullYear()}-${mm}-${dd}`;\n }\n\n // time\n text += ` ${dateObj.getHours().toString().padStart(2, '0')}:${dateObj.getMinutes().toString().padStart(2, '0')}:${dateObj.getSeconds().toString().padStart(2, '0')}.${dateObj.getMilliseconds().toString().padStart(3, '0')}`;\n\n return text;\n }\n\n /**\n * Format seconds to string like 'h:mm:ss' or 'd.hh:mm:ss'\n */\n static formatTime(seconds: number): string {\n if (seconds) {\n seconds = Math.round(seconds);\n const d = Math.floor(seconds / (3600 * 24));\n const h = Math.floor((seconds % (3600 * 24)) / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = seconds % 60;\n if (d) {\n return `${d}.${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n }\n if (h) {\n return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n }\n\n return `0:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n }\n return '0:00:00';\n }\n\n static MDtext2link(text: string): string {\n const m = text.match(/\\d+\\.\\)\\s/);\n if (m) {\n text = text.replace(m[0], m[0].replace(/\\s/, ' '));\n }\n\n return text\n .replace(/[^a-zA-Zа-яА-Я0-9]/g, '')\n .trim()\n .replace(/\\s/g, '')\n .toLowerCase();\n }\n\n /**\n * Open url link in the new target window\n */\n static openLink(url: string, target?: string): void {\n // replace IPv6 Address with [ipv6]:port\n url = url.replace(/\\/\\/([0-9a-f]*:[0-9a-f]*:[0-9a-f]*:[0-9a-f]*:[0-9a-f]*:[0-9a-f]*)(:\\d+)?\\//i, '//[$1]$2/');\n\n if (target === 'this') {\n window.location.href = url;\n } else {\n window.open(url, target || '_blank');\n }\n }\n\n static MDgetTitle(text: string): string {\n const result = Utils.MDextractHeader(text);\n const header = result.header;\n let body = result.body;\n if (!header.title) {\n // remove {docsify-bla}\n body = body.replace(/{[^}]*}/g, '');\n body = body.trim();\n const lines = body.replace(/\\r/g, '').split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].startsWith('# ')) {\n return lines[i].substring(2).trim();\n }\n }\n return '';\n }\n\n return header.title?.toString() || '';\n }\n\n static MDextractHeader(text: string): { header: Record<string, string | boolean | number>; body: string } {\n const attrs: Record<string, string | boolean | number> = {};\n if (text.substring(0, 3) === '---') {\n const pos = text.substring(3).indexOf('\\n---');\n if (pos !== -1) {\n const _header = text.substring(3, pos + 3);\n const lines = _header.replace(/\\r/g, '').split('\\n');\n lines.forEach(line => {\n if (!line.trim()) {\n return;\n }\n const pos_ = line.indexOf(':');\n if (pos_ !== -1) {\n const attr = line.substring(0, pos_).trim();\n let value = line.substring(pos_ + 1).trim();\n value = value.replace(/^['\"]|['\"]$/g, '');\n if (value === 'true') {\n attrs[attr] = true;\n } else if (value === 'false') {\n attrs[attr] = false;\n } else if (parseFloat(value).toString() === attrs[attr]) {\n attrs[attr] = parseFloat(value);\n } else {\n attrs[attr] = value;\n }\n } else {\n attrs[line.trim()] = true;\n }\n });\n text = text.substring(pos + 7);\n }\n }\n return { header: attrs, body: text };\n }\n\n static MDremoveDocsify(text: string): string {\n const m = text.match(/{docsify-[^}]*}/g);\n if (m) {\n m.forEach(doc => (text = text.replace(doc, '')));\n }\n return text;\n }\n\n /**\n * Generate the file for download from JSON object.\n */\n static generateFile(\n fileName: string,\n /** json file data */\n json: Record<string, any>,\n ): void {\n const el = document.createElement('a');\n el.setAttribute(\n 'href',\n `data:application/json;charset=utf-8,${encodeURIComponent(JSON.stringify(json, null, 2))}`,\n );\n el.setAttribute('download', fileName);\n\n el.style.display = 'none';\n document.body.appendChild(el);\n\n el.click();\n\n document.body.removeChild(el);\n }\n\n /**\n * Convert quality code into text\n *\n * @returns lines that decode quality\n */\n static quality2text(quality: ioBroker.STATE_QUALITY[keyof ioBroker.STATE_QUALITY]): string[] {\n const custom = quality & 0xffff0000;\n const text: string = QUALITY_BITS[quality];\n let result;\n if (text) {\n result = [text];\n } else if (quality & 0x01) {\n result = [QUALITY_BITS[0x01], `0x${(quality & (0xffff & ~1)).toString(16)}`];\n } else if (quality & 0x02) {\n result = [QUALITY_BITS[0x02], `0x${(quality & (0xffff & ~2)).toString(16)}`];\n } else {\n result = [`0x${quality.toString(16)}`];\n }\n if (custom) {\n result.push(`0x${(custom >> 16).toString(16).toUpperCase()}`);\n }\n return result;\n }\n\n /**\n * Deep copy object\n */\n static clone(object: Record<string, any>): Record<string, any> {\n return JSON.parse(JSON.stringify(object));\n }\n\n /**\n * Get states of object\n *\n * @returns states as an object in form {\"value1\": \"label1\", \"value2\": \"label2\"} or null\n */\n static getStates(obj: ioBroker.StateObject | null | undefined): Record<string, string> | null {\n const states: Record<string, string> | string[] | string | undefined | null = obj?.common?.states;\n let result: Record<string, string> | null | undefined;\n if (states) {\n if (typeof states === 'string' && states[0] === '{') {\n try {\n result = JSON.parse(states) as Record<string, string>;\n } catch {\n console.error(`Cannot parse states: ${states}`);\n result = null;\n }\n } else if (typeof states === 'string') {\n // if old format val1:text1;val2:text2\n const parts = states.split(';');\n result = {};\n for (let p = 0; p < parts.length; p++) {\n const s = parts[p].split(':');\n result[s[0]] = s[1];\n }\n } else if (Array.isArray(states)) {\n result = {};\n if (obj?.common.type === 'number') {\n states.forEach((value, key) => (result[key] = value));\n } else if (obj?.common.type === 'string') {\n states.forEach(value => (result[value] = value));\n } else if (obj?.common.type === 'boolean') {\n result.false = states[0];\n result.true = states[1];\n }\n } else if (typeof states === 'object') {\n result = states;\n }\n }\n\n return result || null;\n }\n\n /**\n * Get svg file as text\n *\n * @param url URL of SVG file\n * @returns Promise with \"data:image...\"\n */\n static async getSvg(url: string): Promise<string> {\n const response = await fetch(url);\n const blob = await response.blob();\n return new Promise(resolve => {\n const reader = new FileReader();\n reader.onload = function () {\n resolve(this.result?.toString() || '');\n };\n reader.readAsDataURL(blob);\n });\n }\n\n /**\n * Detect a file extension by its content\n *\n * @returns The detected extension, like 'jpg'\n */\n static detectMimeType(\n /** Base64 encoded binary file */\n base64: string,\n ): string | null {\n const signature = Object.keys(SIGNATURES).find(s => base64.startsWith(s));\n return signature ? SIGNATURES[signature] : null;\n }\n\n /**\n * Check if configured repository is the stable repository\n */\n static isStableRepository(\n /** current configured repository or multi repository */\n activeRepo: string | string[],\n ): boolean {\n return !!(\n (typeof activeRepo === 'string' && activeRepo.toLowerCase().startsWith('stable')) ||\n (activeRepo && typeof activeRepo !== 'string' && activeRepo.find(r => r.toLowerCase().startsWith('stable')))\n );\n }\n\n /**\n * Check if a given string is an integer\n */\n static isStringInteger(str: string | number): boolean {\n if (typeof str === 'number') {\n return Math.round(str) === str;\n }\n return parseInt(str, 10).toString() === str;\n }\n\n /**\n * Check if the date is valid\n */\n static isValidDate(date: any): boolean {\n return date instanceof Date && !isNaN(date as any as number);\n }\n\n static getStyle(\n theme: IobTheme,\n ...args: (((_theme: IobTheme) => Record<string, any>) | undefined | Record<string, any>)[]\n ): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (let a = 0; a < args.length; a++) {\n if (typeof args[a] === 'function') {\n Object.assign(result, (args[a] as (_theme: IobTheme) => Record<string, any>)(theme));\n } else if (args[a] && typeof args[a] === 'object') {\n Object.keys(args[a] as Record<string, any>).forEach((attr: string) => {\n if (typeof (args[a] as Record<string, any>)[attr] === 'function') {\n result[attr] = (\n (args[a] as Record<string, any>)[attr] as (_theme: IobTheme) => Record<string, any>\n )(theme);\n } else if (typeof (args[a] as Record<string, any>)[attr] === 'object') {\n const obj = (args[a] as Record<string, any>)[attr];\n result[attr] = {};\n Object.keys(obj).forEach((attr1: string) => {\n if (typeof obj[attr1] === 'function') {\n result[attr][attr1] = obj(theme);\n } else if (obj[attr1] || obj[attr1] === 0) {\n result[attr][attr1] = obj[attr1];\n }\n });\n } else if ((args[a] as Record<string, any>)[attr] || (args[a] as Record<string, any>)[attr] === 0) {\n result[attr] = (args[a] as Record<string, any>)[attr];\n }\n });\n }\n }\n\n return result;\n }\n}\n","// please do not delete React, as without it other projects could not be compiled: ReferenceError: React is not defined\nimport React, { type JSX } from 'react';\n\nimport { Fab, Toolbar } from '@mui/material';\n\nimport { Save as IconSave, Close as IconClose } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\nimport type { IobTheme } from '../types';\n\nconst styles: Record<string, React.CSSProperties> = {\n buttonIcon: {\n marginRight: 8,\n },\n};\n\ninterface SaveCloseButtonsProps {\n /* Are the buttons without text */\n noTextOnButtons?: boolean;\n /* Theme object (from this.state.theme) */\n theme: IobTheme;\n /* bottom position 0 or 38 for iFrame */\n isIFrame?: boolean;\n /* is used in new React */\n newReact?: boolean;\n /* on Save handler */\n onSave: (close: boolean) => void;\n /* on Close handler */\n onClose: () => void;\n dense?: boolean;\n paddingLeft?: number;\n changed: boolean;\n error?: boolean;\n}\n\nexport class SaveCloseButtons extends React.Component<SaveCloseButtonsProps> {\n private readonly isIFrame: boolean;\n\n constructor(props: SaveCloseButtonsProps) {\n super(props);\n const newReact = props.newReact === undefined ? true : props.newReact;\n\n if (props.isIFrame !== undefined) {\n this.isIFrame = props.isIFrame;\n } else {\n try {\n this.isIFrame = !newReact && window.self !== window.top;\n } catch {\n this.isIFrame = !newReact;\n }\n }\n }\n\n render(): JSX.Element {\n const noTextOnButtons = this.props.noTextOnButtons;\n const buttonStyle: React.CSSProperties = {\n borderRadius: this.props.theme.saveToolbar.button.borderRadius || 3,\n height: this.props.theme.saveToolbar.button.height || 32,\n };\n\n const style: React.CSSProperties = {\n bottom: this.isIFrame ? 38 : 0,\n left: this.props.paddingLeft || 0,\n right: 0,\n position: 'absolute',\n background: this.props.theme.saveToolbar.background,\n };\n if (this.props.dense) {\n style.minHeight = 48;\n }\n\n if (this.props.error) {\n buttonStyle.border = '1px solid red';\n }\n\n return (\n <Toolbar\n // position=\"absolute\"\n style={style}\n >\n <Fab\n variant=\"extended\"\n aria-label=\"Save\"\n disabled={!this.props.changed || this.props.error}\n onClick={() => this.props.onSave(false)}\n style={buttonStyle}\n >\n <IconSave style={!noTextOnButtons ? styles.buttonIcon : undefined} />\n {!noTextOnButtons && I18n.t('ra_Save')}\n </Fab>\n <Fab\n variant=\"extended\"\n aria-label=\"Save and close\"\n disabled={!this.props.changed || this.props.error}\n onClick={() => this.props.onSave(true)}\n style={{ ...buttonStyle, ...{ marginLeft: 10 } }}\n >\n <IconSave style={!noTextOnButtons ? styles.buttonIcon : undefined} />\n {!noTextOnButtons ? I18n.t('ra_Save and close') : '+'}\n {noTextOnButtons && <IconClose />}\n </Fab>\n <div style={{ flexGrow: 1 }} />\n <Fab\n variant=\"extended\"\n aria-label=\"Close\"\n onClick={() => this.props.onClose()}\n style={buttonStyle}\n >\n <IconClose style={!noTextOnButtons ? styles.buttonIcon : undefined} />\n {!noTextOnButtons && I18n.t('ra_Close')}\n </Fab>\n </Toolbar>\n );\n }\n}\n","/**\n * Copyright 2019-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\n// please do not delete React, as without it other projects could not be compiled: ReferenceError: React is not defined\nimport React, { Component, type JSX } from 'react';\n\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n FormControlLabel,\n Checkbox,\n} from '@mui/material';\n\nimport { Check as IconCheck, Close as IconClose } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\n\nconst styles: Record<string, React.CSSProperties> = {\n suppress: {\n fontSize: 12,\n },\n suppressRoot: {\n // it is sx\n marginTop: '16px',\n },\n};\n\ninterface DialogConfirmProps {\n /** The dialog title; default: Are you sure? (translated) */\n title?: string;\n /** The dialog text */\n text?: string | React.JSX.Element | React.JSX.Element[];\n /** Close handler. */\n onClose?: (ok: boolean) => void;\n /** if the dialog must be fill sized */\n fullWidth?: boolean;\n /** optional icon */\n icon?: React.JSX.Element;\n /** optional ok button text */\n ok?: string;\n /** optional cancel button text */\n cancel?: string;\n /** optional interval in minutes for which the confirmation dialog will be suppressed if activated. */\n suppressQuestionMinutes?: number;\n /** optional text for the suppression checkbox */\n suppressText?: string;\n /** optional name of the dialog. Used only with suppressQuestionMinutes to store the user choice */\n dialogName?: string;\n}\n\ninterface DialogConfirmState {\n suppress: number | boolean;\n}\n\nexport class DialogConfirm extends Component<DialogConfirmProps, DialogConfirmState> {\n constructor(props: DialogConfirmProps) {\n super(props);\n\n if (!this.props.dialogName && this.props.suppressQuestionMinutes) {\n throw new Error('dialogName required if suppressQuestionMinutes used');\n }\n let suppress: number | boolean = false;\n\n if (this.props.suppressQuestionMinutes) {\n suppress =\n parseInt(((window as any)._localStorage || window.localStorage).getItem(this.props.dialogName), 10) ||\n 0;\n\n if (!suppress) {\n suppress = false;\n } else if (Date.now() > suppress) {\n ((window as any)._localStorage || window.localStorage).removeItem(this.props.dialogName);\n suppress = false;\n }\n }\n\n this.state = {\n suppress,\n };\n }\n\n handleOk(): void {\n if (this.state.suppress) {\n ((window as any)._localStorage || window.localStorage).setItem(\n this.props.dialogName,\n Date.now() + (this.props.suppressQuestionMinutes || 2) * 60000,\n );\n }\n if (this.props.onClose) {\n this.props.onClose(true);\n }\n }\n\n handleCancel(): void {\n if (this.props.onClose) {\n this.props.onClose(false);\n }\n }\n\n render(): JSX.Element | null {\n if (typeof this.state.suppress === 'number') {\n setTimeout(() => this.props.onClose && this.props.onClose(true), 100);\n return null;\n }\n\n return (\n <Dialog\n open={!0}\n maxWidth=\"md\"\n fullWidth={this.props.fullWidth !== undefined ? this.props.fullWidth : true}\n onClose={(event, reason) => {\n if (reason !== 'backdropClick' && reason !== 'escapeKeyDown') {\n this.handleCancel();\n }\n }}\n aria-labelledby=\"ar_confirmation_dialog_title\"\n aria-describedby=\"ar_confirmation_dialog_description\"\n >\n <DialogTitle id=\"ar_confirmation_dialog_title\">\n {this.props.title || I18n.t('ra_Are you sure?')}\n </DialogTitle>\n <DialogContent>\n <DialogContentText id=\"ar_confirmation_dialog_description\">\n {this.props.icon || null}\n {this.props.text}\n {this.props.suppressQuestionMinutes ? <br /> : null}\n {this.props.suppressQuestionMinutes ? (\n <FormControlLabel\n sx={{\n '& .FormControlLabel-label': styles.suppress,\n '&.FormControlLabel-root': styles.suppressRoot,\n }}\n control={\n <Checkbox\n id={`ar_dialog_confirm_suppress_${this.props.dialogName || ''}`}\n checked={!!this.state.suppress}\n onChange={() => this.setState({ suppress: !this.state.suppress })}\n />\n }\n label={\n this.props.suppressText ||\n I18n.t(\n 'ra_Suppress question for next %s minutes',\n (this.props.suppressQuestionMinutes || 2).toString(),\n )\n }\n />\n ) : null}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n id={`ar_dialog_confirm_ok_${this.props.dialogName || ''}`}\n variant=\"contained\"\n onClick={() => this.handleOk()}\n color=\"primary\"\n autoFocus\n startIcon={<IconCheck />}\n >\n {this.props.ok || I18n.t('ra_Ok')}\n </Button>\n <Button\n id={`ar_dialog_confirm_cancel_${this.props.dialogName || ''}`}\n variant=\"contained\"\n onClick={() => this.handleCancel()}\n color=\"grey\"\n startIcon={<IconClose />}\n >\n {this.props.cancel || I18n.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n","/**\n * Copyright 2018-2023 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n// please do not delete React, as without it other projects could not be compiled: ReferenceError: React is not defined\nimport React, { Component, type JSX } from 'react';\n\nimport { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material';\n\nimport { Check as IconCheck } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\n\ninterface DialogErrorProps {\n /* The dialog title; default: Error (translated) */\n title?: string;\n /* The dialog text */\n text: string | React.JSX.Element | React.JSX.Element[];\n /* Close handler. */\n onClose?: () => void;\n /* if the dialog must be fill sized */\n fullWidth?: boolean;\n}\n\nexport class DialogError extends Component<DialogErrorProps> {\n handleOk(): void {\n if (this.props.onClose) {\n this.props.onClose();\n }\n }\n\n render(): JSX.Element {\n return (\n <Dialog\n open={!0}\n maxWidth=\"sm\"\n fullWidth={this.props.fullWidth !== undefined ? this.props.fullWidth : true}\n onClose={() => this.handleOk()}\n aria-labelledby=\"alert-dialog-title\"\n aria-describedby=\"alert-dialog-description\"\n >\n <DialogTitle id=\"ar_alert_dialog_title\">{this.props.title || I18n.t('ra_Error')}</DialogTitle>\n <DialogContent>\n <DialogContentText id=\"ar_alert_dialog_description\">\n {this.props.text || I18n.t('ra_Unknown error!')}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n id=\"ar_dialog_error_ok\"\n variant=\"contained\"\n onClick={() => this.handleOk()}\n color=\"primary\"\n autoFocus\n startIcon={<IconCheck />}\n >\n {I18n.t('ra_Ok')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n","import langEn from './i18n/en.json';\nimport langDe from './i18n/de.json';\nimport langRu from './i18n/ru.json';\nimport langPt from './i18n/pt.json';\nimport langNl from './i18n/nl.json';\nimport langFr from './i18n/fr.json';\nimport langIt from './i18n/it.json';\nimport langEs from './i18n/es.json';\nimport langPl from './i18n/pl.json';\nimport langUk from './i18n/uk.json';\nimport langZhCn from './i18n/zh-cn.json';\n\nexport const dictionary: Record<ioBroker.Languages, Record<string, string>> = {\n en: langEn,\n de: langDe,\n ru: langRu,\n pt: langPt,\n nl: langNl,\n fr: langFr,\n it: langIt,\n es: langEs,\n pl: langPl,\n uk: langUk,\n 'zh-cn': langZhCn,\n};\n","/**\n * Copyright 2018-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport React, { type JSX } from 'react';\nimport { PROGRESS, Connection, type AdminConnection } from '@iobroker/socket-client';\nimport * as Sentry from '@sentry/browser';\n\nimport { Snackbar, IconButton } from '@mui/material';\n\nimport { Close as IconClose } from '@mui/icons-material';\n\nimport { printPrompt } from './Prompt';\nimport { Theme } from './Theme';\nimport { Loader } from './Components/Loader';\nimport { Router } from './Components/Router';\nimport { Utils } from './Components/Utils';\nimport { SaveCloseButtons } from './Components/SaveCloseButtons';\nimport { DialogConfirm } from './Dialogs/Confirm';\nimport { I18n } from './i18n';\nimport { DialogError } from './Dialogs/Error';\nimport type {\n GenericAppProps,\n GenericAppState,\n GenericAppSettings,\n ThemeName,\n ThemeType,\n IobTheme,\n Width,\n} from './types';\n\nimport { dictionary } from './dictionary';\n\ndeclare global {\n /** If config has been changed */\n // eslint-disable-next-line no-var\n var changed: boolean;\n\n interface Window {\n io: any;\n SocketClient: any;\n adapterName: undefined | string;\n socketUrl: undefined | string;\n oldAlert: any;\n changed: boolean;\n $iframeDialog: {\n close?: () => void;\n };\n }\n}\n\n// import './index.css';\nconst cssStyle = `\nhtml {\n height: 100%;\n}\n\nbody {\n margin: 0;\n padding: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n/* scrollbar */\n::-webkit-scrollbar-track {\n background-color: #ccc;\n border-radius: 5px;\n}\n\n::-webkit-scrollbar {\n width: 5px;\n height: 5px;\n background-color: #ccc;\n}\n\n::-webkit-scrollbar-thumb {\n background-color: #575757;\n border-radius: 5px;\n}\n\n#root {\n height: 100%;\n}\n\n.App {\n height: 100%;\n}\n\n@keyframes glow {\n from {\n background-color: initial;\n }\n to {\n background-color: #58c458;\n }\n}\n`;\n\nexport class GenericApp<\n TProps extends GenericAppProps = GenericAppProps,\n TState extends GenericAppState = GenericAppState,\n> extends Router<TProps, TState> {\n protected socket: AdminConnection;\n\n protected readonly instance: number;\n\n protected readonly adapterName: string;\n\n protected readonly instanceId: string;\n\n protected readonly newReact: boolean;\n\n protected encryptedFields: string[];\n\n protected readonly sentryDSN: string | undefined;\n\n private alertDialogRendered: boolean;\n\n private _secret: string | undefined;\n\n protected _systemConfig: ioBroker.SystemConfigCommon | undefined;\n\n // it is not readonly\n private savedNative: Record<string, any>;\n\n protected common: ioBroker.InstanceCommon | null = null;\n\n private sentryStarted: boolean = false;\n\n private sentryInited: boolean = false;\n\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(props: TProps, settings?: GenericAppSettings) {\n const ConnectionClass = (props.Connection ||\n settings?.Connection ||\n Connection) as unknown as typeof AdminConnection;\n // const ConnectionClass = props.Connection === 'admin' || settings.Connection = 'admin' ? AdminConnection : (props.Connection || settings.Connection || Connection);\n\n if (!window.document.getElementById('generic-app-iobroker-component')) {\n const style = window.document.createElement('style');\n style.setAttribute('id', 'generic-app-iobroker-component');\n style.innerHTML = cssStyle;\n window.document.head.appendChild(style);\n }\n\n // Remove `!Connection.isWeb() && window.adapterName !== 'material'` when iobroker.socket will support native ws\n if (!GenericApp.isWeb() && window.io && window.location.port === '3000') {\n try {\n const io = new window.SocketClient();\n delete window.io;\n window.io = io;\n } catch {\n // ignore\n }\n }\n\n super(props);\n\n printPrompt();\n\n const query = (window.location.search || '').replace(/^\\?/, '').replace(/#.*$/, '');\n const args: Record<string, string | boolean> = {};\n query\n .trim()\n .split('&')\n .filter(t => t.trim())\n .forEach(b => {\n const parts = b.split('=');\n args[parts[0]] = parts.length === 2 ? parts[1] : true;\n if (args[parts[0]] === 'true') {\n args[parts[0]] = true;\n } else if (args[parts[0]] === 'false') {\n args[parts[0]] = false;\n }\n });\n\n // extract instance from URL\n this.instance =\n settings?.instance ??\n props.instance ??\n (args.instance !== undefined\n ? parseInt(args.instance as string, 10) || 0\n : parseInt(window.location.search.slice(1), 10) || 0);\n // extract adapter name from URL\n const tmp = window.location.pathname.split('/');\n this.adapterName =\n settings?.adapterName || props.adapterName || window.adapterName || tmp[tmp.length - 2] || 'iot';\n this.instanceId = `system.adapter.${this.adapterName}.${this.instance}`;\n this.newReact = args.newReact === true; // it is admin5\n\n const location = Router.getLocation();\n location.tab =\n location.tab ||\n ((window as any)._localStorage || window.localStorage).getItem(`${this.adapterName}-adapter`) ||\n '';\n\n const themeInstance = this.createTheme();\n\n this.state = Object.assign(\n this.state || {}, // keep the existing state\n {\n selectedTab:\n ((window as any)._localStorage || window.localStorage).getItem(`${this.adapterName}-adapter`) || '',\n selectedTabNum: -1,\n native: {},\n errorText: '',\n changed: false,\n connected: false,\n loaded: false,\n isConfigurationError: '',\n expertMode: false,\n toast: '',\n theme: themeInstance,\n themeName: this.getThemeName(themeInstance),\n themeType: this.getThemeType(themeInstance),\n bottomButtons: (settings && settings.bottomButtons) === false ? false : props?.bottomButtons !== false,\n width: GenericApp.getWidth(),\n confirmClose: false,\n _alert: false,\n _alertType: 'info',\n _alertMessage: '',\n },\n ) as TState;\n\n // init translations\n const translations: Record<ioBroker.Languages, Record<string, string>> = dictionary;\n\n // merge together\n if (settings?.translations) {\n Object.keys(settings.translations).forEach(lang => {\n if (settings.translations) {\n translations[lang as ioBroker.Languages] = Object.assign(\n translations[lang as ioBroker.Languages],\n settings.translations[lang as ioBroker.Languages] || {},\n );\n }\n });\n } else if (props.translations) {\n Object.keys(props.translations).forEach(lang => {\n if (props.translations) {\n translations[lang as ioBroker.Languages] = Object.assign(\n translations[lang as ioBroker.Languages],\n props.translations[lang as ioBroker.Languages] || {},\n );\n }\n });\n }\n\n I18n.setTranslations(translations);\n\n this.savedNative = {}; // to detect if the config changed\n\n this.encryptedFields = props.encryptedFields || settings?.encryptedFields || [];\n\n this.sentryDSN = (settings && settings.sentryDSN) || props.sentryDSN;\n\n if (window.socketUrl) {\n if (window.socketUrl.startsWith(':')) {\n window.socketUrl = `${window.location.protocol}//${window.location.hostname}${window.socketUrl}`;\n } else if (!window.socketUrl.startsWith('http://') && !window.socketUrl.startsWith('https://')) {\n window.socketUrl = `${window.location.protocol}//${window.socketUrl}`;\n }\n }\n\n this.alertDialogRendered = false;\n\n window.oldAlert = window.alert;\n window.alert = message => {\n if (!this.alertDialogRendered) {\n window.oldAlert(message);\n return;\n }\n if (message && message.toString().toLowerCase().includes('error')) {\n console.error(message);\n this.showAlert(message.toString(), 'error');\n } else {\n console.log(message);\n this.showAlert(message.toString(), 'info');\n }\n };\n\n // @ts-expect-error either make props in ConnectionProps required or the constructor needs to accept than as they are (means adapt socket-client)\n this.socket = new ConnectionClass({\n ...(props?.socket || settings?.socket),\n name: this.adapterName,\n doNotLoadAllObjects: settings?.doNotLoadAllObjects,\n onProgress: (progress: PROGRESS) => {\n if (progress === PROGRESS.CONNECTING) {\n this.setState({ connected: false });\n } else if (progress === PROGRESS.READY) {\n this.setState({ connected: true });\n } else {\n this.setState({ connected: true });\n }\n },\n onReady: (/* objects, scripts */) => {\n I18n.setLanguage(this.socket.systemLang);\n\n // subscribe because of language and expert mode\n this.socket\n .subscribeObject('system.config', this.onSystemConfigChanged)\n .then(() => this.getSystemConfig())\n .then(obj => {\n this._secret =\n (typeof obj !== 'undefined' && obj.native && obj.native.secret) || 'Zgfr56gFe87jJOM';\n this._systemConfig = obj?.common || ({} as ioBroker.SystemConfigCommon);\n return this.socket.getObject(this.instanceId);\n })\n .then(async obj => {\n let waitPromise;\n const instanceObj: ioBroker.InstanceObject | null | undefined = obj as\n | ioBroker.InstanceObject\n | null\n | undefined;\n\n const sentryPluginEnabled = (\n await this.socket.getState(`${this.instanceId}.plugins.sentry.enabled`)\n )?.val;\n\n const sentryEnabled =\n sentryPluginEnabled !== false &&\n this._systemConfig?.diag !== 'none' &&\n instanceObj?.common &&\n instanceObj.common.name &&\n instanceObj.common.version &&\n // @ts-expect-error will be extended in js-controller TODO: (BF: 2024.05.30) this is redundant to state `${this.instanceId}.plugins.sentry.enabled`, remove this in future when admin sets the state correctly\n !instanceObj.common.disableDataReporting &&\n window.location.host !== 'localhost:3000';\n\n // activate sentry plugin\n if (!this.sentryStarted && this.sentryDSN && sentryEnabled) {\n this.sentryStarted = true;\n\n Sentry.init({\n dsn: this.sentryDSN,\n release: `iobroker.${instanceObj.common.name}@${instanceObj.common.version}`,\n integrations: [Sentry.dedupeIntegration()],\n });\n\n console.log('Sentry initialized');\n }\n\n // read UUID and init sentry with it.\n // for backward compatibility it will be processed separately from the above logic: some adapters could still have this.sentryDSN as undefined\n if (!this.sentryInited && sentryEnabled) {\n this.sentryInited = true;\n\n waitPromise = this.socket.getObject('system.meta.uuid').then(uuidObj => {\n if (uuidObj && uuidObj.native && uuidObj.native.uuid) {\n const scope = Sentry.getCurrentScope();\n scope.setUser({ id: uuidObj.native.uuid });\n }\n });\n }\n\n waitPromise = (waitPromise instanceof Promise) ? waitPromise : Promise.resolve();\n\n void waitPromise.then(() => {\n if (instanceObj) {\n this.common = instanceObj?.common;\n this.onPrepareLoad(instanceObj.native, instanceObj.encryptedNative); // decode all secrets\n this.savedNative = JSON.parse(JSON.stringify(instanceObj.native));\n this.setState(\n { native: instanceObj.native, loaded: true, expertMode: this.getExpertMode() },\n () => this.onConnectionReady && this.onConnectionReady(),\n );\n } else {\n console.warn('Cannot load instance settings');\n this.setState(\n {\n native: {},\n loaded: true,\n expertMode: this.getExpertMode(),\n },\n () => this.onConnectionReady && this.onConnectionReady(),\n );\n }\n });\n })\n .catch(e => window.alert(`Cannot settings: ${e}`));\n },\n onError: (err: string) => {\n console.error(err);\n this.showError(err);\n },\n });\n }\n\n /**\n * Checks if this connection is running in a web adapter and not in an admin.\n *\n * @returns True if running in a web adapter or in a socketio adapter.\n */\n static isWeb(): boolean {\n return window.socketUrl !== undefined;\n }\n\n showAlert(message: string, type?: 'info' | 'warning' | 'error' | 'success'): void {\n if (type !== 'error' && type !== 'warning' && type !== 'info' && type !== 'success') {\n type = 'info';\n }\n\n this.setState({\n _alert: true,\n _alertType: type,\n _alertMessage: message,\n });\n }\n\n renderAlertSnackbar(): JSX.Element {\n this.alertDialogRendered = true;\n\n return (\n <Snackbar\n style={\n this.state._alertType === 'error'\n ? { backgroundColor: '#f44336' }\n : this.state._alertType === 'success'\n ? { backgroundColor: '#4caf50' }\n : undefined\n }\n open={this.state._alert}\n autoHideDuration={6000}\n onClose={(_e, reason) => reason !== 'clickaway' && this.setState({ _alert: false })}\n message={this.state._alertMessage}\n />\n );\n }\n\n onSystemConfigChanged = (id: string, obj: ioBroker.AnyObject | null | undefined): void => {\n if (obj && id === 'system.config') {\n if (this.socket.systemLang !== (obj as ioBroker.SystemConfigObject)?.common.language) {\n this.socket.systemLang = (obj as ioBroker.SystemConfigObject)?.common.language || 'en';\n I18n.setLanguage(this.socket.systemLang);\n }\n\n if (this._systemConfig?.expertMode !== !!(obj as ioBroker.SystemConfigObject)?.common?.expertMode) {\n this._systemConfig =\n (obj as ioBroker.SystemConfigObject)?.common || ({} as ioBroker.SystemConfigCommon);\n this.setState({ expertMode: this.getExpertMode() });\n } else {\n this._systemConfig =\n (obj as ioBroker.SystemConfigObject)?.common || ({} as ioBroker.SystemConfigCommon);\n }\n }\n };\n\n /**\n * Called immediately after a component is mounted. Setting state here will trigger re-rendering.\n */\n componentDidMount(): void {\n window.addEventListener('resize', this.onResize, true);\n window.addEventListener('message', this.onReceiveMessage, false);\n super.componentDidMount();\n }\n\n /**\n * Called immediately before a component is destroyed.\n */\n componentWillUnmount(): void {\n window.removeEventListener('resize', this.onResize, true);\n window.removeEventListener('message', this.onReceiveMessage, false);\n super.componentWillUnmount();\n }\n\n onReceiveMessage = (message: { data: string } | null): void => {\n if (message?.data) {\n if (message.data === 'updateTheme') {\n const newThemeName = Utils.getThemeName();\n Utils.setThemeName(Utils.getThemeName());\n\n const newTheme = this.createTheme(newThemeName);\n\n this.setState(\n {\n theme: newTheme,\n themeName: this.getThemeName(newTheme),\n themeType: this.getThemeType(newTheme),\n },\n () => {\n this.props.onThemeChange && this.props.onThemeChange(newThemeName);\n this.onThemeChanged && this.onThemeChanged(newThemeName);\n },\n );\n } else if (message.data === 'updateExpertMode') {\n this.onToggleExpertMode && this.onToggleExpertMode(this.getExpertMode());\n } else if (message.data !== 'chartReady') {\n // if not \"echart ready\" message\n console.debug(\n `Received unknown message: \"${JSON.stringify(message.data)}\". May be it will be processed later`,\n );\n }\n }\n };\n\n private onResize = (): void => {\n this.resizeTimer && clearTimeout(this.resizeTimer);\n this.resizeTimer = setTimeout(() => {\n this.resizeTimer = null;\n this.setState({ width: GenericApp.getWidth() });\n }, 200);\n };\n\n /**\n * Gets the width depending on the window inner width.\n */\n static getWidth(): Width {\n /**\n * innerWidth |xs sm md lg xl\n * |-------|-------|-------|-------|------>\n * width | xs | sm | md | lg | xl\n */\n\n const SIZES: Record<Width, number> = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920,\n };\n const width = window.innerWidth;\n const keys = Object.keys(SIZES).reverse();\n const widthComputed = keys.find(key => width >= SIZES[key as Width]) as Width;\n\n return widthComputed || 'xs';\n }\n\n /**\n * Get a theme\n *\n * @param name Theme name\n */\n // eslint-disable-next-line class-methods-use-this\n createTheme(name?: ThemeName | null): IobTheme {\n return Theme(Utils.getThemeName(name));\n }\n\n /**\n * Get the theme name\n */\n // eslint-disable-next-line class-methods-use-this\n getThemeName(currentTheme: IobTheme): ThemeName {\n return currentTheme.name;\n }\n\n /**\n * Get the theme type\n */\n // eslint-disable-next-line class-methods-use-this\n getThemeType(currentTheme: IobTheme): ThemeType {\n return currentTheme.palette.mode;\n }\n\n // eslint-disable-next-line class-methods-use-this\n onThemeChanged(_newThemeName: string): void {}\n\n // eslint-disable-next-line class-methods-use-this\n onToggleExpertMode(_expertMode: boolean): void {}\n\n /**\n * Changes the current theme\n */\n toggleTheme(newThemeName?: ThemeName): void {\n const themeName = this.state.themeName;\n\n // dark => blue => colored => light => dark\n newThemeName =\n newThemeName ||\n (themeName === 'dark'\n ? 'light'\n : themeName === 'blue'\n ? 'light'\n : themeName === 'colored'\n ? 'light'\n : 'dark');\n\n if (newThemeName !== themeName) {\n Utils.setThemeName(newThemeName);\n\n const newTheme = this.createTheme(newThemeName);\n\n this.setState(\n {\n theme: newTheme,\n themeName: this.getThemeName(newTheme),\n themeType: this.getThemeType(newTheme),\n },\n () => {\n this.props.onThemeChange && this.props.onThemeChange(newThemeName || 'light');\n this.onThemeChanged && this.onThemeChanged(newThemeName || 'light');\n },\n );\n }\n }\n\n /**\n * Gets the system configuration.\n */\n getSystemConfig(): Promise<ioBroker.SystemConfigObject> {\n return this.socket.getSystemConfig();\n }\n\n /**\n * Get current expert mode\n */\n getExpertMode(): boolean {\n return window.sessionStorage.getItem('App.expertMode') === 'true' || !!this._systemConfig?.expertMode;\n }\n\n /**\n * Gets called when the socket.io connection is ready.\n * You can overload this function to execute own commands.\n */\n // eslint-disable-next-line class-methods-use-this\n onConnectionReady(): void {}\n\n /**\n * Encrypts a string.\n */\n encrypt(value: string): string {\n let result = '';\n if (this._secret) {\n for (let i = 0; i < value.length; i++) {\n result += String.fromCharCode(\n this._secret[i % this._secret.length].charCodeAt(0) ^ value.charCodeAt(i),\n );\n }\n }\n return result;\n }\n\n /**\n * Decrypts a string.\n */\n decrypt(value: string): string {\n let result = '';\n if (this._secret) {\n for (let i = 0; i < value.length; i++) {\n result += String.fromCharCode(\n this._secret[i % this._secret.length].charCodeAt(0) ^ value.charCodeAt(i),\n );\n }\n }\n return result;\n }\n\n /**\n * Gets called when the navigation hash changes.\n * You may override this if needed.\n */\n onHashChanged(): void {\n const location = Router.getLocation();\n if (location.tab !== this.state.selectedTab) {\n this.selectTab(location.tab);\n }\n }\n\n /**\n * Selects the given tab.\n */\n selectTab(tab: string, index?: number): void {\n ((window as any)._localStorage || window.localStorage).setItem(`${this.adapterName}-adapter`, tab);\n this.setState({ selectedTab: tab, selectedTabNum: index });\n }\n\n /**\n * Gets called before the settings are saved.\n * You may override this if needed.\n */\n onPrepareSave(settings: Record<string, any>): boolean {\n // here you can encode values\n this.encryptedFields &&\n this.encryptedFields.forEach(attr => {\n if (settings[attr]) {\n settings[attr] = this.encrypt(settings[attr]);\n }\n });\n\n return true;\n }\n\n /**\n * Gets called after the settings are loaded.\n * You may override this if needed.\n *\n * @param settings instance settings from native part\n * @param encryptedNative optional list of fields to be decrypted\n */\n onPrepareLoad(settings: Record<string, any>, encryptedNative?: string[]): void {\n // here you can encode values\n this.encryptedFields &&\n this.encryptedFields.forEach(attr => {\n if (settings[attr]) {\n settings[attr] = this.decrypt(settings[attr]);\n }\n });\n encryptedNative &&\n encryptedNative.forEach(attr => {\n this.encryptedFields = this.encryptedFields || [];\n !this.encryptedFields.includes(attr) && this.encryptedFields.push(attr);\n if (settings[attr]) {\n settings[attr] = this.decrypt(settings[attr]);\n }\n });\n }\n\n /**\n * Gets the extendable instances.\n */\n async getExtendableInstances(): Promise<ioBroker.InstanceObject[]> {\n try {\n const instances = await this.socket.getObjectViewSystem(\n 'instance',\n 'system.adapter.',\n 'system.adapter.\\u9999',\n );\n return Object.values(instances).filter(instance => !!instance?.common?.webExtendable);\n } catch {\n return [];\n }\n }\n\n /**\n * Gets the IP addresses of the given host.\n */\n async getIpAddresses(host: string): Promise<{ name: string; address: string; family: 'ipv4' | 'ipv6' }[]> {\n const ips = await this.socket.getHostByIp(host || this.common?.host || '');\n // translate names\n const ip4 = ips.find(ip => ip.address === '0.0.0.0');\n if (ip4) {\n ip4.name = `[IPv4] 0.0.0.0 - ${I18n.t('ra_Listen on all IPs')}`;\n }\n const ip6 = ips.find(ip => ip.address === '::');\n if (ip6) {\n ip6.name = `[IPv4] :: - ${I18n.t('ra_Listen on all IPs')}`;\n }\n return ips;\n }\n\n /**\n * Saves the settings to the server.\n *\n * @param isClose True if the user is closing the dialog.\n */\n onSave(isClose?: boolean): void {\n let oldObj: ioBroker.InstanceObject;\n if (this.state.isConfigurationError) {\n this.setState({ errorText: this.state.isConfigurationError });\n return;\n }\n\n this.socket\n .getObject(this.instanceId)\n .then(_oldObj => {\n oldObj = (_oldObj || {}) as ioBroker.InstanceObject;\n\n for (const a in this.state.native) {\n if (Object.prototype.hasOwnProperty.call(this.state.native, a)) {\n if (this.state.native[a] === null) {\n oldObj.native[a] = null;\n } else if (this.state.native[a] !== undefined) {\n oldObj.native[a] = JSON.parse(JSON.stringify(this.state.native[a]));\n } else {\n delete oldObj.native[a];\n }\n }\n }\n\n if (this.state.common) {\n for (const b in this.state.common) {\n if (this.state.common[b] === null) {\n (oldObj as Record<string, any>).common[b] = null;\n } else if (this.state.common[b] !== undefined) {\n (oldObj as Record<string, any>).common[b] = JSON.parse(\n JSON.stringify(this.state.common[b]),\n );\n } else {\n delete (oldObj as Record<string, any>).common[b];\n }\n }\n }\n\n if (this.onPrepareSave(oldObj.native) !== false) {\n return this.socket.setObject(this.instanceId, oldObj);\n }\n\n return Promise.reject(new Error('Invalid configuration'));\n })\n .then(() => {\n this.savedNative = oldObj.native;\n globalThis.changed = false;\n try {\n window.parent.postMessage('nochange', '*');\n } catch {\n // ignore\n }\n\n this.setState({ changed: false });\n isClose && GenericApp.onClose();\n })\n .catch(e => console.error(`Cannot save configuration: ${e}`));\n }\n\n /**\n * Renders the toast.\n */\n renderToast(): JSX.Element | null {\n if (!this.state.toast) {\n return null;\n }\n\n return (\n <Snackbar\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n open={!0}\n autoHideDuration={6000}\n onClose={() => this.setState({ toast: '' })}\n ContentProps={{ 'aria-describedby': 'message-id' }}\n message={<span id=\"message-id\">{this.state.toast}</span>}\n action={[\n <IconButton\n key=\"close\"\n aria-label=\"Close\"\n color=\"inherit\"\n className={this.props.classes?.close}\n onClick={() => this.setState({ toast: '' })}\n size=\"large\"\n >\n <IconClose />\n </IconButton>,\n ]}\n />\n );\n }\n\n /**\n * Closes the dialog.\n */\n static onClose(): void {\n if (typeof window.parent !== 'undefined' && window.parent) {\n try {\n if (window.parent.$iframeDialog && typeof window.parent.$iframeDialog.close === 'function') {\n window.parent.$iframeDialog.close();\n } else {\n window.parent.postMessage('close', '*');\n }\n } catch {\n window.parent.postMessage('close', '*');\n }\n }\n }\n\n /**\n * Renders the error dialog.\n */\n renderError(): React.JSX.Element | null {\n if (!this.state.errorText) {\n return null;\n }\n\n return (\n <DialogError\n text={this.state.errorText}\n onClose={() => this.setState({ errorText: '' })}\n />\n );\n }\n\n /**\n * Checks if the configuration has changed.\n *\n * @param native the new state\n */\n getIsChanged(native: Record<string, any>): boolean {\n native = native || this.state.native;\n const isChanged = JSON.stringify(native) !== JSON.stringify(this.savedNative);\n\n globalThis.changed = isChanged;\n\n return isChanged;\n }\n\n /**\n * Gets called when loading the configuration.\n *\n * @param newNative The new configuration object.\n */\n onLoadConfig(newNative: Record<string, any>): void {\n if (JSON.stringify(newNative) !== JSON.stringify(this.state.native)) {\n this.setState({ native: newNative, changed: this.getIsChanged(newNative) });\n }\n }\n\n /**\n * Sets the configuration error.\n */\n setConfigurationError(errorText: string): void {\n if (this.state.isConfigurationError !== errorText) {\n this.setState({ isConfigurationError: errorText });\n }\n }\n\n /**\n * Renders the save and close buttons.\n */\n renderSaveCloseButtons(): React.JSX.Element | null {\n if (!this.state.confirmClose && !this.state.bottomButtons) {\n return null;\n }\n\n return (\n <>\n {this.state.bottomButtons ? (\n <SaveCloseButtons\n theme={this.state.theme}\n newReact={this.newReact}\n noTextOnButtons={\n this.state.width === 'xs' || this.state.width === 'sm' || this.state.width === 'md'\n }\n changed={this.state.changed}\n onSave={isClose => this.onSave(isClose)}\n onClose={() => {\n if (this.state.changed) {\n this.setState({ confirmClose: true });\n } else {\n GenericApp.onClose();\n }\n }}\n />\n ) : null}\n {this.state.confirmClose ? (\n <DialogConfirm\n title={I18n.t('ra_Please confirm')}\n text={I18n.t('ra_Some data are not stored. Discard?')}\n ok={I18n.t('ra_Discard')}\n cancel={I18n.t('ra_Cancel')}\n onClose={isYes => this.setState({ confirmClose: false }, () => isYes && GenericApp.onClose())}\n />\n ) : null}\n </>\n );\n }\n\n private _updateNativeValue(obj: Record<string, any>, attrs: string | string[], value: any): boolean {\n if (typeof attrs !== 'object') {\n attrs = attrs.split('.');\n }\n const attr: string = attrs.shift() || '';\n if (!attrs.length) {\n if (value && typeof value === 'object') {\n if (JSON.stringify(obj[attr]) !== JSON.stringify(value)) {\n obj[attr] = value;\n return true;\n }\n return false;\n }\n if (obj[attr] !== value) {\n obj[attr] = value;\n return true;\n }\n\n return false;\n }\n\n obj[attr] = obj[attr] || {};\n if (typeof obj[attr] !== 'object') {\n throw new Error(`attribute ${attr} is no object, but ${typeof obj[attr]}`);\n }\n return this._updateNativeValue(obj[attr], attrs, value);\n }\n\n /**\n * Update the native value\n *\n * @param attr The attribute name with dots as delimiter.\n * @param value The new value.\n * @param cb Callback which will be called upon completion.\n */\n updateNativeValue(attr: string, value: any, cb?: () => void): void {\n const native = JSON.parse(JSON.stringify(this.state.native));\n if (this._updateNativeValue(native, attr, value)) {\n const changed = this.getIsChanged(native);\n\n if (changed !== this.state.changed) {\n try {\n window.parent.postMessage(changed ? 'change' : 'nochange', '*');\n } catch {\n // ignore\n }\n }\n\n this.setState({ native, changed }, cb);\n }\n }\n\n /**\n * Set the error text to be shown.\n */\n showError(text: string | React.JSX.Element): void {\n this.setState({ errorText: text });\n }\n\n /**\n * Sets the toast to be shown.\n *\n * @param toast Text to be shown.\n */\n showToast(toast: string | React.JSX.Element): void {\n this.setState({ toast });\n }\n\n /**\n * Renders helper dialogs\n */\n renderHelperDialogs(): React.JSX.Element {\n return (\n <>\n {this.renderError()}\n {this.renderToast()}\n {this.renderSaveCloseButtons()}\n {this.renderAlertSnackbar()}\n </>\n );\n }\n\n /**\n * Renders this component.\n */\n render(): React.JSX.Element {\n if (!this.state.loaded) {\n return <Loader themeType={this.state.themeType} />;\n }\n\n return (\n <div className=\"App\">\n {this.renderError()}\n {this.renderToast()}\n {this.renderSaveCloseButtons()}\n {this.renderAlertSnackbar()}\n </div>\n );\n }\n}\n","/**\n * Copyright 2018-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * Licensed under the Creative Commons Attribution-NonCommercial License, Version 4.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://creativecommons.org/licenses/by-nc/4.0/legalcode.txt\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { Component, type CSSProperties } from 'react';\nimport { ChromePicker, type RGBColor } from 'react-color';\n\nimport { TextField, Menu, IconButton, Button, Box } from '@mui/material';\n\nimport { Delete as IconDelete, Close as IconClose } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\n\nimport type { IobTheme } from '../types';\n\nconst styles: Record<string, any> = {\n color: {\n width: 36,\n height: 14,\n borderRadius: 2,\n },\n delButton: {\n marginTop: 16,\n },\n swatch: {\n mt: '16px',\n p: '5px',\n backgroundColor: 'background.paper',\n borderRadius: '1px',\n boxShadow: '0 0 0 1px rgba(0,0,0,.1)',\n display: 'inline-block',\n cursor: 'pointer',\n verticalAlign: 'middle',\n },\n swatchDisabled: {\n opacity: 0.5,\n cursor: 'default',\n },\n popover: {\n '& .MuiPaper-root': {\n textAlign: 'right',\n backgroundColor: '#00000000',\n boxShadow: 'none',\n },\n },\n popoverList: {\n padding: 0,\n },\n closeButton: (theme: IobTheme) => ({\n backgroundColor: `${theme.palette.background.paper} !important`,\n borderRadius: '0 0 25% 25%',\n '&:hover': {\n backgroundColor: `${theme.palette.secondary.main} !important`,\n },\n }),\n cover: {\n position: 'fixed',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n },\n textDense: {\n mt: 0,\n mb: 0,\n },\n picker: (theme: IobTheme) => ({\n background: `${theme.palette.background.paper} !important`,\n }),\n iconButton: {\n width: 16,\n height: 16,\n },\n button: {\n width: 32,\n height: 32,\n minWidth: 32,\n minHeight: 32,\n },\n};\n\ninterface ColorPickerProps {\n /** Set to true to disable the color picker. */\n disabled?: boolean;\n /** The currently selected color. */\n value?: string;\n /** @deprecated The currently selected color use value */\n color?: string;\n /** The color change callback. */\n onChange: (rgba: string) => void;\n /** Label of the color picker. */\n label?: string;\n /** @deprecated TLabel of the color picker use label */\n name?: string;\n /** Additional styling for this component. */\n style?: CSSProperties;\n /** The CSS class name. */\n className?: string;\n customPalette?: string[];\n noInputField?: boolean;\n barWidth?: number;\n sx?: Record<string, any>;\n theme?: IobTheme;\n}\n\ninterface ColorPickerState {\n displayColorPicker: boolean;\n color: string | RGBColor;\n anchorEl: HTMLDivElement | null;\n}\n\n/**\n * A color picker component.\n */\nexport class ColorPicker extends Component<ColorPickerProps, ColorPickerState> {\n /**\n * Constructor for the color picker.\n *\n * @param props The properties.\n */\n constructor(props: ColorPickerProps) {\n super(props);\n this.state = {\n displayColorPicker: false,\n color: this.props.value || this.props.color || '',\n anchorEl: null,\n };\n }\n\n private handleClick = (e: React.MouseEvent<HTMLDivElement>): void => {\n this.setState({\n displayColorPicker: !this.state.displayColorPicker,\n anchorEl: this.state.displayColorPicker ? null : e.currentTarget,\n });\n };\n\n private handleClose = (): void => {\n this.setState({ displayColorPicker: false, anchorEl: null });\n };\n\n /**\n * Convert the given color to hex ('#rrggbb') or rgba ('rgba(r,g,b,a)') format.\n *\n * @param color The color to convert.\n * @param isHex If true, the color will be converted to hex format.\n * @returns the hex or rgba representation of the given color.\n */\n static getColor(color: string | { rgb: RGBColor } | RGBColor, isHex?: boolean): string {\n if (color && typeof color === 'object') {\n const oColor = color as { rgb: RGBColor };\n if (oColor.rgb) {\n if (isHex) {\n return `#${oColor.rgb.r.toString(16).padStart(2, '0')}${oColor.rgb.g.toString(16).padStart(2, '0')}${oColor.rgb.b.toString(16).padStart(2, '0')}`;\n }\n return `rgba(${oColor.rgb.r},${oColor.rgb.g},${oColor.rgb.b},${oColor.rgb.a})`;\n }\n const rColor = color as RGBColor;\n if (isHex) {\n return `#${rColor.r.toString(16).padStart(2, '0')}${rColor.g.toString(16).padStart(2, '0')}${rColor.b.toString(16).padStart(2, '0')}`;\n }\n return `rgba(${rColor.r},${rColor.g},${rColor.b},${rColor.a})`;\n }\n if (typeof color === 'string') {\n return isHex ? ColorPicker.rgb2hex(color || '') : color || '';\n }\n return '';\n }\n\n /**\n * Convert rgb() or rgba() format to hex format #rrggbb.\n *\n * @param rgb The color in rgb() or rgba() format. if not in this format, the color will be returned as is.\n */\n static rgb2hex(rgb: string): string {\n const m = rgb.match(/^rgba?[\\s+]?\\([\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?/i);\n\n if (m) {\n const r = parseInt(m[1], 10).toString(16).padStart(2, '0');\n const g = parseInt(m[2], 10).toString(16).padStart(2, '0');\n const b = parseInt(m[3], 10).toString(16).padStart(2, '0');\n\n return m?.length === 4 ? `#${r}${g}${b}` : rgb;\n }\n return rgb;\n }\n\n private handleChange = (color: string | RGBColor): void => {\n this.setState({ color }, () => this.props.onChange && this.props.onChange(ColorPicker.getColor(color)));\n };\n\n /**\n * If the props are updated from outside, they should override the state\n *\n * @param _prevProps The previous properties.\n * @param prevState The previous state.\n */\n componentDidUpdate(_prevProps: ColorPickerProps, prevState: ColorPickerState): void {\n const color = ColorPicker.getColor(this.props.color || this.props.value || '');\n\n if (color !== prevState.color) {\n this.setState({ color });\n }\n }\n\n renderCustomPalette(): React.JSX.Element | null {\n if (!this.props.customPalette) {\n return null;\n }\n return (\n <div style={{ width: '100%', display: 'flex', flexWrap: 'wrap' }}>\n {this.props.customPalette.map(color => (\n <Button\n style={styles.button}\n key={color}\n onClick={() => {\n this.handleChange(color);\n setTimeout(() => this.handleClose(), 300);\n }}\n >\n <div style={{ ...styles.iconButton, background: color }} />\n </Button>\n ))}\n </div>\n );\n }\n\n render(): React.JSX.Element {\n const style = { ...(this.props.style || {}) };\n style.position = 'relative';\n const { color } = this.state;\n\n return (\n <Box\n component=\"div\"\n style={style}\n sx={this.props.sx || undefined}\n className={this.props.className || ''}\n >\n {this.props.noInputField ? null : (\n <TextField\n disabled={this.props.disabled}\n variant=\"standard\"\n id=\"ar_color_picker_name\"\n label={this.props.label || this.props.name}\n value={color || ''}\n margin=\"dense\"\n sx={{\n '&.MuiFormControl-root': styles.textDense,\n width: color ? 'calc(100% - 80px)' : 'calc(100% - 56px)',\n mr: color ? undefined : 1,\n }}\n onChange={e => this.handleChange(e.target.value)}\n />\n )}\n {!this.props.noInputField && color ? (\n <IconButton\n disabled={this.props.disabled}\n onClick={() => this.handleChange('')}\n size=\"small\"\n style={this.props.label || this.props.name ? styles.delButton : undefined}\n >\n <IconDelete />\n </IconButton>\n ) : null}\n <Box\n component=\"div\"\n onClick={e => !this.props.disabled && this.handleClick(e)}\n title={I18n.t('ra_Select color')}\n sx={{\n ...styles.swatch,\n ...(this.props.disabled ? styles.swatchDisabled : undefined),\n background: color ? undefined : 'transparent',\n border: color ? undefined : '1px dashed #ccc',\n boxSizing: 'border-box',\n marginTop: this.props.noInputField || !(this.props.label || this.props.name) ? 0 : undefined,\n }}\n >\n <div\n style={{\n ...styles.color,\n background: ColorPicker.getColor(color),\n width: this.props.noInputField ? this.props.barWidth || 16 : this.props.barWidth || 36,\n }}\n />\n </Box>\n {this.state.displayColorPicker && !this.props.disabled ? (\n <Menu\n sx={{\n ...styles.popover,\n '&. MuiMenu-list': styles.popoverList,\n }}\n anchorEl={this.state.anchorEl}\n open={!0}\n onClose={() => this.handleClose()}\n >\n <ChromePicker\n color={this.state.color || undefined}\n onChangeComplete={(_color: { rgb: RGBColor }) => this.handleChange(_color.rgb)}\n styles={{\n default: {\n picker: {\n backgroundColor: this.props.theme?.palette.background.paper || '#888',\n },\n },\n }}\n />\n {color && this.props.noInputField ? (\n <IconButton\n sx={styles.closeButton}\n onClick={() => this.handleChange('')}\n >\n <IconDelete />\n </IconButton>\n ) : null}\n <IconButton\n sx={styles.closeButton}\n onClick={() => this.handleClose()}\n >\n <IconClose />\n </IconButton>\n {this.renderCustomPalette()}\n </Menu>\n ) : null}\n </Box>\n );\n }\n}\n","import cronstrue from 'cronstrue';\nimport 'cronstrue/locales/fr';\nimport 'cronstrue/locales/es';\nimport 'cronstrue/locales/de';\nimport 'cronstrue/locales/it';\nimport 'cronstrue/locales/ru';\nimport 'cronstrue/locales/zh_CN';\nimport 'cronstrue/locales/uk';\nimport 'cronstrue/locales/pt_BR';\nimport 'cronstrue/locales/pl';\n\nfunction convertCronToText(cron: string, lang?: ioBroker.Languages): string {\n return cronstrue.toString(cron, { locale: lang });\n}\n\nexport default convertCronToText;\n","import React, { Component } from 'react';\n\nimport { Checkbox, Button, MenuItem, Select, FormControlLabel, AppBar, Tabs, Tab, TextField } from '@mui/material';\n\nimport { I18n } from '../i18n';\nimport convertCronToText from './SimpleCron/cronText';\n\nconst styles: Record<string, React.CSSProperties> = {\n mainDiv: {\n width: '100%',\n height: '100%',\n },\n periodSelect: {\n // margin: '0 10px 60px 10px',\n display: 'block',\n width: 250,\n },\n slider: {\n marginTop: 20,\n display: 'block',\n width: '100%',\n },\n tabContent: {\n padding: 20,\n height: 'calc(100% - 240px)',\n overflow: 'auto',\n },\n numberButton: {\n padding: 4,\n minWidth: 40,\n margin: 5,\n },\n numberButtonBreak: {\n display: 'block',\n },\n appBar: {\n color: 'white',\n },\n warning: {\n marginLeft: 16,\n color: 'red',\n fontSize: 12,\n },\n};\n\nconst WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\n// 5-7,9-11 => [5,6,7,9,10,11]\nfunction convertMinusIntoArray(value: string | false | undefined, max: number): number[] {\n const result: number[] = [];\n\n if (value === '*') {\n if (max === 24 || max === 60 || max === 7) {\n for (let i = 0; i < max; i++) {\n result.push(i);\n }\n } else {\n for (let i = 1; i <= max; i++) {\n result.push(i);\n }\n }\n return result; // array with entries max\n }\n\n const parts = (value || '').toString().split(',');\n\n for (let p = 0; p < parts.length; p++) {\n if (!parts[p].trim().length) {\n continue;\n }\n const items = parts[p].trim().split('-');\n if (items.length > 1) {\n const iMax = parseInt(items[1], 10);\n for (let i = parseInt(items[0], 10); i <= iMax; i++) {\n result.push(i);\n }\n } else {\n result.push(parseInt(parts[p], 10));\n }\n }\n\n result.sort();\n\n // remove double entries\n for (let p = result.length - 1; p >= 0; p--) {\n if (result[p] === result[p + 1]) {\n result.splice(p + 1, 1);\n }\n }\n\n return result;\n}\n\n// [5,6,7,9,10,11] => 5-7,9-11\nfunction convertArrayIntoMinus(value: number | number[], max: number): string {\n if (typeof value !== 'object') {\n value = [value];\n }\n if (value.length === max) {\n return '*';\n }\n const newParts = [];\n if (!value.length) {\n return '-';\n }\n value = value.map(a => parseInt(a as any as string, 10));\n\n value.sort((a, b) => a - b);\n\n let start = value[0];\n let end = value[0];\n for (let p = 1; p < value.length; p++) {\n if (value[p] - 1 !== parseInt(value[p - 1] as any as string, 10)) {\n if (start === end) {\n newParts.push(start);\n } else if (end - 1 === start) {\n newParts.push(`${start},${end}`);\n } else {\n newParts.push(`${start}-${end}`);\n }\n start = value[p];\n }\n end = value[p];\n }\n\n if (start === end) {\n newParts.push(start);\n } else if (end - 1 === start) {\n newParts.push(`${start},${end}`);\n } else {\n newParts.push(`${start}-${end}`);\n }\n\n return newParts.join(',');\n}\n\ntype CronNames = 'seconds' | 'minutes' | 'hours' | 'dates' | 'months' | 'dow';\n\ninterface CronProps {\n seconds: string | false | null;\n minutes: string | null;\n hours: string | null;\n dates: string | null;\n months: string | null;\n dow: string | null;\n}\n\ninterface ComplexCronProps {\n cronExpression: string;\n onChange: (cron: string) => void;\n language: ioBroker.Languages;\n}\n\n// type CronModes = 'every' | 'everyN' | 'specific';\n\ninterface ComplexCronState {\n extended: boolean;\n tab: number;\n cron: string;\n seconds?: string | false;\n minutes?: string;\n hours?: string;\n dates?: string;\n months?: string;\n dow?: string;\n modes: CronProps;\n}\n\nexport class ComplexCron extends Component<ComplexCronProps, ComplexCronState> {\n constructor(props: ComplexCronProps) {\n super(props);\n let cron =\n typeof this.props.cronExpression === 'string'\n ? this.props.cronExpression.replace(/^[\"']/, '').replace(/[\"']\\n?$/, '')\n : '';\n if (cron[0] === '{') {\n cron = '';\n }\n const state = ComplexCron.cron2state(cron || '* * * * *');\n\n this.state = {\n extended: false,\n tab: state.seconds !== false ? 1 : 0,\n cron: ComplexCron.state2cron(state),\n modes: {\n seconds: null,\n minutes: null,\n hours: null,\n dates: null,\n months: null,\n dow: null,\n },\n };\n Object.assign(this.state, state);\n if (this.state.cron !== this.props.cronExpression) {\n setTimeout(() => this.props.onChange && this.props.onChange(this.state.cron), 100);\n }\n }\n\n static cron2state(cron: string): CronProps {\n cron = cron.replace(/['\"]/g, '').trim();\n const cronParts = cron.split(' ').map(p => p.trim());\n let options: CronProps;\n\n if (cronParts.length === 6) {\n options = {\n seconds: cronParts[0] || '*',\n minutes: cronParts[1] || '*',\n hours: cronParts[2] || '*',\n dates: cronParts[3] || '*',\n months: cronParts[4] || '*',\n dow: cronParts[5] || '*',\n };\n } else {\n options = {\n seconds: false,\n minutes: cronParts[0] || '*',\n hours: cronParts[1] || '*',\n dates: cronParts[2] || '*',\n months: cronParts[3] || '*',\n dow: cronParts[4] || '*',\n };\n }\n return options;\n }\n\n static state2cron(state: ComplexCronState | CronProps): string {\n let text = `${state.minutes} ${state.hours} ${state.dates} ${state.months} ${state.dow}`;\n if (state.seconds !== false) {\n text = `${state.seconds} ${text}`;\n }\n return text;\n }\n\n recalcCron(): void {\n const cron = ComplexCron.state2cron(this.state);\n if (cron !== this.state.cron) {\n this.setState({ cron }, () => this.props.onChange && this.props.onChange(this.state.cron));\n }\n }\n\n onToggle(i: boolean | number, type: CronNames, max: number): void {\n if (i === true) {\n this.setCronAttr(type, '*');\n } else if (i === false) {\n if (max === 60 || max === 24) {\n this.setCronAttr(type, '0');\n } else {\n this.setCronAttr(type, '1');\n }\n } else {\n const nums = convertMinusIntoArray(this.state[type], max);\n const pos = nums.indexOf(i);\n if (pos !== -1) {\n nums.splice(pos, 1);\n } else {\n nums.push(i);\n nums.sort();\n }\n this.setCronAttr(type, convertArrayIntoMinus(nums, max));\n }\n }\n\n getDigitsSelector(type: CronNames, max: number): React.JSX.Element[] {\n let values = [];\n if (max === 7) {\n values = [1, 2, 3, 4, 5, 6, 0];\n } else if (max === 60 || max === 24) {\n for (let i = 0; i < max; i++) {\n values.push(i);\n }\n } else {\n for (let i = 1; i <= max; i++) {\n values.push(i);\n }\n }\n\n const parts = convertMinusIntoArray(this.state[type], max);\n\n return [\n <Button\n key=\"removeall\"\n variant=\"outlined\"\n style={styles.numberButton}\n // style={{paddingBottom: 20}}\n color=\"primary\"\n onClick={() => this.onToggle(false, type, max)}\n >\n {I18n.t('ra_Deselect all')}\n </Button>,\n <Button\n key=\"addall\"\n variant=\"contained\"\n // style={{paddingBottom: 20}}\n style={styles.numberButton}\n color=\"secondary\"\n onClick={() => this.onToggle(true, type, max)}\n >\n {I18n.t('ra_Select all')}\n </Button>,\n <div key=\"all\">\n {values.map(i => [\n (max === 7 && i === 4) ||\n (max === 12 && i === 7) ||\n (max === 31 && !((i - 1) % 10)) ||\n (max === 60 && i && !(i % 10)) ||\n (max === 24 && i && !(i % 6)) ? (\n <div\n key={`allInner${i}`}\n style={{ width: '100%' }}\n />\n ) : null,\n <Button\n key={`_${i}`}\n variant={parts.indexOf(i) !== -1 ? 'contained' : 'outlined'}\n style={styles.numberButton}\n color={parts.indexOf(i) !== -1 ? 'secondary' : 'primary'}\n onClick={() => this.onToggle(i, type, max)}\n >\n {max === 7 ? I18n.t(WEEKDAYS[i]) : max === 12 ? MONTHS[i - 1] : i}\n </Button>,\n ])}\n </div>,\n ];\n }\n\n getPeriodsTab(type: CronNames, max: number): React.JSX.Element | null {\n const value = this.state[type];\n let every = value === '*';\n let everyN = value === undefined || value === null ? false : value.toString().includes('/');\n let select;\n if (this.state.modes[type] === null) {\n select = every ? 'every' : everyN ? 'everyN' : 'specific';\n const modes = JSON.parse(JSON.stringify(this.state.modes));\n modes[type] = select;\n setTimeout(() => this.setState({ modes }, () => this.recalcCron()), 100);\n return null;\n }\n\n every = this.state.modes[type] === 'every';\n everyN = this.state.modes[type] === 'everyN';\n select = this.state.modes[type];\n\n let valueNumber = 1;\n if (everyN && value) {\n valueNumber = parseInt(value.replace('*/', ''), 10) || 1;\n }\n\n return (\n <div>\n <Select\n variant=\"standard\"\n style={{ ...styles.periodSelect, verticalAlign: 'bottom' }}\n value={select}\n onChange={e => {\n const modes = JSON.parse(JSON.stringify(this.state.modes));\n modes[type] = e.target.value;\n if (e.target.value === 'every') {\n this.setCronAttr(type, '*', modes);\n } else if (e.target.value === 'everyN') {\n const num = parseInt((this.state[type] || '').toString().replace('*/', ''), 10) || 1;\n this.setCronAttr(type, `*/${num}`, modes);\n } else if (e.target.value === 'specific') {\n let num = parseInt((this.state[type] || '').toString().split(',')[0], 10) || 0;\n if (!num && (type === 'months' || type === 'dates')) {\n num = 1;\n }\n this.setCronAttr(type, convertArrayIntoMinus(num, max), modes);\n }\n }}\n >\n <MenuItem\n key=\"every\"\n value=\"every\"\n >\n {I18n.t(`sc_every_${type}`)}\n </MenuItem>\n <MenuItem\n key=\"everyN\"\n value=\"everyN\"\n >\n {I18n.t(`sc_everyN_${type}`)}\n </MenuItem>\n <MenuItem\n key=\"specific\"\n value=\"specific\"\n >\n {I18n.t(`sc_specific_${type}`)}\n </MenuItem>\n </Select>\n {/* everyN && false && <span>{value}</span> */}\n {everyN && (\n <TextField\n variant=\"standard\"\n key=\"interval\"\n label={I18n.t(`sc_${type}`)}\n value={valueNumber}\n slotProps={{\n htmlInput: {\n min: 1,\n max,\n },\n inputLabel: {\n shrink: true,\n },\n }}\n onChange={e => {\n // @ts-expect-error is allowed\n this.setState({ [type]: `*/${e.target.value}` }, () => this.recalcCron());\n }}\n type=\"number\"\n margin=\"normal\"\n />\n )}\n {!every && !everyN && this.getDigitsSelector(type, max)}\n </div>\n );\n }\n\n static convertCronToText(cron: string, lang: ioBroker.Languages): string {\n if (cron.split(' ').includes('-')) {\n return I18n.t('ra_Invalid CRON');\n }\n return convertCronToText(cron, lang);\n }\n\n setCronAttr(attr: CronNames, value: string, modes?: CronProps): void {\n if (modes) {\n if (attr === 'seconds') {\n this.setState({ seconds: value, modes }, () => this.recalcCron());\n } else if (attr === 'minutes') {\n this.setState({ minutes: value, modes }, () => this.recalcCron());\n } else if (attr === 'hours') {\n this.setState({ hours: value, modes }, () => this.recalcCron());\n } else if (attr === 'dates') {\n this.setState({ dates: value, modes }, () => this.recalcCron());\n } else if (attr === 'months') {\n this.setState({ months: value, modes }, () => this.recalcCron());\n } else if (attr === 'dow') {\n this.setState({ dow: value, modes }, () => this.recalcCron());\n } else {\n this.setState({ modes }, () => this.recalcCron());\n }\n } else if (attr === 'seconds') {\n this.setState({ seconds: value }, () => this.recalcCron());\n } else if (attr === 'minutes') {\n this.setState({ minutes: value }, () => this.recalcCron());\n } else if (attr === 'hours') {\n this.setState({ hours: value }, () => this.recalcCron());\n } else if (attr === 'dates') {\n this.setState({ dates: value }, () => this.recalcCron());\n } else if (attr === 'months') {\n this.setState({ months: value }, () => this.recalcCron());\n } else if (attr === 'dow') {\n this.setState({ dow: value }, () => this.recalcCron());\n }\n }\n\n render(): React.JSX.Element {\n const tab = this.state.seconds !== false ? this.state.tab : this.state.tab + 1;\n\n // Detect if every minute or every second is activated\n const everyMinute = this.state.minutes === '*' || this.state.minutes === '*/1';\n const everySecond = this.state.seconds === '*' || this.state.seconds === '*/1';\n\n return (\n <div style={styles.mainDiv}>\n <div style={{ paddingLeft: 8, width: 'calc(100% - px)' }}>\n <TextField\n variant=\"standard\"\n style={{ width: '100%' }}\n value={this.state.cron}\n disabled\n />\n </div>\n <div style={{ paddingLeft: 8, width: 'calc(100% - px)', height: 60 }}>\n {ComplexCron.convertCronToText(this.state.cron, this.props.language || 'en')}\n <span style={styles.warning}>\n {everySecond\n ? I18n.t('ra_warning_every_second')\n : everyMinute\n ? I18n.t('ra_warning_every_minute')\n : ''}\n </span>\n </div>\n <FormControlLabel\n control={\n <Checkbox\n checked={!!this.state.seconds}\n onChange={e =>\n this.setState({ seconds: e.target.checked ? '*' : false }, () => this.recalcCron())\n }\n />\n }\n label={I18n.t('ra_use seconds')}\n />\n <AppBar\n position=\"static\"\n sx={{ '&.MuiAppBar-root': styles.appBar }}\n color=\"secondary\"\n >\n <Tabs\n value={this.state.tab}\n style={styles.appBar}\n color=\"secondary\"\n onChange={(_active, _tab) => this.setState({ tab: _tab })}\n >\n {this.state.seconds !== false && (\n <Tab\n id=\"sc_seconds\"\n label={I18n.t('sc_seconds')}\n />\n )}\n <Tab\n id=\"minutes\"\n label={I18n.t('sc_minutes')}\n />\n <Tab\n id=\"hours\"\n label={I18n.t('sc_hours')}\n />\n <Tab\n id=\"dates\"\n label={I18n.t('sc_dates')}\n />\n <Tab\n id=\"months\"\n label={I18n.t('sc_months')}\n />\n <Tab\n id=\"dow\"\n label={I18n.t('sc_dows')}\n />\n </Tabs>\n </AppBar>\n {tab === 0 && <div style={styles.tabContent}>{this.getPeriodsTab('seconds', 60)}</div>}\n {tab === 1 && <div style={styles.tabContent}>{this.getPeriodsTab('minutes', 60)}</div>}\n {tab === 2 && <div style={styles.tabContent}>{this.getPeriodsTab('hours', 24)}</div>}\n {tab === 3 && <div style={styles.tabContent}>{this.getPeriodsTab('dates', 31)}</div>}\n {tab === 4 && <div style={styles.tabContent}>{this.getPeriodsTab('months', 12)}</div>}\n {tab === 5 && <div style={styles.tabContent}>{this.getPeriodsTab('dow', 7)}</div>}\n </div>\n );\n }\n}\n","import React, { useEffect, useState } from 'react';\n\nimport { Dialog, DialogActions, DialogContent, DialogTitle, IconButton, TextField, Button } from '@mui/material';\n\nimport { Check as CheckIcon, Close as CloseIcon, Language as LanguageIcon } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\nimport type { IobTheme } from '../types';\nimport { Utils } from './Utils';\n\nconst styles: Record<string, any> = {\n modalDialog: {\n minWidth: 400,\n maxWidth: 800,\n },\n overflowHidden: {\n display: 'flex',\n overflow: 'hidden',\n },\n titleIcon: {\n marginRight: 5,\n },\n content: {\n fontSize: 16,\n },\n languageButton: {\n position: 'absolute',\n right: 8,\n top: 8,\n },\n languageButtonActive: (theme: IobTheme) => ({\n color: theme.palette.primary.main,\n }),\n};\n\ninterface CustomModalProps {\n icon?: any;\n open: boolean;\n onClose: () => void;\n children: React.JSX.Element | null;\n titleButtonClose?: string;\n titleButtonApply?: string;\n onApply: (result: string) => void;\n fullWidth?: boolean;\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n applyButton?: boolean;\n applyDisabled?: boolean;\n overflowHidden?: boolean;\n help?: string;\n noTranslation?: boolean;\n toggleTranslation?: () => void;\n title?: string;\n progress?: boolean;\n textInput?: boolean;\n defaultValue?: string;\n theme: IobTheme;\n}\n\nexport function CustomModal(props: CustomModalProps): React.JSX.Element {\n const {\n open,\n toggleTranslation,\n noTranslation,\n title,\n fullWidth,\n help,\n maxWidth,\n progress,\n icon,\n applyDisabled,\n applyButton,\n onClose,\n children,\n titleButtonApply,\n titleButtonClose,\n onApply,\n textInput,\n defaultValue,\n overflowHidden,\n } = props;\n\n const [value, setValue] = useState<string>(defaultValue || '');\n\n useEffect(() => {\n setValue(defaultValue || '');\n }, [defaultValue]);\n\n let Icon = null;\n\n if (icon) {\n Icon = icon;\n }\n\n return (\n <Dialog\n open={open}\n maxWidth={maxWidth || 'md'}\n fullWidth={!!fullWidth}\n disableEscapeKeyDown={false}\n onClose={onClose}\n sx={{ '& .MuiDialog-paper': styles.modalDialog }}\n >\n {title && (\n <DialogTitle>\n {icon ? <Icon style={styles.titleIcon} /> : null}\n {title}\n {I18n.getLanguage() !== 'en' && toggleTranslation ? (\n <IconButton\n size=\"large\"\n sx={Utils.getStyle(\n props.theme,\n styles.languageButton,\n noTranslation && styles.languageButtonActive,\n )}\n onClick={() => toggleTranslation()}\n title={I18n.t('Disable/Enable translation')}\n >\n <LanguageIcon />\n </IconButton>\n ) : null}\n </DialogTitle>\n )}\n <DialogContent\n style={{ ...styles.content, ...(overflowHidden ? styles.overflowHidden : undefined), paddingTop: 8 }}\n >\n {textInput && (\n <TextField\n // className={className}\n autoComplete=\"off\"\n fullWidth\n autoFocus\n variant=\"outlined\"\n size=\"medium\"\n // rows={10}\n multiline\n value={value}\n onChange={e => setValue(e.target.value)}\n // customValue\n />\n )}\n {children}\n {help ? <div>{help}</div> : null}\n </DialogContent>\n <DialogActions>\n {applyButton !== false && (\n <Button\n startIcon={<CheckIcon />}\n disabled={progress || (applyDisabled && defaultValue === value)}\n onClick={() => onApply(textInput ? value : '')}\n variant=\"contained\"\n color=\"primary\"\n >\n {I18n.t(titleButtonApply || 'ra_Ok')}\n </Button>\n )}\n <Button\n color=\"grey\"\n onClick={onClose}\n disabled={progress}\n variant=\"contained\"\n startIcon={<CloseIcon />}\n >\n {I18n.t(titleButtonClose || 'ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","import React, { type JSXElementConstructor, type JSX } from 'react';\nimport { useTheme } from '@mui/material/styles';\nimport { type Breakpoint, useMediaQuery } from '@mui/material';\n\nfunction useWidth(): Breakpoint {\n const theme = useTheme();\n const keys = [...theme.breakpoints.keys].reverse();\n return (\n keys.reduce((output: Breakpoint | null, key: Breakpoint) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const matches = useMediaQuery(theme.breakpoints.up(key));\n return !output && matches ? key : output;\n }, null) || 'xs'\n );\n}\n\n// FIXME checkout https://mui.com/components/use-media-query/#migrating-from-withwidth\nexport function withWidth() {\n return (WrappedComponent: JSXElementConstructor<any>) => {\n return function AnyComponent(props: Record<string, any>): JSX.Element {\n const width = useWidth();\n return (\n <WrappedComponent\n {...props}\n width={width}\n />\n );\n };\n };\n}\n","import React, { type JSX } from 'react';\n\nimport { Button, TextField, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material';\n\nimport { Close as IconClose, Check as IconCheck } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\nimport { withWidth } from '../Components/withWidth';\n\ninterface TextInputProps {\n /** The dialog close callback */\n onClose: (text: string | null) => void;\n /** The title text */\n titleText: string;\n /** Prompt text (default: empty) */\n promptText?: string;\n /** Label text (default: empty) */\n labelText?: string;\n /** The text of the cancel button */\n cancelText: string;\n /** The text of the \"apply\" button */\n applyText: string;\n /** The verification callback. Return a non-empty string if there was an error */\n verify?: (text: string) => string;\n /** The text replacement callback */\n rule?: (text: string) => string;\n /** The type of the textbox (default: text) */\n type?: 'text' | 'number' | 'password' | 'email';\n /** The initial input value when opening the dialog */\n value?: string;\n /** @deprecated Use value. The input when opening the dialog */\n input?: string;\n /** If true, the dialog will be full width */\n fullWidth?: boolean;\n}\n\nfunction TextInputFunc(props: TextInputProps): JSX.Element {\n const [text, setText] = React.useState<string>(props.input || props.value || '');\n const [error, setError] = React.useState<string | boolean>('');\n return (\n <Dialog\n open={!0}\n onClose={() => props.onClose(null)}\n aria-labelledby=\"form-dialog-title\"\n fullWidth={props.fullWidth !== undefined ? props.fullWidth : false}\n >\n <DialogTitle id=\"form-dialog-title\">{props.titleText}</DialogTitle>\n <DialogContent>\n <DialogContentText>{props.promptText}</DialogContentText>\n <TextField\n variant=\"standard\"\n autoFocus\n margin=\"dense\"\n error={!!error}\n helperText={error === true || !error ? '' : error}\n value={text}\n label={props.labelText || ''}\n type={props.type || 'text'}\n onKeyUp={e => e.code === 'Enter' && text && props.onClose(text)}\n onChange={e => {\n let _error: string | boolean = '';\n if (props.verify) {\n _error = !props.verify(e.target.value);\n }\n\n if (props.rule) {\n setText(props.rule(e.target.value));\n } else {\n setText(e.target.value);\n }\n setError(_error);\n }}\n fullWidth\n />\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n disabled={!text || !!error}\n onClick={() => props.onClose(text)}\n color=\"primary\"\n startIcon={<IconCheck />}\n >\n {props.applyText || I18n.t('ra_Ok')}\n </Button>\n <Button\n color=\"grey\"\n variant=\"contained\"\n onClick={() => props.onClose(null)}\n startIcon={<IconClose />}\n >\n {props.cancelText || I18n.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n\nexport const DialogTextInput = withWidth()(TextInputFunc);\n","import React from 'react';\n\nimport { type IconProps } from './IconProps';\n\nexport const IconExpert = (props: IconProps): React.JSX.Element => (\n <svg\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 486 486\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n xmlns=\"http://www.w3.org/2000/svg\"\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"m414.928297,149.715165 c-2.639376,-57.222555 -35.669446,-106.505345 -83.345894,-132.039151 c-3.758948,-2.049842 -7.636885,-3.932022 -11.590542,-5.641125 c-19.303146,-8.394083 -40.607459,-13.050853 -63.004303,-13.050853 c-84.113909,0 -152.791790,65.703174 -157.718988,148.605566 l0.043268,-0.010816 v0.281245 c0,3.061243 -0.146031,16.750306 -0.146031,16.750306 l-2.352723,5.224668 h15.744315 c5.916964,-19.384275 24.078904,-32.635245 45.513024,-32.635245 c26.231510,0 47.573684,21.915481 47.573684,48.146991 c0,26.226103 -21.342174,47.146409 -47.573684,47.146409 c-25.111939,0 -45.734774,-19.735831 -47.443879,-44.658471 h-18.789334 c-0.400232,0 -0.778832,0.638209 -1.162839,0.584122 l-19.762875,55.199753 c-2.774590,7.696379 2.926030,16.214860 11.103771,16.214860 h17.020735 l-0.129805,87.899899 c0,17.356066 14.073071,31.174935 31.429136,31.174935 h56.205745 v82.648189 c0,12.877778 12.937273,22.580734 25.815051,22.580734 h144.597825 c12.877778,0 23.429877,-9.702955 23.429877,-22.580734 v-166.037352 c0,-22.645636 5.976457,-44.761234 16.561008,-64.789128 c11.055093,-20.925714 17.523731,-44.620611 18.129489,-69.792045 c0.027042,-1.260193 0.037858,-2.552839 0.037858,-3.845485 c0,-2.466302 -0.070310,-4.938014 -0.183890,-7.377273 zm-155.393308,-11.731165 h-13.456494 v13.559257 c0,4.732489 -4.267352,8.567157 -8.999842,8.567157 c-4.727079,0 -8.999842,-3.834667 -8.999842,-8.567157 v-13.559257 h-12.185483 c-4.732489,0 -8.567157,-4.267352 -8.567157,-8.999842 c0,-4.727079 3.834667,-8.999842 8.567157,-8.999842 h12.185483 v-12.077311 c0,-4.732489 4.272762,-8.567157 8.999842,-8.567157 c4.732489,0 8.999842,3.834667 8.999842,8.567157 v12.077311 h13.456494 c4.727079,0 8.567157,4.272762 8.567157,8.999842 c0,4.732489 -3.840077,8.999842 -8.567157,8.999842 zm0,0\"\n />\n <path\n fill=\"currentColor\"\n d=\"m187.695312 285.875c3.9375-3.980469 6.414063-9.449219 6.414063-15.523438 0-12.128906-9.855469-21.980468-21.984375-21.980468-6.007812 0-11.472656 2.410156-15.457031 6.347656-4.023438 4.003906-6.523438 9.539062-6.523438 15.636719 0 12.125 9.855469 21.980469 21.980469 21.980469 6.078125 0 11.585938-2.476563 15.570312-6.460938zm0 0\"\n />\n </svg>\n);\n","import React from 'react';\nimport { type IconProps } from './IconProps';\n\n// Icon copied from https://github.com/FortAwesome/Font-Awesome/blob/0d1f27efb836eb2ab994ba37221849ed64a73e5c/svgs/regular/\nexport const IconClosed = (props: IconProps): React.JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 650 512\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"m524,128l-192,0l-64,-64l-160,0c-26.51,0 -48,21.49 -48,48l0,288c0,26.51 21.49,48 48,48l416,0c26.51,0 48,-21.49 48,-48l0,-224c0,-26.51 -21.49,-48 -48,-48z\"\n />\n </svg>\n);\n","import React, { type JSX } from 'react';\nimport { type IconProps } from './IconProps';\n\n// Icon copied from https://github.com/FortAwesome/Font-Awesome/blob/0d1f27efb836eb2ab994ba37221849ed64a73e5c/svgs/regular/\nexport const IconOpen = (props: IconProps): JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 650 512\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"m631.75617,292.093l-72.424,124.155a63.997,63.997 0 0 1 -55.281,31.752l-399.964,0c-18.523,0 -30.064,-20.093 -20.731,-36.093l72.424,-124.155a64,64 0 0 1 55.282,-31.752l399.964,0c18.523,0 30.064,20.093 20.73,36.093zm-420.694,-68.093l328,0l0,-48c0,-26.51 -21.49,-48 -48,-48l-160,0l-64,-64l-160,0c-26.51,0 -48,21.49 -48,48l0,278.046l69.077,-118.418c17.137,-29.378 48.912,-47.628 82.923,-47.628z\"\n />\n </svg>\n);\n","import React from 'react';\nimport { type IconProps } from './IconProps';\n\nexport const IconNoIcon = (props: IconProps): React.JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 512 512\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"#EE3333\"\n d=\"M256,0C114.844,0,0,114.844,0,256s114.844,256,256,256s256-114.844,256-256S397.156,0,256,0z M256,448 c-105.865,0-192-86.135-192-192c0-40.406,12.25-78.604,35.542-111.198l267.656,267.656C334.604,435.75,296.406,448,256,448z M412.458,367.198L144.802,99.542C177.396,76.25,215.594,64,256,64c105.865,0,192,86.135,192,192 C448,296.406,435.75,334.604,412.458,367.198z\"\n />\n </svg>\n);\n","import React from 'react';\nimport { type IconProps } from './IconProps';\n\n// Icon copied from https://github.com/FortAwesome/Font-Awesome/blob/0d1f27efb836eb2ab994ba37221849ed64a73e5c/svgs/regular/\nexport const IconAlias = (props: IconProps): React.JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 512 512\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0 0 26.64 14.28h61.71a31.99 31.99 0 0 0 26.64-14.28l17.09-25.69a31.989 31.989 0 0 0 5.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z\"\n />\n </svg>\n);\n","import React, { type ReactEventHandler } from 'react';\nimport SVG from 'react-inlinesvg';\n\nimport { Box } from '@mui/material';\n\nimport {\n SettingsApplications as IconSystem,\n Photo as IconPhoto,\n SupervisedUserCircle as IconGroup,\n PersonOutlined as IconUser,\n Router as IconHost,\n Wifi as IconConnection,\n Info as IconInfo,\n Description as IconMeta,\n} from '@mui/icons-material';\n\nimport { IconAlias } from '../icons/IconAlias';\nimport { Utils } from './Utils';\n\n/**\n * Get icon by object type (state, channel, device, ...).\n *\n * @param obj Object\n */\nexport function getSystemIcon(obj: ioBroker.Object | null): React.JSX.Element | null {\n let icon;\n const id = obj?._id;\n\n if (!id) {\n return null;\n }\n\n // system or design has special icons\n if (id.startsWith('_design/') || id === 'system') {\n icon = <IconSystem className=\"iconOwn\" />;\n } else if (id === '0_userdata' || id === '0_userdata.0') {\n icon = <IconPhoto className=\"iconOwn\" />;\n } else if (id === 'alias' || id === 'alias.0') {\n icon = <IconAlias className=\"iconOwn\" />;\n } else if (id === 'system.adapter') {\n icon = <IconSystem className=\"iconOwn\" />;\n } else if (id === 'system.group') {\n icon = <IconGroup className=\"iconOwn\" />;\n } else if (id === 'system.user') {\n icon = <IconUser className=\"iconOwn\" />;\n } else if (id === 'system.host') {\n icon = <IconHost className=\"iconOwn\" />;\n } else if (id.endsWith('.connection') || id.endsWith('.connected')) {\n icon = <IconConnection className=\"iconOwn\" />;\n } else if (id.endsWith('.info')) {\n icon = <IconInfo className=\"iconOwn\" />;\n } else if (obj?.type === 'meta') {\n icon = <IconMeta className=\"iconOwn\" />;\n }\n\n return icon || null;\n}\n\n/**\n * Get icon from the object.\n *\n * @param obj Object\n * @param imagePrefix Prefix for image\n */\nexport function getSelectIdIcon(obj: ioBroker.Object | null, imagePrefix?: string): string | null {\n imagePrefix = imagePrefix || '.'; // http://localhost:8081';\n let src = '';\n const common = obj?.common;\n\n if (common) {\n const cIcon = common.icon;\n if (cIcon) {\n if (!cIcon.startsWith('data:image/')) {\n if (cIcon.includes('.')) {\n let instance;\n if (obj.type === 'instance' || obj.type === 'adapter') {\n src = `${imagePrefix}/adapter/${common.name as string}/${cIcon}`;\n } else if (obj._id && obj._id.startsWith('system.adapter.')) {\n instance = obj._id.split('.', 3);\n if (cIcon[0] === '/') {\n instance[2] += cIcon;\n } else {\n instance[2] += `/${cIcon}`;\n }\n src = `${imagePrefix}/adapter/${instance[2]}`;\n } else {\n instance = obj._id.split('.', 2);\n if (cIcon[0] === '/') {\n instance[0] += cIcon;\n } else {\n instance[0] += `/${cIcon}`;\n }\n src = `${imagePrefix}/adapter/${instance[0]}`;\n }\n } else {\n return null;\n }\n } else {\n // base 64 image\n src = cIcon;\n }\n }\n }\n\n return src || null;\n}\n\ninterface IconProps {\n /** URL, UTF-8 character, or svg code (data:image/svg...) */\n src: string | React.JSX.Element | null | undefined;\n /** Class name */\n className?: string;\n /** Style for image */\n style?: React.CSSProperties;\n /** Styles for mui */\n sx?: Record<string, any>;\n /** Tooltip */\n title?: string;\n /** Styles for utf-8 characters */\n styleUTF8?: React.CSSProperties;\n /** On error handler */\n onError?: ReactEventHandler<HTMLImageElement>;\n /** Reference to image */\n ref?: React.RefObject<HTMLImageElement>;\n /** Alternative text for image */\n alt?: string;\n}\n\nconst REMOTE_SERVER = window.location.hostname.endsWith('iobroker.in');\nconst REMOTE_PREFIX = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1);\n\nexport function Icon(props: IconProps): React.JSX.Element | null {\n if (props.src) {\n if (typeof props.src === 'string') {\n if (props.src.length < 3) {\n // utf-8 char\n if (props.sx) {\n return (\n <Box\n component=\"span\"\n sx={props.sx}\n title={props.title || undefined}\n style={{ height: 27, marginTop: -8, ...(props.styleUTF8 || props.style) }}\n className={Utils.clsx(props.className, 'iconOwn')}\n >\n {props.src}\n </Box>\n );\n }\n return (\n <span\n title={props.title || undefined}\n style={{ height: 27, marginTop: -8, ...(props.styleUTF8 || props.style) }}\n className={Utils.clsx(props.className, 'iconOwn')}\n >\n {props.src}\n </span>\n );\n }\n if (props.src.startsWith('data:image/svg')) {\n return (\n <SVG\n title={props.title || undefined}\n src={props.src}\n className={Utils.clsx(props.className, 'iconOwn')}\n width={props.style?.width || 28}\n height={props.style?.height || props.style?.width || 28}\n style={props.style || {}}\n />\n );\n }\n if (REMOTE_SERVER && !props.src.startsWith('http://') && !props.src.startsWith('https://')) {\n let src = props.src;\n if (src.startsWith('./')) {\n src = REMOTE_PREFIX + src.substring(2);\n } else if (!src.startsWith('/')) {\n src = REMOTE_PREFIX + src;\n }\n\n if (props.sx) {\n return (\n <Box\n component=\"img\"\n sx={props.sx}\n title={props.title || undefined}\n style={props.style || {}}\n className={Utils.clsx(props.className, 'iconOwn')}\n src={`https://remote-files.iobroker.in${src}`}\n alt={props.alt || undefined}\n ref={props.ref}\n onError={e => props.onError && props.onError(e)}\n />\n );\n }\n return (\n <img\n title={props.title || undefined}\n style={props.style || {}}\n className={Utils.clsx(props.className, 'iconOwn')}\n src={`https://remote-files.iobroker.in${src}`}\n alt={props.alt || undefined}\n ref={props.ref}\n onError={e => props.onError && props.onError(e)}\n />\n );\n }\n if (props.sx) {\n return (\n <Box\n component=\"img\"\n sx={props.sx}\n title={props.title || undefined}\n style={props.style || {}}\n className={Utils.clsx(props.className, 'iconOwn')}\n src={props.src}\n alt={props.alt || undefined}\n ref={props.ref}\n onError={props.onError}\n />\n );\n }\n return (\n <img\n title={props.title || undefined}\n style={props.style || {}}\n className={Utils.clsx(props.className, 'iconOwn')}\n src={props.src}\n alt={props.alt || undefined}\n ref={props.ref}\n onError={props.onError}\n />\n );\n }\n\n return props.src;\n }\n return null;\n}\n","// File viewer in adapter-react does not support write\n// import { Buffer } from 'buffer';\nimport React, { Component, type JSX } from 'react';\n\nimport { TextField, Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton } from '@mui/material';\n\n// Icons\nimport {\n Close as CloseIcon,\n Save as SaveIcon,\n Brightness6 as Brightness5Icon,\n ContentCopy as CopyIcon,\n} from '@mui/icons-material';\n\nimport type { Connection } from '@iobroker/socket-client';\n\nimport { IconNoIcon } from '../icons/IconNoIcon';\nimport { withWidth } from './withWidth';\nimport { Utils } from './Utils';\nimport type { ThemeType, Translate } from '../types';\nimport { Icon } from './Icon';\n\nconst styles: Record<string, React.CSSProperties> = {\n dialog: {\n height: '100%',\n },\n paper: {\n height: 'calc(100% - 64px)',\n },\n content: {\n textAlign: 'center',\n },\n textarea: {\n width: '100%',\n height: '100%',\n },\n img: {\n width: 'auto',\n height: 'calc(100% - 5px)',\n objectFit: 'contain',\n },\n dialogTitle: {\n justifyContent: 'space-between',\n display: 'flex',\n },\n};\n\nexport const EXTENSIONS = {\n images: ['png', 'jpg', 'svg', 'jpeg', 'bmp', 'gif', 'apng', 'avif', 'webp'],\n code: ['js', 'json', 'json5', 'md'],\n txt: ['log', 'txt', 'html', 'css', 'xml', 'ics'],\n audio: ['mp3', 'wav', 'ogg', 'acc'],\n video: ['mp4', 'mov', 'avi'],\n};\n\nfunction bufferToBase64(buffer: Buffer, isFull?: boolean): string {\n let binary = '';\n const bytes = new Uint8Array(buffer);\n const len = bytes.byteLength;\n for (let i = 0; i < len && (isFull || i < 50); i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return window.btoa(binary);\n}\n\nexport interface FileViewerProps {\n /** Translation function */\n t: Translate;\n /** Callback when the viewer is closed. */\n onClose: () => void;\n /** The URL (file path) to the file to be displayed. */\n href: string;\n formatEditFile?: string;\n socket: Connection;\n setStateBackgroundImage: () => void;\n themeType: ThemeType;\n getStyleBackgroundImage: () => React.CSSProperties | null;\n /** Flag is the js-controller support subscribe on file */\n supportSubscribes?: boolean;\n}\n\nexport interface FileViewerState {\n text: string | null;\n code: string | null;\n ext: string | null;\n editing: boolean;\n editingValue: string | null;\n copyPossible: boolean;\n forceUpdate: number;\n changed: boolean;\n imgError: boolean;\n}\n\nexport class FileViewerClass extends Component<FileViewerProps, FileViewerState> {\n private timeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(props: FileViewerProps) {\n super(props);\n const ext = Utils.getFileExtension(props.href);\n\n this.state = {\n text: null,\n code: null,\n ext,\n // File viewer in adapter-react does not support write\n editing: /* !!this.props.formatEditFile || */ false,\n editingValue: null,\n copyPossible: !!ext && (EXTENSIONS.code.includes(ext) || EXTENSIONS.txt.includes(ext)),\n forceUpdate: Date.now(),\n changed: false,\n imgError: false,\n };\n }\n\n readFile(): void {\n if (this.props.href) {\n const parts = this.props.href.split('/');\n parts.splice(0, 2);\n const adapter = parts[0];\n const name = parts.splice(1).join('/');\n\n this.props.socket\n .readFile(adapter, name)\n .then((data: { data: Buffer; type: string } | { file: string; mimeType: string }) => {\n let fileData = '';\n if ((data as { file: string; mimeType: string }).file !== undefined) {\n fileData = (data as { file: string; mimeType: string }).file;\n }\n\n const newState: Partial<FileViewerState> = {\n copyPossible: this.state.copyPossible,\n ext: this.state.ext,\n };\n // try to detect valid extension\n if ((data as { data: Buffer; type: string }).type === 'Buffer') {\n if (name.toLowerCase().endsWith('.json5')) {\n newState.ext = 'json5';\n newState.copyPossible = true;\n try {\n fileData = atob(bufferToBase64((data as { data: Buffer; type: string }).data, true));\n } catch {\n console.error('Cannot convert base64 to string');\n fileData = '';\n }\n } else {\n const ext = Utils.detectMimeType(\n bufferToBase64((data as { data: Buffer; type: string }).data),\n );\n if (ext) {\n newState.ext = ext;\n newState.copyPossible = EXTENSIONS.code.includes(ext) || EXTENSIONS.txt.includes(ext);\n }\n }\n }\n\n if (newState.copyPossible) {\n if (newState.ext && EXTENSIONS.txt.includes(newState.ext)) {\n newState.text = fileData;\n newState.editingValue = fileData;\n } else if (newState.ext && EXTENSIONS.code.includes(newState.ext)) {\n newState.code = fileData;\n newState.editingValue = fileData;\n }\n }\n\n this.setState(newState as FileViewerState);\n })\n .catch(e => window.alert(`Cannot read file: ${e}`));\n }\n }\n\n componentDidMount(): void {\n this.readFile();\n\n const parts = this.props.href.split('/');\n parts.splice(0, 2);\n const adapter = parts[0];\n const name = parts.splice(1).join('/');\n\n if (this.props.supportSubscribes) {\n this.props.socket\n .subscribeFiles(adapter, name, this.onFileChanged)\n .catch(e => window.alert(`Cannot subscribe on file: ${e}`));\n }\n }\n\n componentWillUnmount(): void {\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n const parts = this.props.href.split('/');\n parts.splice(0, 2);\n const adapter = parts[0];\n const name = parts.splice(1).join('/');\n if (this.props.supportSubscribes) {\n this.props.socket\n .subscribeFiles(adapter, name, this.onFileChanged)\n .catch(e => window.alert(`Cannot subscribe on file: ${e}`));\n }\n }\n\n onFileChanged = (_id: string, _fileName: string, size: number | null): void => {\n if (!this.state.changed) {\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n this.timeout = setTimeout(() => {\n this.timeout = null;\n if (size === null) {\n window.alert('Show file was deleted!');\n } else if (this.state.text !== null || this.state.code !== null) {\n this.readFile();\n } else {\n this.setState({ forceUpdate: Date.now() });\n }\n }, 300);\n }\n };\n\n getEditorOrViewer(): JSX.Element {\n return (\n <TextField\n variant=\"standard\"\n style={styles.textarea}\n multiline\n value={this.state.editingValue || this.state.code || this.state.text}\n // onChange={newValue => this.setState({ editingValue: newValue, changed: true })}\n slotProps={{\n htmlInput: {\n readOnly: !this.state.editing,\n },\n }}\n />\n );\n }\n\n getContent(): React.JSX.Element | null {\n if (this.state.ext && EXTENSIONS.images.includes(this.state.ext)) {\n if (this.state.imgError) {\n return <IconNoIcon style={{ ...styles.img, ...this.props.getStyleBackgroundImage() }} />;\n }\n return (\n <Icon\n onError={e => {\n (e.target as HTMLImageElement).onerror = null;\n this.setState({ imgError: true });\n }}\n style={{ ...styles.img, ...this.props.getStyleBackgroundImage() }}\n src={`${this.props.href}?ts=${this.state.forceUpdate}`}\n alt={this.props.href}\n />\n );\n }\n if (this.state.ext && EXTENSIONS.audio.includes(this.state.ext)) {\n return (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <audio\n style={{ width: '100%' }}\n src={this.props.href}\n controls\n ></audio>\n </div>\n );\n }\n if (this.state.ext && EXTENSIONS.video.includes(this.state.ext)) {\n return (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <video\n style={{ width: '100%', height: '100%' }}\n controls\n >\n <source\n src={this.props.href}\n type={`video/${this.state.ext}}`}\n />\n </video>\n </div>\n );\n }\n if (this.state.code !== null || this.state.text !== null || this.state.editing) {\n // File viewer in adapter-react does not support write\n // return <Editor\n // mode={this.getEditFile(this.props.formatEditFile)}\n // themeType={this.props.themeType}\n // value={this.state.editingValue || this.state.code || this.state.text}\n // onChange={this.state.editing ? newValue => this.setState({ editingValue: newValue, changed: true }) : undefined}\n // />;\n return this.getEditorOrViewer();\n }\n return null;\n }\n\n // eslint-disable-next-line class-methods-use-this\n onSave(): void {\n // Do nothing as the file viewer in adapter-react does not support writing\n }\n\n render(): JSX.Element {\n return (\n <Dialog\n sx={{\n '&.MuiDialog-scrollPaper': styles.dialog,\n '& .MuiDialog-paper': styles.paper,\n }}\n scroll=\"paper\"\n open={!!this.props.href}\n onClose={() => this.props.onClose()}\n fullWidth\n maxWidth=\"xl\"\n aria-labelledby=\"ar_dialog_file_view_title\"\n >\n <div style={styles.dialogTitle}>\n <DialogTitle id=\"ar_dialog_file_view_title\">{`${this.props.t(this.state.editing ? 'Edit' : 'View')}: ${this.props.href}`}</DialogTitle>\n {this.state.ext && EXTENSIONS.images.includes(this.state.ext) && (\n <div>\n <IconButton\n size=\"large\"\n color=\"inherit\"\n onClick={this.props.setStateBackgroundImage}\n >\n <Brightness5Icon />\n </IconButton>\n </div>\n )}\n </div>\n <DialogContent style={styles.content}>{this.getContent()}</DialogContent>\n <DialogActions>\n {this.state.copyPossible ? (\n <Button\n color=\"grey\"\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n Utils.copyToClipboard(this.state.text || this.state.code || '');\n }}\n startIcon={<CopyIcon />}\n >\n {this.props.t('Copy content')}\n </Button>\n ) : null}\n {this.state.editing ? (\n <Button\n color=\"grey\"\n disabled={\n this.state.editingValue === this.state.code ||\n this.state.editingValue === this.state.text\n }\n variant=\"contained\"\n onClick={() => this.onSave()}\n startIcon={<SaveIcon />}\n >\n {this.props.t('Save')}\n </Button>\n ) : null}\n <Button\n variant=\"contained\"\n onClick={() => this.props.onClose()}\n color=\"primary\"\n startIcon={<CloseIcon />}\n >\n {this.props.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\nexport const FileViewer = withWidth()(FileViewerClass);\n","/**\n * Copyright 2020-2024, Denis Haev <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport React, { Component, type JSX } from 'react';\nimport Dropzone from 'react-dropzone';\n\nimport {\n LinearProgress,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n Tooltip,\n CircularProgress,\n Toolbar,\n IconButton,\n Fab,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Button,\n Input,\n Breadcrumbs,\n Box,\n} from '@mui/material';\n\n// MUI Icons\nimport {\n Refresh as RefreshIcon,\n Close as CloseIcon,\n Bookmark as JsonIcon,\n BookmarkBorder as CssIcon,\n Description as HtmlIcon,\n Edit as EditIcon,\n Code as JSIcon,\n InsertDriveFile as FileIcon,\n Publish as UploadIcon,\n MusicNote as MusicIcon,\n SaveAlt as DownloadIcon,\n CreateNewFolder as AddFolderIcon,\n FolderOpen as EmptyFilterIcon,\n List as IconList,\n ViewModule as IconTile,\n ArrowBack as IconBack,\n Delete as DeleteIcon,\n Brightness6 as Brightness5Icon,\n Image as TypeIconImages,\n FontDownload as TypeIconTxt,\n AudioFile as TypeIconAudio,\n Videocam as TypeIconVideo,\n KeyboardReturn as EnterIcon,\n FolderSpecial as RestrictedIcon,\n} from '@mui/icons-material';\n\nimport type { Connection } from '@iobroker/socket-client';\n\nimport { DialogError } from '../Dialogs/Error';\nimport { Utils } from './Utils';\nimport { DialogTextInput } from '../Dialogs/TextInput';\n\n// Custom Icons\nimport { IconExpert } from '../icons/IconExpert';\nimport { IconClosed } from '../icons/IconClosed';\nimport { IconOpen } from '../icons/IconOpen';\nimport { IconNoIcon } from '../icons/IconNoIcon';\nimport { Icon } from './Icon';\n\nimport { withWidth } from './withWidth';\nimport type { ThemeName, ThemeType, Translate, IobTheme } from '../types';\n\nimport { FileViewer, EXTENSIONS, type FileViewerProps } from './FileViewer';\n\nconst ROW_HEIGHT = 32;\nconst BUTTON_WIDTH = 32;\nconst TILE_HEIGHT = 120;\nconst TILE_WIDTH = 64;\n\nconst NOT_FOUND = 'Not found';\n\n// Todo: replace with js-controller types\nexport interface MetaACL extends ioBroker.ObjectACL {\n file: number;\n}\n\n// Todo: replace with js-controller types\nexport interface MetaObject extends ioBroker.MetaObject {\n acl: MetaACL;\n}\n\nconst FILE_TYPE_ICONS: Record<string, React.FC<{ fontSize?: 'small' }>> = {\n all: FileIcon,\n images: TypeIconImages,\n code: JSIcon,\n txt: TypeIconTxt,\n audio: TypeIconAudio,\n video: TypeIconVideo,\n};\n\nconst styles: Record<string, any> = {\n root: {\n width: '100%',\n overflow: 'hidden',\n height: '100%',\n position: 'relative',\n },\n filesDiv: {\n width: 'calc(100% - 16px)',\n overflowX: 'hidden',\n overflowY: 'auto',\n padding: 8,\n },\n filesDivHint: {\n position: 'absolute',\n bottom: 0,\n left: 20,\n opacity: 0.7,\n fontStyle: 'italic',\n fontSize: 12,\n },\n filesDivTable: {\n height: 'calc(100% - 56px)',\n },\n filesDivTile: {\n height: `calc(100% - ${48 * 2 + 8}px)`,\n display: 'flex',\n alignContent: 'flex-start',\n alignItems: 'stretch',\n flexWrap: 'wrap',\n flex: `0 0 ${TILE_WIDTH}px`,\n },\n\n itemTile: (theme: IobTheme) => ({\n position: 'relative',\n userSelect: 'none',\n cursor: 'pointer',\n height: TILE_HEIGHT,\n width: TILE_WIDTH,\n display: 'inline-block',\n textAlign: 'center',\n opacity: 0.1,\n transition: 'opacity 1s',\n margin: '4px',\n borderRadius: '4px',\n '&:hover': {\n background: theme.palette.secondary.light,\n color: Utils.invertColor(theme.palette.secondary.main, true),\n },\n }),\n itemNameFolderTile: {\n fontWeight: 'bold',\n },\n itemNameTile: {\n width: '100%',\n height: 32,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n fontSize: 12,\n textAlign: 'center',\n wordBreak: 'break-all',\n },\n itemFolderIconTile: (theme: IobTheme) => ({\n width: '100%',\n height: TILE_HEIGHT - 32 - 16 - 8, // name + size\n display: 'block',\n pl: 1,\n color: theme.palette.secondary.main || '#fbff7d',\n }),\n itemFolderIconBack: (theme: IobTheme) => ({\n position: 'absolute',\n top: 22,\n left: 18,\n zIndex: 1,\n color: theme.palette.mode === 'dark' ? '#FFF' : '#000',\n }),\n itemSizeTile: {\n width: '100%',\n height: 16,\n textAlign: 'center',\n fontSize: 10,\n },\n itemImageTile: {\n width: 'calc(100% - 8px)',\n height: TILE_HEIGHT - 32 - 16 - 8, // name + size\n margin: 4,\n display: 'block',\n textAlign: 'center',\n objectFit: 'contain',\n },\n itemIconTile: {\n width: '100%',\n height: TILE_HEIGHT - 32 - 16 - 8, // name + size\n display: 'block',\n objectFit: 'contain',\n },\n\n itemSelected: (theme: IobTheme) => ({\n background: theme.palette.primary.main,\n color: Utils.invertColor(theme.palette.primary.main, true),\n }),\n\n itemTable: (theme: IobTheme) => ({\n userSelect: 'none',\n cursor: 'pointer',\n height: ROW_HEIGHT,\n display: 'inline-flex',\n lineHeight: `${ROW_HEIGHT}px`,\n '&:hover': {\n background: theme.palette.secondary.light,\n color: Utils.invertColor(theme.palette.secondary.main, true),\n },\n }),\n itemNameTable: {\n display: 'inline-block',\n pl: '10px',\n fontSize: '1rem',\n verticalAlign: 'top',\n flexGrow: 1,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n '@media screen and (max-width: 500px)': {\n textAlign: 'end',\n direction: 'rtl',\n },\n },\n itemNameFolderTable: {\n fontWeight: 'bold',\n },\n itemSizeTable: {\n display: 'inline-block',\n width: 60,\n verticalAlign: 'top',\n textAlign: 'right',\n whiteSpace: 'nowrap',\n },\n itemAccessTable: {\n // display: 'inline-block',\n verticalAlign: 'top',\n width: 60,\n textAlign: 'right',\n paddingRight: 5,\n display: 'flex',\n justifyContent: 'center',\n },\n itemImageTable: {\n display: 'inline-block',\n width: 30,\n marginTop: 1,\n objectFit: 'contain',\n maxHeight: 30,\n },\n itemNoImageTable: {\n marginTop: 6,\n },\n itemIconTable: {\n display: 'inline-block',\n marginTop: 1,\n width: 30,\n height: 30,\n },\n itemFolderTable: {},\n itemFolderTemp: {\n opacity: 0.4,\n },\n itemFolderIconTable: (theme: IobTheme) => ({\n marginTop: '1px',\n marginLeft: '8px',\n display: 'inline-block',\n width: 30,\n height: 30,\n color: theme.palette.secondary.main || '#fbff7d',\n }),\n itemDownloadButtonTable: (theme: IobTheme) => ({\n display: 'inline-block',\n width: BUTTON_WIDTH,\n height: ROW_HEIGHT,\n minWidth: BUTTON_WIDTH,\n verticalAlign: 'middle',\n textAlign: 'center',\n padding: 0,\n borderRadius: `${BUTTON_WIDTH / 2}px`,\n '&:hover': {\n backgroundColor: theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.08)',\n },\n '& span': {\n pt: '9px',\n },\n '& svg': {\n width: 14,\n height: 14,\n fontSize: '1rem',\n mt: '-3px',\n verticalAlign: 'middle',\n color: theme.palette.mode === 'dark' ? '#EEE' : '#111',\n },\n }),\n itemDownloadEmptyTable: {\n display: 'inline-block',\n width: BUTTON_WIDTH,\n height: ROW_HEIGHT,\n minWidth: BUTTON_WIDTH,\n padding: 0,\n },\n itemAclButtonTable: {\n width: BUTTON_WIDTH,\n height: ROW_HEIGHT,\n minWidth: BUTTON_WIDTH,\n verticalAlign: 'top',\n padding: 0,\n fontSize: 12,\n display: 'flex',\n },\n itemDeleteButtonTable: {\n display: 'inline-block',\n width: BUTTON_WIDTH,\n height: ROW_HEIGHT,\n minWidth: BUTTON_WIDTH,\n verticalAlign: 'top',\n padding: 0,\n '& svg': {\n width: 18,\n height: 18,\n fontSize: '1.5rem',\n },\n },\n\n uploadDiv: {\n top: 0,\n zIndex: 1,\n bottom: 0,\n left: 0,\n right: 0,\n position: 'absolute',\n opacity: 0.9,\n textAlign: 'center',\n background: '#FFFFFF',\n },\n uploadDivDragging: {\n opacity: 1,\n },\n\n uploadCenterDiv: (theme: IobTheme) => ({\n m: '20px',\n border: '3px dashed grey',\n borderRadius: '30px',\n width: 'calc(100% - 40px)',\n height: 'calc(100% - 40px)',\n position: 'relative',\n color: theme.palette.mode === 'dark' ? '#222' : '#CCC',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }),\n uploadCenterIcon: {\n width: '25%',\n height: '25%',\n },\n uploadCenterText: {\n fontSize: 24,\n fontWeight: 'bold',\n },\n uploadCloseButton: {\n zIndex: 2,\n position: 'absolute',\n top: 30,\n right: 30,\n },\n uploadCenterTextAndIcon: {\n position: 'absolute',\n height: '30%',\n width: '100%',\n margin: 'auto',\n opacity: 0.3,\n },\n menuButtonExpertActive: {\n color: '#c00000',\n },\n menuButtonRestrictActive: {\n color: '#c05000',\n },\n pathDiv: (theme: IobTheme) => ({\n display: 'flex',\n width: 'calc(100% - 16px)',\n ml: 1,\n mr: 1,\n textOverflow: 'clip',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n backgroundColor: theme.palette.secondary.main,\n }),\n pathDivInput: {\n width: '100%',\n },\n pathDivBreadcrumbDir: (theme: IobTheme) => ({\n pl: '2px',\n pr: '2px',\n cursor: 'pointer',\n '&:hover': {\n background: theme.palette.primary.main,\n },\n }),\n pathDivBreadcrumbSelected: {\n // todo: add style\n },\n backgroundImageLight: {\n background: 'white',\n },\n backgroundImageDark: {\n background: 'black',\n },\n backgroundImageColored: {\n background: 'silver',\n },\n specialFolder: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#229b0f' : '#5dd300',\n }),\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\nconst USER_DATA = '0_userdata.0';\n\nfunction getParentDir(dir: string | null): string {\n const parts = (dir || '').split('/');\n if (parts.length) {\n parts.pop();\n }\n return parts.join('/');\n}\n\nfunction isFile(path: string): boolean {\n const ext = Utils.getFileExtension(path);\n return !!(ext?.toLowerCase().match(/[a-z]+/) && ext.length < 5);\n}\n\nconst TABLE = 'Table';\nconst TILE = 'Tile';\n\nexport interface FileBrowserProps {\n /** The key to identify this component. */\n key?: string;\n /** Additional styling for this component. */\n style?: React.CSSProperties;\n /** The CSS class name. */\n className?: string;\n /** Translation function. */\n t: Translate;\n /** The selected language. */\n lang: ioBroker.Languages;\n /** The socket connection. */\n socket: Connection;\n /** Shows if the component data ready. */\n ready?: boolean;\n /** Is expert mode enabled? (default: false) */\n expertMode?: boolean;\n /** Show the toolbar? (default: false) */\n showToolbar?: boolean;\n /** If defined, allow selecting only files from this folder and subfolders */\n limitPath?: string;\n /** Allow upload of new files? (default: false) */\n allowUpload?: boolean;\n /** Allow download of files? (default: false) */\n allowDownload?: boolean;\n /** Allow creation of new folders? (default: false) */\n allowCreateFolder?: boolean;\n /** Allow deleting files? (default: false) */\n allowDelete?: boolean;\n /** Allow viewing files? (default: false) */\n allowView?: boolean;\n /** Prefix (default: '.') */\n imagePrefix?: string;\n /** Show the expert button? */\n showExpertButton?: boolean;\n /** Type of view */\n viewType?: 'Table' | 'Tile';\n /** Show the buttons to switch the view from table to tile? (default: false) */\n showViewTypeButton?: boolean;\n /** The ID of the selected file. */\n selected?: string | string[];\n /** The file extensions to show, like ['png', 'svg', 'bmp', 'jpg', 'jpeg', 'gif']. */\n filterFiles?: string[];\n /** The file extension categories to show. */\n filterByType?: 'images' | 'code' | 'txt';\n /** Callback for file selection. */\n onSelect?: (id: string | string[], isDoubleClick?: boolean, isFolder?: boolean) => void;\n /** Theme name */\n themeName?: ThemeName;\n /** Theme type. */\n themeType?: ThemeType;\n /** Theme object. */\n theme: IobTheme;\n\n /** Padding in pixels for folder levels */\n levelPadding?: number;\n\n restrictToFolder?: string;\n\n modalEditOfAccessControl?: (obj: FileBrowserClass) => JSX.Element | null;\n\n allowNonRestricted?: boolean;\n\n showTypeSelector?: boolean;\n\n FileViewer?: React.FC<FileViewerProps>;\n}\n\nexport interface FolderOrFileItem {\n id: string;\n level: number;\n name: string;\n folder: boolean;\n temp?: boolean;\n\n size?: number | undefined;\n ext?: string | null;\n modified?: number;\n title?: ioBroker.StringOrTranslated;\n meta?: boolean;\n from?: string;\n ts?: number;\n color?: string;\n icon?: string;\n acl?: ioBroker.EvaluatedFileACL | MetaACL;\n}\n\nexport type Folders = Record<string, FolderOrFileItem[]>;\n\nfunction sortFolders(a: FolderOrFileItem, b: FolderOrFileItem): number {\n if (a.folder && b.folder) {\n return a.name > b.name ? 1 : a.name < b.name ? -1 : 0;\n }\n if (a.folder) {\n return -1;\n }\n if (b.folder) {\n return 1;\n }\n return a.name > b.name ? 1 : a.name < b.name ? -1 : 0;\n}\n\ninterface FileBrowserState {\n viewType: string;\n folders: Folders;\n filterEmpty: boolean;\n expanded: string[];\n currentDir: string;\n expertMode: boolean;\n addFolder: boolean;\n uploadFile: boolean | 'dragging';\n deleteItem: string;\n viewer: string;\n formatEditFile: string | null;\n path: string;\n selected: string;\n errorText: string;\n modalEditOfAccess: boolean;\n backgroundImage: string | null;\n queueLength: number;\n loadAllFolders: boolean;\n fileErrors: string[];\n filterByType: string;\n showTypesMenu: HTMLButtonElement | null;\n restrictToFolder: string;\n pathFocus: boolean;\n}\n\nexport class FileBrowserClass extends Component<FileBrowserProps, FileBrowserState> {\n private readonly imagePrefix: string;\n\n private readonly levelPadding: number;\n\n private mounted: boolean;\n\n private suppressDeleteConfirm: number;\n\n private browseList:\n | {\n processing?: boolean;\n resolve: null | ((files: ioBroker.ReadDirResult[]) => void);\n reject: null | ((e: any) => void);\n adapter: string | null;\n relPath: string | null;\n }[]\n | null;\n\n private browseListRunning: boolean;\n\n private initialReadFinished: boolean;\n\n private supportSubscribes: boolean | null;\n\n private _tempTimeout: Record<string, ReturnType<typeof setTimeout>>;\n\n private readonly limitToObjectID: string | null = null;\n\n private readonly limitToPath: string | null = null;\n\n private lastSelect: number | null = null;\n\n private setOpacityTimer: ReturnType<typeof setTimeout> | null = null;\n\n private cacheFoldersTimeout: ReturnType<typeof setTimeout> | null = null;\n\n private foldersLoading: boolean | null = null;\n\n private cacheFolders: Folders | null = null;\n\n private readonly localStorage: Storage;\n\n constructor(props: FileBrowserProps) {\n super(props);\n\n this.localStorage = (window as any)._localStorage || window.localStorage;\n const expandedStr = this.localStorage.getItem('files.expanded') || '[]';\n\n if (this.props.limitPath) {\n const parts = this.props.limitPath.split('/');\n this.limitToObjectID = parts[0];\n this.limitToPath = !parts.length ? null : parts.length === 1 && parts[0] === '' ? null : parts.join('/');\n if (this.limitToPath && this.limitToPath.endsWith('/')) {\n this.limitToPath.substring(0, this.limitToPath.length - 1);\n }\n }\n\n let expanded: string[];\n try {\n expanded = JSON.parse(expandedStr);\n if (this.limitToPath) {\n expanded = expanded.filter(\n id =>\n id.startsWith(`${this.limitToPath}/`) ||\n id === this.limitToPath ||\n this.limitToPath?.startsWith(`${id}/`),\n );\n }\n } catch {\n expanded = [];\n }\n\n let viewType;\n if (this.props.showViewTypeButton) {\n viewType = this.localStorage.getItem('files.viewType') || TABLE;\n } else {\n viewType = TABLE;\n }\n\n let selected = this.props.selected || this.localStorage.getItem('files.selected') || USER_DATA;\n\n let currentDir: string;\n\n if (props.restrictToFolder) {\n selected = props.restrictToFolder;\n currentDir = props.restrictToFolder;\n const parts = props.restrictToFolder.split('/');\n expanded = [];\n let path = '';\n for (let i = 0; i < parts.length; i++) {\n path += (path ? '/' : '') + parts[i];\n expanded.push(path);\n }\n } else {\n // TODO: Now we do not support multiple selection\n if (Array.isArray(selected)) {\n selected = selected[0];\n }\n\n if (isFile(selected)) {\n currentDir = getParentDir(selected);\n } else {\n currentDir = selected;\n }\n }\n const backgroundImage = this.localStorage.getItem('files.backgroundImage') || null;\n\n this.state = {\n viewType,\n folders: {},\n filterEmpty: this.localStorage.getItem('files.empty') !== 'false',\n expanded,\n currentDir,\n expertMode: !!props.expertMode,\n addFolder: false,\n uploadFile: false,\n deleteItem: '',\n // marked: [],\n viewer: '',\n formatEditFile: '',\n path: selected,\n selected,\n errorText: '',\n modalEditOfAccess: false,\n backgroundImage,\n queueLength: 0,\n loadAllFolders: false,\n // allFoldersLoaded: false,\n fileErrors: [],\n filterByType: props.filterByType || window.localStorage.getItem('files.filterByType') || '',\n showTypesMenu: null,\n restrictToFolder: props.restrictToFolder || '',\n pathFocus: false,\n };\n\n this.imagePrefix = this.props.imagePrefix || './files/';\n\n this.levelPadding = this.props.levelPadding || 20;\n this.mounted = true;\n this.suppressDeleteConfirm = 0;\n\n this.browseList = [];\n this.browseListRunning = false;\n this.initialReadFinished = false;\n this.supportSubscribes = null;\n this._tempTimeout = {};\n }\n\n static getDerivedStateFromProps(\n props: FileBrowserProps,\n state: FileBrowserState,\n ): Partial<FileBrowserState> | null {\n if (props.expertMode !== undefined && props.expertMode !== state.expertMode) {\n return { expertMode: props.expertMode, loadAllFolders: true };\n }\n\n return null;\n }\n\n async loadFolders(): Promise<void> {\n this.initialReadFinished = false;\n\n let folders = (await this.browseFolder('/')) as unknown as Folders;\n\n if (this.state.viewType === TABLE) {\n folders = (await this.browseFolders([...this.state.expanded], folders)) as unknown as Folders;\n } else if (\n this.state.currentDir &&\n this.state.currentDir !== '/' &&\n (!this.limitToObjectID || this.state.currentDir.startsWith(this.limitToObjectID))\n ) {\n folders = (await this.browseFolder(this.state.currentDir, folders)) as unknown as Folders;\n }\n\n this.setState({ folders }, () => {\n if (this.state.viewType === TABLE && !this.findItem(this.state.selected)) {\n const parts = this.state.selected.split('/');\n while (parts.length && !this.findItem(parts.join('/'))) {\n parts.pop();\n }\n let selected;\n if (parts.length) {\n selected = parts.join('/');\n } else {\n selected = USER_DATA;\n }\n this.setState({ selected, path: selected, pathFocus: false }, () => this.scrollToSelected());\n } else {\n this.scrollToSelected();\n }\n this.initialReadFinished = true;\n });\n }\n\n scrollToSelected(): void {\n if (this.mounted) {\n const el = document.getElementById(this.state.selected);\n el?.scrollIntoView();\n }\n }\n\n async componentDidMount(): Promise<void> {\n this.mounted = true;\n this.loadFolders().catch(error => console.error(`Cannot load folders: ${error}`));\n\n this.supportSubscribes = await this.props.socket.checkFeatureSupported('BINARY_STATE_EVENT');\n if (this.supportSubscribes) {\n await this.props.socket.subscribeFiles('*', '*', this.onFileChange);\n }\n }\n\n componentWillUnmount(): void {\n if (this.supportSubscribes) {\n this.props.socket.unsubscribeFiles('*', '*', this.onFileChange);\n }\n this.mounted = false;\n this.browseList = null;\n this.browseListRunning = false;\n Object.values(this._tempTimeout).forEach(timer => timer && clearTimeout(timer));\n this._tempTimeout = {};\n }\n\n browseFoldersCb(foldersList: string[], newFoldersNotNull: Folders, cb: (folders: Folders) => void): void {\n if (!foldersList?.length) {\n cb(newFoldersNotNull);\n } else {\n const folder = foldersList.shift();\n if (folder) {\n void this.browseFolder(folder, newFoldersNotNull)\n .catch((e: Error) => console.error(`Cannot read folder ${folder}: ${e.message}`))\n .then(() => {\n setTimeout(() => this.browseFoldersCb(foldersList, newFoldersNotNull, cb), 0);\n });\n } else {\n setTimeout(() => this.browseFoldersCb(foldersList, newFoldersNotNull, cb), 0);\n }\n }\n }\n\n browseFolders(foldersList: string[], _newFolders?: Folders | null): Promise<Folders> {\n let newFoldersNotNull: Folders;\n if (!_newFolders) {\n newFoldersNotNull = {};\n Object.keys(this.state.folders).forEach(folder => (newFoldersNotNull[folder] = this.state.folders[folder]));\n } else {\n newFoldersNotNull = _newFolders;\n }\n\n if (!foldersList?.length) {\n return Promise.resolve(newFoldersNotNull);\n }\n return new Promise(resolve => {\n this.browseFoldersCb(foldersList, newFoldersNotNull, resolve);\n });\n }\n\n readDirSerial(adapter: string, relPath: string): Promise<ioBroker.ReadDirResult[]> {\n return new Promise((resolve, reject) => {\n if (this.browseList) {\n // if component still mounted\n this.browseList.push({\n resolve: resolve as unknown as (files: ioBroker.ReadDirResult[]) => void,\n reject,\n adapter,\n relPath,\n });\n if (!this.browseListRunning) {\n this.processBrowseList();\n }\n }\n });\n }\n\n processBrowseList(level: number = 0): void {\n if (!this.browseListRunning && this.browseList && this.browseList.length) {\n this.browseListRunning = true;\n if (this.browseList.length > 10) {\n // not too often\n if (!(this.browseList.length % 10)) {\n this.setState({ queueLength: this.browseList.length });\n }\n } else {\n this.setState({ queueLength: this.browseList.length });\n }\n\n this.browseList[0].processing = true;\n this.props.socket\n .readDir(this.browseList[0].adapter, this.browseList[0].relPath)\n .then(files => {\n if (this.browseList) {\n // if component still mounted\n const item = this.browseList.shift();\n if (item) {\n const resolve = item.resolve;\n item.resolve = null;\n item.reject = null;\n item.adapter = null;\n item.relPath = null;\n if (resolve) {\n resolve(files);\n }\n this.browseListRunning = false;\n if (this.browseList.length) {\n if (level < 5) {\n this.processBrowseList(level + 1);\n } else {\n setTimeout(() => this.processBrowseList(0), 0);\n }\n } else {\n this.setState({ queueLength: 0 });\n }\n } else {\n this.setState({ queueLength: 0 });\n }\n }\n })\n .catch(e => {\n if (this.browseList) {\n // if component still mounted\n const item = this.browseList.shift();\n if (item) {\n const reject = item.reject;\n item.resolve = null;\n item.reject = null;\n item.adapter = null;\n item.relPath = null;\n if (reject) {\n reject(e);\n }\n this.browseListRunning = false;\n if (this.browseList.length) {\n if (level < 5) {\n this.processBrowseList(level + 1);\n } else {\n setTimeout(() => this.processBrowseList(0), 0);\n }\n } else {\n this.setState({ queueLength: 0 });\n }\n } else {\n this.setState({ queueLength: 0 });\n }\n }\n });\n }\n }\n\n async browseFolder(\n folderId: string,\n _newFolders?: Folders | null,\n _checkEmpty?: boolean,\n force?: boolean,\n ): Promise<Folders> {\n let newFoldersNotNull: Folders;\n if (!_newFolders) {\n newFoldersNotNull = {};\n Object.keys(this.state.folders).forEach(folder => {\n newFoldersNotNull[folder] = this.state.folders[folder];\n });\n } else {\n newFoldersNotNull = _newFolders;\n }\n\n if (newFoldersNotNull[folderId] && !force) {\n if (!_checkEmpty) {\n return new Promise((resolve, reject) => {\n Promise.all(\n newFoldersNotNull[folderId]\n .filter(item => item.folder)\n .map(item => this.browseFolder(item.id, newFoldersNotNull, true).catch(() => undefined)),\n )\n .then(() => resolve(newFoldersNotNull))\n .catch(error => reject(new Error(error)));\n });\n }\n\n return Promise.resolve(newFoldersNotNull);\n }\n\n // if root folder\n if (!folderId || folderId === '/') {\n try {\n let objs = (await this.props.socket.readMetaItems()) as MetaObject[];\n const _folders: FolderOrFileItem[] = [];\n let userData = null;\n\n if (this.state.restrictToFolder) {\n const adapter = this.state.restrictToFolder.split('/')[0];\n objs = objs.filter(obj => obj._id === adapter);\n } else if (!this.state.expertMode) {\n // load only adapter.admin and not other meta files like hm-rpc.0.devices.blablabla\n objs = objs.filter(obj => !obj._id.endsWith('.admin'));\n }\n\n const pos = objs.findIndex(obj => obj._id === 'system.meta.uuid');\n if (pos !== -1) {\n objs.splice(pos, 1);\n }\n\n objs.forEach(obj => {\n if (this.limitToObjectID && this.limitToObjectID !== obj._id) {\n return;\n }\n\n const item: FolderOrFileItem = {\n id: obj._id,\n name: obj._id,\n title: (obj.common && obj.common.name) || obj._id,\n meta: true,\n from: obj.from,\n ts: obj.ts,\n color: obj.common && obj.common.color,\n icon: obj.common && obj.common.icon,\n folder: true,\n acl: obj.acl,\n level: 0,\n };\n\n if (item.id === USER_DATA) {\n // user data must be first\n userData = item;\n } else {\n _folders.push(item);\n }\n });\n\n _folders.sort((a, b) => (a.id > b.id ? 1 : a.id < b.id ? -1 : 0));\n if (!this.limitToObjectID || this.limitToObjectID === USER_DATA) {\n if (userData) {\n _folders.unshift(userData);\n }\n }\n\n newFoldersNotNull[folderId || '/'] = _folders;\n\n if (!_checkEmpty) {\n return Promise.all(\n _folders\n .filter(item => item.folder)\n .map(item => this.browseFolder(item.id, newFoldersNotNull, true).catch(() => undefined)),\n ).then(() => newFoldersNotNull);\n }\n } catch (e: unknown) {\n const knownError = e as Error;\n if (this.initialReadFinished) {\n window.alert(`Cannot read meta items: ${knownError.message}`);\n }\n newFoldersNotNull[folderId || '/'] = [];\n }\n return newFoldersNotNull;\n }\n\n const parts = folderId.split('/');\n const level = parts.length;\n const adapter = parts.shift();\n const relPath = parts.join('/');\n\n // make all requests here serial\n let files: ioBroker.ReadDirResult[];\n try {\n files = await this.readDirSerial(adapter || '', relPath);\n } catch (error: unknown) {\n // work around: 0_userdata.0 is a special folder, that should exist event when other folders and itself do not exit, as the browser shows it anyway.\n if (error === 'Not exists' && adapter === '0_userdata.0') {\n files = [];\n } else {\n throw error;\n }\n }\n try {\n const _folders: FolderOrFileItem[] = [];\n\n files.forEach(file => {\n const item: FolderOrFileItem = {\n id: `${folderId}/${file.file}`,\n ext: Utils.getFileExtension(file.file),\n folder: file.isDir,\n name: file.file,\n size: file.stats?.size,\n modified: file.modifiedAt,\n acl: file.acl,\n level,\n };\n\n if (this.state.restrictToFolder) {\n if (\n item.folder &&\n (item.id.startsWith(`${this.state.restrictToFolder}/`) ||\n item.id === this.state.restrictToFolder ||\n this.state.restrictToFolder.startsWith(`${item.id}/`))\n ) {\n _folders.push(item);\n } else if (item.id.startsWith(`${this.state.restrictToFolder}/`)) {\n _folders.push(item);\n }\n } else if (this.limitToPath) {\n if (\n item.folder &&\n (item.id.startsWith(`${this.limitToPath}/`) ||\n item.id === this.limitToPath ||\n this.limitToPath.startsWith(`${item.id}/`))\n ) {\n _folders.push(item);\n } else if (item.id.startsWith(`${this.limitToPath}/`)) {\n _folders.push(item);\n }\n } else {\n _folders.push(item);\n }\n });\n\n _folders.sort(sortFolders);\n newFoldersNotNull[folderId] = _folders;\n\n if (!_checkEmpty) {\n return Promise.all(\n _folders\n .filter(item => item.folder)\n .map(item => this.browseFolder(item.id, newFoldersNotNull, true)),\n ).then(() => newFoldersNotNull);\n }\n } catch (e: unknown) {\n const knownError = e as Error;\n if (this.initialReadFinished) {\n window.alert(`Cannot read ${adapter}${relPath ? `/${relPath}` : ''}: ${knownError?.message}`);\n }\n newFoldersNotNull[folderId] = [];\n }\n\n return newFoldersNotNull;\n }\n\n toggleFolder(item: FolderOrFileItem, e: React.MouseEvent): void {\n e?.stopPropagation();\n const expanded = [...this.state.expanded];\n const pos = expanded.indexOf(item.id);\n if (pos === -1) {\n expanded.push(item.id);\n expanded.sort();\n\n this.localStorage.setItem('files.expanded', JSON.stringify(expanded));\n\n if (!item.temp) {\n this.browseFolder(item.id)\n .then(folders => this.setState({ expanded, folders }))\n .catch(err =>\n window.alert(\n err === NOT_FOUND\n ? this.props.t('ra_Cannot find \"%s\"', item.id)\n : this.props.t('ra_Cannot read \"%s\"', item.id),\n ),\n );\n } else {\n this.setState({ expanded });\n }\n } else {\n expanded.splice(pos, 1);\n this.localStorage.setItem('files.expanded', JSON.stringify(expanded));\n this.setState({ expanded });\n }\n }\n\n onFileChange = (id: string, fileName: string, size: number | null): void => {\n const key = `${id}/${fileName}`;\n const pos = key.lastIndexOf('/');\n const folder = key.substring(0, pos);\n console.log(`File changed ${key}[${size}]`);\n\n if (this.state.folders[folder]) {\n if (this._tempTimeout[folder]) {\n clearTimeout(this._tempTimeout[folder]);\n }\n\n this._tempTimeout[folder] = setTimeout(() => {\n delete this._tempTimeout[folder];\n\n this.browseFolder(folder, null, false, true)\n .then(folders => this.setState({ folders }))\n .catch(e => console.error(`Cannot read folder: ${e.message}`));\n }, 300);\n }\n };\n\n changeFolder(e: React.MouseEvent<HTMLDivElement>, folder?: string): void {\n e?.stopPropagation();\n\n this.lastSelect = Date.now();\n\n let _folder = folder || getParentDir(this.state.currentDir);\n\n if (_folder === '/') {\n _folder = '';\n }\n\n this.localStorage.setItem('files.currentDir', _folder);\n\n if (folder && e && (e.altKey || e.shiftKey || e.ctrlKey || e.metaKey)) {\n this.setState({ selected: _folder });\n return;\n }\n\n // If desired folder is not yet loaded\n if (_folder && !this.state.folders[_folder]) {\n this.browseFolder(_folder)\n .then(folders =>\n this.setState(\n {\n folders,\n path: _folder,\n currentDir: _folder,\n selected: _folder,\n pathFocus: false,\n },\n () => this.props.onSelect && this.props.onSelect(''),\n ),\n )\n .catch(_e => console.error(`Cannot read folder: ${_e.message}`));\n return;\n }\n\n this.setState(\n {\n currentDir: _folder,\n selected: _folder,\n path: _folder,\n pathFocus: false,\n },\n () => this.props.onSelect && this.props.onSelect(''),\n );\n }\n\n select(id: string, e?: React.MouseEvent<HTMLDivElement> | null, cb?: () => void): void {\n if (e) {\n e.stopPropagation();\n }\n this.lastSelect = Date.now();\n\n this.localStorage.setItem('files.selected', id);\n\n this.setState({ selected: id, path: id, pathFocus: false }, () => {\n if (this.props.onSelect) {\n const ext = Utils.getFileExtension(id);\n if (\n (!this.props.filterFiles || (ext && this.props.filterFiles.includes(ext))) &&\n (!this.state.filterByType ||\n (ext && (EXTENSIONS as Record<string, string[]>)[this.state.filterByType].includes(ext)))\n ) {\n this.props.onSelect(id, false, !!this.state.folders[id]);\n } else {\n this.props.onSelect('');\n }\n }\n if (cb) {\n cb();\n }\n });\n }\n\n getText(text?: ioBroker.StringOrTranslated | null): string | undefined {\n if (text) {\n if (typeof text === 'object') {\n return text[this.props.lang] || text.en || undefined;\n }\n return text;\n }\n return undefined;\n }\n\n renderFolder(item: FolderOrFileItem, expanded?: boolean): JSX.Element | null {\n if (\n this.state.viewType === TABLE &&\n this.state.filterEmpty &&\n (!this.state.folders[item.id] || !this.state.folders[item.id].length) &&\n item.id !== USER_DATA &&\n !item.temp\n ) {\n return null;\n }\n const IconEl = expanded ? IconOpen : IconClosed;\n const padding = this.state.viewType === TABLE ? item.level * this.levelPadding : 0;\n const isUserData = item.name === USER_DATA;\n const isSpecialData = isUserData || item.name === 'vis.0' || item.name === 'vis-2.0';\n\n const iconStyle = Utils.getStyle(\n this.props.theme,\n styles[`itemFolderIcon${this.state.viewType}`],\n isSpecialData && styles.specialFolder,\n );\n return (\n <Box\n component=\"div\"\n key={item.id}\n id={item.id}\n style={this.state.viewType === TABLE ? { marginLeft: padding, width: `calc(100% - ${padding}px` } : {}}\n onClick={e => (this.state.viewType === TABLE ? this.select(item.id, e) : this.changeFolder(e, item.id))}\n onDoubleClick={e => this.state.viewType === TABLE && this.toggleFolder(item, e)}\n title={this.getText(item.title)}\n className=\"browserItem\"\n sx={Utils.getStyle(\n this.props.theme,\n styles[`item${this.state.viewType}`],\n styles[`itemFolder${this.state.viewType}`],\n this.state.selected === item.id ? styles.itemSelected : {},\n item.temp ? styles.itemFolderTemp : {},\n )}\n >\n <IconEl\n style={iconStyle}\n onClick={\n this.state.viewType === TABLE ? (e: React.MouseEvent) => this.toggleFolder(item, e) : undefined\n }\n />\n\n <Box\n component=\"div\"\n sx={Utils.getStyle(\n this.props.theme,\n styles[`itemName${this.state.viewType}`],\n styles[`itemNameFolder${this.state.viewType}`],\n )}\n >\n {isUserData ? this.props.t('ra_User files') : item.name}\n </Box>\n\n <Box\n component=\"div\"\n style={styles[`itemSize${this.state.viewType}`]}\n sx={{ display: { md: 'inline-block', sm: 'none' } }}\n >\n {this.state.viewType === TABLE && this.state.folders[item.id]\n ? this.state.folders[item.id].length\n : ''}\n </Box>\n\n <Box\n component=\"div\"\n sx={{ display: { md: 'inline-block', sm: 'none' } }}\n >\n {this.state.viewType === TABLE && this.props.expertMode ? this.formatAcl(item.acl) : null}\n </Box>\n\n {this.state.viewType === TABLE && this.props.expertMode ? (\n <Box\n component=\"div\"\n sx={{ ...styles.itemDeleteButtonTable, display: { md: 'inline-block', sm: 'none' } }}\n />\n ) : null}\n\n {this.state.viewType === TABLE && this.props.allowDownload ? (\n <div style={styles[`itemDownloadEmpty${this.state.viewType}`]} />\n ) : null}\n\n {this.state.viewType === TABLE &&\n this.props.allowDelete &&\n this.state.folders[item.id] &&\n this.state.folders[item.id].length ? (\n <IconButton\n aria-label=\"delete\"\n onClick={e => {\n e.stopPropagation();\n if (this.suppressDeleteConfirm > Date.now()) {\n this.deleteItem(item.id);\n } else {\n this.setState({ deleteItem: item.id });\n }\n }}\n sx={styles[`itemDeleteButton${this.state.viewType}`]}\n size=\"large\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n ) : this.state.viewType === TABLE && this.props.allowDelete ? (\n <Box\n component=\"div\"\n sx={styles[`itemDeleteButton${this.state.viewType}`]}\n />\n ) : null}\n </Box>\n );\n }\n\n renderBackFolder(): JSX.Element {\n return (\n <Box\n component=\"div\"\n key={this.state.currentDir}\n id={this.state.currentDir}\n onClick={e => this.changeFolder(e)}\n title={this.props.t('ra_Back to %s', getParentDir(this.state.currentDir))}\n className=\"browserItem\"\n sx={Utils.getStyle(\n this.props.theme,\n styles[`item${this.state.viewType}`],\n styles[`itemFolder${this.state.viewType}`],\n )}\n >\n <IconClosed style={Utils.getStyle(this.props.theme, styles[`itemFolderIcon${this.state.viewType}`])} />\n <IconBack sx={styles.itemFolderIconBack} />\n\n <Box\n component=\"div\"\n sx={Utils.getStyle(\n this.props.theme,\n styles[`itemName${this.state.viewType}`],\n styles[`itemNameFolder${this.state.viewType}`],\n )}\n >\n ..\n </Box>\n </Box>\n );\n }\n\n formatSize(size: number | null | undefined): JSX.Element {\n return (\n <div style={styles[`itemSize${this.state.viewType}`]}>\n {size || size === 0 ? Utils.formatBytes(size) : ''}\n </div>\n );\n }\n\n formatAcl(acl: ioBroker.EvaluatedFileACL | MetaACL | undefined): JSX.Element {\n const access: number = acl ? (acl as ioBroker.EvaluatedFileACL).permissions || (acl as MetaACL).file : 0;\n let accessStr: string;\n if (access) {\n accessStr = access.toString(16).padStart(3, '0');\n } else {\n accessStr = '';\n }\n\n return (\n <div style={styles[`itemAccess${this.state.viewType}`]}>\n {this.props.modalEditOfAccessControl ? (\n <IconButton\n size=\"large\"\n onClick={() => this.setState({ modalEditOfAccess: true })}\n sx={styles[`itemAclButton${this.state.viewType}`]}\n >\n {accessStr || '---'}\n </IconButton>\n ) : (\n accessStr || '---'\n )}\n </div>\n );\n }\n\n getFileIcon(ext: string | null): JSX.Element {\n switch (ext) {\n case 'json':\n case 'json5':\n return <JsonIcon style={styles[`itemIcon${this.state.viewType}`]} />;\n\n case 'css':\n return <CssIcon style={styles[`itemIcon${this.state.viewType}`]} />;\n\n case 'js':\n case 'ts':\n return <JSIcon style={styles[`itemIcon${this.state.viewType}`]} />;\n\n case 'html':\n case 'md':\n return <HtmlIcon style={styles[`itemIcon${this.state.viewType}`]} />;\n\n case 'mp3':\n case 'ogg':\n case 'wav':\n case 'm4a':\n case 'mp4':\n case 'flac':\n return <MusicIcon style={styles[`itemIcon${this.state.viewType}`]} />;\n\n default:\n return <FileIcon style={styles[`itemIcon${this.state.viewType}`]} />;\n }\n }\n\n static getEditFile(ext: string | null): boolean {\n switch (ext) {\n case 'json':\n case 'json5':\n case 'js':\n case 'html':\n case 'txt':\n case 'css':\n case 'log':\n return true;\n default:\n return false;\n }\n }\n\n setStateBackgroundImage = (): void => {\n const array = ['light', 'dark', 'colored', 'delete'];\n this.setState(({ backgroundImage }) => {\n if (\n backgroundImage &&\n array.indexOf(backgroundImage) !== -1 &&\n array.length - 1 !== array.indexOf(backgroundImage)\n ) {\n this.localStorage.setItem('files.backgroundImage', array[array.indexOf(backgroundImage) + 1]);\n return { backgroundImage: array[array.indexOf(backgroundImage) + 1] };\n }\n this.localStorage.setItem('files.backgroundImage', array[0]);\n return { backgroundImage: array[0] };\n });\n };\n\n getStyleBackgroundImage = (): React.CSSProperties | null => {\n // ['light', 'dark', 'colored', 'delete']\n switch (this.state.backgroundImage) {\n case 'light':\n return styles.backgroundImageLight;\n case 'dark':\n return styles.backgroundImageDark;\n case 'colored':\n return styles.backgroundImageColored;\n case 'delete':\n return null;\n default:\n return null;\n }\n };\n\n renderFile(item: FolderOrFileItem): JSX.Element {\n const padding = this.state.viewType === TABLE ? item.level * this.levelPadding : 0;\n const ext = Utils.getFileExtension(item.name);\n\n return (\n <Box\n component=\"div\"\n key={item.id}\n id={item.id}\n onDoubleClick={e => {\n e.stopPropagation();\n if (!this.props.onSelect) {\n this.setState({ viewer: this.imagePrefix + item.id, formatEditFile: ext });\n } else if (\n (!this.props.filterFiles || (item.ext && this.props.filterFiles.includes(item.ext))) &&\n (!this.state.filterByType ||\n (item.ext &&\n (EXTENSIONS as Record<string, string[]>)[this.state.filterByType].includes(item.ext)))\n ) {\n this.props.onSelect(item.id, true, !!this.state.folders[item.id]);\n }\n }}\n onClick={e => this.select(item.id, e)}\n style={this.state.viewType === TABLE ? { marginLeft: padding, width: `calc(100% - ${padding}px)` } : {}}\n className=\"browserItem\"\n sx={Utils.getStyle(\n this.props.theme,\n styles[`item${this.state.viewType}`],\n styles[`itemFile${this.state.viewType}`],\n this.state.selected === item.id ? styles.itemSelected : undefined,\n )}\n >\n {ext && EXTENSIONS.images.includes(ext) ? (\n this.state.fileErrors.includes(item.id) ? (\n <IconNoIcon\n style={{\n ...styles[`itemImage${this.state.viewType}`],\n ...this.getStyleBackgroundImage(),\n ...styles[`itemNoImage${this.state.viewType}`],\n }}\n />\n ) : (\n <Icon\n onError={e => {\n (e.target as HTMLImageElement).onerror = null;\n const fileErrors = [...this.state.fileErrors];\n if (!fileErrors.includes(item.id)) {\n fileErrors.push(item.id);\n this.setState({ fileErrors });\n }\n }}\n style={{ ...styles[`itemImage${this.state.viewType}`], ...this.getStyleBackgroundImage() }}\n src={this.imagePrefix + item.id}\n alt={item.name}\n />\n )\n ) : (\n this.getFileIcon(ext)\n )}\n <Box\n component=\"div\"\n sx={styles[`itemName${this.state.viewType}`]}\n >\n {item.name}\n </Box>\n <Box\n component=\"div\"\n sx={{ display: { md: 'inline-block', sm: 'none' } }}\n >\n {this.formatSize(item.size)}\n </Box>\n <Box\n component=\"div\"\n sx={{ display: { md: 'inline-block', sm: 'none' } }}\n >\n {this.state.viewType === TABLE && this.props.expertMode ? this.formatAcl(item.acl) : null}\n </Box>\n <Box\n component=\"div\"\n sx={{ display: { md: 'inline-block', sm: 'none' } }}\n >\n {this.state.viewType === TABLE && this.props.expertMode && FileBrowserClass.getEditFile(ext) ? (\n <IconButton\n aria-label=\"edit\"\n onClick={e => {\n e.stopPropagation();\n if (!this.props.onSelect) {\n this.setState({ viewer: this.imagePrefix + item.id, formatEditFile: ext });\n } else if (\n (!this.props.filterFiles ||\n (item.ext && this.props.filterFiles.includes(item.ext))) &&\n (!this.state.filterByType ||\n (item.ext &&\n (EXTENSIONS as Record<string, string[]>)[this.state.filterByType].includes(\n item.ext,\n )))\n ) {\n this.props.onSelect(item.id, true, !!this.state.folders[item.id]);\n }\n }}\n sx={styles.itemDeleteButtonTable}\n size=\"large\"\n >\n <EditIcon fontSize=\"small\" />\n </IconButton>\n ) : (\n <Box\n component=\"div\"\n sx={styles[`itemDeleteButton${this.state.viewType}`]}\n />\n )}\n </Box>\n {this.state.viewType === TABLE && this.props.allowDownload ? (\n <Box\n component=\"a\"\n className=\"MuiButtonBase-root MuiIconButton-root MuiIconButton-sizeLarge\"\n sx={styles.itemDownloadButtonTable}\n tabIndex={0}\n download={item.id}\n href={this.imagePrefix + item.id}\n onClick={e => e.stopPropagation()}\n >\n <DownloadIcon />\n </Box>\n ) : null}\n\n {this.state.viewType === TABLE &&\n this.props.allowDelete &&\n item.id !== 'vis.0/' &&\n item.id !== 'vis-2.0/' &&\n item.id !== USER_DATA ? (\n <IconButton\n aria-label=\"delete\"\n onClick={e => {\n e.stopPropagation();\n if (this.suppressDeleteConfirm > Date.now()) {\n this.deleteItem(item.id);\n } else {\n this.setState({ deleteItem: item.id });\n }\n }}\n sx={styles[`itemDeleteButton${this.state.viewType}`]}\n size=\"large\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n ) : this.state.viewType === TABLE && this.props.allowDelete ? (\n <Box\n component=\"div\"\n sx={styles[`itemDeleteButton${this.state.viewType}`]}\n />\n ) : null}\n </Box>\n );\n }\n\n renderItems(folderId: string): JSX.Element | (JSX.Element | null)[] {\n if (this.state.folders && this.state.folders[folderId]) {\n // tile\n if (this.state.viewType === TILE) {\n const res: (JSX.Element | null)[] = [];\n if (folderId && folderId !== '/') {\n res.push(this.renderBackFolder());\n }\n this.state.folders[folderId].forEach(item => {\n if (item.folder) {\n res.push(this.renderFolder(item));\n } else if (\n (!this.props.filterFiles || (item.ext && this.props.filterFiles.includes(item.ext))) &&\n (!this.state.filterByType ||\n (item.ext &&\n (EXTENSIONS as Record<string, string[]>)[this.state.filterByType].includes(item.ext)))\n ) {\n res.push(this.renderFile(item));\n }\n });\n return res;\n }\n\n const totalResult: (JSX.Element | null)[] = [];\n this.state.folders[folderId].forEach(item => {\n if (item.folder) {\n const expanded = this.state.expanded.includes(item.id);\n\n const folders = this.renderFolder(item, expanded);\n if (Array.isArray(folders)) {\n folders.forEach(folder => totalResult.push(folder));\n } else {\n totalResult.push(folders);\n }\n if (this.state.folders[item.id] && expanded) {\n const items = this.renderItems(item.id);\n if (Array.isArray(items)) {\n items.forEach(_item => totalResult.push(_item));\n } else {\n totalResult.push(items);\n }\n }\n } else if (\n (!this.props.filterFiles || (item.ext && this.props.filterFiles.includes(item.ext))) &&\n (!this.state.filterByType ||\n (item.ext &&\n (EXTENSIONS as Record<string, string[]>)[this.state.filterByType].includes(item.ext)))\n ) {\n totalResult.push(this.renderFile(item));\n }\n });\n\n return totalResult;\n }\n\n return (\n <div style={{ position: 'relative' }}>\n <CircularProgress\n key={folderId}\n color=\"secondary\"\n size={24}\n />\n <div\n style={{\n position: 'absolute',\n zIndex: 2,\n top: 4,\n width: 24,\n textAlign: 'center',\n }}\n >\n {this.state.queueLength}\n </div>\n </div>\n );\n }\n\n renderToolbar(): JSX.Element {\n const IconType: React.FC<{ fontSize?: 'small' }> | null = this.props.showTypeSelector\n ? FILE_TYPE_ICONS[this.state.filterByType || 'all'] || FILE_TYPE_ICONS.all\n : null;\n\n const isInFolder = this.findFirstFolder(this.state.selected);\n\n return (\n <Toolbar\n key=\"toolbar\"\n variant=\"dense\"\n >\n {this.props.allowNonRestricted && this.props.restrictToFolder ? (\n <IconButton\n edge=\"start\"\n title={\n this.state.restrictToFolder\n ? this.props.t('ra_Show all folders')\n : this.props.t('ra_Restrict to folder')\n }\n style={{\n ...styles.menuButton,\n ...(this.state.restrictToFolder ? styles.menuButtonRestrictActive : undefined),\n }}\n aria-label=\"restricted to folder\"\n onClick={() =>\n this.setState({\n restrictToFolder:\n (this.state.restrictToFolder ? '' : this.props.restrictToFolder) || '',\n loadAllFolders: true,\n })\n }\n size=\"small\"\n >\n <RestrictedIcon fontSize=\"small\" />\n </IconButton>\n ) : null}\n {this.props.showExpertButton ? (\n <IconButton\n edge=\"start\"\n title={this.props.t('ra_Toggle expert mode')}\n style={{\n ...styles.menuButton,\n ...(this.state.expertMode ? styles.menuButtonExpertActive : undefined),\n }}\n aria-label=\"expert mode\"\n onClick={() => this.setState({ expertMode: !this.state.expertMode })}\n size=\"small\"\n >\n <IconExpert />\n </IconButton>\n ) : null}\n {this.props.showViewTypeButton ? (\n <IconButton\n edge=\"start\"\n title={this.props.t('ra_Toggle view mode')}\n style={styles.menuButton}\n aria-label=\"view mode\"\n onClick={() => {\n const viewType = this.state.viewType === TABLE ? TILE : TABLE;\n this.localStorage.setItem('files.viewType', viewType);\n let currentDir = this.state.selected;\n if (isFile(currentDir)) {\n currentDir = getParentDir(currentDir);\n }\n this.setState({ viewType, currentDir }, () => {\n if (this.state.viewType === TABLE) {\n this.scrollToSelected();\n }\n });\n }}\n size=\"small\"\n >\n {this.state.viewType !== TABLE ? <IconList fontSize=\"small\" /> : <IconTile fontSize=\"small\" />}\n </IconButton>\n ) : null}\n <IconButton\n edge=\"start\"\n title={this.props.t('ra_Hide empty folders')}\n style={styles.menuButton}\n color={this.state.filterEmpty ? 'secondary' : 'inherit'}\n aria-label=\"filter empty\"\n onClick={() => {\n this.localStorage.setItem('file.empty', this.state.filterEmpty ? 'false' : 'true');\n this.setState({ filterEmpty: !this.state.filterEmpty });\n }}\n size=\"small\"\n >\n <EmptyFilterIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n edge=\"start\"\n title={this.props.t('ra_Reload files')}\n style={styles.menuButton}\n color=\"inherit\"\n aria-label=\"reload files\"\n onClick={() => this.setState({ folders: {} }, () => this.loadFolders())}\n size=\"small\"\n >\n <RefreshIcon fontSize=\"small\" />\n </IconButton>\n {this.props.allowCreateFolder ? (\n <IconButton\n edge=\"start\"\n disabled={\n !this.state.selected ||\n !isInFolder ||\n (!!this.limitToPath &&\n !this.state.selected.startsWith(`${this.limitToPath}/`) &&\n this.limitToPath !== this.state.selected)\n }\n title={this.props.t('ra_Create folder')}\n style={styles.menuButton}\n color=\"inherit\"\n aria-label=\"add folder\"\n onClick={() => this.setState({ addFolder: true })}\n size=\"small\"\n >\n <AddFolderIcon fontSize=\"small\" />\n </IconButton>\n ) : null}\n {this.props.allowUpload ? (\n <IconButton\n edge=\"start\"\n disabled={\n !this.state.selected ||\n !isInFolder ||\n (!!this.limitToPath &&\n !this.state.selected.startsWith(`${this.limitToPath}/`) &&\n this.limitToPath !== this.state.selected)\n }\n title={this.props.t('ra_Upload file')}\n style={styles.menuButton}\n color=\"inherit\"\n aria-label=\"upload file\"\n onClick={() => this.setState({ uploadFile: true })}\n size=\"small\"\n >\n <UploadIcon fontSize=\"small\" />\n </IconButton>\n ) : null}\n {this.props.showTypeSelector && IconType ? (\n <Tooltip\n title={this.props.t('ra_Filter files')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"small\"\n onClick={e => this.setState({ showTypesMenu: e.target as HTMLButtonElement })}\n >\n <IconType fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n ) : null}\n {this.state.showTypesMenu ? (\n <Menu\n open={!0}\n anchorEl={this.state.showTypesMenu}\n onClose={() => this.setState({ showTypesMenu: null })}\n >\n {Object.keys(FILE_TYPE_ICONS).map(type => {\n const MyIcon: React.FC<{ fontSize?: 'small' }> = FILE_TYPE_ICONS[type];\n return (\n <MenuItem\n key={type}\n selected={this.state.filterByType === type}\n onClick={() => {\n if (type === 'all') {\n this.localStorage.removeItem('files.filterByType');\n this.setState({ filterByType: '', showTypesMenu: null });\n } else {\n this.localStorage.setItem('files.filterByType', type);\n this.setState({ filterByType: type, showTypesMenu: null });\n }\n }}\n >\n <ListItemIcon>\n <MyIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>{this.props.t(`ra_fileType_${type}`)}</ListItemText>\n </MenuItem>\n );\n })}\n </Menu>\n ) : null}\n <Tooltip\n title={this.props.t('ra_Background image')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n color=\"inherit\"\n edge=\"start\"\n style={styles.menuButton}\n onClick={this.setStateBackgroundImage}\n size=\"small\"\n >\n <Brightness5Icon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n {this.state.viewType !== TABLE && this.props.allowDelete ? (\n <Tooltip\n title={this.props.t('ra_Delete')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <span>\n <IconButton\n aria-label=\"delete\"\n disabled={\n !this.state.selected ||\n this.state.selected === 'vis.0/' ||\n this.state.selected === 'vis-2.0/' ||\n this.state.selected === USER_DATA\n }\n color=\"inherit\"\n edge=\"start\"\n style={styles.menuButton}\n onClick={e => {\n e.stopPropagation();\n if (this.suppressDeleteConfirm > Date.now()) {\n this.deleteItem(this.state.selected);\n } else {\n this.setState({ deleteItem: this.state.selected });\n }\n }}\n size=\"small\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n </span>\n </Tooltip>\n ) : null}\n </Toolbar>\n );\n }\n\n findItem(id: string, folders?: Folders | null): null | FolderOrFileItem {\n folders = folders || this.state.folders;\n if (!folders) {\n return null;\n }\n const parts = id.split('/');\n parts.pop();\n const parentFolder = parts.join('/') || '/';\n if (!folders[parentFolder]) {\n return null;\n }\n return folders[parentFolder].find(item => item.id === id) || null;\n }\n\n renderInputDialog(): JSX.Element | null {\n if (this.state.addFolder) {\n const parentFolder = this.findFirstFolder(this.state.selected);\n\n if (!parentFolder) {\n window.alert(this.props.t('ra_Invalid parent folder!'));\n return null;\n }\n\n return (\n <DialogTextInput\n key=\"inputDialog\"\n applyText={this.props.t('ra_Create')}\n cancelText={this.props.t('ra_Cancel')}\n titleText={this.props.t('ra_Create new folder in %s', this.state.selected)}\n promptText={this.props.t(\n 'ra_If no file will be created in the folder, it will disappear after the browser closed',\n )}\n labelText={this.props.t('ra_Folder name')}\n verify={(text: string) =>\n this.state.folders[parentFolder].find(item => item.name === text)\n ? ''\n : this.props.t('ra_Duplicate name')\n }\n onClose={(name: string | null) => {\n if (name) {\n const folders: Folders = {};\n Object.keys(this.state.folders).forEach(\n folder => (folders[folder] = this.state.folders[folder]),\n );\n const parent = this.findItem(parentFolder);\n const id = `${parentFolder}/${name}`;\n folders[parentFolder].push({\n id,\n level: (parent?.level || 0) + 1,\n name,\n folder: true,\n temp: true,\n });\n\n folders[parentFolder].sort(sortFolders);\n\n folders[id] = [];\n const expanded = [...this.state.expanded];\n if (!expanded.includes(parentFolder)) {\n expanded.push(parentFolder);\n expanded.sort();\n }\n this.localStorage.setItem('files.expanded', JSON.stringify(expanded));\n this.setState({ addFolder: false, folders, expanded }, () => this.select(id));\n } else {\n this.setState({ addFolder: false });\n }\n }}\n replace={(text: string) => text.replace(/[^-_\\w]/, '_')}\n />\n );\n }\n return null;\n }\n\n componentDidUpdate(/* prevProps , prevState, snapshot */): void {\n if (this.setOpacityTimer) {\n clearTimeout(this.setOpacityTimer);\n }\n this.setOpacityTimer = setTimeout(() => {\n this.setOpacityTimer = null;\n const items = window.document.getElementsByClassName('browserItem');\n for (let i = 0; i < items.length; i++) {\n (items[i] as HTMLElement).style.opacity = '1';\n }\n }, 100);\n }\n\n findFirstFolder(id: string): string | null {\n let parentFolder = id;\n const item = this.findItem(parentFolder);\n // find folder\n if (item && !item.folder) {\n const parts = parentFolder.split('/');\n parts.pop();\n parentFolder = '';\n while (parts.length) {\n const _item = this.findItem(parts.join('/'));\n if (_item?.folder) {\n parentFolder = parts.join('/');\n break;\n }\n parts.pop();\n }\n if (!parts.length) {\n return null;\n }\n }\n\n return parentFolder;\n }\n\n async uploadFile(fileName: string, data: string): Promise<void> {\n const parts: string[] = fileName.split('/');\n const adapterName = parts.shift();\n try {\n await this.props.socket.writeFile64(adapterName || '', parts.join('/'), data);\n } catch (e: unknown) {\n const knownError = e as Error;\n window.alert(`Cannot write file: ${knownError?.message}`);\n }\n }\n\n renderUpload(): JSX.Element[] | null {\n if (this.state.uploadFile) {\n return [\n <Fab\n key=\"close\"\n color=\"primary\"\n aria-label=\"close\"\n style={styles.uploadCloseButton}\n onClick={() => this.setState({ uploadFile: false })}\n >\n <CloseIcon />\n </Fab>,\n <Dropzone\n key=\"dropzone\"\n onDragEnter={() => this.setState({ uploadFile: 'dragging' })}\n onDragLeave={() => this.setState({ uploadFile: true })}\n onDrop={acceptedFiles => {\n let count = acceptedFiles.length;\n\n acceptedFiles.forEach(file => {\n const reader = new FileReader();\n\n reader.onabort = () => console.log('file reading was aborted');\n reader.onerror = () => console.log('file reading has failed');\n reader.onload = () => {\n const parentFolder = this.findFirstFolder(this.state.selected);\n\n if (!parentFolder) {\n window.alert(this.props.t('ra_Invalid parent folder!'));\n } else {\n const id = `${parentFolder}/${file.name}`;\n\n void this.uploadFile(id, reader.result as string).then(() => {\n if (!--count) {\n this.setState({ uploadFile: false }, () => {\n if (this.supportSubscribes) {\n // open current folder\n const expanded = [...this.state.expanded];\n if (!expanded.includes(parentFolder)) {\n expanded.push(parentFolder);\n expanded.sort();\n this.localStorage.setItem(\n 'files.expanded',\n JSON.stringify(expanded),\n );\n }\n this.setState({ expanded }, () => this.select(id));\n } else {\n setTimeout(\n () =>\n this.browseFolder(parentFolder, null, false, true).then(\n folders => {\n // open current folder\n const expanded = [...this.state.expanded];\n if (!expanded.includes(parentFolder)) {\n expanded.push(parentFolder);\n expanded.sort();\n this.localStorage.setItem(\n 'files.expanded',\n JSON.stringify(expanded),\n );\n }\n this.setState({ folders, expanded }, () =>\n this.select(id),\n );\n },\n ),\n 500,\n );\n }\n });\n }\n });\n }\n };\n\n reader.readAsArrayBuffer(file);\n });\n }}\n >\n {({ getRootProps, getInputProps }) => (\n <div\n style={{\n ...styles.uploadDiv,\n ...(this.state.uploadFile === 'dragging' ? styles.uploadDivDragging : undefined),\n }}\n {...getRootProps()}\n >\n <input {...getInputProps()} />\n <Box\n component=\"div\"\n sx={styles.uploadCenterDiv}\n >\n <div style={styles.uploadCenterTextAndIcon}>\n <UploadIcon style={styles.uploadCenterIcon} />\n <div style={styles.uploadCenterText}>\n {this.state.uploadFile === 'dragging'\n ? this.props.t('ra_Drop file here')\n : this.props.t(\n 'ra_Place your files here or click here to open the browse dialog',\n )}\n </div>\n </div>\n </Box>\n </div>\n )}\n </Dropzone>,\n ];\n }\n return null;\n }\n\n deleteRecursive(id: string): Promise<void> {\n const item = this.findItem(id);\n if (item?.folder) {\n return (\n this.state.folders[id]\n ? Promise.all(this.state.folders[id].map(_item => this.deleteRecursive(_item.id)))\n : Promise.resolve()\n ).then(() => {\n // If it is a folder of second level\n if (item.level >= 1) {\n const parts = id.split('/');\n const adapter = parts.shift();\n void this.props.socket.deleteFolder(adapter || '', parts.join('/')).then(() => {\n // remove this folder\n const folders = JSON.parse(JSON.stringify(this.state.folders));\n delete folders[item.id];\n // delete folder from parent item\n const parentId = getParentDir(item.id);\n const parentFolder = folders[parentId];\n if (parentFolder) {\n const pos = parentFolder.findIndex((f: FolderOrFileItem) => f.id === item.id);\n if (pos !== -1) {\n parentFolder.splice(pos, 1);\n }\n\n this.select(parentId, null, () => this.setState({ folders }));\n }\n });\n }\n });\n }\n\n const parts = id.split('/');\n const adapter = parts.shift();\n if (parts.length) {\n return this.props.socket\n .deleteFile(adapter || '', parts.join('/'))\n .catch(e => window.alert(`Cannot delete file: ${e}`));\n }\n return Promise.resolve();\n }\n\n deleteItem(deleteItem: string): void {\n deleteItem = deleteItem || this.state.deleteItem;\n\n this.setState({ deleteItem: '' }, () =>\n this.deleteRecursive(deleteItem).then(() => {\n const newState: Partial<FileBrowserState> = {};\n const pos = this.state.expanded.indexOf(deleteItem);\n if (pos !== -1) {\n const expanded = [...this.state.expanded];\n expanded.splice(pos, 1);\n this.localStorage.setItem('files.expanded', JSON.stringify(expanded));\n newState.expanded = expanded;\n }\n\n if (this.state.selected === deleteItem) {\n const parts = this.state.selected.split('/');\n parts.pop();\n newState.selected = parts.join('/');\n }\n\n if (!this.supportSubscribes) {\n const parentFolder = this.findFirstFolder(deleteItem);\n const folders: Folders = {};\n\n Object.keys(this.state.folders).forEach(name => {\n if (name !== parentFolder && !name.startsWith(`${parentFolder}/`)) {\n folders[name] = this.state.folders[name];\n }\n });\n\n newState.folders = folders;\n\n this.setState(newState as FileBrowserState, () =>\n setTimeout(() => {\n this.browseFolders([...this.state.expanded], folders)\n .then(_folders => this.setState({ folders: _folders }))\n .catch(e => console.error(e));\n }, 200),\n );\n } else {\n this.setState(newState as FileBrowserState);\n }\n }),\n );\n }\n\n renderDeleteDialog(): JSX.Element | null {\n if (this.state.deleteItem) {\n return (\n <Dialog\n key=\"deleteDialog\"\n open={!0}\n onClose={() => this.setState({ deleteItem: '' })}\n aria-labelledby=\"ar_dialog_file_delete_title\"\n >\n <DialogTitle id=\"ar_dialog_file_delete_title\">\n {this.props.t('ra_Confirm deletion of %s', this.state.deleteItem.split('/').pop())}\n </DialogTitle>\n <DialogContent>\n <DialogContentText>{this.props.t('ra_Are you sure?')}</DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n color=\"grey\"\n variant=\"contained\"\n onClick={() => {\n this.suppressDeleteConfirm = Date.now() + 60000 * 5;\n this.deleteItem('');\n }}\n >\n {this.props.t('ra_Delete (no confirm for 5 mins)')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => this.deleteItem('')}\n color=\"primary\"\n autoFocus\n >\n {this.props.t('ra_Delete')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({ deleteItem: '' })}\n color=\"grey\"\n >\n {this.props.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n return null;\n }\n\n renderViewDialog(): JSX.Element | null {\n const FileViewerComponent = this.props.FileViewer || FileViewer;\n\n return this.state.viewer ? (\n <FileViewerComponent\n supportSubscribes={this.supportSubscribes}\n key={this.state.viewer}\n href={this.state.viewer}\n formatEditFile={this.state.formatEditFile}\n themeType={this.props.themeType}\n setStateBackgroundImage={this.setStateBackgroundImage}\n getStyleBackgroundImage={this.getStyleBackgroundImage}\n t={this.props.t}\n socket={this.props.socket}\n onClose={() => this.setState({ viewer: '', formatEditFile: '' })}\n />\n ) : null;\n }\n\n renderError(): JSX.Element | null {\n if (this.state.errorText) {\n return (\n <DialogError\n key=\"errorDialog\"\n text={this.state.errorText}\n onClose={() => this.setState({ errorText: '' })}\n />\n );\n }\n return null;\n }\n\n // used in tabs/Files\n // eslint-disable-next-line react/no-unused-class-component-methods\n updateItemsAcl(info: FolderOrFileItem[]): void {\n this.cacheFolders = this.cacheFolders || JSON.parse(JSON.stringify(this.state.folders));\n let changed;\n\n info.forEach(it => {\n const item = this.findItem(it.id, this.cacheFolders);\n if (item && JSON.stringify(item.acl) !== JSON.stringify(it.acl)) {\n item.acl = it.acl;\n changed = true;\n }\n });\n if (changed) {\n if (this.cacheFoldersTimeout) {\n clearTimeout(this.cacheFoldersTimeout);\n }\n this.cacheFoldersTimeout = setTimeout(() => {\n this.cacheFoldersTimeout = null;\n const folders = this.cacheFolders || {};\n this.cacheFolders = null;\n this.setState({ folders });\n }, 200);\n }\n }\n\n changeToPath(): void {\n setTimeout(() => {\n if (this.state.path !== this.state.selected && (!this.lastSelect || Date.now() - this.lastSelect > 100)) {\n let folder = this.state.path;\n if (isFile(this.state.path)) {\n folder = getParentDir(this.state.path);\n }\n new Promise(resolve => {\n if (!this.state.folders[folder]) {\n this.browseFolder(folder)\n .then(folders => this.setState({ folders }, () => resolve(true)))\n .catch(err =>\n this.setState({\n errorText:\n err === NOT_FOUND\n ? this.props.t('ra_Cannot find \"%s\"', folder)\n : this.props.t('ra_Cannot read \"%s\"', folder),\n }),\n );\n } else {\n resolve(true);\n }\n })\n .then(\n result =>\n result &&\n this.setState({ selected: this.state.path, currentDir: folder, pathFocus: false }),\n )\n .catch(e => console.error(e));\n } else if (!this.lastSelect || Date.now() - this.lastSelect > 100) {\n this.setState({ pathFocus: false });\n }\n }, 100);\n }\n\n renderBreadcrumb(): JSX.Element {\n const parts = this.state.currentDir.startsWith('/')\n ? this.state.currentDir.split('/')\n : `/${this.state.currentDir}`.split('/');\n const p: string[] = [];\n return (\n <Breadcrumbs style={{ paddingLeft: 8 }}>\n {parts.map((part, i) => {\n if (part) {\n p.push(part);\n }\n const path = p.join('/');\n if (i < parts.length - 1) {\n return (\n <Box\n component=\"div\"\n key={`${this.state.selected}_${i}`}\n sx={styles.pathDivBreadcrumbDir}\n onClick={e => this.changeFolder(e, path || '/')}\n >\n {part || this.props.t('ra_Root')}\n </Box>\n );\n }\n\n return (\n <div\n style={styles.pathDivBreadcrumbSelected}\n key={`${this.state.selected}_${i}`}\n onClick={() => this.setState({ pathFocus: true })}\n >\n {part}\n </div>\n );\n })}\n </Breadcrumbs>\n );\n }\n\n renderPath(): JSX.Element {\n return (\n <Box\n component=\"div\"\n key=\"path\"\n sx={styles.pathDiv}\n >\n {this.state.pathFocus ? (\n <Input\n value={this.state.path}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n this.changeToPath();\n } else if (e.key === 'Escape') {\n this.setState({ pathFocus: false });\n }\n }}\n endAdornment={\n <IconButton\n size=\"small\"\n onClick={() => this.changeToPath()}\n >\n <EnterIcon />\n </IconButton>\n }\n onBlur={() => this.changeToPath()}\n onChange={e => this.setState({ path: e.target.value })}\n style={styles.pathDivInput}\n />\n ) : (\n this.renderBreadcrumb()\n )}\n </Box>\n );\n }\n\n render(): JSX.Element {\n if (!this.props.ready) {\n return <LinearProgress />;\n }\n\n if (this.state.loadAllFolders && !this.foldersLoading) {\n this.foldersLoading = true;\n setTimeout(() => {\n this.setState({ loadAllFolders: false, folders: {} }, () => {\n this.foldersLoading = false;\n this.loadFolders().catch(error => console.error(`Cannot load folders: ${error}`));\n });\n }, 300);\n }\n\n return (\n <div\n style={{ ...styles.root, ...this.props.style }}\n className={this.props.className}\n >\n {this.props.showToolbar ? this.renderToolbar() : null}\n {this.state.viewType === TILE ? this.renderPath() : null}\n <div\n style={{\n ...styles.filesDiv,\n ...styles[`filesDiv${this.state.viewType}`],\n }}\n onClick={e => {\n if (this.state.viewType !== TABLE) {\n if (this.state.selected !== (this.state.currentDir || '/')) {\n this.changeFolder(e, this.state.currentDir || '/');\n } else {\n e.stopPropagation();\n }\n }\n }}\n >\n {this.state.viewType === TABLE\n ? this.renderItems('/')\n : this.renderItems(this.state.currentDir || '/')}\n {this.state.viewType !== TABLE ? (\n <div style={styles.filesDivHint}>{this.props.t('ra_select_folder_hint')}</div>\n ) : null}\n </div>\n {this.props.allowUpload ? this.renderInputDialog() : null}\n {this.props.allowUpload ? this.renderUpload() : null}\n {this.props.allowDelete ? this.renderDeleteDialog() : null}\n {this.props.allowView ? this.renderViewDialog() : null}\n {this.state.modalEditOfAccess && this.props.modalEditOfAccessControl\n ? this.props.modalEditOfAccessControl(this)\n : null}\n {this.renderError()}\n </div>\n );\n }\n}\n\nexport const FileBrowser = withWidth()(FileBrowserClass);\n","import React, { Component } from 'react';\n\nimport {\n Dialog,\n DialogTitle,\n DialogActions,\n DialogContent,\n Button,\n IconButton,\n TextField,\n Tooltip,\n CircularProgress,\n} from '@mui/material';\n\nimport { Close as CloseIcon, Clear as ClearIcon } from '@mui/icons-material';\n\nimport { Icon } from './Icon';\nimport { Utils } from './Utils';\nimport devicesIcons from '../assets/devices.json';\nimport roomsIcons from '../assets/rooms.json';\nimport type { Translate } from '../types';\n\n// import devices from '../assets/devices/list.json';\nconst devices: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[] = [\n {\n _id: 'hood',\n name: {\n en: 'Hood',\n ru: 'Вытяжка',\n de: 'Abzugshaube',\n fr: 'Capot',\n it: 'Cappe',\n nl: 'Hood',\n pl: 'Okapy',\n pt: 'Hood',\n es: 'Campana',\n 'zh-cn': '抽油烟机',\n },\n icon: 'Hoods.svg',\n },\n {\n _id: 'alarm_system',\n name: {\n en: 'Alarm System',\n ru: 'Сигнализация',\n de: 'Alarmanlage',\n fr: \"Systèmes D'Alarme\",\n it: 'Sistemi Di Allarme',\n nl: 'Alarm Systems',\n pl: 'Systemy Alarmowe',\n pt: 'Sistemas De Alarme',\n es: 'Sistemas De Alarma',\n 'zh-cn': '报警系统',\n },\n icon: 'Alarm Systems.svg',\n },\n {\n _id: 'battery_status',\n name: {\n en: 'Battery Status',\n ru: 'Заряд батареи',\n de: 'Batteriestatus',\n fr: 'État De La Batterie',\n it: 'Stato Della Batteria',\n nl: 'Batterij Status',\n pl: 'Stan Baterii',\n pt: 'Estado Da Bateria',\n es: 'Estado De La Batería',\n 'zh-cn': '电池状态',\n },\n icon: 'Battery Status.svg',\n },\n {\n _id: 'lighting',\n name: {\n en: 'Lighting',\n ru: 'Светильник',\n de: 'Beleuchtung',\n fr: 'Éclairages',\n it: 'Illuminazione',\n nl: 'Verlichting',\n pl: 'Oprawy Oświetleniowe',\n pt: 'Iluminações',\n es: 'Iluminaciones',\n 'zh-cn': '照明',\n },\n icon: 'Lightings.svg',\n },\n {\n _id: 'shading',\n name: {\n en: 'Shading',\n ru: 'Затенение',\n de: 'Beschattungen',\n fr: 'Ombres',\n it: 'Ombreggiatura',\n nl: 'Shading',\n pl: 'Zacienienie',\n pt: 'Shading',\n es: 'Sombreado',\n 'zh-cn': '底纹',\n },\n icon: 'Shading.svg',\n },\n {\n _id: 'irrigation',\n name: {\n en: 'Irrigation',\n ru: 'Орошение',\n de: 'Bewässerung',\n fr: 'Irrigation',\n it: 'Irrigazione',\n nl: 'Irrigatie',\n pl: 'Nawadnianie',\n pt: 'Irrigação',\n es: 'Irrigación',\n 'zh-cn': '灌溉',\n },\n icon: 'Irrigation.svg',\n },\n {\n _id: 'iron',\n name: {\n en: 'Iron',\n ru: 'Утюг',\n de: 'Bügeleisen',\n fr: 'Le Fer',\n it: 'Ferro',\n nl: 'Ijzer',\n pl: 'Żelazo',\n pt: 'Ferro',\n es: 'Hierro',\n 'zh-cn': '铁',\n },\n icon: 'Iron.svg',\n },\n {\n _id: 'computer',\n name: {\n en: 'Computer',\n ru: 'Компьютер',\n de: 'Rechner',\n fr: \"L'Ordinateur\",\n it: 'Computer',\n nl: 'Computer',\n pl: 'Komputer',\n pt: 'Computador',\n es: 'Ordenador',\n 'zh-cn': '电脑',\n },\n icon: 'Computer.svg',\n },\n {\n _id: 'ceiling_spotlight',\n name: {\n en: 'Ceiling Spotlight',\n ru: 'Потолочный прожектор',\n de: 'Deckenspot',\n fr: 'Plafond Spotlight',\n it: 'Faretti A Soffitto',\n nl: 'Plafond Spotlight',\n pl: 'Reflektory Sufitowe',\n pt: 'Tecto Foco',\n es: 'Focos De Techo',\n 'zh-cn': '天花射灯',\n },\n icon: 'Ceiling Spotlights.svg',\n },\n {\n _id: 'printer',\n name: {\n en: 'Printer',\n de: 'Drucker',\n ru: 'Принтер',\n pt: 'Impressora',\n nl: 'Printer',\n fr: 'Imprimante',\n it: 'Stampante',\n es: 'Impresora',\n pl: 'Drukarka',\n 'zh-cn': '打印机',\n },\n icon: 'Printer.svg',\n },\n {\n _id: 'power_consumption',\n name: {\n en: 'Power Consumption',\n ru: 'Потребляемая мощность',\n de: 'Stromverbrauch',\n fr: \"Consommation D'Énergie\",\n it: 'Consumo Di Energia',\n nl: 'Energieverbruik',\n pl: 'Pobór Energii',\n pt: 'Consumo De Energia',\n es: 'El Consumo De Energía',\n 'zh-cn': '能量消耗',\n },\n icon: 'Power Consumption.svg',\n },\n {\n _id: 'window',\n name: {\n en: 'Window',\n ru: 'Окно',\n de: 'Fenster',\n fr: 'La Fenêtre',\n it: 'Finestra',\n nl: 'Venster',\n pl: 'Okno',\n pt: 'Janela',\n es: 'Ventana',\n 'zh-cn': '窗户',\n },\n icon: 'Window.svg',\n },\n {\n _id: 'garage_door',\n name: {\n en: 'Garage Door',\n ru: 'Гаражные Ворота',\n de: 'Garagentor',\n fr: 'Portes De Garage',\n it: 'Garage Door',\n nl: 'Garage Door',\n pl: 'Bramy Garażowe',\n pt: 'Portas De Garagem',\n es: 'Las Puertas De Garaje',\n 'zh-cn': '车库门',\n },\n icon: 'Garage Doors.svg',\n },\n {\n _id: 'hairdryer',\n name: {\n en: 'Hairdryer',\n ru: 'Фен',\n de: 'Haartrockner',\n fr: 'Sèche-Cheveux',\n it: 'Asciugacapelli',\n nl: 'Haardroger',\n pl: 'Suszarka Do Włosów',\n pt: 'Secador De Cabelo',\n es: 'Secador De Pelo',\n 'zh-cn': '电吹风',\n },\n icon: 'Hairdryer.svg',\n },\n {\n _id: 'hanging_lamp',\n name: {\n en: 'Hanging Lamp',\n ru: 'Подвесной светильник',\n de: 'Hängelampe',\n fr: 'Lampes Suspendues',\n it: 'Lampade A Sospensione',\n nl: 'Opknoping Lampen',\n pl: 'Lampy Wiszące',\n pt: 'Lâmpadas De Suspensão',\n es: 'Lámparas Colgantes',\n 'zh-cn': '挂灯',\n },\n icon: 'Hanging Lamps.svg',\n },\n {\n _id: 'doorstep',\n name: {\n en: 'Enterance',\n ru: 'Входная дверь',\n de: 'Haustür',\n fr: 'Seuil De Porte',\n it: 'Gradino Della Porta',\n nl: 'Drempel',\n pl: 'Próg',\n pt: 'Porta',\n es: 'Peldaño',\n 'zh-cn': '门阶',\n },\n icon: 'Doorstep.svg',\n },\n {\n _id: 'hot_water',\n name: {\n en: 'Hot Water',\n ru: 'Горячая вода',\n de: 'Heißwasser',\n fr: 'Eau Chaude',\n it: 'Acqua Calda',\n nl: 'Heet Water',\n pl: 'Gorąca Woda',\n pt: 'Água Quente',\n es: 'Agua Caliente',\n 'zh-cn': '热水',\n },\n icon: 'Hot Water.svg',\n },\n {\n _id: 'heating',\n name: {\n en: 'Heating',\n ru: 'Отопление',\n de: 'Heizung',\n fr: 'Chauffe-Eau',\n it: 'Riscaldatore',\n nl: 'Verwarmer',\n pl: 'Podgrzewacz',\n pt: 'Aquecedor',\n es: 'Calentador',\n 'zh-cn': '加热器',\n },\n icon: 'Heater.svg',\n },\n {\n _id: 'stove',\n name: {\n en: 'Stove',\n ru: 'Печь',\n de: 'Herd',\n fr: 'Le Fourneau',\n it: 'Stufa',\n nl: 'Fornuis',\n pl: 'Kuchenka',\n pt: 'Forno',\n es: 'Cocina',\n 'zh-cn': '火炉',\n },\n icon: 'Stove.svg',\n },\n {\n _id: 'louvre',\n name: {\n en: 'Louvre',\n ru: 'Жалюзи',\n de: 'Jalousie',\n fr: 'Persienne',\n it: 'Persiana Di Ventilazione',\n nl: 'Louvre',\n pl: 'Żaluzja',\n pt: 'Trapeira',\n es: 'Lumbrera',\n 'zh-cn': '卢浮宫',\n },\n icon: 'Louvre.svg',\n },\n {\n _id: 'coffee_maker',\n name: {\n en: 'Coffee Maker',\n ru: 'Кофеварка',\n de: 'Kaffemaschine',\n fr: 'Cafetière',\n it: 'Macchine Da Caffè',\n nl: 'Koffie Maker',\n pl: 'Ekspresy Do Kawy',\n pt: 'Cafeteira',\n es: 'Cafetera',\n 'zh-cn': '咖啡壶',\n },\n icon: 'Coffee Makers.svg',\n },\n {\n _id: 'cold_water',\n name: {\n en: 'Cold Water',\n ru: 'Холодная вода',\n de: 'Kaltwasser',\n fr: 'Eau Froide',\n it: 'Acqua Fredda',\n nl: 'Koud Water',\n pl: 'Zimna Woda',\n pt: 'Água Fria',\n es: 'Agua Fría',\n 'zh-cn': '冷水',\n },\n icon: 'Cold Water.svg',\n },\n {\n _id: 'climate',\n name: {\n en: 'Climate',\n ru: 'Климат',\n de: 'Klima',\n fr: 'Climat',\n it: 'Clima',\n nl: 'Klimaat',\n pl: 'Klimat',\n pt: 'Clima',\n es: 'Clima',\n 'zh-cn': '气候',\n },\n icon: 'Climate.svg',\n },\n {\n _id: 'speaker',\n name: {\n en: 'Speaker',\n ru: 'Звуковая система',\n de: 'Lautsprecher',\n fr: 'Orateur',\n it: 'Altoparlante',\n nl: 'Spreker',\n pl: 'Głośnik',\n pt: 'Palestrante',\n es: 'Altavoz',\n 'zh-cn': '扬声器',\n },\n icon: 'Speaker.svg',\n },\n {\n _id: 'led_strip',\n name: {\n en: 'Led Strip',\n ru: 'Светодиодная лента',\n de: 'LED Leiste',\n fr: 'Led Strip',\n it: 'Led Strip',\n nl: 'Loden Strip',\n pl: 'Pasek Ledowy',\n pt: 'Led Faixa',\n es: 'Tira Llevada',\n 'zh-cn': '灯带',\n },\n icon: 'Led Strip.svg',\n },\n {\n _id: 'light',\n name: {\n en: 'Light',\n ru: 'Свет',\n de: 'Licht',\n fr: 'Lumière',\n it: 'Leggero',\n nl: 'Licht',\n pl: 'Lekki',\n pt: 'Luz',\n es: 'Luz',\n 'zh-cn': '光',\n },\n icon: 'Light.svg',\n },\n {\n _id: 'fan',\n name: {\n en: 'Fan',\n ru: 'Вентилятор',\n de: 'Lüfter',\n fr: 'Ventilateur',\n it: 'Fan',\n nl: 'Ventilator',\n pl: 'Wentylator',\n pt: 'Ventilador',\n es: 'Ventilador',\n 'zh-cn': '扇子',\n },\n icon: 'Fan.svg',\n },\n {\n _id: 'humidity',\n name: {\n en: 'Humidity',\n ru: 'Влажность',\n de: 'Luftfeuchtigkeit',\n fr: 'Humidité',\n it: 'Umidità',\n nl: 'Vochtigheid',\n pl: 'Wilgotność',\n pt: 'Umidade',\n es: 'Humedad',\n 'zh-cn': '湿度',\n },\n icon: 'Humidity.svg',\n },\n {\n _id: 'ventilation',\n name: {\n en: 'Ventilation',\n ru: 'Вентиляция',\n de: 'Lüftung',\n fr: 'Ventilation',\n it: 'Ventilazione',\n nl: 'Ventilatie',\n pl: 'Wentylacja',\n pt: 'Ventilação',\n es: 'Ventilación',\n 'zh-cn': '通风',\n },\n icon: 'Ventilation.svg',\n },\n {\n _id: 'chandelier',\n name: {\n en: 'Chandelier',\n ru: 'Люстра',\n de: 'Kronleuchter',\n fr: 'Lustre',\n it: 'Lampadario',\n nl: 'Kroonluchter',\n pl: 'Żyrandol',\n pt: 'Lustre',\n es: 'Candelabro',\n 'zh-cn': '枝形吊灯',\n },\n icon: 'Chandelier.svg',\n },\n {\n _id: 'awning',\n name: {\n en: 'Awning',\n ru: 'Маркиза',\n de: 'Markise',\n fr: 'Auvents',\n it: 'Tende',\n nl: 'Luifels',\n pl: 'Okrycia',\n pt: 'Toldos',\n es: 'Toldos',\n 'zh-cn': '遮阳篷',\n },\n icon: 'Awnings.svg',\n },\n {\n _id: 'music',\n name: {\n en: 'Music',\n ru: 'Музыка',\n de: 'Musik',\n fr: 'Musique',\n it: 'Musica',\n nl: 'Muziek',\n pl: 'Muzyka',\n pt: 'Música',\n es: 'Música',\n 'zh-cn': '音乐',\n },\n icon: 'Music.svg',\n },\n {\n _id: 'people',\n name: {\n en: 'People',\n ru: 'Люди',\n de: 'Personen',\n fr: 'Gens',\n it: 'Persone',\n nl: 'Mensen',\n pl: 'Ludzie',\n pt: 'Pessoas',\n es: 'Personas',\n 'zh-cn': '人们',\n },\n icon: 'People.svg',\n },\n {\n _id: 'pool',\n name: {\n en: 'Pool',\n ru: 'Бассейн',\n de: 'Pool',\n fr: 'Piscine',\n it: 'Piscina',\n nl: 'Zwembad',\n pl: 'Basen',\n pt: 'Piscina',\n es: 'Piscina',\n 'zh-cn': '水池',\n },\n icon: 'Pool.svg',\n },\n {\n _id: 'pump',\n name: {\n en: 'Pump',\n ru: 'Насос',\n de: 'Pumpe',\n fr: 'Pompe',\n it: 'Pompa',\n nl: 'Pomp',\n pl: 'Pompa',\n pt: 'Bombear',\n es: 'Bomba',\n 'zh-cn': '泵',\n },\n icon: 'Pump.svg',\n },\n {\n _id: 'outdoor_blinds',\n name: {\n en: 'Outdoor Blinds',\n ru: 'Внещгте жалюзи',\n de: 'Raffstore',\n fr: 'Volets',\n it: 'Tende Da Esterni',\n nl: 'Outdoor Blinds',\n pl: 'Rolety Zewnętrzne',\n pt: 'Estores Exteriores',\n es: 'Persianas Exteriores',\n 'zh-cn': '室外百叶窗',\n },\n icon: 'Outdoor Blinds.svg',\n },\n {\n _id: 'mowing_machine',\n name: {\n en: 'Mowing Machine',\n ru: 'Газонокосилка',\n de: 'Rasenmäher',\n fr: 'Machine De Fauchage',\n it: 'Macchina Di Falciatura',\n nl: 'Maaimachine',\n pl: 'Kosiarka',\n pt: 'Roçada Máquina',\n es: 'Segadora',\n 'zh-cn': '割草机',\n },\n icon: 'Mowing Machine.svg',\n },\n {\n _id: 'receiver',\n name: {\n en: 'Receiver',\n ru: 'Приставка',\n de: 'Receiver',\n fr: 'Destinataire',\n it: 'Ricevitore',\n nl: 'Ontvanger',\n pl: 'Odbiorca',\n pt: 'Recebedor',\n es: 'Receptor',\n 'zh-cn': '接收者',\n },\n icon: 'Receiver.svg',\n },\n {\n _id: 'shutters',\n name: {\n en: 'Shutters',\n ru: 'Ставни',\n de: 'Rollladen',\n fr: 'Volets',\n it: 'Persiane',\n nl: 'Shutters',\n pl: 'Żaluzje',\n pt: 'Persianas',\n es: 'Persianas',\n 'zh-cn': '百叶窗',\n },\n icon: 'Shutters.svg',\n },\n {\n _id: 'smoke_detector',\n name: {\n en: 'Smoke detector',\n de: 'Rauchmelder',\n ru: 'Детектор дыма',\n pt: 'Detector de fumaça',\n nl: 'Rookdetector',\n fr: 'Détecteur de fumée',\n it: 'Rilevatore di fumo',\n es: 'Detector de humo',\n pl: 'Wykrywacz dymu',\n 'zh-cn': '烟雾探测器',\n },\n icon: 'SmokeDetector.svg',\n },\n {\n _id: 'lock',\n name: {\n en: 'Lock',\n ru: 'Замок',\n de: 'Schloß',\n fr: 'Fermer À Clé',\n it: 'Serratura',\n nl: 'Slot',\n pl: 'Zamek',\n pt: 'Trancar',\n es: 'Cerrar Con Llave',\n 'zh-cn': '锁',\n },\n icon: 'Lock.svg',\n },\n {\n _id: 'security',\n name: {\n en: 'Security',\n ru: 'Безопасность',\n de: 'Sicherheit',\n fr: 'Sécurité',\n it: 'Sicurezza',\n nl: 'Veiligheid',\n pl: 'Bezpieczeństwo',\n pt: 'Segurança',\n es: 'Seguridad',\n 'zh-cn': '安全',\n },\n icon: 'Security.svg',\n },\n {\n _id: 'dishwasher',\n name: {\n en: 'Dishwasher',\n ru: 'Посудомоечная машина',\n de: 'Spülmaschine',\n fr: 'Lave-Vaisselles',\n it: 'Lavastoviglie',\n nl: 'Vaatwassers',\n pl: 'Zmywarki',\n pt: 'Máquinas De Lavar Louça',\n es: 'Lavaplatos',\n 'zh-cn': '洗碗机',\n },\n icon: 'Dishwashers.svg',\n },\n {\n _id: 'vacuum_cleaner',\n name: {\n en: 'Vacuum Cleaner',\n ru: 'Пылесос',\n de: 'Staubsauger',\n fr: 'Aspirateur',\n it: 'Aspirapolvere',\n nl: 'Stofzuiger',\n pl: 'Odkurzacz',\n pt: 'Aspirador De Pó',\n es: 'Aspiradora',\n 'zh-cn': '吸尘器',\n },\n icon: 'Vacuum Cleaner.svg',\n },\n {\n _id: 'socket',\n name: {\n en: 'Socket',\n ru: 'Розетка',\n de: 'Steckdose',\n fr: 'Prise',\n it: 'Socket',\n nl: 'Socket',\n pl: 'Gniazdka',\n pt: 'Tomada',\n es: 'Zócalo',\n 'zh-cn': '套接字',\n },\n icon: 'Sockets.svg',\n },\n {\n _id: 'floor_lamp',\n name: {\n en: 'Floor Lamp',\n ru: 'Торшер',\n de: 'Stehlampe',\n fr: 'Lampes Pour Plancher',\n it: 'Lampade A Stelo',\n nl: 'Vloerlampen',\n pl: 'Lampy Podłogowe',\n pt: 'Lâmpadas Chão',\n es: 'Lámparas De Pie',\n 'zh-cn': '落地灯',\n },\n icon: 'Floor Lamps.svg',\n },\n {\n _id: 'power_consumption',\n name: {\n en: 'Power Consumption',\n ru: 'Потребляемая мощность',\n de: 'Stromverbrauch',\n fr: \"Consommation D'Énergie\",\n it: 'Consumo Di Energia',\n nl: 'Energieverbruik',\n pl: 'Pobór Energii',\n pt: 'Consumo De Energia',\n es: 'El Consumo De Energía',\n 'zh-cn': '能量消耗',\n },\n icon: 'Power Consumption.svg',\n },\n {\n _id: 'temperature_sensor',\n name: {\n en: 'Temperature Sensor',\n ru: 'Температурный датчик',\n de: 'Temperatur-Sensor',\n fr: 'Capteur De Température',\n it: 'Sensori Di Temperatura',\n nl: 'Temperatuursensor',\n pl: 'Czujniki Temperatury',\n pt: 'Sensores De Temperatura',\n es: 'Sensores De Temperatura',\n 'zh-cn': '温度传感器',\n },\n icon: 'Temperature Sensors.svg',\n },\n {\n _id: 'table_lamp',\n name: {\n en: 'Table Lamp',\n ru: 'Настольная лампа',\n de: 'Tischlampe',\n fr: 'Lampe De Chevet',\n it: 'Lampade Da Tavolo',\n nl: 'Tafellampen',\n pl: 'Lampy Stołowe',\n pt: 'Lâmpadas De Mesa',\n es: 'Lámparas De Mesa',\n 'zh-cn': '台灯',\n },\n icon: 'Table Lamps.svg',\n },\n {\n _id: 'gate',\n name: {\n en: 'Gate',\n ru: 'Ворота',\n de: 'Tor',\n fr: 'Porte',\n it: 'Gate',\n nl: 'Gate',\n pl: 'Bramy',\n pt: 'Portões',\n es: 'Puertas',\n 'zh-cn': '盖茨',\n },\n icon: 'Gates.svg',\n },\n {\n _id: 'dryer',\n name: {\n en: 'Dryer',\n ru: 'Сушилка',\n de: 'Trockner',\n fr: 'Séchoir',\n it: 'Asciugatrice',\n nl: 'Droger',\n pl: 'Suszarka',\n pt: 'Secador',\n es: 'Secadora',\n 'zh-cn': '烘干机',\n },\n icon: 'Dryer.svg',\n },\n {\n _id: 'door',\n name: {\n en: 'Door',\n ru: 'Дверь',\n de: 'Tür',\n fr: 'Des Portes',\n it: 'Porte',\n nl: 'Deuren',\n pl: 'Drzwi',\n pt: 'Portas',\n es: 'Puertas',\n 'zh-cn': '门',\n },\n icon: 'Doors.svg',\n },\n {\n _id: 'tv',\n name: {\n en: 'Tv',\n ru: 'Телевизор',\n de: 'TV',\n fr: 'La Télé',\n it: 'Tv',\n nl: 'Tv',\n pl: 'Telewizja',\n pt: 'Televisão',\n es: 'Televisor',\n 'zh-cn': '电视',\n },\n icon: 'Tv.svg',\n },\n {\n _id: 'consumption',\n name: {\n en: 'Consumption',\n ru: 'Потребление',\n de: 'Verbrauch',\n fr: 'Consommation',\n it: 'Consumo',\n nl: 'Consumptie',\n pl: 'Konsumpcja',\n pt: 'Consumo',\n es: 'Consumo',\n 'zh-cn': '消费',\n },\n icon: 'Consumption.svg',\n },\n {\n _id: 'amplifier',\n name: {\n en: 'Amplifier',\n ru: 'Усилитель звука',\n de: 'Verstärker',\n fr: 'Amplificateur',\n it: 'Amplificatore',\n nl: 'Versterker',\n pl: 'Wzmacniacz',\n pt: 'Amplificador',\n es: 'Amplificador',\n 'zh-cn': '放大器',\n },\n icon: 'Amplifier.svg',\n },\n {\n _id: 'curtains',\n name: {\n en: 'Curtains',\n ru: 'Шторы',\n de: 'Vorhänge',\n fr: 'Des Rideaux',\n it: 'Le Tende',\n nl: 'Gordijnen',\n pl: 'Zasłony',\n pt: 'Cortinas',\n es: 'Cortinas',\n 'zh-cn': '窗帘',\n },\n icon: 'Curtains.svg',\n },\n {\n _id: 'sconce',\n name: {\n en: 'Sconce',\n ru: 'Настенный светильник',\n de: 'Wandlampe',\n fr: 'Sconce',\n it: 'Sconce',\n nl: 'Sconce',\n pl: 'Kinkiety',\n pt: 'Arandelas',\n es: 'Los Apliques',\n 'zh-cn': '壁灯',\n },\n icon: 'Sconces.svg',\n },\n {\n _id: 'washing_machine',\n name: {\n en: 'Washing Machine',\n ru: 'Стиральная машина',\n de: 'Waschmaschine',\n fr: 'Machines À Laver',\n it: 'Lavatrici',\n nl: 'Wasmachines',\n pl: 'Pralki',\n pt: 'Máquinas De Lavar Roupas',\n es: 'Lavadoras',\n 'zh-cn': '洗衣机',\n },\n icon: 'Washing Machines.svg',\n },\n {\n _id: 'water',\n name: {\n en: 'Water',\n ru: 'Вода',\n de: 'Wasser',\n fr: \"L'Eau\",\n it: 'Acqua',\n nl: 'Water',\n pl: 'Woda',\n pt: 'Água',\n es: 'Agua',\n 'zh-cn': '水',\n },\n icon: 'Water.svg',\n },\n {\n _id: 'water_heater',\n name: {\n en: 'Water Heater',\n ru: 'Нагреватель воды',\n de: 'Wasserkocher',\n fr: 'Chauffe-Eau',\n it: 'Scaldabagno',\n nl: 'Waterkoker',\n pl: 'Podgrzewacz Wody',\n pt: 'Aquecedor De Água',\n es: 'Calentador De Agua',\n 'zh-cn': '热水器',\n },\n icon: 'Water Heater.svg',\n },\n {\n _id: 'water_consumption',\n name: {\n en: 'Water Consumption',\n ru: 'Потребление воды',\n de: 'Wasserverbrauch',\n fr: \"Consommation D'Eau\",\n it: \"Consumo D'Acqua\",\n nl: 'Waterverbruik',\n pl: 'Konsumpcja Wody',\n pt: 'Consumo De Água',\n es: 'Consumo De Agua',\n 'zh-cn': '耗水量',\n },\n icon: 'Water Consumption.svg',\n },\n {\n _id: 'weather',\n name: {\n en: 'Weather',\n ru: 'Погода',\n de: 'Wetter',\n fr: 'La Météo',\n it: 'Tempo Metereologico',\n nl: 'Weer',\n pl: 'Pogoda',\n pt: 'Clima',\n es: 'Tiempo',\n 'zh-cn': '天气',\n },\n icon: 'Weather.svg',\n },\n];\n\n// import rooms from '../assets/rooms/list.json';\nconst rooms: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[] = [\n {\n _id: 'storeroom',\n name: {\n en: 'Storeroom',\n ru: 'Кладовая',\n de: 'Abstellraum',\n fr: 'Débarras',\n it: 'Dispensa',\n nl: 'Bergplaats',\n pl: 'Magazyn',\n pt: 'Despensa',\n es: 'Trastero',\n 'zh-cn': '库房',\n },\n icon: 'Storeroom.svg',\n },\n {\n _id: 'second_floor',\n name: {\n en: 'Second floor',\n ru: 'Второй этаж',\n de: 'Erster OG',\n pt: 'Primeiro andar',\n nl: 'Eerste verdieping',\n fr: 'Premier étage',\n it: 'Primo piano',\n es: 'Primer piso',\n pl: 'Pierwsze piętro',\n 'zh-cn': '第一层',\n },\n icon: 'Second Floor.svg',\n },\n {\n _id: 'dressing_room',\n name: {\n en: 'Dressing Room',\n ru: 'Гардеробная',\n de: 'Ankleide',\n fr: 'Vestiaire',\n it: 'Camerino',\n nl: 'Kleedkamer',\n pl: 'Przebieralnia',\n pt: 'Provador',\n es: 'Vestidor',\n 'zh-cn': '更衣室',\n },\n icon: 'Dressing Room.svg',\n },\n {\n _id: 'workspace',\n name: {\n en: 'Workspace',\n ru: 'Рабочая Среда',\n de: 'Arbeitszimmer',\n fr: 'Espace De Travail',\n it: 'Area Di Lavoro',\n nl: 'Workspace',\n pl: 'Workspace',\n pt: 'Área De Trabalho',\n es: 'Espacio De Trabajo',\n 'zh-cn': '工作区',\n },\n icon: 'Workspace.svg',\n },\n {\n _id: 'driveway',\n name: {\n en: 'Driveway',\n ru: 'Дорога',\n de: 'Auffahrt',\n fr: 'Allée',\n it: 'Viale',\n nl: 'Pad',\n pl: 'Podjazd',\n pt: 'Entrada Da Garagem',\n es: 'Entrada De Coches',\n 'zh-cn': '车道',\n },\n icon: 'Driveway.svg',\n },\n {\n _id: 'outdoors',\n name: {\n en: 'Outdoors',\n ru: 'На Улице',\n de: 'Außenbereich',\n fr: 'En Plein Air',\n it: \"All'Aperto\",\n nl: 'Buitenshuis',\n pl: 'Na Dworze',\n pt: 'Ao Ar Livre',\n es: 'Al Aire Libre',\n 'zh-cn': '户外',\n },\n icon: 'Outdoors.svg',\n },\n {\n _id: 'bathroom',\n name: {\n en: 'Bathroom',\n ru: 'Ванная Комната',\n de: 'Badezimmer',\n fr: 'Salle De Bains',\n it: 'Bagno',\n nl: 'Badkamer',\n pl: 'Łazienka',\n pt: 'Banheiro',\n es: 'Baño',\n 'zh-cn': '浴室',\n },\n icon: 'Bathroom.svg',\n },\n {\n _id: 'balcony',\n name: {\n en: 'Balcony',\n ru: 'Балкон',\n de: 'Balkon',\n fr: 'Balcon',\n it: 'Balcone',\n nl: 'Balkon',\n pl: 'Balkon',\n pt: 'Sacada',\n es: 'Balcón',\n 'zh-cn': '阳台',\n },\n icon: 'Balcony.svg',\n },\n {\n _id: 'office',\n name: {\n en: 'Office',\n ru: 'Офис',\n de: 'Office',\n fr: 'Bureau',\n it: 'Ufficio',\n nl: 'Kantoor',\n pl: 'Gabinet',\n pt: 'Escritório',\n es: 'Oficina',\n 'zh-cn': '办公室',\n },\n icon: 'Office.svg',\n },\n {\n _id: 'carport',\n name: {\n en: 'Carport',\n ru: 'Навес',\n de: 'Carport',\n fr: 'Carport',\n it: 'Posto Auto Coperto',\n nl: 'Carport',\n pl: 'Wiata',\n pt: 'Telheiro',\n es: 'Cochera',\n 'zh-cn': '车棚',\n },\n icon: 'Carport.svg',\n },\n {\n _id: 'attic',\n name: {\n en: 'Attic',\n ru: 'Чердак',\n de: 'Dachgeschoss',\n fr: 'Grenier',\n it: 'Attico',\n nl: 'Zolder',\n pl: 'Poddasze',\n pt: 'Sótão',\n es: 'Ático',\n 'zh-cn': '阁楼',\n },\n icon: 'Attic.svg',\n },\n {\n _id: 'hall',\n name: {\n en: 'Hall',\n ru: 'Зал',\n de: 'Diele',\n fr: 'Salle',\n it: 'Sala',\n nl: 'Hal',\n pl: 'Sala',\n pt: 'Corredor',\n es: 'Sala',\n 'zh-cn': '大厅',\n },\n icon: 'Hall.svg',\n },\n {\n _id: 'entrance',\n name: {\n en: 'Entrance',\n ru: 'Вход',\n de: 'Eingang',\n fr: 'Entrée',\n it: 'Ingresso',\n nl: 'Ingang',\n pl: 'Wejście',\n pt: 'Entrada',\n es: 'Entrada',\n 'zh-cn': '入口',\n },\n icon: 'Entrance.svg',\n },\n {\n _id: 'ground_floor',\n name: {\n en: 'Ground Floor',\n ru: 'Первый Этаж',\n de: 'Erdgeschoss',\n fr: 'Rez-De-Chaussée',\n it: 'Piano Terra',\n nl: 'Begane Grond',\n pl: 'Parter',\n pt: 'Térreo',\n es: 'Planta Baja',\n 'zh-cn': '一楼',\n },\n icon: 'Ground Floor.svg',\n },\n {\n _id: 'dining_area',\n name: {\n en: 'Dining Area',\n ru: 'Столовая',\n de: 'Essbereich',\n fr: 'Salle À Manger',\n it: 'Zona Pranzo',\n nl: 'Eethoek',\n pl: 'Jadalnia',\n pt: 'Área De Refeições',\n es: 'Comedor',\n 'zh-cn': '用餐区',\n },\n icon: 'Dining Area.svg',\n },\n {\n _id: 'dining_room',\n name: {\n en: 'Dining Room',\n ru: 'Столовая',\n de: 'Esszimmer',\n fr: 'Salle À Manger',\n it: 'Sala Da Pranzo',\n nl: 'Eetkamer',\n pl: 'Jadalnia',\n pt: 'Sala De Jantar',\n es: 'Comedor',\n 'zh-cn': '饭厅',\n },\n icon: 'Dining Room.svg',\n },\n {\n _id: 'gym',\n name: {\n en: 'Gym',\n ru: 'Спортзал',\n de: 'Fitnessraum',\n fr: 'Gym',\n it: 'Palestra',\n nl: 'Sportschool',\n pl: 'Siłownia',\n pt: 'Ginásio',\n es: 'Gimnasio',\n 'zh-cn': '健身房',\n },\n icon: 'Gym.svg',\n },\n {\n _id: 'gallery',\n name: {\n en: 'Gallery',\n ru: 'Галерея',\n de: 'Galerie',\n fr: 'Galerie',\n it: 'Galleria',\n nl: 'Galerij',\n pl: 'Galeria',\n pt: 'Galeria',\n es: 'Galería',\n 'zh-cn': '画廊',\n },\n icon: 'Gallery.svg',\n },\n {\n _id: 'garage',\n name: {\n en: 'Garage',\n ru: 'Гараж',\n de: 'Garage',\n fr: 'Garage',\n it: 'Box Auto',\n nl: 'Garage',\n pl: 'Garaż',\n pt: 'Garagem',\n es: 'Garaje',\n 'zh-cn': '车库',\n },\n icon: 'Garage.svg',\n },\n {\n _id: 'wardrobe',\n name: {\n en: 'Wardrobe',\n ru: 'Гардероб',\n de: 'Garderobe',\n fr: 'Penderie',\n it: 'Armadio',\n nl: 'Garderobe',\n pl: 'Szafa',\n pt: 'Guarda Roupa',\n es: 'Armario',\n 'zh-cn': '衣柜',\n },\n icon: 'Wardrobe.svg',\n },\n {\n _id: 'garden',\n name: {\n en: 'Garden',\n ru: 'Сад',\n de: 'Garten',\n fr: 'Jardin',\n it: 'Giardino',\n nl: 'Tuin',\n pl: 'Ogród',\n pt: 'Jardim',\n es: 'Jardín',\n 'zh-cn': '花园',\n },\n icon: 'Garden.svg',\n },\n {\n _id: 'summer_house',\n name: {\n en: 'Summer House',\n ru: 'Дача',\n de: 'Gartenhaus',\n fr: \"Maison D'Été\",\n it: 'Casa Estiva',\n nl: 'Zomerhuis',\n pl: 'Domek Letniskowy',\n pt: 'Summer House',\n es: 'Casa De Verano',\n 'zh-cn': '凉亭',\n },\n icon: 'Summer House.svg',\n },\n {\n _id: 'guest_bathroom',\n name: {\n en: 'Guest Bathroom',\n ru: 'Гостевая Комната',\n de: 'Gäste-WC',\n fr: 'Salle De Bains Invité',\n it: 'Guest Bathroom',\n nl: 'Gastenbadkamer',\n pl: 'Łazienka Gościnna',\n pt: 'Banheiro De Hóspedes',\n es: 'Baño De Visitas',\n 'zh-cn': '客用浴室',\n },\n icon: 'Guest Bathroom.svg',\n },\n {\n _id: 'guest_room',\n name: {\n en: 'Guest Room',\n ru: 'Гостевая Комната',\n de: 'Gästezimmer',\n fr: \"Chambre D'Amis\",\n it: 'Stanza Degli Ospiti',\n nl: 'Guest Room',\n pl: 'Pokój Gościnny',\n pt: 'Quarto De Hóspedes',\n es: 'Habitación De Huéspedes',\n 'zh-cn': '客房',\n },\n icon: 'Guest Room.svg',\n },\n {\n _id: 'laundry_room',\n name: {\n en: 'Laundry Room',\n ru: 'Прачечная',\n de: 'Hauswirtschaftsraum',\n fr: 'Buanderie',\n it: 'Lavanderia',\n nl: 'Wasruimte',\n pl: 'Pralnia',\n pt: 'Lavandaria',\n es: 'Cuarto De Lavado',\n 'zh-cn': '洗衣房',\n },\n icon: 'Laundry Room.svg',\n },\n {\n _id: 'home_theater',\n name: {\n en: 'Home Theater',\n ru: 'Домашний Театр',\n de: 'Heimkino',\n fr: 'Cinéma Maison',\n it: 'Home Theater',\n nl: 'Thuisbioscoop',\n pl: 'Kino Domowe',\n pt: 'Cinema Em Casa',\n es: 'Cine En Casa',\n 'zh-cn': '家庭电影院',\n },\n icon: 'Home Theater.svg',\n },\n {\n _id: 'boiler_room',\n name: {\n en: 'Boiler Room',\n ru: 'Бойлерная',\n de: 'Heizungsraum',\n fr: 'Chaufferie',\n it: 'Locale Caldaia',\n nl: 'Boiler Room',\n pl: 'Kotłownia',\n pt: 'Sala Da Caldeira',\n es: 'Sala De Calderas',\n 'zh-cn': '锅炉房',\n },\n icon: 'Boiler Room.svg',\n },\n {\n _id: 'chamber',\n name: {\n en: 'Chamber',\n ru: 'Камера',\n de: 'Kammer',\n fr: 'Chambre',\n it: 'Camera',\n nl: 'Kamer',\n pl: 'Izba',\n pt: 'Câmara',\n es: 'Cámara',\n 'zh-cn': '商会',\n },\n icon: 'Chamber.svg',\n },\n {\n _id: 'basement,_cellar',\n name: {\n en: 'Basement, Cellar',\n ru: 'Подвал, Погреб',\n de: 'Keller',\n fr: 'Sous-Sol, Cave',\n it: 'Taverna, Cantina',\n nl: 'Kelder, Kelder',\n pl: 'Piwnica, Piwnica',\n pt: 'Porão, Adega',\n es: 'Sótano, Bodega',\n 'zh-cn': '地下室,地窖',\n },\n icon: 'Basement.svg',\n },\n {\n _id: 'nursery',\n name: {\n en: 'Nursery',\n ru: 'Питомник',\n de: 'Kinderzimmer',\n fr: 'Garderie',\n it: 'Asilo',\n nl: 'Kinderkamer',\n pl: 'Żłobek',\n pt: 'Berçário',\n es: 'Guardería',\n 'zh-cn': '苗圃',\n },\n icon: 'Nursery.svg',\n },\n {\n _id: 'corridor',\n name: {\n en: 'Corridor',\n ru: 'Коридор',\n de: 'Korridor',\n fr: 'Couloir',\n it: 'Corridoio',\n nl: 'Gang',\n pl: 'Korytarz',\n pt: 'Corredor',\n es: 'Corredor',\n 'zh-cn': '走廊',\n },\n icon: 'Corridor.svg',\n },\n {\n _id: 'kitchen',\n name: {\n en: 'Kitchen',\n ru: 'Кухня',\n de: 'Küche',\n fr: 'Cuisine',\n it: 'Cucina',\n nl: 'Keuken',\n pl: 'Kuchnia',\n pt: 'Cozinha',\n es: 'Cocina',\n 'zh-cn': '厨房',\n },\n icon: 'Kitchen.svg',\n },\n {\n _id: 'upstairs',\n name: {\n en: 'Upstairs',\n ru: 'Вверх По Лестнице',\n de: 'Obergeschoss',\n fr: 'En Haut',\n it: 'Di Sopra',\n nl: 'Boven',\n pl: 'Na Górę',\n pt: 'Andar De Cima',\n es: 'Piso Superior',\n 'zh-cn': '楼上',\n },\n icon: 'Upstairs.svg',\n },\n {\n _id: 'office',\n name: {\n en: 'Office',\n ru: 'Офис',\n de: 'Office',\n fr: 'Bureau',\n it: 'Ufficio',\n nl: 'Kantoor',\n pl: 'Gabinet',\n pt: 'Escritório',\n es: 'Oficina',\n 'zh-cn': '办公室',\n },\n icon: 'Office.svg',\n },\n {\n _id: 'pool',\n name: {\n en: 'Pool',\n ru: 'Бассейн',\n de: 'Pool',\n fr: 'Piscine',\n it: 'Piscina',\n nl: 'Zwembad',\n pl: 'Basen',\n pt: 'Piscina',\n es: 'Piscina',\n 'zh-cn': '水池',\n },\n icon: 'Pool.svg',\n },\n {\n _id: 'rear_wall',\n name: {\n en: 'Rear Wall',\n ru: 'Задняя Стенка',\n de: 'Rückwand',\n fr: 'Paroi Arrière',\n it: 'Parete Posteriore',\n nl: 'Achterwand',\n pl: 'Tylna Ściana',\n pt: 'Parede Traseira',\n es: 'Pared Posterior',\n 'zh-cn': '后墙',\n },\n icon: 'Rear Wall.svg',\n },\n {\n _id: 'barn',\n name: {\n en: 'Barn',\n ru: 'Амбар',\n de: 'Scheune',\n fr: 'Grange',\n it: 'Fienile',\n nl: 'Schuur',\n pl: 'Stodoła',\n pt: 'Celeiro',\n es: 'Granero',\n 'zh-cn': '谷仓',\n },\n icon: 'Barn.svg',\n },\n {\n _id: 'sleeping_area',\n name: {\n en: 'Sleeping Area',\n ru: 'Спальное Место',\n de: 'Schlafbereich',\n fr: 'Coin Montagne',\n it: 'Area Sleeping',\n nl: 'Sleeping Area',\n pl: 'Powierzchnia Spania',\n pt: 'Sleeping Area',\n es: 'Área De Dormir',\n 'zh-cn': '睡眠区',\n },\n icon: 'Sleeping Area.svg',\n },\n {\n _id: 'bedroom',\n name: {\n en: 'Bedroom',\n ru: 'Спальная Комната',\n de: 'Schlafzimmer',\n fr: 'Chambre',\n it: 'Camera Da Letto',\n nl: 'Slaapkamer',\n pl: 'Sypialnia',\n pt: 'Quarto',\n es: 'Cuarto',\n 'zh-cn': '卧室',\n },\n icon: 'Bedroom.svg',\n },\n {\n _id: 'shed',\n name: {\n en: 'Shed',\n ru: 'Сбрасывать',\n de: 'Schuppen',\n fr: 'Hangar',\n it: 'Capannone',\n nl: 'Schuur',\n pl: 'Budka',\n pt: 'Cabana',\n es: 'Cobertizo',\n 'zh-cn': '棚',\n },\n icon: 'Shed.svg',\n },\n {\n _id: 'swimming_pool',\n name: {\n en: 'Swimming Pool',\n ru: 'Плавательный Бассейн',\n de: 'Schwimmbad',\n fr: 'Piscine',\n it: 'Piscina',\n nl: 'Zwembad',\n pl: 'Basen',\n pt: 'Piscina',\n es: 'Piscina',\n 'zh-cn': '游泳池',\n },\n icon: 'Swimming Pool.svg',\n },\n {\n _id: 'dining',\n name: {\n en: 'Dining',\n ru: 'Обеденный',\n de: 'Speis',\n fr: 'À Manger',\n it: 'Cenare',\n nl: 'Dining',\n pl: 'Jadalnia',\n pt: 'Jantar',\n es: 'Comida',\n 'zh-cn': '用餐',\n },\n icon: 'Dining.svg',\n },\n {\n _id: 'playroom',\n name: {\n en: 'Playroom',\n ru: 'Игровая Комната',\n de: 'Spielzimmer',\n fr: 'Salle De Jeux',\n it: 'Stanza Dei Giochi',\n nl: 'Speelkamer',\n pl: 'Pokój Zabaw',\n pt: 'Sala De Jogos',\n es: 'Cuarto De Jugar',\n 'zh-cn': '游戏室',\n },\n icon: 'Playroom.svg',\n },\n {\n _id: 'stairway',\n name: {\n en: 'Stairway',\n ru: 'Лестница',\n de: 'Treppe',\n fr: 'Escalier',\n it: 'Scala',\n nl: 'Trap',\n pl: 'Klatka Schodowa',\n pt: 'Escada',\n es: 'Escalera',\n 'zh-cn': '楼梯',\n },\n icon: 'Stairway.svg',\n },\n {\n _id: 'equipment_room',\n name: {\n en: 'Equipment Room',\n ru: 'Оборудование Номера',\n de: 'Technikraum',\n fr: \"Salle D'Équipement\",\n it: 'Stanza Degli Attrezzi',\n nl: 'Technische Ruimte',\n pl: 'Wyposażenie Pokoi',\n pt: 'Sala De Equipamentos',\n es: 'Cuarto De Equipos',\n 'zh-cn': '机房',\n },\n icon: 'Equipment Room.svg',\n },\n {\n _id: 'terrace',\n name: {\n en: 'Terrace',\n ru: 'Терраса',\n de: 'Terrasse',\n fr: 'Terrasse',\n it: 'Terrazza',\n nl: 'Terras',\n pl: 'Taras',\n pt: 'Terraço',\n es: 'Terraza',\n 'zh-cn': '阳台',\n },\n icon: 'Terrace.svg',\n },\n {\n _id: 'toilet',\n name: {\n en: 'Toilet',\n ru: 'Туалет',\n de: 'Toilette',\n fr: 'Toilette',\n it: 'Gabinetto',\n nl: 'Toilet',\n pl: 'Toaleta',\n pt: 'Banheiro',\n es: 'Inodoro',\n 'zh-cn': '洗手间',\n },\n icon: 'Toilet.svg',\n },\n {\n _id: 'stairwell',\n name: {\n en: 'Stairwell',\n ru: 'Лестничная клетка',\n de: 'Treppenhaus',\n fr: \"Cage D'Escalier\",\n it: 'Tromba Delle Scale',\n nl: 'Trappenhuis',\n pl: 'Klatka Schodowa',\n pt: 'Caixa De Escada',\n es: 'Hueco De Escalera',\n 'zh-cn': '楼梯间',\n },\n icon: 'Stairwell.svg',\n },\n {\n _id: 'locker_room',\n name: {\n en: 'Locker Room',\n ru: 'Камера Хранения',\n de: 'Umkleideraum',\n fr: 'Vestiaire',\n it: 'Spogliatoio',\n nl: 'Kleedkamer',\n pl: 'Szatnia',\n pt: 'Vestiário',\n es: 'Vestuario',\n 'zh-cn': '更衣室',\n },\n icon: 'Locker Room.svg',\n },\n {\n _id: 'basement',\n name: {\n en: 'Basement',\n ru: 'Подвал',\n de: 'Untergeschoss',\n fr: 'Sous-Sol',\n it: 'Seminterrato',\n nl: 'Kelder',\n pl: 'Piwnica',\n pt: 'Porão',\n es: 'Sótano',\n 'zh-cn': '地下室',\n },\n icon: 'Basement.svg',\n },\n {\n _id: 'front_yard',\n name: {\n en: 'Front Yard',\n ru: 'Передний Двор',\n de: 'Vorgarten',\n fr: 'Front Yard',\n it: 'Cortile',\n nl: 'Voortuin',\n pl: 'Podwórko',\n pt: 'Jardim Da Frente',\n es: 'Patio Delantero',\n 'zh-cn': '前院',\n },\n icon: 'Front Yard.svg',\n },\n {\n _id: 'anteroom',\n name: {\n en: 'Anteroom',\n ru: 'Передняя',\n de: 'Vorraum',\n fr: 'Antichambre',\n it: 'Anticamera',\n nl: 'Voorkamer',\n pl: 'Przedpokój',\n pt: 'Ante-Sala',\n es: 'Antesala',\n 'zh-cn': '接待室',\n },\n icon: 'Anteroom.svg',\n },\n {\n _id: 'washroom',\n name: {\n en: 'Washroom',\n ru: 'Уборная',\n de: 'Waschraum',\n fr: 'Toilettes',\n it: 'Bagno',\n nl: 'Waskamer',\n pl: 'Umywalnia',\n pt: 'Banheiro',\n es: 'Baño',\n 'zh-cn': '卫生间',\n },\n icon: 'Washroom.svg',\n },\n {\n _id: 'wc',\n name: {\n en: 'Wc',\n ru: 'Туалет',\n de: 'WC',\n fr: 'Toilettes',\n it: 'Bagno',\n nl: 'Wc',\n pl: 'Toaleta',\n pt: 'Banheiro',\n es: 'Wc',\n 'zh-cn': '厕所',\n },\n icon: 'Wc.svg',\n },\n {\n _id: 'workshop',\n name: {\n en: 'Workshop',\n ru: 'Мастерская',\n de: 'Werkstatt',\n fr: 'Atelier',\n it: 'Laboratorio',\n nl: 'Werkplaats',\n pl: 'Warsztat',\n pt: 'Oficina',\n es: 'Taller',\n 'zh-cn': '作坊',\n },\n icon: 'Workshop.svg',\n },\n {\n _id: 'windscreen',\n name: {\n en: 'Windscreen',\n ru: 'Ветровое Стекло',\n de: 'Windfang',\n fr: 'Pare-Brise',\n it: 'Parabrezza',\n nl: 'Voorruit',\n pl: 'Szyba Przednia',\n pt: 'Pára-Brisas',\n es: 'Parabrisas',\n 'zh-cn': '风档',\n },\n icon: 'Windscreen.svg',\n },\n {\n _id: 'living_area',\n name: {\n en: 'Living Area',\n ru: 'Жилая Площадь',\n de: 'Wohnbereich',\n fr: 'Salon',\n it: 'Zona Giorno',\n nl: 'Living Area',\n pl: 'Powierzchnia Mieszkalna',\n pt: 'Sala-De-Estar',\n es: 'Sala De Estar',\n 'zh-cn': '生活区域',\n },\n icon: 'Living Area.svg',\n },\n {\n _id: 'living_room',\n name: {\n en: 'Living Room',\n ru: 'Гостинная',\n de: 'Wohnzimmer',\n fr: 'Le Salon',\n it: 'Soggiorno',\n nl: 'Woonkamer',\n pl: 'Salon',\n pt: 'Sala De Estar',\n es: 'Sala De Estar',\n 'zh-cn': '客厅',\n },\n icon: 'Living Room.svg',\n },\n {\n _id: 'living_room',\n name: {\n en: 'Living Room',\n ru: 'Гостинная',\n de: 'Wohnzimmer',\n fr: 'Le Salon',\n it: 'Soggiorno',\n nl: 'Woonkamer',\n pl: 'Salon',\n pt: 'Sala De Estar',\n es: 'Sala De Estar',\n 'zh-cn': '客厅',\n },\n icon: 'Living Room.svg',\n },\n];\n\ninterface IconSelectorProps {\n icons?: {\n icon?: string;\n src?: string;\n href?: string;\n name?: ioBroker.StringOrTranslated;\n _id?: string;\n }[];\n onlyRooms?: boolean;\n onlyDevices?: boolean;\n onSelect?: (icon: string) => void; // one of onSelect or onChange are required\n onChange?: (icon: string) => void;\n t: Translate;\n lang: ioBroker.Languages;\n}\n\ninterface IconSelectorState {\n opened: boolean;\n names: string[];\n filter: string;\n icons: string[] | null;\n loading: boolean;\n isAnyName: boolean;\n}\n\nexport class IconSelector extends Component<IconSelectorProps, IconSelectorState> {\n constructor(props: IconSelectorProps) {\n super(props);\n\n this.state = {\n opened: false,\n names: [],\n filter: '',\n icons: null,\n loading: false,\n isAnyName: false,\n };\n }\n\n loadAllIcons(): void {\n if (this.state.loading || this.state.icons) {\n return;\n }\n this.setState({ loading: true }, () => {\n const icons: string[] = [];\n const names: string[] = [];\n\n if (!this.props.icons) {\n // load rooms\n let templates =\n this.props.onlyRooms || (!this.props.onlyRooms && !this.props.onlyDevices) ? rooms : null;\n\n if (templates) {\n templates.forEach(item => {\n if (item.name && typeof item.name === 'object') {\n item.name = item.name[this.props.lang] || item.name.en || item._id;\n }\n item.name = item.name || item._id;\n });\n\n templates = templates.filter(\n (item, i) =>\n !templates?.find(\n (_item, _i) => i !== _i && _item.icon === item.icon && _item.name === item.name,\n ),\n );\n\n templates.forEach((template, i) => {\n names[i] = template.name as string;\n icons[i] =\n `data:image/svg+xml;base64,${(roomsIcons as Record<string, string>)[template.icon.replace(/\\.svg$/, '')]}`;\n });\n }\n\n // load devices\n templates =\n this.props.onlyDevices || (!this.props.onlyRooms && !this.props.onlyDevices) ? devices : null;\n if (templates) {\n const offset = icons.length;\n templates &&\n templates.forEach(item => {\n if (item.name && typeof item.name === 'object') {\n item.name = item.name[this.props.lang] || item.name.en || item._id;\n }\n item.name = item.name || item._id;\n });\n\n templates = templates.filter(\n (item, i) =>\n !templates?.find(\n (_item, _i) => i !== _i && _item.icon === item.icon && _item.name === item.name,\n ),\n );\n\n templates.forEach((template, i) => {\n names[i + offset] = template.name as string;\n icons[i + offset] =\n `data:image/svg+xml;base64,${(devicesIcons as Record<string, string>)[template.icon.replace(/\\.svg$/, '')]}`;\n });\n }\n this.setState({\n icons,\n loading: false,\n names,\n isAnyName: !!names.find(i => i),\n });\n } else {\n const promises = this.props.icons.map((item, i) => {\n let href: string;\n if (typeof item === 'object') {\n href = item.icon || item.src || item.href || '';\n names[i] =\n typeof item.name === 'object'\n ? item.name[this.props.lang] || item.name.en || item._id || ''\n : item.name || '';\n if (!names[i]) {\n const parts = href.split('.');\n parts.pop();\n names[i] = parts[parts.length - 1];\n }\n } else {\n href = item;\n }\n\n if (href) {\n if (href.startsWith('data:')) {\n icons[i] = href;\n return Promise.resolve();\n }\n return Utils.getSvg(href).then(icon => (icons[i] = icon));\n }\n\n return Promise.resolve();\n });\n\n void Promise.all(promises)\n .catch((e: Error) => console.error(e))\n .then(() =>\n this.setState({\n icons,\n loading: false,\n names,\n isAnyName: !!names.find(i => i),\n }),\n );\n }\n });\n }\n\n render(): React.JSX.Element {\n if (this.state.loading) {\n return <CircularProgress />;\n }\n\n return (\n <>\n <Button\n color=\"grey\"\n variant=\"outlined\"\n title={this.props.t('ra_Select predefined icon')}\n onClick={() => this.setState({ opened: true }, () => this.loadAllIcons())}\n style={{ minWidth: 40, marginRight: 8 }}\n >\n ...\n </Button>\n {this.state.opened ? (\n <Dialog\n onClose={() => this.setState({ opened: false })}\n open={!0}\n >\n <DialogTitle>\n {this.props.t('ra_Select predefined icon')}\n {this.state.isAnyName ? (\n <TextField\n variant=\"standard\"\n margin=\"dense\"\n style={{ marginLeft: 20 }}\n value={this.state.filter}\n onChange={e => this.setState({ filter: e.target.value.toLowerCase() })}\n placeholder={this.props.t('ra_Filter')}\n slotProps={{\n input: {\n endAdornment: this.state.filter ? (\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ filter: '' })}\n >\n <ClearIcon />\n </IconButton>\n ) : undefined,\n },\n }}\n />\n ) : null}\n </DialogTitle>\n <DialogContent>\n <div style={{ width: '100%', textAlign: 'center' }}>\n {this.state.icons &&\n this.state.icons.map((icon, i) => {\n if (\n !this.state.filter ||\n (this.state.names[i] &&\n this.state.names[i].toLowerCase().includes(this.state.filter))\n ) {\n return (\n <Tooltip\n title={this.state.names[i] || ''}\n key={i}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <IconButton\n onClick={() =>\n this.setState({ opened: false }, () => {\n const onApply: ((_icon: string) => void) | undefined =\n this.props.onSelect || this.props.onChange;\n if (onApply) {\n onApply(icon);\n }\n })\n }\n size=\"large\"\n >\n <Icon\n src={icon}\n alt={i.toString()}\n style={{ width: 32, height: 32, borderRadius: 5 }}\n />\n </IconButton>\n </Tooltip>\n );\n }\n\n return null;\n })}\n </div>\n </DialogContent>\n <DialogActions>\n <Button\n color=\"grey\"\n variant=\"contained\"\n onClick={() => this.setState({ opened: false })}\n startIcon={<CloseIcon />}\n >\n {this.props.t('ra_Close')}\n </Button>\n </DialogActions>\n </Dialog>\n ) : null}\n </>\n );\n }\n}\n","import React, { useCallback } from 'react';\nimport { useDropzone } from 'react-dropzone';\n\nimport { InputLabel, FormControl, IconButton } from '@mui/material';\nimport { Clear as ClearIcon } from '@mui/icons-material';\n\nimport { IconSelector } from './IconSelector';\nimport { Icon } from './Icon';\nimport { I18n } from '../i18n';\nimport { Utils } from './Utils';\n\nconst styles: Record<string, React.CSSProperties> = {\n formContainer: {\n display: 'flex',\n justifyContent: 'left',\n alignItems: 'center',\n },\n formControl: {\n display: 'flex',\n padding: 24,\n flexGrow: 1000,\n },\n divContainer: {\n width: 32 + 32,\n height: 32,\n whiteSpace: 'nowrap',\n lineHeight: '32px',\n marginRight: 8,\n },\n dragField: {\n textAlign: 'center',\n display: 'table',\n minHeight: 90,\n width: 'calc(100% - 60px)',\n border: '2px dashed #777',\n borderRadius: 10,\n padding: 4,\n },\n formIcon: {\n margin: 10,\n opacity: 0.6,\n },\n text: {\n display: 'table-cell',\n verticalAlign: 'middle',\n },\n};\n\ninterface IconPickerProps {\n previewStyle?: React.CSSProperties;\n previewClassName?: string;\n /** Custom icon element. */\n icon?: React.FC<{ style?: React.CSSProperties }>;\n customStyles?: Record<string, React.CSSProperties>;\n customClasses?: Record<string, string>;\n /** The label. */\n label?: string;\n /** The value. */\n value?: any;\n /** Set to true to disable the icon picker. */\n disabled?: boolean;\n /** The icon change callback. */\n onChange: (icon: string) => void;\n icons?: {\n icon?: string;\n src?: string;\n href?: string;\n name?: ioBroker.StringOrTranslated;\n _id?: string;\n }[];\n onlyRooms?: boolean;\n onlyDevices?: boolean;\n}\n\nexport function IconPicker(props: IconPickerProps): React.JSX.Element {\n const IconCustom = props.icon;\n\n const onChange = props.onChange;\n\n const onDrop = useCallback(\n (acceptedFiles: File[]) => {\n const reader = new FileReader();\n\n reader.addEventListener('load', () => onChange(reader.result as string), false);\n\n if (acceptedFiles[0]) {\n reader.readAsDataURL(acceptedFiles[0]);\n }\n },\n [onChange],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop });\n\n return (\n <div style={styles.formContainer}>\n {IconCustom ? <IconCustom style={styles.formIcon} /> : null}\n <FormControl\n variant=\"standard\"\n style={{ ...styles.formControl, padding: 3 }}\n >\n <InputLabel\n shrink\n sx={props.customStyles?.label ? { '&.MuiInputLabel-root': props.customStyles.label } : undefined}\n classes={{ root: props.customClasses?.label }}\n >\n {props.label}\n </InputLabel>\n <div style={styles.formContainer}>\n {props.value ? (\n <div style={styles.divContainer}>\n <Icon\n style={{ ...props.previewStyle, ...(props.customStyles?.icon || undefined) }}\n src={props.value}\n className={Utils.clsx(props.previewClassName, props.customClasses?.icon)}\n />\n {!props.disabled && (\n <IconButton\n style={{ verticalAlign: 'top' }}\n title={I18n.t('ra_Clear icon')}\n size=\"small\"\n onClick={() => props.onChange('')}\n >\n <ClearIcon />\n </IconButton>\n )}\n </div>\n ) : (\n !props.disabled && (\n <IconSelector\n icons={props.icons}\n onlyRooms={props.onlyRooms}\n onlyDevices={props.onlyDevices}\n onSelect={(base64: string) => props.onChange(base64)}\n t={I18n.t}\n lang={I18n.getLanguage()}\n />\n )\n )}\n\n {!props.disabled && (\n <div\n {...getRootProps()}\n style={{\n ...styles.dragField,\n ...(isDragActive ? { backgroundColor: 'rgba(0, 255, 0, 0.1)' } : { cursor: 'pointer' }),\n }}\n >\n <input {...getInputProps()} />\n {isDragActive ? (\n <span style={styles.text}>{I18n.t('ra_Drop the files here...')}</span>\n ) : (\n <span style={styles.text}>\n {I18n.t(\"ra_Drag 'n' drop some files here, or click to select files\")}\n </span>\n )}\n </div>\n )}\n </div>\n </FormControl>\n </div>\n );\n};\n","import React, { type JSX } from 'react';\nimport { Component } from 'react';\n\nimport { IconNoIcon } from '../icons/IconNoIcon';\n\nfunction getElementFromSource(src: string): HTMLElement | null {\n const svgContainer = document.createElement('div');\n svgContainer.innerHTML = src;\n const svg: HTMLElement = svgContainer.firstElementChild as HTMLElement;\n if (svg?.remove) {\n svg.remove();\n } else if (svg) {\n svgContainer.removeChild(svg);\n }\n\n svgContainer.remove();\n return svg;\n}\n\nfunction serializeAttrs(map?: NamedNodeMap): Record<string, string> {\n const ret: Record<string, string> = {};\n if (!map) {\n return ret;\n }\n for (let prop, i = 0; i < map.length; i++) {\n const key = map[i].name;\n if (key === 'class') {\n prop = 'className';\n } else if (!key.startsWith('data-')) {\n prop = key.replace(/[-|:]([a-z])/g, g => g[1].toUpperCase());\n } else {\n prop = key;\n }\n\n ret[prop] = map[i].value;\n }\n return ret;\n}\n\ninterface ImageProps {\n /* The color */\n color?: string;\n /* The source of the image */\n src?: string;\n /* The image prefix (default: './files/') */\n imagePrefix?: string;\n /* The CSS class name */\n className?: string;\n /* Show image errors (or just show no image)? */\n showError?: boolean;\n}\n\ninterface ImageState {\n svg?: boolean;\n created?: boolean;\n color?: string;\n src?: string;\n imgError?: boolean;\n showError?: boolean;\n}\n\n/**\n * A component for displaying an image.\n */\nexport class Image extends Component<ImageProps, ImageState> {\n private svg: JSX.Element | null;\n\n static REMOTE_SERVER: boolean = window.location.hostname.includes('iobroker.in');\n\n static REMOTE_PREFIX: string = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1);\n\n constructor(props: ImageProps) {\n super(props);\n this.state = {\n svg: !!this.props.src?.startsWith('data:'),\n created: true,\n color: this.props.color || '',\n src: this.props.src || '',\n imgError: false,\n showError: !!this.props.showError,\n };\n\n this.svg = this.state.svg && this.state.src ? this.getSvgFromData(this.state.src) : null;\n }\n\n static getDerivedStateFromProps(props: ImageProps, state: ImageState): Partial<ImageState> | null {\n const newState: ImageState = {};\n let changed = false;\n\n if (props && state && props.src !== state.src) {\n newState.src = props.src;\n newState.svg = props.src?.startsWith('data:');\n newState.created = false;\n changed = true;\n }\n\n if (props && state && props.color !== state.color) {\n newState.color = props.color;\n newState.created = false;\n changed = true;\n }\n\n if (props && state && props.showError !== state.showError) {\n newState.showError = props.showError;\n changed = true;\n }\n\n return changed ? newState : null;\n }\n\n getSvgFromData(src: string): JSX.Element | null {\n const len = 'data:image/svg+xml;base64,';\n if (!src.startsWith(len)) {\n return null;\n }\n src = src.substring(len.length);\n try {\n src = atob(src);\n const svg = getElementFromSource(src) as HTMLElement;\n const inner = svg.innerHTML;\n const svgProps = serializeAttrs(svg.attributes);\n\n svg.remove();\n\n return (\n <svg\n className={this.props.className}\n style={this.state.color ? { color: this.state.color } : {}}\n {...svgProps}\n dangerouslySetInnerHTML={{ __html: inner }}\n />\n );\n } catch {\n // ignore\n }\n return null;\n }\n\n render(): JSX.Element | null {\n if (this.state.svg) {\n if (!this.state.created) {\n setTimeout(() => {\n this.svg = this.state.src ? this.getSvgFromData(this.state.src) : null;\n this.setState({ created: true });\n }, 50);\n }\n\n return this.svg;\n }\n if (this.state.src) {\n if (this.state.imgError || !this.state.src) {\n return <IconNoIcon className={this.props.className} />;\n }\n if (\n Image.REMOTE_SERVER &&\n !this.state.src.startsWith('http://') &&\n !this.state.src.startsWith('https://')\n ) {\n let src = (this.props.imagePrefix || '') + this.state.src;\n if (src.startsWith('./')) {\n src = Image.REMOTE_PREFIX + src.substring(2);\n } else if (!src.startsWith('/')) {\n src = Image.REMOTE_PREFIX + src;\n }\n return (\n <img\n className={this.props.className}\n src={`https://remote-files.iobroker.in${src}`}\n alt=\"\"\n onError={() =>\n this.props.showError ? this.setState({ imgError: true }) : this.setState({ src: '' })\n }\n />\n );\n }\n\n return (\n <img\n className={this.props.className}\n src={(this.props.imagePrefix || '') + this.state.src}\n alt=\"\"\n onError={() =>\n this.props.showError ? this.setState({ imgError: true }) : this.setState({ src: '' })\n }\n />\n );\n }\n\n return null;\n }\n}\n","import React from 'react';\nimport { Fab } from '@mui/material';\n\nimport {\n Help as IconHelp,\n VerticalAlignTop as IconUpload,\n VerticalAlignBottom as IconDownload,\n} from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\nimport { Icon } from './Icon';\n\ninterface LogoProps {\n /* Adapter common configuration from io-package.json */\n common: any;\n /* Adapter native data from io-package.json */\n native: any;\n /* Adapter instance number. */\n instance: number;\n /* on Load handler */\n onLoad?: (contents: any) => void;\n /* on Error handler */\n onError?: (error: string) => void;\n className?: string;\n style?: Record<string, any>;\n}\n\nexport class Logo extends React.Component<LogoProps> {\n static generateFile(fileName: string, obj: any): void {\n const el = window.document.createElement('a');\n el.setAttribute(\n 'href',\n `data:application/json;charset=utf-8,${encodeURIComponent(JSON.stringify(obj, null, 2))}`,\n );\n el.setAttribute('download', fileName);\n\n el.style.display = 'none';\n window.document.body.appendChild(el);\n\n el.click();\n\n window.document.body.removeChild(el);\n }\n\n handleFileSelect = (evt: Event): void => {\n const target = evt.target as HTMLInputElement;\n const files = target?.files;\n if (!files || !files.length) {\n console.error('No files found. Please report to developers');\n return;\n }\n const f = files[0];\n\n if (f) {\n const r = new window.FileReader();\n r.onload = () => {\n const contents: string = r.result?.toString() || '';\n try {\n const json = JSON.parse(contents);\n if (json.native && json.common) {\n if (json.common.name !== this.props.common.name) {\n this.props.onError && this.props.onError(I18n.t('ra_otherConfig', json.common.name));\n } else {\n this.props.onLoad && this.props.onLoad(json.native);\n }\n } else {\n this.props.onError && this.props.onError(I18n.t('ra_invalidConfig'));\n }\n } catch (err: any) {\n this.props.onError && this.props.onError(err?.toString());\n }\n };\n r.readAsText(f);\n } else {\n alert('Failed to open JSON File');\n }\n };\n\n download(): void {\n const result = {\n _id: `system.adapter.${this.props.common.name}.${this.props.instance}`,\n common: JSON.parse(JSON.stringify(this.props.common)),\n native: this.props.native,\n };\n // remove unimportant information\n if (result.common.news) {\n delete result.common.news;\n }\n if (result.common.titleLang) {\n delete result.common.titleLang;\n }\n if (result.common.desc) {\n delete result.common.desc;\n }\n\n // window.open('data:application/iobroker; content-disposition=attachment; filename=' + result._id + '.json,' + JSON.stringify(result, null, 2));\n Logo.generateFile(`${result._id}.json`, result);\n }\n\n upload(): void {\n const input = window.document.createElement('input');\n input.setAttribute('type', 'file');\n input.setAttribute('id', 'files');\n input.setAttribute('opacity', '0');\n input.addEventListener('change', this.handleFileSelect, false);\n input.click();\n }\n\n render(): React.JSX.Element {\n return (\n <div\n className={this.props.className}\n style={this.props.style}\n >\n {this.props.common.icon ? (\n <Icon\n src={this.props.common.icon}\n style={{\n padding: 8,\n width: 64,\n }}\n alt=\"logo\"\n />\n ) : null}\n {this.props.common.readme ? (\n <Fab\n size=\"small\"\n color=\"primary\"\n aria-label=\"Help\"\n style={{\n marginRight: 5,\n marginTop: 5,\n float: 'right',\n }}\n onClick={() => {\n const win = window.open(this.props.common.readme, '_blank');\n win?.focus();\n }}\n >\n <IconHelp />\n </Fab>\n ) : null}\n <Fab\n size=\"small\"\n color=\"primary\"\n aria-label=\"Load config\"\n style={{\n marginRight: 5,\n marginTop: 5,\n float: 'right',\n }}\n title={I18n.t('ra_Load configuration from file')}\n onClick={() => this.upload()}\n >\n <IconUpload />\n </Fab>\n <Fab\n size=\"small\"\n color=\"primary\"\n aria-label=\"Save config\"\n style={{\n marginRight: 5,\n marginTop: 5,\n float: 'right',\n }}\n title={I18n.t('ra_Save configuration to file')}\n onClick={() => this.download()}\n >\n <IconDownload />\n </Fab>\n </div>\n );\n }\n}\n","/**\n * Copyright 2018-2023 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport { copy } from './CopyToClipboard';\n\nexport class MDUtils {\n static text2link(text: string): string {\n const m = text.match(/\\d+\\.\\)\\s/);\n if (m) {\n text = text.replace(m[0], m[0].replace(/\\s/, ' '));\n }\n\n return text\n .replace(/[^a-zA-Zа-яА-Я0-9]/g, '')\n .trim()\n .replace(/\\s/g, '')\n .toLowerCase();\n }\n\n static openLink(url: string, target?: string): void {\n // replace IPv6 Address with [ipv6]:port\n url = url.replace(/\\/\\/([0-9a-f]*:[0-9a-f]*:[0-9a-f]*:[0-9a-f]*:[0-9a-f]*:[0-9a-f]*)(:\\d+)?\\//i, '//[$1]$2/');\n\n if (target === 'this') {\n window.location.href = url;\n } else {\n window.open(url, target || '_blank');\n }\n }\n\n static getTitle(text: string): string {\n const result = MDUtils.extractHeader(text);\n let body = result.body;\n const header = result.header;\n if (!header.title) {\n // remove {docsify-bla}\n body = body.replace(/{[^}]*}/g, '');\n body = body.trim();\n const lines = body.replace(/\\r/g, '').split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].startsWith('# ')) {\n return lines[i].substring(2).trim();\n }\n }\n return '';\n }\n\n return header.title.toString();\n }\n\n static extractHeader(text: string): { header: Record<string, string | boolean | number>; body: string } {\n const attrs: Record<string, string | boolean | number> = {};\n if (text.substring(0, 3) === '---') {\n const pos = text.substring(3).indexOf('\\n---');\n if (pos !== -1) {\n const _header = text.substring(3, pos + 3);\n const lines = _header.replace(/\\r/g, '').split('\\n');\n lines.forEach(line => {\n if (!line.trim()) {\n return;\n }\n const pos_ = line.indexOf(':');\n if (pos_ !== -1) {\n const attr = line.substring(0, pos_).trim();\n let val: string = line.substring(pos_ + 1).trim();\n val = val.replace(/^['\"]|['\"]$/g, '');\n if (val === 'true') {\n attrs[attr] = true;\n } else if (val === 'false') {\n attrs[attr] = false;\n } else if (parseFloat(val).toString() === val) {\n attrs[attr] = parseFloat(val);\n } else {\n attrs[attr] = val;\n }\n } else {\n attrs[line.trim()] = true;\n }\n });\n text = text.substring(pos + 7);\n }\n }\n return { header: attrs, body: text };\n }\n\n static removeDocsify(text: string): string {\n const m = text.match(/{docsify-[^}]*}/g);\n if (m) {\n m.forEach(doc => (text = text.replace(doc, '')));\n }\n return text;\n }\n\n static onCopy(e: Event | null, text: string): void {\n copy(text);\n e && e.stopPropagation();\n e && e.preventDefault();\n }\n}\n","import React from 'react';\nimport { type IconProps } from './IconProps';\n\n// Icon copied from https://github.com/FortAwesome/Font-Awesome/blob/0d1f27efb836eb2ab994ba37221849ed64a73e5c/svgs/regular/\nexport const IconAdapter = (props: IconProps): React.JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 512 512\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M448 0L320 96v62.06l-83.03 83.03c6.79 4.25 13.27 9.06 19.07 14.87 5.8 5.8 10.62 12.28 14.87 19.07L353.94 192H416l96-128-64-64zM128 278.59L10.92 395.67c-14.55 14.55-14.55 38.15 0 52.71l52.7 52.7c14.56 14.56 38.15 14.56 52.71 0L233.41 384c29.11-29.11 29.11-76.3 0-105.41s-76.3-29.11-105.41 0z\"\n />\n </svg>\n);\n","import React from 'react';\nimport { type IconProps } from './IconProps';\n\nexport const IconChannel = (props: IconProps): React.JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 320 320\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <g fill=\"currentColor\">\n <rect\n rx=\"32\"\n height=\"272\"\n width=\"267\"\n y=\"25\"\n x=\"25\"\n strokeWidth=\"15\"\n stroke=\"currentColor\"\n fill=\"none\"\n />\n <ellipse\n stroke=\"currentColor\"\n ry=\"26\"\n rx=\"26\"\n cy=\"248\"\n cx=\"160\"\n fill=\"none\"\n strokeWidth=\"15\"\n />\n <line\n y2=\"201.94531\"\n x2=\"159.5\"\n y1=\"46.94531\"\n x1=\"159.5\"\n fillOpacity=\"null\"\n strokeOpacity=\"null\"\n strokeWidth=\"15\"\n stroke=\"currentColor\"\n fill=\"none\"\n />\n <rect\n height=\"27\"\n width=\"50\"\n y=\"79.7979\"\n x=\"133.5\"\n fillOpacity=\"null\"\n strokeOpacity=\"null\"\n strokeWidth=\"15\"\n stroke=\"currentColor\"\n fill=\"#fff\"\n />\n </g>\n </svg>\n);\n","import React from 'react';\nimport { type IconProps } from './IconProps';\n\nexport const IconCopy = (props: IconProps): React.JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 512 512\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z\"\n />\n </svg>\n);\n","import React from 'react';\nimport { type IconProps } from './IconProps';\n\nexport const IconDevice = (props: IconProps): React.JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 320 320\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <g fill=\"currentColor\">\n <rect\n rx=\"32\"\n height=\"272\"\n width=\"267\"\n y=\"25\"\n x=\"25\"\n strokeWidth=\"15\"\n stroke=\"currentColor\"\n fill=\"none\"\n />\n <ellipse\n stroke=\"currentColor\"\n ry=\"26\"\n rx=\"26\"\n cy=\"252\"\n cx=\"160\"\n fillOpacity=\"null\"\n strokeOpacity=\"null\"\n strokeWidth=\"15\"\n fill=\"#fff\"\n />\n <line\n y2=\"201.94531\"\n x2=\"159.5\"\n y1=\"46.94531\"\n x1=\"159.5\"\n fillOpacity=\"null\"\n strokeOpacity=\"null\"\n strokeWidth=\"15\"\n stroke=\"currentColor\"\n fill=\"none\"\n />\n <rect\n height=\"27\"\n width=\"50\"\n y=\"140.83068\"\n x=\"133.5\"\n fillOpacity=\"null\"\n strokeOpacity=\"null\"\n strokeWidth=\"15\"\n stroke=\"currentColor\"\n fill=\"#fff\"\n />\n <ellipse\n stroke=\"currentColor\"\n ry=\"26\"\n rx=\"26\"\n cy=\"251\"\n cx=\"241\"\n fillOpacity=\"null\"\n strokeOpacity=\"null\"\n strokeWidth=\"15\"\n fill=\"#fff\"\n />\n <line\n y2=\"200.94531\"\n x2=\"240.5\"\n y1=\"45.94531\"\n x1=\"240.5\"\n fillOpacity=\"null\"\n strokeOpacity=\"null\"\n strokeWidth=\"15\"\n stroke=\"currentColor\"\n fill=\"none\"\n />\n <rect\n height=\"27\"\n width=\"50\"\n y=\"78.7979\"\n x=\"214.5\"\n strokeWidth=\"15\"\n stroke=\"currentColor\"\n fill=\"#fff\"\n />\n <ellipse\n stroke=\"currentColor\"\n ry=\"26\"\n rx=\"26\"\n cy=\"252\"\n cx=\"84\"\n fillOpacity=\"null\"\n strokeOpacity=\"null\"\n strokeWidth=\"15\"\n fill=\"#fff\"\n />\n <line\n y2=\"201.94531\"\n x2=\"83.5\"\n y1=\"46.94531\"\n x1=\"83.5\"\n fillOpacity=\"null\"\n strokeOpacity=\"null\"\n strokeWidth=\"15\"\n stroke=\"currentColor\"\n fill=\"none\"\n />\n <rect\n height=\"27\"\n width=\"50\"\n y=\"79.7979\"\n x=\"57.5\"\n fillOpacity=\"null\"\n strokeOpacity=\"null\"\n strokeWidth=\"15\"\n stroke=\"currentColor\"\n fill=\"#fff\"\n />\n </g>\n </svg>\n);\n","import React from 'react';\nimport { type IconProps } from './IconProps';\n\n// Icon copied from https://github.com/FortAwesome/Font-Awesome/blob/0d1f27efb836eb2ab994ba37221849ed64a73e5c/svgs/regular/\nexport const IconDocument = (props: IconProps): React.JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 512\"\n onClick={e => props.onClick && props.onClick(e)}\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z\"\n />\n </svg>\n);\n","import React from 'react';\nimport { type IconProps } from './IconProps';\n\n// Icon copied from https://github.com/FortAwesome/Font-Awesome/blob/0d1f27efb836eb2ab994ba37221849ed64a73e5c/svgs/regular/\nexport const IconDocumentReadOnly = (props: IconProps): React.JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 512 512\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z\"\n />\n <path\n fill=\"currentColor\"\n stroke=\"null\"\n d=\"m261,270l-12,0l0,-24c0,-33.12 -26.88,-60 -60,-60s-60,26.88 -60,60l0,24l-12,0c-13.2,0 -24,10.8 -24,24l0,120c0,13.2 10.8,24 24,24l144,0c13.2,0 24,-10.8 24,-24l0,-120c0,-13.2 -10.8,-24 -24,-24zm-72,108c-13.2,0 -24,-10.8 -24,-24s10.8,-24 24,-24s24,10.8 24,24s-10.8,24 -24,24zm37.2,-108l-74.4,0l0,-24c0,-20.52 16.68,-37.2 37.2,-37.2c20.52,0 37.2,16.68 37.2,37.2l0,24z\"\n />\n </svg>\n);\n","import React from 'react';\nimport { type IconProps } from './IconProps';\n\n// Icon copied from https://github.com/FortAwesome/Font-Awesome/blob/0d1f27efb836eb2ab994ba37221849ed64a73e5c/svgs/regular/\nexport const IconInstance = (props: IconProps): React.JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 512 512\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M448 0L320 96v62.06l-83.03 83.03c6.79 4.25 13.27 9.06 19.07 14.87 5.8 5.8 10.62 12.28 14.87 19.07L353.94 192H416l96-128-64-64zM128 278.59L10.92 395.67c-14.55 14.55-14.55 38.15 0 52.71l52.7 52.7c14.56 14.56 38.15 14.56 52.71 0L233.41 384c29.11-29.11 29.11-76.3 0-105.41s-76.3-29.11-105.41 0z\"\n />\n </svg>\n);\n","import React, { type JSX } from 'react';\nimport { type IconProps } from './IconProps';\n\nexport const IconState = (props: IconProps): JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 320 320\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <rect\n fill=\"none\"\n rx=\"32\"\n height=\"272\"\n width=\"267\"\n y=\"25\"\n x=\"25\"\n strokeWidth=\"15\"\n stroke=\"currentColor\"\n />\n <ellipse\n fill=\"none\"\n ry=\"54\"\n rx=\"54\"\n cy=\"160\"\n cx=\"160\"\n fillOpacity=\"null\"\n strokeOpacity=\"null\"\n strokeWidth=\"15\"\n stroke=\"currentColor\"\n />\n </svg>\n);\n","import React from 'react';\nimport { type IconProps } from './IconProps';\n\n// Copyright Apache 2.0 https://raw.githubusercontent.com/material-icons/material-icons/master/svg/filter_alt/baseline.svg\n// https://github.com/material-icons/material-icons/blob/master/LICENSE\nexport const IconClearFilter = (props: IconProps): React.JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 24 24\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n stroke=\"currentColor\"\n d=\"M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z\"\n />\n </svg>\n);\n","import React from 'react';\n\nimport { Grid2, Paper } from '@mui/material';\n\nconst styles: Record<string, React.CSSProperties> = {\n root: {\n width: '100%',\n height: '100%',\n },\n overflowHidden: {\n overflow: 'hidden',\n },\n container: {\n height: '100%',\n },\n};\n\ninterface TabContainerProps {\n /* The elevation of the tab container. */\n elevation?: number;\n /* Set to 'visible' show the overflow. */\n overflow?: string;\n styles?: {\n root?: React.CSSProperties;\n container?: React.CSSProperties;\n };\n onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n tabIndex?: number;\n /** The content of the component. */\n children: React.ReactNode;\n}\n\nexport function TabContainer(props: TabContainerProps): React.JSX.Element {\n return (\n <Paper\n elevation={!Number.isNaN(props.elevation) ? props.elevation : 1}\n style={{\n ...styles.root,\n ...(props.styles?.root || undefined),\n ...(props.overflow !== 'visible' ? styles.overflowHidden : undefined),\n }}\n onKeyDown={props.onKeyDown}\n tabIndex={props.tabIndex}\n >\n <Grid2\n container\n direction=\"column\"\n wrap=\"nowrap\"\n sx={styles.container}\n >\n {props.children}\n </Grid2>\n </Paper>\n );\n}\n","// please do not delete React, as without it other projects could not be compiled: ReferenceError: React is not defined\nimport React from 'react';\nimport { Grid2 } from '@mui/material';\n\nconst styles: Record<string, React.CSSProperties> = {\n root: {\n height: '100%',\n overflow: 'hidden',\n },\n overflowAuto: {\n overflow: 'auto',\n },\n};\n\ninterface TabContentProps {\n /** The content of the component. */\n children: React.JSX.Element | (React.JSX.Element | null | React.JSX.Element[])[];\n /** Overflow behavior */\n overflow?: 'auto';\n style?: React.CSSProperties;\n ref?: React.RefObject<HTMLDivElement>;\n}\n\nexport function TabContent(props: TabContentProps): React.JSX.Element {\n return (\n <Grid2\n sx={{\n ...styles.root,\n ...(props?.style || undefined),\n ...(props.overflow === 'auto' ? styles.overflowAuto : undefined),\n }}\n ref={props.ref}\n >\n {props.children}\n </Grid2>\n );\n}\n","import React from 'react';\n\nimport { Grid2 } from '@mui/material';\n\ninterface TabHeaderProps {\n children: React.ReactNode;\n}\n\nexport function TabHeader(props: TabHeaderProps): React.JSX.Element {\n return (\n <Grid2\n container\n alignItems=\"center\"\n >\n {props.children}\n </Grid2>\n );\n}\n","/**\n * Copyright 2020-2024, Denis Haev <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport React, { Component, createRef, type JSX } from 'react';\nimport SVG from 'react-inlinesvg';\n\nimport {\n Badge,\n Box,\n Button,\n Checkbox,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n Fab,\n FormControl,\n FormControlLabel,\n Grid2,\n IconButton,\n Input,\n List,\n ListItem,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n Paper,\n Select,\n Snackbar,\n Switch,\n TextField,\n type Theme,\n Tooltip,\n} from '@mui/material';\n\n// Icons\nimport {\n Add as AddIcon,\n ArrowRight as ArrowRightIcon,\n BedroomParent,\n BorderColor,\n Build as BuildIcon,\n CalendarToday as IconSchedule,\n Check as IconCheck,\n Close as IconClose,\n Code as IconScript,\n Construction,\n CreateNewFolder as IconFolder,\n Delete as IconDelete,\n Description as IconMeta,\n Edit as IconEdit,\n Error as IconError,\n FindInPage,\n FormatItalic as IconValueEdit,\n Info as IconInfo,\n Link as IconLink,\n ListAlt as IconEnum,\n LooksOne as LooksOneIcon,\n PersonOutlined as IconUser,\n Publish as PublishIcon,\n Refresh as RefreshIcon,\n Router as IconHost,\n Settings as IconConfig,\n SettingsApplications as IconSystem,\n DataObject as IconData,\n ShowChart as IconChart,\n SupervisedUserCircle as IconGroup,\n TextFields as TextFieldsIcon,\n ViewColumn as IconColumns,\n Wifi as IconConnection,\n WifiOff as IconDisconnected,\n} from '@mui/icons-material';\n\nimport { IconExpert } from '../icons/IconExpert';\nimport { IconAdapter } from '../icons/IconAdapter';\nimport { IconChannel } from '../icons/IconChannel';\nimport { IconCopy } from '../icons/IconCopy';\nimport { IconDevice } from '../icons/IconDevice';\nimport { IconDocument } from '../icons/IconDocument';\nimport { IconDocumentReadOnly } from '../icons/IconDocumentReadOnly';\nimport { IconInstance } from '../icons/IconInstance';\nimport { IconState } from '../icons/IconState';\nimport { IconClosed } from '../icons/IconClosed';\nimport { IconOpen } from '../icons/IconOpen';\nimport { IconClearFilter } from '../icons/IconClearFilter';\n\n// own\nimport type { Router } from './Router';\nimport type { ThemeType, ThemeName, IobTheme, Translate } from '../types';\nimport { Connection } from '../Connection';\nimport { Icon } from './Icon';\nimport { withWidth } from './withWidth';\nimport { Utils } from './Utils'; // @iobroker/adapter-react-v5/Components/Utils\nimport { TabContainer } from './TabContainer';\nimport { TabContent } from './TabContent';\nimport { TabHeader } from './TabHeader';\n\ndeclare global {\n interface Window {\n sparkline: {\n sparkline: (el: HTMLDivElement, data: number[]) => JSX.Element;\n };\n }\n}\ndeclare module '@mui/material/Button' {\n interface ButtonPropsColorOverrides {\n grey: true;\n }\n}\n\nconst ICON_SIZE = 24;\nconst ROW_HEIGHT = 32;\nconst ITEM_LEVEL = 16;\nconst SMALL_BUTTON_SIZE = 20;\nconst COLOR_NAME_USERDATA = (themeType: ThemeType): string => (themeType === 'dark' ? '#62ff25' : '#37c400');\nconst COLOR_NAME_ALIAS = (themeType: ThemeType): string => (themeType === 'dark' ? '#ee56ff' : '#a204b4');\nconst COLOR_NAME_JAVASCRIPT = (themeType: ThemeType): string => (themeType === 'dark' ? '#fff46e' : '#b89101');\nconst COLOR_NAME_SYSTEM = (themeType: ThemeType): string => (themeType === 'dark' ? '#ff6d69' : '#ff6d69');\nconst COLOR_NAME_SYSTEM_ADAPTER = (themeType: ThemeType): string => (themeType === 'dark' ? '#5773ff' : '#5773ff');\nconst COLOR_NAME_ERROR_DARK = '#ff413c';\nconst COLOR_NAME_ERROR_LIGHT = '#86211f';\nconst COLOR_NAME_CONNECTED_DARK = '#57ff45';\nconst COLOR_NAME_CONNECTED_LIGHT = '#098c04';\nconst COLOR_NAME_DISCONNECTED_DARK = '#f3ad11';\nconst COLOR_NAME_DISCONNECTED_LIGHT = '#6c5008';\n\ntype ObjectEventType = 'new' | 'changed' | 'deleted';\n\ninterface ObjectEvent {\n id: string;\n obj?: ioBroker.Object;\n type: ObjectEventType;\n oldObj?: ioBroker.Object;\n}\n\ninterface ObjectsWorker {\n getObjects(update?: boolean): Promise<void | Record<string, ioBroker.Object>>;\n registerHandler(cb: (events: ObjectEvent[]) => void): void;\n unregisterHandler(cb: (events: ObjectEvent[]) => void, doNotUnsubscribe?: boolean): void;\n}\n\ninterface CustomAdminColumnStored {\n path: string;\n name: string;\n objTypes?: ioBroker.ObjectType[];\n width?: number;\n edit?: boolean;\n type?: ioBroker.CommonType;\n}\n\ninterface ContextMenuItem {\n /** hotkey */\n key?: string;\n visibility: boolean;\n icon: JSX.Element | string;\n label: string;\n onClick?: () => void;\n listItemIconStyle?: React.CSSProperties;\n style?: React.CSSProperties;\n subMenu?: {\n label: string;\n visibility: boolean;\n icon: JSX.Element;\n onClick: () => void;\n iconStyle?: React.CSSProperties;\n style?: React.CSSProperties;\n listItemIconStyle?: React.CSSProperties;\n }[];\n iconStyle?: React.CSSProperties;\n}\n\nexport interface TreeItemData {\n id: string;\n name: string;\n obj?: ioBroker.Object;\n /** Object ID in lower case for filtering */\n fID?: string;\n /** translated common.name in lower case for filtering */\n fName?: string;\n /** Link to parent item */\n parent?: TreeItem;\n level?: number;\n icon?: string | JSX.Element | null;\n /** If the item existing object or generated folder */\n generated?: boolean;\n title?: string;\n /** if the item has \"write\" button (value=true, ack=false) */\n button?: boolean;\n /** If the item has read and write and is boolean */\n switch?: boolean;\n /** if the item has custom settings in `common.custom` */\n hasCustoms?: boolean;\n /** If this item is visible */\n visible?: boolean;\n /** Is any of the children visible (not only directly children) */\n hasVisibleChildren?: boolean;\n /** Is any of the parents visible (not only directly parent) */\n hasVisibleParent?: boolean;\n /** Combination of `visible || hasVisibleChildren` */\n sumVisibility?: boolean;\n /** translated names of enumerations (functions) where this object is the member (or the parent), divided by comma */\n funcs?: string;\n /** is if the enums are from parent */\n pef?: boolean;\n /** translated names of enumerations (rooms) where this object is the member (or the parent), divided by comma */\n rooms?: string;\n /** is if the enums are from parent */\n per?: boolean;\n // language in what the rooms and functions where translated\n lang?: ioBroker.Languages;\n state?: {\n valTextRx?: JSX.Element[] | null;\n style?: React.CSSProperties;\n };\n aclTooltip?: null | JSX.Element;\n}\n\ninterface InputSelectItem {\n value: string;\n name: string;\n icon?: null | JSX.Element;\n}\n\ntype ioBrokerObjectForExport = ioBroker.Object & Partial<ioBroker.State>;\n\ninterface ObjectBrowserCustomFilter {\n type?: ioBroker.ObjectType | ioBroker.ObjectType[];\n common?: {\n type?: ioBroker.CommonType | ioBroker.CommonType[];\n role?: string | string[];\n // If \"_\" - no custom set\n // If \"_dataSources\" - only data sources (history, sql, influxdb, ...)\n // Else \"telegram.\" or something like this\n // `true` - If common.custom not empty\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n custom?: '_' | '_dataSources' | true | string | string[];\n };\n}\n\ninterface FormatValueOptions {\n state: ioBroker.State;\n obj: ioBroker.StateObject;\n texts: Record<string, string>;\n dateFormat: string;\n isFloatComma: boolean;\n full?: boolean;\n}\n\nexport interface TreeItem {\n id?: string;\n data: TreeItemData;\n children?: TreeItem[];\n}\n\ninterface TreeInfo {\n funcEnums: string[];\n roomEnums: string[];\n roles: string[];\n ids: string[];\n types: string[];\n objects: Record<string, ioBroker.Object>;\n customs: string[];\n enums: string[];\n hasSomeCustoms: boolean;\n // List of all aliases that shows to this state\n aliasesMap: { [stateId: string]: string[] };\n}\n\ninterface GetValueStyleOptions {\n state: ioBroker.State;\n isExpertMode?: boolean;\n isButton?: boolean;\n}\n\nconst styles: Record<string, any> = {\n toolbar: {\n minHeight: 38, // Theme.toolbar.height,\n // boxShadow: '0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12)'\n },\n toolbarButtons: {\n padding: 4,\n marginLeft: 4,\n },\n switchColumnAuto: {\n marginLeft: 16,\n },\n dialogColumns: {\n transition: 'opacity 1s',\n },\n dialogColumnsLabel: {\n fontSize: 12,\n paddingTop: 8,\n },\n columnCustom: {\n width: '100%',\n display: 'inline-block',\n },\n columnCustomEditable: {\n cursor: 'text',\n },\n columnCustom_center: {\n textAlign: 'center',\n },\n columnCustom_left: {\n textAlign: 'left',\n },\n columnCustom_right: {\n textAlign: 'right',\n },\n width100: {\n width: '100%',\n },\n transparent_10: {\n opacity: 0.1,\n },\n transparent_20: {\n opacity: 0.2,\n },\n transparent_30: {\n opacity: 0.3,\n },\n transparent_40: {\n opacity: 0.4,\n },\n transparent_50: {\n opacity: 0.5,\n },\n transparent_60: {\n opacity: 0.6,\n },\n transparent_70: {\n opacity: 0.7,\n },\n transparent_80: {\n opacity: 0.8,\n },\n transparent_90: {\n opacity: 0.9,\n },\n transparent_100: {\n opacity: 1,\n },\n headerRow: {\n paddingLeft: 8,\n height: 38,\n whiteSpace: 'nowrap',\n userSelect: 'none',\n },\n buttonClearFilter: {\n position: 'relative',\n float: 'right',\n padding: 0,\n },\n buttonClearFilterIcon: {\n zIndex: 2,\n position: 'absolute',\n top: 0,\n left: 0,\n color: '#FF0000',\n opacity: 0.7,\n },\n\n tableDiv: {\n paddingTop: 0,\n paddingLeft: 0,\n width: 'calc(100% - 8px)',\n height: 'calc(100% - 38px)',\n overflow: 'auto',\n },\n tableRow: (theme: IobTheme) => ({\n pl: 1,\n height: ROW_HEIGHT,\n lineHeight: `${ROW_HEIGHT}px`,\n verticalAlign: 'top',\n userSelect: 'none',\n position: 'relative',\n width: '100%',\n '&:hover': {\n background: `${\n theme.palette.mode === 'dark' ? theme.palette.primary.dark : theme.palette.primary.light\n } !important`,\n color: Utils.invertColor(theme.palette.primary.main, true),\n },\n whiteSpace: 'nowrap',\n flexWrap: 'nowrap',\n }),\n tableRowLines: (theme: IobTheme) => ({\n borderBottom: `1px solid ${theme.palette.mode === 'dark' ? '#8888882e' : '#8888882e'}`,\n '& > div': {\n borderRight: `1px solid ${theme.palette.mode === 'dark' ? '#8888882e' : '#8888882e'}`,\n },\n }),\n tableRowNoDragging: {\n cursor: 'pointer',\n },\n tableRowAlias: {\n height: ROW_HEIGHT + 10,\n },\n tableRowAliasReadWrite: {\n height: ROW_HEIGHT + 22,\n },\n tableRowFocused: (theme: IobTheme) => ({\n '&:after': {\n content: '\"\"',\n position: 'absolute',\n top: 1,\n left: 1,\n right: 1,\n bottom: 1,\n border: theme.palette.mode ? '1px dotted #000' : '1px dotted #FFF',\n },\n }),\n checkBox: {\n padding: 0,\n },\n cellId: {\n position: 'relative',\n fontSize: '1rem',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n // verticalAlign: 'top',\n // position: 'relative',\n '& .copyButton': {\n display: 'none',\n },\n '&:hover .copyButton': {\n display: 'block',\n },\n '& .iconOwn': {\n display: 'block',\n width: ROW_HEIGHT - 4,\n height: ROW_HEIGHT - 4,\n mt: '2px',\n float: 'right',\n },\n '&:hover .iconOwn': {\n display: 'none',\n },\n '& *': {\n width: 'initial',\n },\n },\n cellIdSpan: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n // display: 'inline-block',\n // verticalAlign: 'top',\n },\n // This style is used for simple div. Do not migrate it to \"secondary.main\"\n cellIdIconFolder: (theme: IobTheme) => ({\n marginRight: 8,\n width: ROW_HEIGHT - 4,\n height: ROW_HEIGHT - 4,\n cursor: 'pointer',\n color: theme.palette.secondary.main || '#fbff7d',\n verticalAlign: 'top',\n }),\n cellIdIconDocument: {\n verticalAlign: 'middle',\n marginLeft: (ROW_HEIGHT - SMALL_BUTTON_SIZE) / 2,\n marginRight: 8,\n width: SMALL_BUTTON_SIZE,\n height: SMALL_BUTTON_SIZE,\n },\n cellIdIconOwn: {},\n cellIdTooltip: {\n fontSize: 14,\n },\n cellIdTooltipLink: {\n color: '#7ec2fd',\n '&:hover': {\n color: '#7ec2fd',\n },\n '&:visited': {\n color: '#7ec2fd',\n },\n },\n cellCopyButton: {\n width: SMALL_BUTTON_SIZE,\n height: SMALL_BUTTON_SIZE,\n top: (ROW_HEIGHT - SMALL_BUTTON_SIZE) / 2,\n opacity: 0.8,\n position: 'absolute',\n right: 3,\n },\n cellCopyButtonInDetails: {\n width: SMALL_BUTTON_SIZE,\n height: SMALL_BUTTON_SIZE,\n top: (ROW_HEIGHT - SMALL_BUTTON_SIZE) / 2,\n opacity: 0.8,\n },\n cellEditButton: {\n width: SMALL_BUTTON_SIZE,\n height: SMALL_BUTTON_SIZE,\n color: 'white',\n position: 'absolute',\n top: (ROW_HEIGHT - SMALL_BUTTON_SIZE) / 2,\n right: SMALL_BUTTON_SIZE + 3,\n opacity: 0.7,\n '&:hover': {\n opacity: 1,\n },\n },\n cellName: {\n display: 'inline-block',\n verticalAlign: 'top',\n fontSize: 14,\n ml: '5px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n position: 'relative',\n '& .copyButton': {\n display: 'none',\n },\n '&:hover .copyButton': {\n display: 'block',\n },\n },\n cellNameWithDesc: {\n lineHeight: 'normal',\n },\n cellNameDivDiv: {},\n cellDescription: {\n fontSize: 10,\n opacity: 0.5,\n fontStyle: 'italic',\n },\n cellIdAlias: (theme: IobTheme) => ({\n fontStyle: 'italic',\n fontSize: 12,\n opacity: 0.7,\n '&:hover': {\n color: theme.palette.mode === 'dark' ? '#009900' : '#007700',\n },\n }),\n cellIdAliasReadWriteDiv: {\n height: 24,\n marginTop: -5,\n },\n cellIdAliasAlone: {\n lineHeight: 0,\n },\n cellIdAliasReadWrite: {\n lineHeight: '12px',\n },\n cellType: {\n display: 'inline-block',\n verticalAlign: 'top',\n '& .itemIcon': {\n verticalAlign: 'middle',\n width: ICON_SIZE,\n height: ICON_SIZE,\n display: 'inline-block',\n },\n '& .itemIconFolder': {\n marginLeft: 3,\n },\n },\n cellRole: {\n display: 'inline-block',\n verticalAlign: 'top',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n cellRoom: {\n display: 'inline-block',\n verticalAlign: 'top',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n cellEnumParent: {\n opacity: 0.4,\n },\n cellFunc: {\n display: 'inline-block',\n verticalAlign: 'top',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n cellValue: {\n display: 'inline-block',\n verticalAlign: 'top',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n cellValueButton: {\n marginTop: 5,\n },\n cellValueButtonFalse: {\n opacity: 0.3,\n },\n cellAdapter: {\n display: 'inline-block',\n verticalAlign: 'top',\n },\n cellValueTooltip: {\n fontSize: 12,\n },\n cellValueText: {\n width: '100%',\n height: ROW_HEIGHT,\n fontSize: 16,\n display: 'flex',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n position: 'relative',\n verticalAlign: 'top',\n '& .copyButton': {\n display: 'none',\n },\n '&:hover .copyButton': {\n display: 'block',\n },\n },\n cellValueFile: {\n color: '#2837b9',\n },\n cellValueTooltipTitle: {\n fontStyle: 'italic',\n width: 100,\n display: 'inline-block',\n },\n cellValueTooltipValue: {\n width: 120,\n display: 'inline-block',\n // overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n },\n cellValueTooltipImage: {\n width: 100,\n height: 'auto',\n },\n cellValueTooltipBoth: {\n width: 220,\n display: 'inline-block',\n whiteSpace: 'nowrap',\n },\n cellValueTooltipBox: {\n width: 250,\n overflow: 'hidden',\n pointerEvents: 'none',\n },\n tooltip: {\n pointerEvents: 'none',\n },\n cellValueTextUnit: {\n marginLeft: 4,\n opacity: 0.8,\n display: 'inline-block',\n },\n cellValueTextState: {\n opacity: 0.7,\n },\n cellValueTooltipCopy: {\n position: 'absolute',\n bottom: 3,\n right: 3,\n },\n cellValueTooltipEdit: {\n position: 'absolute',\n bottom: 3,\n right: 15,\n },\n cellButtons: {\n display: 'inline-block',\n verticalAlign: 'top',\n },\n cellButtonsButton: {\n display: 'inline-block',\n opacity: 0.5,\n width: SMALL_BUTTON_SIZE + 4,\n height: SMALL_BUTTON_SIZE + 4,\n '&:hover': {\n opacity: 1,\n },\n p: 0,\n mt: '-2px',\n },\n cellButtonsEmptyButton: {\n fontSize: 12,\n },\n cellButtonMinWidth: {\n minWidth: 40,\n },\n cellButtonsButtonAlone: {\n ml: `${SMALL_BUTTON_SIZE + 6}px`,\n pt: 0,\n mt: '-2px',\n },\n cellButtonsButtonWithCustoms: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? theme.palette.primary.main : theme.palette.secondary.main,\n }),\n cellButtonsButtonWithoutCustoms: {\n opacity: 0.2,\n },\n cellButtonsValueButton: (theme: IobTheme) => ({\n position: 'absolute',\n top: SMALL_BUTTON_SIZE / 2 - 2,\n opacity: 0.7,\n width: SMALL_BUTTON_SIZE - 2,\n height: SMALL_BUTTON_SIZE - 2,\n color: theme.palette.action.active,\n '&:hover': {\n opacity: 1,\n },\n }),\n cellButtonsValueButtonCopy: {\n right: 8,\n cursor: 'pointer',\n },\n cellButtonsValueButtonEdit: {\n right: SMALL_BUTTON_SIZE / 2 + 16,\n },\n cellDetailsLine: {\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n height: 32,\n fontSize: 16,\n },\n cellDetailsName: {\n fontWeight: 'bold',\n marginRight: 8,\n minWidth: 80,\n },\n\n filteredOut: {\n opacity: 0.5,\n },\n filteredParentOut: {\n opacity: 0.3,\n },\n filterInput: {\n mt: 0,\n mb: 0,\n },\n selectIcon: {\n width: 24,\n height: 24,\n marginRight: 4,\n },\n selectNone: {\n opacity: 0.5,\n },\n itemSelected: (theme: IobTheme) => ({\n background: `${theme.palette.primary.main} !important`,\n color: `${Utils.invertColor(theme.palette.primary.main, true)} !important`,\n }),\n header: {\n width: '100%',\n },\n headerCell: {\n display: 'inline-block',\n verticalAlign: 'top',\n },\n headerCellValue: {\n paddingTop: 4,\n // paddingLeft: 5,\n fontSize: 16,\n },\n headerCellInput: {\n width: 'calc(100% - 5px)',\n height: ROW_HEIGHT,\n pt: 0,\n '& .itemIcon': {\n verticalAlign: 'middle',\n width: ICON_SIZE,\n height: ICON_SIZE,\n display: 'inline-block',\n },\n },\n headerCellSelectItem: {\n '& .itemIcon': {\n width: ICON_SIZE,\n height: ICON_SIZE,\n mr: '5px',\n display: 'inline-block',\n },\n },\n visibleButtons: {\n color: '#2196f3',\n opacity: 0.7,\n },\n grow: {\n flexGrow: 1,\n },\n enumIconDiv: {\n marginRight: 8,\n width: 32,\n height: 32,\n borderRadius: 8,\n background: '#FFFFFF',\n },\n enumIcon: {\n marginTop: 4,\n marginLeft: 4,\n width: 24,\n height: 24,\n },\n enumDialog: {\n overflow: 'hidden',\n },\n enumList: {\n minWidth: 250,\n height: 'calc(100% - 50px)',\n overflow: 'auto',\n },\n enumButton: {\n float: 'right',\n },\n enumCheckbox: {\n minWidth: 0,\n },\n buttonDiv: {\n display: 'flex',\n height: '100%',\n alignItems: 'center',\n },\n aclText: {\n fontSize: 13,\n marginTop: 6,\n },\n rightsObject: {\n color: '#55ff55',\n paddingLeft: 3,\n },\n rightsState: {\n color: '#86b6ff',\n paddingLeft: 3,\n },\n textCenter: {\n padding: 12,\n textAlign: 'center',\n },\n tooltipAccessControl: {\n display: 'flex',\n flexDirection: 'column',\n },\n fontSizeTitle: {\n '@media screen and (max-width: 465px)': {\n '& *': {\n fontSize: 12,\n },\n },\n },\n draggable: {\n cursor: 'copy',\n },\n nonDraggable: {\n cursor: 'no-drop',\n },\n selectClearButton: {\n position: 'absolute',\n top: 0,\n right: 0,\n borderRadius: 5,\n backgroundColor: 'background.default',\n },\n iconDeviceConnected: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? COLOR_NAME_CONNECTED_DARK : COLOR_NAME_CONNECTED_LIGHT,\n opacity: 0.8,\n position: 'absolute',\n top: 4,\n right: 32,\n width: 20,\n }),\n iconDeviceDisconnected: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? COLOR_NAME_DISCONNECTED_DARK : COLOR_NAME_DISCONNECTED_LIGHT,\n opacity: 0.8,\n position: 'absolute',\n top: 4,\n right: 32,\n width: 20,\n }),\n iconDeviceError: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? COLOR_NAME_ERROR_DARK : COLOR_NAME_ERROR_LIGHT,\n opacity: 0.8,\n position: 'absolute',\n top: 4,\n right: 50,\n width: 20,\n }),\n resizeHandle: {\n display: 'block',\n position: 'absolute',\n cursor: 'col-resize',\n width: 7,\n top: 2,\n bottom: 2,\n zIndex: 1,\n },\n resizeHandleRight: {\n right: 3,\n borderRight: '2px dotted #888',\n '&:hover': {\n borderColor: '#ccc',\n borderRightStyle: 'solid',\n },\n '&.active': {\n borderColor: '#517ea5',\n borderRightStyle: 'solid',\n },\n },\n invertedBackground: (theme: IobTheme) => ({\n backgroundColor: theme.palette.mode === 'dark' ? '#9a9a9a' : '#565656',\n padding: '0 3px',\n borderRadius: '2px 0 0 2px',\n }),\n invertedBackgroundFlex: (theme: IobTheme) => ({\n backgroundColor: theme.palette.mode === 'dark' ? '#9a9a9a' : '#565656',\n borderRadius: '0 2px 2px 0',\n }),\n contextMenuEdit: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#ffee48' : '#cbb801',\n }),\n contextMenuEditValue: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#5dff45' : '#1cd301',\n }),\n contextMenuView: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#FFF' : '#000',\n }),\n contextMenuCustom: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#42eaff' : '#01bbc2',\n }),\n contextMenuACL: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#e079ff' : '#500070',\n }),\n contextMenuRoom: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#ff9a33' : '#642a00',\n }),\n contextMenuRole: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#ffdb43' : '#562d00',\n }),\n contextMenuDelete: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#ff4f4f' : '#cf0000',\n }),\n contextMenuKeys: {\n marginLeft: 8,\n opacity: 0.7,\n fontSize: 'smaller',\n },\n contextMenuWithSubMenu: {\n display: 'flex',\n },\n};\n\nfunction ButtonIcon(props?: { style?: React.CSSProperties }): JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 436 436\"\n style={props?.style}\n width=\"24\"\n height=\"24\"\n className=\"admin-button\"\n >\n <g fill=\"currentColor\">\n <path d=\"m195.23077,24.30769c-36,3 -67,12 -96,26c-49,24 -82,61 -93,104l-3,11l-1,50c0,46 0,49 2,59l5,20c21,58 84,103 165,116c16,3 53,4 70,2c60,-6 111,-28 147,-64c21,-21 36,-49 40,-74a866,866 0 0 0 1,-104c-3,-18 -6,-28 -13,-43c-26,-52 -87,-90 -162,-101c-16,-2 -48,-3 -63,-2l1,0zm60,23c36,5 70,18 95,35c31,20 51,47 59,77c2,7 2,11 2,25c1,15 0,18 -2,26c-19,69 -104,117 -200,114c-47,-2 -90,-15 -124,-38c-31,-20 -51,-47 -59,-77c-3,-11 -4,-32 -2,-43c8,-42 41,-78 91,-101a260,260 0 0 1 140,-19l0,1zm-221,222c21,26 57,49 95,62c81,27 174,14 239,-32c14,-10 31,-27 41,-41c2,-2 2,-2 2,7c-1,23 -16,50 -38,72c-78,74 -233,74 -311,-1a121,121 0 0 1 -39,-76l0,-6l3,4l8,11z\" />\n <path d=\"m201.23077,47.30769c-40,3 -79,19 -104,44c-55,55 -38,133 37,171c52,26 122,24 172,-5c30,-17 51,-42 58,-71c3,-11 3,-34 0,-45c-6,-23 -21,-44 -40,-60l-27,-16a184,184 0 0 0 -96,-18zm30,21c56,5 100,35 112,75c4,11 4,30 0,41c-8,25 -26,45 -54,59a166,166 0 0 1 -160,-8a98,98 0 0 1 -41,-53c-5,-18 -2,-39 8,-57c23,-39 79,-62 135,-57z\" />\n </g>\n </svg>\n );\n}\n\n/**\n * Function that walks through all keys of an object or array and applies a function to each key.\n */\nfunction walkThroughArray(object: any[], iteratee: (result: any[], value: any, key: number) => void): any[] {\n const copiedObject: any[] = [];\n for (let index = 0; index < object.length; index++) {\n iteratee(copiedObject, object[index], index);\n }\n return copiedObject;\n}\n\n/**\n * Function that walks through all keys of an object or array and applies a function to each key.\n */\nfunction walkThroughObject(\n object: Record<string, any>,\n iteratee: (result: Record<string, any>, value: any, key: string) => void,\n): Record<string, any> {\n const copiedObject: Record<string, any> = {};\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n iteratee(copiedObject, object[key], key);\n }\n }\n return copiedObject;\n}\n\n/**\n * Function to reduce an object primarily by a given list of keys\n */\nfunction filterObject(\n /** The objects which should be filtered */\n obj: Record<string, any> | any[],\n /** The keys which should be excluded */\n filterKeys: string[],\n /** Whether translations should be reduced to only the english value */\n excludeTranslations?: boolean,\n): Record<string, any> | any[] {\n if (Array.isArray(obj)) {\n return walkThroughArray(obj, (result: any[], value: any, key: number) => {\n if (value === undefined || value === null) {\n return;\n }\n // if the key is an object, run it through the inner function - omitFromObject\n const isObject = typeof value === 'object';\n if (excludeTranslations && isObject) {\n if (typeof value.en === 'string' && typeof value.de === 'string') {\n result[key] = value.en;\n return;\n }\n }\n result[key] = isObject ? filterObject(value, filterKeys, excludeTranslations) : value;\n });\n }\n\n return walkThroughObject(obj, (result: Record<string, any>, value: any, key: string) => {\n if (value === undefined || value === null) {\n return;\n }\n if (filterKeys.includes(key)) {\n return;\n }\n // if the key is an object, run it through the inner function - omitFromObject\n const isObject = typeof value === 'object';\n if (excludeTranslations && isObject) {\n if (typeof value.en === 'string' && typeof value.de === 'string') {\n result[key] = value.en;\n return;\n }\n }\n result[key] = isObject ? filterObject(value, filterKeys, excludeTranslations) : value;\n });\n}\n\n/**\n * Function to generate a json-file for an object and trigger download it\n */\nfunction generateFile(\n /** The desired filename */\n fileName: string,\n /** The objects which should be downloaded */\n obj: Record<string, ioBroker.Object>,\n /** Options to filter/reduce the output */\n options: {\n /** Whether the output should be beautified */\n beautify?: boolean;\n /** Whether \"system.repositories\" should be excluded */\n excludeSystemRepositories?: boolean;\n /** Whether translations should be reduced to only the english value */\n excludeTranslations?: boolean;\n },\n): void {\n const el = document.createElement('a');\n const filterKeys = [];\n if (options.excludeSystemRepositories) {\n filterKeys.push('system.repositories');\n }\n const filteredObject =\n filterKeys.length > 0 || options.excludeTranslations\n ? filterObject(obj, filterKeys, options.excludeTranslations)\n : obj;\n const data = options.beautify ? JSON.stringify(filteredObject, null, 2) : JSON.stringify(filteredObject);\n el.setAttribute('href', `data:application/json;charset=utf-8,${encodeURIComponent(data)}`);\n el.setAttribute('download', fileName);\n\n el.style.display = 'none';\n document.body.appendChild(el);\n\n el.click();\n\n document.body.removeChild(el);\n}\n\n// d=data, t=target, s=start, e=end, m=middle\nfunction binarySearch(list: string[], find: string, _start?: number, _end?: number): boolean {\n _start = _start || 0;\n if (_end === undefined) {\n _end = list.length - 1;\n if (!_end) {\n return list[0] === find;\n }\n }\n const middle = Math.floor((_start + _end) / 2);\n if (find === list[middle]) {\n return true;\n }\n if (_end - 1 === _start) {\n return list[_start] === find || list[_end] === find;\n }\n if (find > list[middle]) {\n return binarySearch(list, find, middle, _end);\n }\n if (find < list[middle]) {\n return binarySearch(list, find, _start, middle);\n }\n return false;\n}\n\nfunction getName(name: ioBroker.StringOrTranslated, lang: ioBroker.Languages): string {\n if (typeof name === 'object') {\n if (!name) {\n return '';\n }\n return (name[lang] || name.en || '').toString();\n }\n\n return name ? name.toString() : '';\n}\n\nexport function getSelectIdIconFromObjects(\n objects: Record<string, ioBroker.Object>,\n id: string,\n lang: ioBroker.Languages,\n imagePrefix?: string,\n): string | JSX.Element | null {\n // `admin` has prefix '.' and `web` has '../..'\n imagePrefix = imagePrefix || '.'; // http://localhost:8081';\n let src: string | JSX.Element = '';\n const _id_ = `system.adapter.${id}`;\n const aIcon = id && objects[_id_] && objects[_id_].common && objects[_id_].common.icon;\n if (aIcon) {\n // if not BASE64\n if (!aIcon.startsWith('data:image/')) {\n if (aIcon.includes('.')) {\n const name = objects[_id_].common.name;\n if (typeof name === 'object') {\n src = `${imagePrefix}/adapter/${name[lang] || name.en}/${aIcon}`;\n } else {\n src = `${imagePrefix}/adapter/${name}/${aIcon}`;\n }\n } else if (aIcon && aIcon.length < 3) {\n return aIcon; // utf-8\n } else {\n return null; // '<i class=\"material-icons iob-list-icon\">' + objects[_id_].common.icon + '</i>';\n }\n } else if (aIcon.startsWith('data:image/svg')) {\n src = (\n <SVG\n className=\"iconOwn\"\n src={aIcon}\n width={28}\n height={28}\n />\n );\n } else {\n src = aIcon;\n }\n } else {\n const common = objects[id] && objects[id].common;\n\n if (common) {\n const cIcon = common.icon;\n if (cIcon) {\n if (!cIcon.startsWith('data:image/')) {\n if (cIcon.includes('.')) {\n let instance;\n if (objects[id].type === 'instance' || objects[id].type === 'adapter') {\n if (typeof common.name === 'object') {\n src = `${imagePrefix}/adapter/${common.name[lang] || common.name.en}/${cIcon}`;\n } else {\n src = `${imagePrefix}/adapter/${common.name}/${cIcon}`;\n }\n } else if (id && id.startsWith('system.adapter.')) {\n instance = id.split('.', 3);\n if (cIcon[0] === '/') {\n instance[2] += cIcon;\n } else {\n instance[2] += `/${cIcon}`;\n }\n src = `${imagePrefix}/adapter/${instance[2]}`;\n } else {\n instance = id.split('.', 2);\n if (cIcon[0] === '/') {\n instance[0] += cIcon;\n } else {\n instance[0] += `/${cIcon}`;\n }\n src = `${imagePrefix}/adapter/${instance[0]}`;\n }\n } else if (aIcon && aIcon.length < 3) {\n return aIcon; // utf-8\n } else {\n return null;\n }\n } else if (cIcon.startsWith('data:image/svg')) {\n // if base 64 image\n src = (\n <SVG\n className=\"iconOwn\"\n src={cIcon}\n width={28}\n height={28}\n />\n );\n } else {\n src = cIcon;\n }\n }\n }\n }\n\n return src || null;\n}\n\nfunction applyFilter(\n item: TreeItem,\n filters: {\n id?: string;\n name?: string;\n type?: string;\n custom?: string;\n role?: string;\n room?: string;\n func?: string;\n expertMode?: boolean;\n },\n lang: ioBroker.Languages,\n objects: Record<string, ioBroker.Object>,\n context?: {\n id?: string;\n name?: string;\n type?: string;\n custom?: string;\n role?: string;\n room?: string[];\n func?: string[];\n },\n counter?: { count: number },\n customFilter?: ObjectBrowserCustomFilter,\n selectedTypes?: string[],\n _depth?: number,\n): boolean {\n _depth = _depth || 0;\n let filteredOut = false;\n if (!context) {\n context = {};\n if (filters.id) {\n context.id = filters.id.toLowerCase();\n }\n if (filters.name) {\n context.name = filters.name.toLowerCase();\n }\n if (filters.type) {\n context.type = filters.type.toLowerCase();\n }\n if (filters.custom) {\n context.custom = filters.custom.toLowerCase();\n }\n if (filters.role) {\n context.role = filters.role.toLowerCase();\n }\n if (filters.room) {\n context.room = (objects[filters.room] as ioBroker.EnumObject)?.common?.members || [];\n }\n if (filters.func) {\n context.func = (objects[filters.func] as ioBroker.EnumObject)?.common?.members || [];\n }\n }\n\n const data = item.data;\n\n if (data && data.id) {\n const common: ioBroker.StateCommon = data.obj?.common as ioBroker.StateCommon;\n\n if (customFilter) {\n if (customFilter.type) {\n if (typeof customFilter.type === 'string') {\n if (!data.obj || customFilter.type !== data.obj.type) {\n filteredOut = true;\n }\n } else if (Array.isArray(customFilter.type)) {\n if (!data.obj || !customFilter.type.includes(data.obj.type)) {\n filteredOut = true;\n }\n }\n }\n if (!filteredOut && customFilter.common?.type) {\n if (!common?.type) {\n filteredOut = true;\n } else if (typeof customFilter.common.type === 'string') {\n if (customFilter.common.type !== common.type) {\n filteredOut = true;\n }\n } else if (Array.isArray(customFilter.common.type)) {\n if (!customFilter.common.type.includes(common.type)) {\n filteredOut = true;\n }\n }\n }\n if (!filteredOut && customFilter.common?.role) {\n if (!common?.role) {\n filteredOut = true;\n } else if (typeof customFilter.common.role === 'string') {\n if (common.role.startsWith(customFilter.common.role)) {\n filteredOut = true;\n }\n } else if (Array.isArray(customFilter.common.role)) {\n if (!customFilter.common.role.find(role => common.role.startsWith(role))) {\n filteredOut = true;\n }\n }\n }\n\n if (!filteredOut && customFilter.common?.custom === '_' && common?.custom) {\n filteredOut = true;\n } else if (!filteredOut && customFilter.common?.custom && customFilter.common?.custom !== '_') {\n const filterOfCustom = customFilter.common.custom as string | string[] | boolean;\n if (!common?.custom) {\n filteredOut = true;\n } else if (filterOfCustom === '_dataSources') {\n // TODO: make it configurable\n if (\n !Object.keys(common.custom).find(\n id => id.startsWith('history.') || id.startsWith('sql.') || id.startsWith('influxdb.'),\n )\n ) {\n filteredOut = true;\n }\n } else if (Array.isArray(filterOfCustom)) {\n // here are ['influxdb.', 'telegram.']\n const customs = Object.keys(common.custom); // here are ['influxdb.0', 'telegram.2']\n if (filterOfCustom.find(cst => customs.find(id => id.startsWith(cst)))) {\n filteredOut = true;\n }\n } else if (\n filterOfCustom !== true &&\n !Object.keys(common.custom).find(id => id.startsWith(filterOfCustom as string))\n ) {\n filteredOut = true;\n }\n }\n }\n\n if (!filteredOut && !filters.expertMode) {\n filteredOut =\n data.id === 'system' ||\n data.id === 'enum' ||\n // (data.obj && data.obj.type === 'meta') ||\n data.id.startsWith('system.') ||\n data.id.startsWith('enum.') ||\n data.id.startsWith('_design/') ||\n data.id.endsWith('.admin') ||\n !!common?.expert;\n }\n if (!filteredOut && context.id) {\n if (data.fID === undefined) {\n data.fID = data.id.toLowerCase();\n }\n filteredOut = !data.fID.includes(context.id);\n }\n if (!filteredOut && context.name) {\n if (common) {\n if (data.fName === undefined) {\n data.fName = (common && getName(common.name, lang)) || '';\n data.fName = data.fName.toLowerCase();\n }\n filteredOut = !data.fName.includes(context.name);\n } else {\n filteredOut = true;\n }\n }\n if (!filteredOut && filters.role && common) {\n if (common) {\n filteredOut = !(common.role && common.role.startsWith(context.role));\n } else {\n filteredOut = true;\n }\n }\n if (!filteredOut && context.room) {\n filteredOut = !context.room.find(id => id === data.id || data.id.startsWith(`${id}.`));\n }\n if (!filteredOut && context.func) {\n filteredOut = !context.func.find(id => id === data.id || data.id.startsWith(`${id}.`));\n }\n if (!filteredOut && context.type) {\n filteredOut = !(data.obj && data.obj.type && data.obj.type === context.type);\n }\n if (!filteredOut && selectedTypes) {\n filteredOut = !(data.obj && data.obj.type && selectedTypes.includes(data.obj.type));\n }\n if (!filteredOut && context.custom) {\n if (common) {\n if (context.custom === '_') {\n filteredOut = !!common.custom;\n } else {\n filteredOut = !common.custom || !common.custom[context.custom];\n }\n } else {\n filteredOut = true;\n }\n }\n }\n\n data.visible = !filteredOut;\n\n data.hasVisibleChildren = false;\n if (item.children && _depth < 20) {\n item.children.forEach(_item => {\n const visible = applyFilter(\n _item,\n filters,\n lang,\n objects,\n context,\n counter,\n customFilter,\n selectedTypes,\n _depth + 1,\n );\n if (visible) {\n data.hasVisibleChildren = true;\n }\n });\n }\n\n // const visible = data.visible || data.hasVisibleChildren;\n data.sumVisibility = data.visible || data.hasVisibleChildren; // || data.hasVisibleParent;\n if (counter && data.sumVisibility) {\n counter.count++;\n }\n\n // show all children of visible object with opacity 0.5\n if (data.id && data.sumVisibility && item.children) {\n item.children.forEach(_item => (_item.data.hasVisibleParent = true));\n }\n\n return data.visible || data.hasVisibleChildren;\n}\n\nfunction getVisibleItems(\n item: TreeItem,\n type: ioBroker.ObjectType,\n objects: Record<string, ioBroker.Object>,\n _result?: string[],\n): string[] {\n _result = _result || [];\n const data = item.data;\n if (data.sumVisibility) {\n if (data.id && objects[data.id] && (!type || objects[data.id].type === type)) {\n _result.push(data.id);\n }\n item.children?.forEach(_item => getVisibleItems(_item, type, objects, _result));\n }\n\n return _result;\n}\n\nfunction getSystemIcon(\n objects: Record<string, ioBroker.Object>,\n id: string,\n level: number,\n themeType: ThemeType,\n lang: ioBroker.Languages,\n imagePrefix?: string,\n): string | JSX.Element | null {\n let icon;\n\n // system or design has special icons\n if (id === 'alias' || id === 'alias.0') {\n icon = (\n <IconLink\n className=\"iconOwn\"\n style={{ color: COLOR_NAME_ALIAS(themeType) }}\n />\n );\n } else if (id === '0_userdata' || id === '0_userdata.0') {\n icon = (\n <IconData\n className=\"iconOwn\"\n style={{ color: COLOR_NAME_USERDATA(themeType) }}\n />\n );\n } else if (id.startsWith('_design/') || id === 'system') {\n icon = (\n <IconSystem\n className=\"iconOwn\"\n style={{ color: COLOR_NAME_SYSTEM(themeType) }}\n />\n );\n } else if (id === 'system.adapter') {\n icon = (\n <IconSystem\n className=\"iconOwn\"\n style={{ color: COLOR_NAME_SYSTEM_ADAPTER(themeType) }}\n />\n );\n } else if (id === 'system.group') {\n icon = <IconGroup className=\"iconOwn\" />;\n } else if (id === 'system.user') {\n icon = <IconUser className=\"iconOwn\" />;\n } else if (id === 'system.host') {\n icon = <IconHost className=\"iconOwn\" />;\n } else if (id.endsWith('.connection') || id.endsWith('.connected')) {\n icon = <IconConnection className=\"iconOwn\" />;\n } else if (id.endsWith('.info')) {\n icon = <IconInfo className=\"iconOwn\" />;\n } else if (objects[id] && objects[id].type === 'meta') {\n icon = <IconMeta className=\"iconOwn\" />;\n } else if (level < 2) {\n // detect \"cloud.0\"\n if (objects[`system.adapter.${id}`]) {\n icon = getSelectIdIconFromObjects(objects, `system.adapter.${id}`, lang, imagePrefix);\n }\n }\n\n return icon || null;\n}\n\nfunction getObjectTooltip(data: TreeItemData, lang: ioBroker.Languages): string | null {\n if (data?.obj?.common?.desc) {\n return getName(data.obj.common.desc, lang) || null;\n }\n\n return null;\n}\n\nfunction getIdFieldTooltip(data: TreeItemData, lang: ioBroker.Languages): JSX.Element {\n const tooltip = getObjectTooltip(data, lang);\n if (tooltip?.startsWith('http')) {\n return (\n <Box\n component=\"a\"\n sx={styles.cellIdTooltipLink}\n href={tooltip}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {tooltip}\n </Box>\n );\n }\n return <span style={styles.cellIdTooltip}>{tooltip || data.id || ''}</span>;\n}\n\nfunction buildTree(\n objects: Record<string, ioBroker.Object>,\n options: {\n imagePrefix?: string;\n root?: string;\n lang: ioBroker.Languages;\n themeType: ThemeType;\n },\n): { root: TreeItem; info: TreeInfo } {\n const imagePrefix = options.imagePrefix || '.';\n\n let ids = Object.keys(objects);\n\n ids.sort((a, b) => {\n if (a === b) {\n return 0;\n }\n a = a.replace(/\\./g, '!!!');\n b = b.replace(/\\./g, '!!!');\n if (a > b) {\n return 1;\n }\n return -1;\n });\n\n if (options.root) {\n ids = ids.filter(id => id === options.root || id.startsWith(`${options.root}.`));\n }\n\n // find empty nodes and create names for it\n let currentPathArr: string[] = [];\n let currentPath = '';\n let currentPathLen = 0;\n const root: TreeItem = {\n data: {\n name: '',\n id: '',\n },\n children: [],\n };\n\n const info: TreeInfo = {\n funcEnums: [],\n roomEnums: [],\n roles: [],\n ids: [],\n types: [],\n objects,\n customs: ['_'],\n enums: [],\n hasSomeCustoms: false,\n aliasesMap: {},\n };\n\n let cRoot: TreeItem = root;\n\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n if (!id) {\n continue;\n }\n const obj = objects[id];\n const parts = id.split('.');\n\n if (obj.type && !info.types.includes(obj.type)) {\n info.types.push(obj.type);\n }\n\n if (obj) {\n const common = obj.common;\n const role = common && common.role;\n if (role && !info.roles.includes(role)) {\n info.roles.push(role);\n } else if (id.startsWith('enum.rooms.')) {\n info.roomEnums.push(id);\n info.enums.push(id);\n } else if (id.startsWith('enum.functions.')) {\n info.funcEnums.push(id);\n info.enums.push(id);\n } else if (obj.type === 'enum') {\n info.enums.push(id);\n } else if (obj.type === 'instance' && common && (common.supportCustoms || common.adminUI?.custom)) {\n info.hasSomeCustoms = true;\n info.customs.push(id.substring('system.adapter.'.length));\n }\n\n // Build a map of aliases\n if (id.startsWith('alias.') && obj.common.alias?.id) {\n if (typeof obj.common.alias.id === 'string') {\n const usedId = obj.common.alias.id;\n if (!info.aliasesMap[usedId]) {\n info.aliasesMap[usedId] = [id];\n } else if (!info.aliasesMap[usedId].includes(id)) {\n info.aliasesMap[usedId].push(id);\n }\n } else {\n const readId = obj.common.alias.id.read;\n if (readId) {\n if (!info.aliasesMap[readId]) {\n info.aliasesMap[readId] = [id];\n } else if (!info.aliasesMap[readId].includes(id)) {\n info.aliasesMap[readId].push(id);\n }\n }\n const writeId = obj.common.alias.id.write;\n if (writeId) {\n if (!info.aliasesMap[writeId]) {\n info.aliasesMap[writeId] = [id];\n } else if (!info.aliasesMap[writeId].includes(id)) {\n info.aliasesMap[writeId].push(id);\n }\n }\n }\n }\n }\n\n info.ids.push(id);\n\n let repeat;\n\n // if next level\n do {\n repeat = false;\n\n // If the current level is still OK, and we can add ID to children\n if (!currentPath || id.startsWith(`${currentPath}.`)) {\n // if more than one level added\n if (parts.length - currentPathLen > 1) {\n let curPath = currentPath;\n // generate missing levels\n for (let k = currentPathLen; k < parts.length - 1; k++) {\n curPath += (curPath ? '.' : '') + parts[k];\n // level does not exist\n if (!binarySearch(info.ids, curPath)) {\n const _cRoot: TreeItem = {\n data: {\n name: parts[k],\n parent: cRoot,\n id: curPath,\n obj: objects[curPath],\n level: k,\n icon: getSystemIcon(\n objects,\n curPath,\n k,\n options.themeType,\n options.lang,\n imagePrefix,\n ),\n generated: true,\n },\n };\n\n cRoot.children = cRoot.children || [];\n cRoot.children.push(_cRoot);\n cRoot = _cRoot;\n info.ids.push(curPath); // IDs will be added by alphabet\n } else if (cRoot.children) {\n cRoot = cRoot.children.find(item => item.data.name === parts[k]);\n }\n }\n }\n\n const _cRoot: TreeItem = {\n data: {\n name: parts[parts.length - 1],\n title: getName(obj?.common?.name, options.lang),\n obj,\n parent: cRoot,\n icon:\n getSelectIdIconFromObjects(objects, id, options.lang, imagePrefix) ||\n getSystemIcon(objects, id, 0, options.themeType, options.lang, imagePrefix),\n id,\n hasCustoms: !!(obj.common?.custom && Object.keys(obj.common.custom).length),\n level: parts.length - 1,\n generated: false,\n button:\n obj.type === 'state' &&\n !!obj.common?.role &&\n typeof obj.common.role === 'string' &&\n obj.common.role.startsWith('button') &&\n obj.common?.write !== false,\n switch:\n obj.type === 'state' &&\n obj.common?.type === 'boolean' &&\n obj.common?.write !== false &&\n obj.common?.read !== false,\n },\n };\n\n cRoot.children = cRoot.children || [];\n cRoot.children.push(_cRoot);\n cRoot = _cRoot;\n\n currentPathLen = parts.length;\n currentPathArr = parts;\n currentPath = id;\n } else {\n let u = 0;\n\n while (currentPathArr[u] === parts[u]) {\n u++;\n }\n\n if (u > 0) {\n let move = currentPathArr.length;\n currentPathArr = currentPathArr.splice(0, u);\n currentPathLen = u;\n currentPath = currentPathArr.join('.');\n while (move > u) {\n if (cRoot.data.parent) {\n cRoot = cRoot.data.parent;\n } else {\n console.error(`Parent is null for ${id} ${currentPath} ${currentPathArr.join('.')}`);\n }\n move--;\n }\n } else {\n cRoot = root;\n currentPathArr = [];\n currentPath = '';\n currentPathLen = 0;\n }\n repeat = true;\n }\n } while (repeat);\n }\n\n info.roomEnums.sort((a, b) => {\n const aName: string = getName(objects[a]?.common?.name, options.lang) || a.split('.').pop();\n const bName: string = getName(objects[b]?.common?.name, options.lang) || b.split('.').pop();\n if (aName > bName) {\n return 1;\n }\n if (aName < bName) {\n return -1;\n }\n return 0;\n });\n info.funcEnums.sort((a, b) => {\n const aName: string = getName(objects[a]?.common?.name, options.lang) || a.split('.').pop();\n const bName: string = getName(objects[b]?.common?.name, options.lang) || b.split('.').pop();\n if (aName > bName) {\n return 1;\n }\n if (aName < bName) {\n return -1;\n }\n return 0;\n });\n info.roles.sort();\n info.types.sort();\n\n return { info, root };\n}\n\nfunction findNode(root: TreeItem, id: string, _parts?: string[], _path?: string, _level?: number): TreeItem | null {\n if (root.data.id === id) {\n return root;\n }\n if (!_parts) {\n _parts = id.split('.');\n _level = 0;\n _path = _parts[_level];\n }\n if (!root.children && root.data.id !== id) {\n return null;\n }\n let found;\n if (root.children) {\n for (let i = 0; i < root.children.length; i++) {\n const _id = root.children[i].data.id;\n if (_id === _path) {\n found = root.children[i];\n break;\n } else if (_id > _path) {\n break;\n }\n }\n }\n if (found) {\n _level = _level || 0;\n return findNode(found, id, _parts, `${_path}.${_parts[_level + 1]}`, _level + 1);\n }\n\n return null;\n}\n\nfunction findRoomsForObject(\n info: TreeInfo,\n id: string,\n lang: ioBroker.Languages,\n rooms?: string[],\n): { rooms: string[]; per: boolean } {\n if (!id) {\n return { rooms: [], per: false };\n }\n rooms = rooms || [];\n for (const room of info.roomEnums) {\n const common = info.objects[room]?.common;\n\n if (!common) {\n continue;\n }\n\n const name = getName(common.name, lang);\n\n if (common.members?.includes(id) && !rooms.includes(name)) {\n rooms.push(name);\n }\n }\n\n let ownEnums;\n\n // Check parent\n const parts = id.split('.');\n parts.pop();\n id = parts.join('.');\n if (info.objects[id]) {\n ownEnums = rooms.length;\n findRoomsForObject(info, id, lang, rooms);\n }\n\n return { rooms, per: !ownEnums }; // per is if the enums are from parent\n}\n\nfunction findEnumsForObjectAsIds(\n info: TreeInfo,\n id: string,\n enumName: 'roomEnums' | 'funcEnums',\n funcs?: string[],\n): string[] {\n if (!id) {\n return [];\n }\n funcs = funcs || [];\n for (let i = 0; i < info[enumName].length; i++) {\n const common = info.objects[info[enumName][i]]?.common;\n if (common?.members?.includes(id) && !funcs.includes(info[enumName][i])) {\n funcs.push(info[enumName][i]);\n }\n }\n funcs.sort();\n\n return funcs;\n}\n\nfunction findFunctionsForObject(\n info: TreeInfo,\n id: string,\n lang: ioBroker.Languages,\n funcs?: string[],\n): { funcs: string[]; pef: boolean } {\n if (!id) {\n return { funcs: [], pef: false };\n }\n funcs = funcs || [];\n for (let i = 0; i < info.funcEnums.length; i++) {\n const common = info.objects[info.funcEnums[i]]?.common;\n\n if (!common) {\n continue;\n }\n\n const name = getName(common.name, lang);\n if (common.members?.includes(id) && !funcs.includes(name)) {\n funcs.push(name);\n }\n }\n\n let ownEnums;\n\n // Check parent\n const parts = id.split('.');\n parts.pop();\n id = parts.join('.');\n if (info.objects[id]) {\n ownEnums = funcs.length;\n findFunctionsForObject(info, id, lang, funcs);\n }\n\n return { funcs, pef: !ownEnums };\n}\n\n/*\nfunction quality2text(q) {\n if (!q) {\n return 'ok';\n }\n const custom = q & 0xFFFF0000;\n let text = '';\n if (q & 0x40) text += 'device';\n if (q & 0x80) text += 'sensor';\n if (q & 0x01) text += ' bad';\n if (q & 0x02) text += ' not connected';\n if (q & 0x04) text += ' error';\n\n return text + (custom ? '|0x' + (custom >> 16).toString(16).toUpperCase() : '') + ' [0x' + q.toString(16).toUpperCase() + ']';\n}\n*/\n\n/**\n * Format a state value for visualization\n */\nfunction formatValue(options: FormatValueOptions): {\n valText: {\n /** value as string */\n v: string;\n /** value unit */\n u?: string;\n /** value not replaced by `common.states` */\n s?: string;\n };\n valFull:\n | {\n /** label */\n t: string;\n /** value */\n v: string;\n /** no break */\n nbr?: boolean;\n }[]\n | undefined;\n fileViewer: 'image' | 'text' | 'json' | 'html' | 'pdf' | 'audio' | 'video' | undefined;\n} {\n const { dateFormat, state, isFloatComma, texts, obj } = options;\n const states = Utils.getStates(obj);\n const isCommon = obj.common;\n let fileViewer: 'image' | 'text' | 'json' | 'html' | 'pdf' | 'audio' | 'video' | undefined;\n\n let v: any =\n // @ts-expect-error deprecated from js-controller 6\n isCommon?.type === 'file'\n ? '[file]'\n : !state || state.val === null\n ? '(null)'\n : state.val === undefined\n ? '[undef]'\n : state.val;\n\n const type = typeof v;\n\n if (isCommon?.role && typeof isCommon.role === 'string' && isCommon.role.match(/^value\\.time|^date/)) {\n if (v && typeof v === 'string') {\n if (Utils.isStringInteger(v)) {\n // we assume a unix ts\n v = new Date(parseInt(v, 10)).toString();\n } else {\n // check if parsable by new date\n try {\n const parsedDate = new Date(v);\n\n if (Utils.isValidDate(parsedDate)) {\n v = parsedDate.toString();\n }\n } catch {\n // ignore\n }\n }\n } else {\n if (v > 946681200 && v < 946681200000) {\n // '2000-01-01T00:00:00' => 946681200000\n v *= 1_000; // maybe the time is in seconds (UNIX time)\n }\n // \"null\" and undefined could not be here. See `let v = (isCommon && isCommon.type === 'file') ....` above\n v = v ? new Date(v).toString() : v;\n }\n } else {\n if (type === 'number') {\n if (!Number.isInteger(v)) {\n v = Math.round(v * 100_000_000) / 100_000_000; // remove 4.00000000000000001\n if (isFloatComma) {\n v = v.toString().replace('.', ',');\n }\n }\n } else if (type === 'object') {\n v = JSON.stringify(v);\n } else if (type !== 'string') {\n v = v.toString();\n } else if (v.startsWith('data:image/')) {\n fileViewer = 'image';\n }\n\n if (typeof v !== 'string') {\n v = v.toString();\n }\n }\n\n const valText: {\n /** value as string */\n v: string;\n /** value unit */\n u?: string;\n /** value not replaced by `common.states` */\n s?: string;\n } = { v: v as string };\n\n // try to replace number with \"common.states\"\n if (states && states[v] !== undefined) {\n if (v !== states[v]) {\n valText.s = v;\n v = states[v];\n valText.v = v;\n }\n }\n\n if (isCommon?.unit) {\n valText.u = isCommon.unit;\n }\n let valFull:\n | {\n /** label */\n t: string;\n /** value */\n v: string;\n nbr?: boolean;\n }[]\n | undefined;\n if (options.full) {\n valFull = [{ t: texts.value, v }];\n\n if (state) {\n if (state.ack !== undefined && state.ack !== null) {\n valFull.push({ t: texts.ack, v: state.ack.toString() });\n }\n if (state.ts) {\n valFull.push({ t: texts.ts, v: state.ts ? Utils.formatDate(new Date(state.ts), dateFormat) : '' });\n }\n if (state.lc) {\n valFull.push({ t: texts.lc, v: state.lc ? Utils.formatDate(new Date(state.lc), dateFormat) : '' });\n }\n if (state.from) {\n let from = state.from.toString();\n if (from.startsWith('system.adapter.')) {\n from = from.substring(15);\n }\n valFull.push({ t: texts.from, v: from });\n }\n if (state.user) {\n let user = state.user.toString();\n if (user.startsWith('system.user.')) {\n user = user.substring(12);\n }\n valFull.push({ t: texts.user, v: user });\n }\n if (state.c) {\n valFull.push({ t: texts.c, v: state.c });\n }\n valFull.push({ t: texts.quality, v: Utils.quality2text(state.q || 0).join(', '), nbr: true });\n }\n }\n\n return {\n valText,\n valFull,\n fileViewer,\n };\n}\n\n/**\n * Get CSS style for given state value\n */\nfunction getValueStyle(options: GetValueStyleOptions): { color: string } {\n const { state /* , isExpertMode, isButton */ } = options;\n const color = state?.ack ? (state.q ? '#ffa500' : '') : '#ff2222c9';\n\n // do not show the color of the button in non-expert mode\n // if (!isExpertMode && isButton) {\n // color = '';\n // }\n\n return { color };\n}\n\nfunction prepareSparkData(values: ioBroker.GetHistoryResult, from: number): number[] {\n // set one point every hour\n let time = from;\n let i = 1;\n const v = [];\n\n while (i < values.length && time < from + 25 * 3600000) {\n // find the interval\n while (values[i - 1].ts < time && time <= values[i].ts && i < values.length) {\n i++;\n }\n if (i === 1 && values[i - 1].ts >= time) {\n // assume the value was always null\n v.push(0);\n } else if (i < values.length) {\n if (typeof values[i].val === 'boolean' || typeof values[i - 1].val === 'boolean') {\n v.push(values[i].val ? 1 : 0);\n } else {\n // remove nulls\n values[i - 1].val = values[i - 1].val || 0;\n values[i].val = values[i].val || 0;\n // interpolate\n const nm1: number = values[i - 1].val as number;\n const n: number = values[i].val as number;\n const val = nm1 + ((n - nm1) * (time - values[i - 1].ts)) / (values[i].ts - values[i - 1].ts);\n\n v.push(val);\n }\n }\n\n time += 3600000;\n }\n\n return v;\n}\n\nexport const ITEM_IMAGES: Record<string, JSX.Element> = {\n state: (\n <IconState\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n channel: (\n <IconChannel\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n device: (\n <IconDevice\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n adapter: (\n <IconAdapter\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n meta: (\n <IconMeta\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n instance: (\n <IconInstance\n className=\"itemIcon\"\n style={{ color: '#7da7ff', verticalAlign: 'middle' }}\n />\n ),\n enum: (\n <IconEnum\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n chart: (\n <IconChart\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n config: (\n <IconConfig\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n group: (\n <IconGroup\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n user: (\n <IconUser\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n host: (\n <IconHost\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n schedule: (\n <IconSchedule\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n script: (\n <IconScript\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n folder: (\n <IconClosed\n className=\"itemIcon itemIconFolder\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n};\n\ninterface ScreenWidthOne {\n idWidth: string | number;\n widths: {\n room?: number;\n val?: number;\n name?: number;\n func?: number;\n buttons?: number;\n type?: number;\n role?: number;\n changedFrom?: number;\n qualityCode?: number;\n timestamp?: number;\n lastChange?: number;\n };\n fields: string[];\n}\n\ninterface ScreenWidth {\n xs: ScreenWidthOne;\n sm: ScreenWidthOne;\n md: ScreenWidthOne;\n lg: ScreenWidthOne;\n xl: ScreenWidthOne;\n}\n\nconst SCREEN_WIDTHS: ScreenWidth = {\n // extra-small: 0px\n xs: { idWidth: '100%', fields: [], widths: {} },\n // small: 600px\n sm: { idWidth: 300, fields: ['room', 'val'], widths: { room: 100, val: 200 } },\n // medium: 960px\n md: {\n idWidth: 300,\n fields: ['room', 'func', 'val', 'buttons'],\n widths: {\n name: 200,\n room: 150,\n func: 150,\n val: 120,\n buttons: 120,\n },\n },\n // large: 1280px\n lg: {\n idWidth: 300,\n fields: [\n 'name',\n 'type',\n 'role',\n 'room',\n 'func',\n 'val',\n 'buttons',\n 'changedFrom',\n 'qualityCode',\n 'timestamp',\n 'lastChange',\n ],\n widths: {\n name: 300,\n type: 80,\n role: 120,\n room: 180,\n func: 180,\n val: 140,\n buttons: 120,\n changedFrom: 120,\n qualityCode: 100,\n timestamp: 165,\n lastChange: 165,\n },\n },\n // /////////////\n // extra-large: 1920px\n xl: {\n idWidth: 550,\n fields: [\n 'name',\n 'type',\n 'role',\n 'room',\n 'func',\n 'val',\n 'buttons',\n 'changedFrom',\n 'qualityCode',\n 'timestamp',\n 'lastChange',\n ],\n widths: {\n name: 400,\n type: 80,\n role: 120,\n room: 180,\n func: 180,\n val: 140,\n buttons: 120,\n changedFrom: 120,\n qualityCode: 100,\n timestamp: 170,\n lastChange: 170,\n },\n },\n};\n\nlet objectsAlreadyLoaded = false;\n\nexport interface ObjectBrowserFilter {\n id?: string;\n name?: string;\n room?: string;\n func?: string;\n role?: string;\n type?: string;\n custom?: string;\n expertMode?: boolean;\n}\n\nconst DEFAULT_FILTER: ObjectBrowserFilter = {\n id: '',\n name: '',\n room: '',\n func: '',\n role: '',\n type: '',\n custom: '',\n expertMode: false,\n};\n\ninterface AdapterColumn {\n adapter: string;\n id: string;\n name: string;\n path: string[];\n pathText: string;\n edit?: boolean;\n type?: 'boolean' | 'string' | 'number';\n objTypes?: ioBroker.ObjectType[];\n align?: 'center' | 'left' | 'right';\n}\n\ninterface ObjectBrowserEditRoleProps {\n roles: string[];\n id: string;\n socket: Connection;\n onClose: (obj?: ioBroker.Object | null) => void;\n t: Translate;\n}\n\ninterface ObjectViewFileDialogProps {\n t: Translate;\n socket: Connection;\n obj: ioBroker.AnyObject;\n onClose: () => void;\n}\n\ninterface DragWrapperProps {\n item: TreeItem;\n className?: string;\n style?: React.CSSProperties;\n children: JSX.Element | null;\n}\n\ninterface ObjectCustomDialogProps {\n t: Translate;\n lang: ioBroker.Languages;\n expertMode?: boolean;\n objects: Record<string, ioBroker.Object>;\n socket: Connection;\n theme: IobTheme;\n themeName: ThemeName;\n themeType: ThemeType;\n customsInstances: string[];\n objectIDs: string[];\n onClose: () => void;\n reportChangedIds: (ids: string[]) => void;\n isFloatComma: boolean;\n allVisibleObjects: boolean;\n systemConfig: ioBroker.SystemConfigObject;\n}\n\ninterface ObjectBrowserValueProps {\n /** State type */\n type: 'states' | 'string' | 'number' | 'boolean' | 'json';\n /** State role */\n role: string;\n /** common.states */\n states: Record<string, string> | null;\n /** The state value */\n value: string | number | boolean | null;\n /** If expert mode is enabled */\n expertMode: boolean;\n onClose: (newValue?: {\n val: ioBroker.StateValue;\n ack: boolean;\n q: ioBroker.STATE_QUALITY[keyof ioBroker.STATE_QUALITY];\n expire: number | undefined;\n }) => void;\n /** Configured theme */\n themeType: ThemeType;\n theme: IobTheme;\n socket: Connection;\n defaultHistory: string;\n dateFormat: string;\n object: ioBroker.StateObject;\n isFloatComma: boolean;\n t: Translate;\n lang: ioBroker.Languages;\n width?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n}\n\ninterface ObjectBrowserEditObjectProps {\n socket: Connection;\n obj: ioBroker.AnyObject;\n roleArray: string[];\n expertMode: boolean;\n themeType: ThemeType;\n theme: IobTheme;\n aliasTab: boolean;\n onClose: (obj?: ioBroker.AnyObject) => void;\n dialogName?: string;\n objects: Record<string, ioBroker.AnyObject>;\n dateFormat: string;\n isFloatComma: boolean;\n onNewObject: (obj: ioBroker.AnyObject) => void;\n t: Translate;\n width?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n}\n\ninterface ObjectAliasEditorProps {\n t: Translate;\n socket: Connection;\n objects: Record<string, ioBroker.AnyObject>;\n onRedirect: (id: string, delay?: number) => void;\n obj: ioBroker.AnyObject;\n onClose: () => void;\n}\n\ninterface ObjectBrowserProps {\n /** where to store settings in localStorage */\n dialogName?: string;\n defaultFilters?: ObjectBrowserFilter;\n selected?: string | string[];\n onSelect?: (selected: string | string[], name: string, isDouble?: boolean) => void;\n onFilterChanged?: (newFilter: ObjectBrowserFilter) => void;\n socket: Connection;\n showExpertButton?: boolean;\n expertMode?: boolean;\n imagePrefix?: string;\n themeName: ThemeName;\n themeType: ThemeType;\n /** will be filled by withWidth */\n width?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n theme: IobTheme;\n t: Translate;\n lang: ioBroker.Languages;\n multiSelect?: boolean;\n notEditable?: boolean;\n foldersFirst?: boolean;\n disableColumnSelector?: boolean;\n isFloatComma?: boolean;\n dateFormat?: string;\n levelPadding?: number;\n\n // components\n objectCustomDialog?: React.FC<ObjectCustomDialogProps>;\n objectAddBoolean?: boolean; // optional toolbar button\n objectEditBoolean?: boolean; // optional toolbar button\n objectStatesView?: boolean; // optional toolbar button\n objectImportExport?: boolean; // optional toolbar button\n objectEditOfAccessControl?: boolean; // Access Control\n /** modal add object */\n modalNewObject?: (oBrowser: ObjectBrowserClass) => JSX.Element;\n /** modal Edit Of Access Control */\n modalEditOfAccessControl: (oBrowser: ObjectBrowserClass, data: TreeItemData) => JSX.Element;\n onObjectDelete?: (id: string, hasChildren: boolean, objectExists: boolean, childrenCount: number) => void;\n /**\n * Optional filter\n * `{common: {custom: true}}` - show only objects with some custom settings\n * `{common: {custom: 'sql.0'}}` - show only objects with sql.0 custom settings (only of the specific instance)\n * `{common: {custom: '_dataSources'}}` - show only objects of adapters `influxdb' or 'sql' or 'history'\n * `{common: {custom: 'adapterName.'}}` - show only objects of custom settings of specific adapter (all instances)\n * `{type: 'channel'}` - show only channels\n * `{type: ['channel', 'device']}` - show only channels and devices\n * `{common: {type: 'number'}` - show only states of type 'number\n * `{common: {type: ['number', 'string']}` - show only states of type 'number and string\n * `{common: {role: ['switch']}` - show only states with roles starting from switch\n * `{common: {role: ['switch', 'button']}` - show only states with roles starting from `switch` and `button`\n */\n customFilter: ObjectBrowserCustomFilter;\n objectBrowserValue?: React.FC<ObjectBrowserValueProps>;\n objectBrowserEditObject?: React.FC<ObjectBrowserEditObjectProps>;\n /** on edit alias */\n objectBrowserAliasEditor?: React.FC<ObjectAliasEditorProps>;\n /** on Edit role */\n objectBrowserEditRole?: React.FC<ObjectBrowserEditRoleProps>;\n /** on view file state */\n objectBrowserViewFile?: React.FC<ObjectViewFileDialogProps>;\n router?: typeof Router;\n types?: ioBroker.ObjectType[];\n /** Possible columns: ['name', 'type', 'role', 'room', 'func', 'val', 'buttons'] */\n columns?: string[];\n /** Shows only elements of this root */\n root?: string;\n\n /** cache of objects */\n objectsWorker?: ObjectsWorker;\n /**\n * function to filter out all unnecessary objects. It cannot be used together with \"types\"\n * Example for function: `obj => obj.common?.type === 'boolean'` to show only boolean states\n */\n filterFunc?: (obj: ioBroker.Object) => boolean;\n /** Used for enums dragging */\n DragWrapper?: React.FC<DragWrapperProps>;\n /** let DragWrapper know about objects to get the icons */\n setObjectsReference?: (objects: Record<string, ioBroker.Object>) => void;\n dragEnabled?: boolean;\n}\n\ninterface ObjectBrowserState {\n loaded: boolean;\n foldersFirst: boolean;\n selected: string[];\n focused: string;\n selectedNonObject: string;\n filter: ObjectBrowserFilter;\n filterKey: number;\n depth: number;\n expandAllVisible: boolean;\n expanded: string[];\n toast: string;\n scrollBarWidth: number;\n customDialog: null | string[];\n customDialogAll?: boolean;\n editObjectDialog: string;\n editObjectAlias: boolean; // open the edit object dialog on alias tab\n viewFileDialog: string;\n showAliasEditor: string;\n enumDialog: null | {\n item: TreeItem;\n type: 'room' | 'func';\n enumsOriginal: string;\n };\n enumDialogEnums?: null | string[];\n roleDialog: null | string;\n statesView: boolean;\n /** ['name', 'type', 'role', 'room', 'func', 'val', 'buttons'] */\n columns: string[] | null;\n columnsForAdmin: Record<string, CustomAdminColumnStored[]> | null;\n columnsSelectorShow: boolean;\n columnsAuto: boolean;\n columnsWidths: Record<string, number>;\n columnsDialogTransparent: number;\n columnsEditCustomDialog: null | {\n obj: ioBroker.Object;\n item: TreeItem;\n it: AdapterColumn;\n };\n customColumnDialogValueChanged: boolean;\n showExportDialog: false | number;\n showAllExportOptions: boolean;\n linesEnabled: boolean;\n showDescription: boolean;\n showContextMenu: {\n item: TreeItem;\n position: { left: number; top: number };\n subItem?: string;\n subAnchor?: HTMLLIElement;\n } | null;\n noStatesByExportImport: boolean;\n beautifyJsonExport: boolean;\n excludeSystemRepositoriesFromExport: boolean;\n excludeTranslations: boolean;\n updating?: boolean;\n modalNewObj?: null | { id: string; initialType?: ioBroker.ObjectType; initialStateType?: ioBroker.CommonType };\n error?: any;\n modalEditOfAccess?: boolean;\n modalEditOfAccessObjData?: TreeItemData;\n updateOpened?: boolean;\n tooltipInfo: null | { el: JSX.Element[]; id: string };\n /** Show the menu with aliases for state */\n aliasMenu: string;\n}\n\nexport class ObjectBrowserClass extends Component<ObjectBrowserProps, ObjectBrowserState> {\n // do not define the type as null to save the performance, so we must check it every time\n private info: TreeInfo = {\n funcEnums: [],\n roomEnums: [],\n roles: [],\n ids: [],\n types: [],\n objects: {},\n customs: [],\n enums: [],\n hasSomeCustoms: false,\n aliasesMap: {},\n };\n\n private localStorage: Storage = ((window as any)._localStorage as Storage) || window.localStorage;\n\n private lastAppliedFilter: string | null = null;\n\n private readonly tableRef: React.RefObject<HTMLDivElement>;\n\n private readonly filterRefs: Record<string, React.RefObject<HTMLSelectElement>>;\n\n private pausedSubscribes: boolean = false;\n\n private selectFirst: string;\n\n private root: TreeItem | null = null;\n\n private readonly states: Record<string, ioBroker.State> = {};\n\n private subscribes: string[] = [];\n\n private unsubscribeTimer: ReturnType<typeof setTimeout> | null = null;\n\n private statesUpdateTimer: ReturnType<typeof setTimeout> | null = null;\n\n private objectsUpdateTimer: ReturnType<typeof setTimeout> | null = null;\n\n private filterTimer: ReturnType<typeof setTimeout> | null = null;\n\n private readonly visibleCols: string[];\n\n private readonly texts: Record<string, string>;\n\n private readonly possibleCols: string[];\n\n private readonly imagePrefix: string;\n\n private adapterColumns: AdapterColumn[] = [];\n\n private styleTheme: string = '';\n\n private edit: {\n val: string | number | boolean | null;\n q: number;\n ack: boolean;\n id: string;\n } = {\n id: '',\n val: '',\n q: 0,\n ack: false,\n };\n\n private readonly levelPadding: number;\n\n private customWidth: boolean = false;\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n private resizerNextName: string | null = null;\n\n private resizerActiveName: string | null = null;\n\n private resizerCurrentWidths: Record<string, number> = {};\n\n private resizeLeft: boolean = false;\n\n private resizerOldWidth: number = 0;\n\n private resizerMin: number = 0;\n\n private resizerNextMin: number = 0;\n\n private resizerOldWidthNext: number = 0;\n\n private resizerPosition: number = 0;\n\n private resizerActiveDiv: HTMLDivElement | null = null;\n\n private resizerNextDiv: HTMLDivElement | null = null;\n\n private storedWidths: ScreenWidthOne | null = null;\n\n private systemConfig: ioBroker.SystemConfigObject;\n\n public objects: Record<string, ioBroker.Object>;\n\n private defaultHistory: string = '';\n\n private columnsVisibility: {\n id?: number | string;\n name?: number | string;\n nameHeader?: number | string;\n type?: number;\n role?: number;\n room?: number;\n func?: number;\n changedFrom?: number;\n qualityCode?: number;\n timestamp?: number;\n lastChange?: number;\n val?: number;\n buttons?: number;\n } = {};\n\n private changedIds: null | string[] = null;\n\n private contextMenu: null | { item: any; ts: number } = null;\n\n private recordStates: string[] = [];\n\n private styles: {\n cellIdIconFolder?: React.CSSProperties;\n cellIdIconDocument?: React.CSSProperties;\n iconDeviceError?: React.CSSProperties;\n iconDeviceConnected?: React.CSSProperties;\n iconDeviceDisconnected?: React.CSSProperties;\n cellButtonsButtonWithCustoms?: React.CSSProperties;\n invertedBackground?: React.CSSProperties;\n invertedBackgroundFlex?: React.CSSProperties;\n contextMenuEdit?: React.CSSProperties;\n contextMenuEditValue?: React.CSSProperties;\n contextMenuView?: React.CSSProperties;\n contextMenuCustom?: React.CSSProperties;\n contextMenuACL?: React.CSSProperties;\n contextMenuRoom?: React.CSSProperties;\n contextMenuRole?: React.CSSProperties;\n contextMenuDelete?: React.CSSProperties;\n filterInput?: React.CSSProperties;\n iconCopy?: React.CSSProperties;\n aliasReadWrite?: React.CSSProperties;\n aliasAlone?: React.CSSProperties;\n } = {};\n\n private customColumnDialog: null | {\n value: boolean | number | string;\n type: 'boolean' | 'number' | 'string';\n initValue: boolean | number | string;\n } = null;\n\n /** Namespaces which are allowed to be edited by non-expert users */\n static #NON_EXPERT_NAMESPACES = ['0_userdata.0.', 'alias.0.'];\n\n constructor(props: ObjectBrowserProps) {\n super(props);\n\n const lastSelectedItemStr: string =\n this.localStorage.getItem(`${props.dialogName || 'App'}.objectSelected`) || '';\n\n this.selectFirst = '';\n\n if (lastSelectedItemStr.startsWith('[')) {\n try {\n const lastSelectedItems = JSON.parse(lastSelectedItemStr) as string[];\n this.selectFirst = lastSelectedItems[0] || '';\n } catch {\n // ignore\n }\n } else {\n this.selectFirst = lastSelectedItemStr;\n }\n\n let expanded: string[];\n const expandedStr = this.localStorage.getItem(`${props.dialogName || 'App'}.objectExpanded`) || '[]';\n try {\n expanded = JSON.parse(expandedStr);\n } catch {\n expanded = [];\n }\n\n let filter: ObjectBrowserFilter;\n const filterStr: string = props.defaultFilters\n ? ''\n : this.localStorage.getItem(`${props.dialogName || 'App'}.objectFilter`) || '';\n if (filterStr) {\n try {\n filter = JSON.parse(filterStr);\n } catch {\n filter = { ...DEFAULT_FILTER };\n }\n } else if (props.defaultFilters && typeof props.defaultFilters === 'object') {\n filter = { ...props.defaultFilters };\n } else {\n filter = { ...DEFAULT_FILTER };\n }\n\n filter.expertMode =\n props.expertMode !== undefined\n ? props.expertMode\n : (((window as any)._sessionStorage as Storage) || window.sessionStorage).getItem('App.expertMode') ===\n 'true';\n this.tableRef = createRef();\n this.filterRefs = {};\n\n Object.keys(DEFAULT_FILTER).forEach(name => (this.filterRefs[name] = createRef()));\n\n this.visibleCols = props.columns || SCREEN_WIDTHS[props.width || 'lg'].fields;\n // remove type column if only one type must be selected\n if (props.types && props.types.length === 1) {\n const pos = this.visibleCols.indexOf('type');\n if (pos !== -1) {\n this.visibleCols.splice(pos, 1);\n }\n }\n\n this.possibleCols = SCREEN_WIDTHS.xl.fields;\n\n let customDialog = null;\n\n if (props.router) {\n const location = props.router.getLocation();\n if (location.id && location.dialog === 'customs') {\n customDialog = [location.id];\n this.pauseSubscribe(true);\n }\n }\n\n let selected: string[];\n if (!Array.isArray(props.selected)) {\n selected = [props.selected || ''];\n } else {\n selected = props.selected;\n }\n selected = selected.map(id => id.replace(/[\"']/g, '')).filter(id => id);\n\n this.selectFirst = selected.length && selected[0] ? selected[0] : this.selectFirst;\n\n const columnsStr = this.localStorage.getItem(`${props.dialogName || 'App'}.columns`);\n let columns: string[] | null;\n try {\n columns = columnsStr ? JSON.parse(columnsStr) : null;\n } catch {\n columns = null;\n }\n\n let columnsWidths = null; // this.localStorage.getItem(`${props.dialogName || 'App'}.columnsWidths`);\n try {\n columnsWidths = columnsWidths ? JSON.parse(columnsWidths) : {};\n } catch {\n columnsWidths = {};\n }\n\n this.imagePrefix = props.imagePrefix || '.';\n let foldersFirst: boolean;\n const foldersFirstStr = this.localStorage.getItem(`${props.dialogName || 'App'}.foldersFirst`);\n\n if (foldersFirstStr === 'false') {\n foldersFirst = false;\n } else if (foldersFirstStr === 'true') {\n foldersFirst = true;\n } else {\n foldersFirst = props.foldersFirst === undefined ? true : props.foldersFirst;\n }\n\n let statesView = false;\n try {\n statesView = this.props.objectStatesView\n ? JSON.parse(this.localStorage.getItem(`${props.dialogName || 'App'}.objectStatesView`) || '') || false\n : false;\n } catch {\n // ignore\n }\n\n this.state = {\n loaded: false,\n foldersFirst,\n selected,\n selectedNonObject: this.localStorage.getItem(`${props.dialogName || 'App'}.selectedNonObject`) || '',\n filter,\n filterKey: 0,\n focused: this.localStorage.getItem(`${props.dialogName || 'App'}.focused`) || '',\n depth: 0,\n expandAllVisible: false,\n expanded,\n toast: '',\n scrollBarWidth: 16,\n customDialog,\n editObjectDialog: '',\n editObjectAlias: false, // open the edit object dialog on alias tab\n viewFileDialog: '',\n showAliasEditor: '',\n enumDialog: null,\n roleDialog: null,\n statesView,\n columns,\n columnsForAdmin: null,\n columnsSelectorShow: false,\n columnsAuto: this.localStorage.getItem(`${props.dialogName || 'App'}.columnsAuto`) !== 'false',\n columnsWidths,\n columnsDialogTransparent: 100,\n columnsEditCustomDialog: null,\n customColumnDialogValueChanged: false,\n showExportDialog: false,\n showAllExportOptions: false,\n linesEnabled: this.localStorage.getItem(`${props.dialogName || 'App'}.lines`) === 'true',\n showDescription: this.localStorage.getItem(`${props.dialogName || 'App'}.desc`) !== 'false',\n showContextMenu: null,\n noStatesByExportImport: false,\n beautifyJsonExport: true,\n excludeSystemRepositoriesFromExport: true,\n excludeTranslations: false,\n tooltipInfo: null,\n aliasMenu: '',\n };\n\n this.texts = {\n name: props.t('ra_Name'),\n categories: props.t('ra_Categories'),\n value: props.t('ra_tooltip_value'),\n ack: props.t('ra_tooltip_ack'),\n ts: props.t('ra_tooltip_ts'),\n lc: props.t('ra_tooltip_lc'),\n from: props.t('ra_tooltip_from'),\n user: props.t('ra_tooltip_user'),\n c: props.t('ra_tooltip_comment'),\n quality: props.t('ra_tooltip_quality'),\n editObject: props.t('ra_tooltip_editObject'),\n deleteObject: props.t('ra_tooltip_deleteObject'),\n customConfig: props.t('ra_tooltip_customConfig'),\n copyState: props.t('ra_tooltip_copyState'),\n editState: props.t('ra_tooltip_editState'),\n close: props.t('ra_Close'),\n filter_id: props.t('ra_filter_id'),\n filter_name: props.t('ra_filter_name'),\n filter_type: props.t('ra_filter_type'),\n filter_role: props.t('ra_filter_role'),\n filter_room: props.t('ra_filter_room'),\n filter_func: props.t('ra_filter_func'),\n filter_custom: props.t('ra_filter_customs'), //\n filterCustomsWithout: props.t('ra_filter_customs_without'), //\n objectChangedByUser: props.t('ra_object_changed_by_user'), // Object last changed at\n objectChangedBy: props.t('ra_object_changed_by'), // Object changed by\n objectChangedFrom: props.t('ra_state_changed_from'), // Object changed from\n stateChangedBy: props.t('ra_state_changed_by'), // State changed by\n stateChangedFrom: props.t('ra_state_changed_from'), // State changed from\n ownerGroup: props.t('ra_Owner group'),\n ownerUser: props.t('ra_Owner user'),\n deviceError: props.t('ra_Error'),\n deviceDisconnected: props.t('ra_Disconnected'),\n deviceConnected: props.t('ra_Connected'),\n\n aclOwner_read_object: props.t('ra_aclOwner_read_object'),\n aclOwner_read_state: props.t('ra_aclOwner_read_state'),\n aclOwner_write_object: props.t('ra_aclOwner_write_object'),\n aclOwner_write_state: props.t('ra_aclOwner_write_state'),\n aclGroup_read_object: props.t('ra_aclGroup_read_object'),\n aclGroup_read_state: props.t('ra_aclGroup_read_state'),\n aclGroup_write_object: props.t('ra_aclGroup_write_object'),\n aclGroup_write_state: props.t('ra_aclGroup_write_state'),\n aclEveryone_read_object: props.t('ra_aclEveryone_read_object'),\n aclEveryone_read_state: props.t('ra_aclEveryone_read_state'),\n aclEveryone_write_object: props.t('ra_aclEveryone_write_object'),\n aclEveryone_write_state: props.t('ra_aclEveryone_write_state'),\n\n create: props.t('ra_Create'),\n createBooleanState: props.t('ra_create_boolean_state'),\n createNumberState: props.t('ra_create_number_state'),\n createStringState: props.t('ra_create_string_state'),\n createState: props.t('ra_create_state'),\n createChannel: props.t('ra_create_channel'),\n createDevice: props.t('ra_create_device'),\n createFolder: props.t('ra_Create folder'),\n };\n\n this.levelPadding = props.levelPadding || ITEM_LEVEL;\n\n const resizerCurrentWidthsStr = this.localStorage.getItem(`${this.props.dialogName || 'App'}.table`);\n if (resizerCurrentWidthsStr) {\n try {\n const resizerCurrentWidths = JSON.parse(resizerCurrentWidthsStr);\n const width = this.props.width || 'lg';\n this.storedWidths = JSON.parse(JSON.stringify(SCREEN_WIDTHS[width]));\n Object.keys(resizerCurrentWidths).forEach(id => {\n if (id === 'id') {\n SCREEN_WIDTHS[width].idWidth = resizerCurrentWidths.id;\n } else if (id === 'nameHeader') {\n SCREEN_WIDTHS[width].widths.name = resizerCurrentWidths[id];\n } else if ((SCREEN_WIDTHS[width].widths as Record<string, number>)[id] !== undefined) {\n (SCREEN_WIDTHS[width].widths as Record<string, number>)[id] = resizerCurrentWidths[id];\n }\n });\n\n this.customWidth = true;\n } catch {\n // ignore\n }\n }\n\n this.calculateColumnsVisibility();\n }\n\n async loadAllObjects(update?: boolean): Promise<void> {\n const props = this.props;\n\n try {\n await new Promise<void>(resolve => {\n this.setState({ updating: true }, () => resolve());\n });\n\n const objects =\n (this.props.objectsWorker\n ? await this.props.objectsWorker.getObjects(update)\n : await props.socket.getObjects(update, true)) || {};\n if (props.types && Connection.isWeb()) {\n for (let i = 0; i < props.types.length; i++) {\n // admin has ALL objects\n // web has only state, channel, device, enum, and system.config\n if (\n props.types[i] === 'state' ||\n props.types[i] === 'channel' ||\n props.types[i] === 'device' ||\n props.types[i] === 'enum'\n ) {\n continue;\n }\n const moreObjects = await props.socket.getObjectViewSystem(props.types[i]);\n Object.assign(objects || {}, moreObjects as Record<string, ioBroker.Object>);\n }\n }\n\n this.systemConfig =\n this.systemConfig ||\n (objects?.['system.config'] as ioBroker.SystemConfigObject) ||\n (await props.socket.getObject('system.config'));\n\n this.systemConfig.common = this.systemConfig.common || ({} as ioBroker.SystemConfigCommon);\n this.systemConfig.common.defaultNewAcl = this.systemConfig.common.defaultNewAcl || {\n object: 0,\n state: 0,\n file: 0,\n owner: 'system.user.admin',\n ownerGroup: 'system.group.administrator',\n };\n this.systemConfig.common.defaultNewAcl.owner =\n this.systemConfig.common.defaultNewAcl.owner || 'system.user.admin';\n this.systemConfig.common.defaultNewAcl.ownerGroup =\n this.systemConfig.common.defaultNewAcl.ownerGroup || 'system.group.administrator';\n if (typeof this.systemConfig.common.defaultNewAcl.state !== 'number') {\n // TODO: may be convert here from string\n this.systemConfig.common.defaultNewAcl.state = 0x664;\n }\n if (typeof this.systemConfig.common.defaultNewAcl.object !== 'number') {\n // TODO: may be convert here from string\n this.systemConfig.common.defaultNewAcl.state = 0x664;\n }\n\n if (typeof props.filterFunc === 'function') {\n this.objects = {};\n const filterFunc: (obj: ioBroker.Object) => boolean = props.filterFunc;\n\n Object.keys(objects).forEach(id => {\n try {\n if (filterFunc(objects[id])) {\n this.objects[id] = objects[id];\n } else {\n const type = objects[id] && objects[id].type;\n // include \"folder\" types too for icons and names of nodes\n if (\n type &&\n (type === 'channel' ||\n type === 'device' ||\n type === 'folder' ||\n type === 'adapter' ||\n type === 'instance')\n ) {\n this.objects[id] = objects[id];\n }\n }\n } catch (e) {\n console.log(`Error by filtering of \"${id}\": ${e}`);\n }\n });\n } else if (props.types) {\n this.objects = {};\n const propsTypes = props.types;\n\n Object.keys(objects).forEach(id => {\n const type = objects[id] && objects[id].type;\n // include \"folder\" types too\n if (\n type &&\n (type === 'channel' ||\n type === 'device' ||\n type === 'enum' ||\n type === 'folder' ||\n type === 'adapter' ||\n type === 'instance' ||\n propsTypes.includes(type))\n ) {\n this.objects[id] = objects[id];\n }\n });\n } else {\n this.objects = objects;\n }\n\n if (props.setObjectsReference) {\n props.setObjectsReference(this.objects);\n }\n\n // read default history\n this.defaultHistory = this.systemConfig.common.defaultHistory;\n if (this.defaultHistory) {\n props.socket\n .getState(`system.adapter.${this.defaultHistory}.alive`)\n .then(state => {\n if (!state || !state.val) {\n this.defaultHistory = '';\n }\n })\n .catch(e => window.alert(`Cannot get state: ${e}`));\n }\n\n const columnsForAdmin = await this.getAdditionalColumns();\n this.calculateColumnsVisibility(null, null, columnsForAdmin);\n\n const { info, root } = buildTree(this.objects, {\n imagePrefix: this.props.imagePrefix,\n root: this.props.root,\n lang: this.props.lang,\n themeType: this.props.themeType,\n });\n this.root = root;\n this.info = info;\n\n // Show first selected item\n const node =\n this.state.selected && this.state.selected.length && findNode(this.root, this.state.selected[0]);\n\n this.lastAppliedFilter = null;\n\n // If the selected ID is not visible, reset filter\n if (\n node &&\n !applyFilter(\n node,\n this.state.filter,\n this.props.lang,\n this.objects,\n undefined,\n undefined,\n props.customFilter,\n props.types,\n )\n ) {\n // reset filter\n this.setState({ filter: { ...DEFAULT_FILTER }, columnsForAdmin }, () => {\n this.setState({ loaded: true, updating: false }, () =>\n this.expandAllSelected(() => this.onAfterSelect()),\n );\n });\n } else {\n this.setState({ loaded: true, updating: false, columnsForAdmin }, () =>\n this.expandAllSelected(() => this.onAfterSelect()),\n );\n }\n } catch (e1) {\n this.showError(e1);\n }\n }\n\n /**\n * Check if it is a non-expert id\n */\n static isNonExpertId(\n /** id to test */\n id: string,\n ): boolean {\n return !!ObjectBrowserClass.#NON_EXPERT_NAMESPACES.find(saveNamespace => id.startsWith(saveNamespace));\n }\n\n private expandAllSelected(cb?: () => void): void {\n const expanded = [...this.state.expanded];\n let changed = false;\n this.state.selected.forEach(id => {\n const parts = id.split('.');\n const path = [];\n for (let i = 0; i < parts.length - 1; i++) {\n path.push(parts[i]);\n if (!expanded.includes(path.join('.'))) {\n expanded.push(path.join('.'));\n changed = true;\n }\n }\n });\n if (changed) {\n expanded.sort();\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n this.setState({ expanded }, cb);\n } else if (cb) {\n cb();\n }\n }\n\n /**\n * @param isDouble is double click\n */\n private onAfterSelect(isDouble?: boolean): void {\n if (this.state.selected?.length && this.state.selected[0]) {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectSelected`, this.state.selected[0]);\n\n // remove a task to select the pre-selected item if now we want to see another object\n if (this.selectFirst && this.selectFirst !== this.state.selected[0]) {\n this.selectFirst = '';\n }\n\n if (this.state.selected.length === 1 && this.objects[this.state.selected[0]]) {\n const name = Utils.getObjectName(this.objects, this.state.selected[0], null, {\n language: this.props.lang,\n });\n if (this.props.onSelect) {\n this.props.onSelect(this.state.selected, name, isDouble);\n }\n }\n } else {\n this.localStorage.removeItem(`${this.props.dialogName || 'App'}.objectSelected`);\n\n if (this.state.selected.length) {\n this.setState({ selected: [] }, () => this.props.onSelect && this.props.onSelect([], ''));\n } else if (this.props.onSelect) {\n this.props.onSelect([], '');\n }\n }\n }\n\n private static getDerivedStateFromProps(\n props: ObjectBrowserProps,\n state: ObjectBrowserState,\n ): Partial<ObjectBrowserState> | null {\n const newState: Partial<ObjectBrowserState> = {};\n let changed = false;\n if (props.expertMode !== undefined && props.expertMode !== state.filter.expertMode) {\n changed = true;\n newState.filter = { ...state.filter };\n newState.filter.expertMode = props.expertMode;\n }\n return changed ? newState : null;\n }\n\n /**\n * Called when component is mounted.\n */\n async componentDidMount(): Promise<void> {\n await this.loadAllObjects(!objectsAlreadyLoaded);\n if (this.props.objectsWorker) {\n this.props.objectsWorker.registerHandler(this.onObjectChangeFromWorker);\n } else {\n await this.props.socket.subscribeObject('*', this.onObjectChange);\n }\n\n objectsAlreadyLoaded = true;\n\n window.addEventListener('contextmenu', this.onContextMenu, true);\n }\n\n /**\n * Called when component is unmounted.\n */\n componentWillUnmount(): void {\n if (this.filterTimer) {\n clearTimeout(this.filterTimer);\n this.filterTimer = null;\n }\n window.removeEventListener('contextmenu', this.onContextMenu, true);\n\n if (this.props.objectsWorker) {\n this.props.objectsWorker.unregisterHandler(this.onObjectChangeFromWorker, true);\n } else {\n void this.props.socket\n .unsubscribeObject('*', this.onObjectChange)\n .catch(e => console.error(`Cannot unsubscribe *: ${e}`));\n }\n\n // remove all subscribes\n this.subscribes.forEach(pattern => {\n console.log(`- unsubscribe ${pattern}`);\n this.props.socket.unsubscribeState(pattern, this.onStateChange);\n });\n\n this.subscribes = [];\n this.objects = {};\n }\n\n /**\n * Show the deletion dialog for a given object\n */\n showDeleteDialog(options: { id: string; obj: ioBroker.Object; item: TreeItem }): void {\n const { id, obj, item } = options;\n\n // calculate the number of children\n const keys = Object.keys(this.objects);\n keys.sort();\n let count = 0;\n const start = `${id}.`;\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].startsWith(start)) {\n count++;\n } else if (keys[i] > start) {\n break;\n }\n }\n\n if (this.props.onObjectDelete) {\n this.props.onObjectDelete(id, !!item.children?.length, !obj.common?.dontDelete, count + 1);\n }\n }\n\n /**\n * Context menu handler.\n */\n onContextMenu = (e: MouseEvent): void => {\n // console.log(`CONTEXT MENU: ${this.contextMenu ? Date.now() - this.contextMenu.ts : 'false'}`);\n if (this.contextMenu && Date.now() - this.contextMenu.ts < 2000) {\n e.preventDefault();\n this.setState({\n showContextMenu: {\n item: this.contextMenu.item,\n position: { left: e.clientX + 2, top: e.clientY - 6 },\n },\n });\n } else if (this.state.showContextMenu) {\n e.preventDefault();\n this.setState({ showContextMenu: null });\n }\n this.contextMenu = null;\n };\n\n /**\n * Called when component is mounted.\n */\n refreshComponent(): void {\n // remove all subscribes\n this.subscribes.forEach(pattern => {\n console.log(`- unsubscribe ${pattern}`);\n this.props.socket.unsubscribeState(pattern, this.onStateChange);\n });\n\n this.subscribes = [];\n\n this.loadAllObjects(true)\n .then(() => console.log('updated!'))\n .catch(e => this.showError(e));\n }\n\n /**\n * Renders the error dialog.\n */\n renderErrorDialog(): JSX.Element | null {\n return this.state.error ? (\n <Dialog\n open={!0}\n maxWidth=\"sm\"\n fullWidth\n onClose={() => this.setState({ error: '' })}\n aria-labelledby=\"error-dialog-title\"\n aria-describedby=\"error-dialog-description\"\n >\n <DialogTitle id=\"alert-dialog-title\">{this.props.t('ra_Error')}</DialogTitle>\n <DialogContent>\n <DialogContentText id=\"alert-dialog-description\">{this.state.error}</DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({ error: '' })}\n color=\"primary\"\n autoFocus\n startIcon={<IconCheck />}\n >\n {this.props.t('ra_Ok')}\n </Button>\n </DialogActions>\n </Dialog>\n ) : null;\n }\n\n /**\n * Show the error dialog.\n */\n showError(error: any): void {\n this.setState({\n error:\n typeof error === 'object'\n ? error && typeof error.toString === 'function'\n ? error.toString()\n : JSON.stringify(error)\n : error,\n });\n }\n\n /**\n * Called when an item is selected/deselected.\n */\n onSelect(toggleItem: string, isDouble?: boolean, cb?: () => void): void {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.focused`, toggleItem);\n\n if (!this.props.multiSelect) {\n if (\n this.objects[toggleItem] &&\n (!this.props.types || this.props.types.includes(this.objects[toggleItem].type))\n ) {\n this.localStorage.removeItem(`${this.props.dialogName || 'App'}.selectedNonObject`);\n if (this.state.selected[0] !== toggleItem) {\n this.setState({ selected: [toggleItem], selectedNonObject: '', focused: toggleItem }, () => {\n this.onAfterSelect(isDouble);\n if (cb) {\n cb();\n }\n });\n } else if (isDouble && this.props.onSelect) {\n this.onAfterSelect(isDouble);\n }\n } else {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.selectedNonObject`, toggleItem);\n this.setState({ selected: [], selectedNonObject: toggleItem, focused: toggleItem }, () => {\n this.onAfterSelect();\n if (cb) {\n cb();\n }\n });\n }\n } else if (\n this.objects[toggleItem] &&\n (!this.props.types || this.props.types.includes(this.objects[toggleItem].type))\n ) {\n this.localStorage.removeItem(`${this.props.dialogName || 'App'}.selectedNonObject`);\n\n const selected = [...this.state.selected];\n const pos = selected.indexOf(toggleItem);\n if (pos === -1) {\n selected.push(toggleItem);\n selected.sort();\n } else if (!isDouble) {\n selected.splice(pos, 1);\n }\n\n this.setState({ selected, selectedNonObject: '', focused: toggleItem }, () => {\n this.onAfterSelect(isDouble);\n if (cb) {\n cb();\n }\n });\n }\n }\n\n private _renderDefinedList(isLast: boolean): JSX.Element[] {\n const cols = [...this.possibleCols];\n cols.unshift('id');\n if (this.props.columns && !this.props.columns.includes('buttons')) {\n const pos = cols.indexOf('buttons');\n if (pos !== -1) {\n cols.splice(pos, 1);\n }\n }\n return cols\n .filter(\n id => (isLast && (id === 'val' || id === 'buttons')) || (!isLast && id !== 'val' && id !== 'buttons'),\n )\n .map(id => (\n <ListItemButton\n onClick={() => {\n if (!this.state.columnsAuto && id !== 'id') {\n const columns = [...(this.state.columns || [])];\n const pos = columns.indexOf(id);\n if (pos === -1) {\n columns.push(id);\n columns.sort();\n } else {\n columns.splice(pos, 1);\n }\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.columns`,\n JSON.stringify(columns),\n );\n this.calculateColumnsVisibility(null, columns);\n this.setState({ columns });\n }\n }}\n key={id}\n >\n <Checkbox\n edge=\"start\"\n disabled={id === 'id' || this.state.columnsAuto}\n checked={\n id === 'id' ||\n !!(this.state.columnsAuto\n ? this.visibleCols.includes(id)\n : this.state.columns?.includes(id))\n }\n disableRipple\n />\n <ListItemText primary={this.texts[`filter_${id}`] || this.props.t(`ra_${id}`)} />\n {/*\n <ListItemSecondaryAction>\n <FormControl\n variant=\"standard\"\n style={{ ...styles.columnsDialogInputWidth, marginTop: 0, marginBottom: 0 }}\n margin=\"dense\"\n >\n <Input\n classes={{ underline: 'no-underline' }}\n placeholder={this.props.t('ra_Width')}\n value={this.state.columnsWidths[id] || ''}\n onChange={e => {\n const columnsWidths = JSON.parse(JSON.stringify(this.state.columnsWidths));\n columnsWidths[id] = e.target.value;\n this.localStorage.setItem((this.props.dialogName || 'App') + '.columnsWidths', JSON.stringify(columnsWidths));\n this.calculateColumnsVisibility(null, null, null, columnsWidths);\n this.setState({ columnsWidths });\n }}\n autoComplete=\"off\"\n />\n </FormControl>\n </ListItemSecondaryAction>\n */}\n </ListItemButton>\n ));\n }\n\n /**\n * Renders the columns' selector.\n */\n renderColumnsSelectorDialog(): JSX.Element | null {\n if (!this.state.columnsSelectorShow) {\n return null;\n }\n return (\n <Dialog\n onClose={() => this.setState({ columnsSelectorShow: false })}\n open={!0}\n sx={{\n '& .MuiPaper-root': Utils.getStyle(\n this.props.theme,\n styles.dialogColumns,\n styles[`transparent_${this.state.columnsDialogTransparent}`],\n ),\n }}\n >\n <DialogTitle sx={styles.fontSizeTitle}>{this.props.t('ra_Configure')}</DialogTitle>\n <DialogContent sx={styles.fontSizeTitle}>\n <FormControlLabel\n style={styles.switchColumnAuto}\n control={\n <Switch\n checked={this.state.foldersFirst}\n onChange={() => {\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.foldersFirst`,\n this.state.foldersFirst ? 'false' : 'true',\n );\n this.setState({ foldersFirst: !this.state.foldersFirst });\n }}\n />\n }\n label={this.props.t('ra_Folders always first')}\n />\n <FormControlLabel\n style={styles.switchColumnAuto}\n control={\n <Switch\n checked={this.state.linesEnabled}\n onChange={() => {\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.lines`,\n this.state.linesEnabled ? 'false' : 'true',\n );\n this.setState({ linesEnabled: !this.state.linesEnabled });\n }}\n />\n }\n label={this.props.t('ra_Show lines between rows')}\n />\n <FormControlLabel\n style={styles.switchColumnAuto}\n control={\n <Switch\n checked={this.state.columnsAuto}\n onChange={() => {\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.columnsAuto`,\n this.state.columnsAuto ? 'false' : 'true',\n );\n if (!this.state.columnsAuto) {\n this.calculateColumnsVisibility(true);\n this.setState({ columnsAuto: true });\n } else if (!this.state.columns) {\n this.calculateColumnsVisibility(false, [...this.visibleCols]);\n this.setState({ columnsAuto: false, columns: [...this.visibleCols] });\n } else {\n this.calculateColumnsVisibility(false);\n this.setState({ columnsAuto: false });\n }\n }}\n />\n }\n label={this.props.t('ra_Auto (no custom columns)')}\n />\n {/*\n <Typography classes={{ root: styles.dialogColumnsLabel }}>{this.props.t('ra_Transparent dialog')}</Typography>\n <Slider classes={{ root: styles.width100 }} value={this.state.columnsDialogTransparent} min={20} max={100} step={10} onChange={(event, newValue) =>\n this.setState({ columnsDialogTransparent: newValue })\n } />\n */}\n <List>\n {this._renderDefinedList(false)}\n\n {this.state.columnsForAdmin &&\n Object.keys(this.state.columnsForAdmin)\n .sort()\n .map(\n adapter =>\n this.state.columnsForAdmin &&\n this.state.columnsForAdmin[adapter].map(column => (\n <ListItemButton\n onClick={() => {\n if (!this.state.columnsAuto) {\n const columns = [...(this.state.columns || [])];\n const id = `_${adapter}_${column.path}`;\n const pos = columns.indexOf(id);\n if (pos === -1) {\n columns.push(id);\n columns.sort();\n } else {\n columns.splice(pos, 1);\n }\n this.calculateColumnsVisibility(null, columns);\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.columns`,\n JSON.stringify(columns),\n );\n this.setState({ columns });\n }\n }}\n key={`${adapter}_${column.name}`}\n >\n <ListItemIcon>\n <Checkbox\n disabled={this.state.columnsAuto}\n edge=\"start\"\n checked={\n !this.state.columnsAuto &&\n this.state.columns?.includes(`_${adapter}_${column.path}`)\n }\n disableRipple\n />\n </ListItemIcon>\n <ListItemText primary={`${column.name} (${adapter})`} />\n {/*\n <ListItemSecondaryAction>\n <FormControl\n variant=\"standard\"\n style={{ ...styles.columnsDialogInputWidth, marginTop: 0, marginBottom: 0 }}\n margin=\"dense\"\n >\n <Input\n classes={{ underline: 'no-underline' }}\n placeholder={this.props.t('ra_Width')}\n value={this.state.columnsWidths['_' + adapter + '_' + column.path] || ''}\n onChange={e => {\n const columnsWidths = JSON.parse(JSON.stringify(this.state.columnsWidths));\n columnsWidths['_' + adapter + '_' + column.path] = e.target.value;\n this.localStorage.setItem((this.props.dialogName || 'App') + '.columnsWidths', JSON.stringify(columnsWidths));\n this.calculateColumnsVisibility(null, null, null, columnsWidths);\n this.setState({ columnsWidths });\n }}\n autoComplete=\"off\"\n />\n </FormControl>\n </ListItemSecondaryAction>\n */}\n </ListItemButton>\n )),\n )}\n {this._renderDefinedList(true)}\n </List>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({ columnsSelectorShow: false })}\n color=\"primary\"\n startIcon={<IconClose />}\n >\n {this.texts.close}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n private async getAdditionalColumns(): Promise<Record<string, CustomAdminColumnStored[]> | null> {\n try {\n const instances = await this.props.socket.getAdapters();\n\n let columnsForAdmin: Record<string, CustomAdminColumnStored[]> | null = null;\n // find all additional columns\n instances.forEach(obj => (columnsForAdmin = this.parseObjectForAdmins(columnsForAdmin, obj)));\n\n return columnsForAdmin;\n } catch (err) {\n // window.alert('Cannot get adapters: ' + e);\n // Object browser in Web has no additional columns\n console.error(`Cannot get adapters: ${err}`);\n return null;\n }\n }\n\n private checkUnsubscribes(): void {\n // Remove unused subscriptions\n for (let i = this.subscribes.length - 1; i >= 0; i--) {\n if (!this.recordStates.includes(this.subscribes[i])) {\n this.unsubscribe(this.subscribes[i]);\n }\n }\n this.recordStates = [];\n }\n\n /**\n * Find an item.\n */\n findItem(id: string, _parts?: string[], _root?: TreeItem | null, _partyId?: string): TreeItem | null {\n _parts = _parts || id.split('.');\n _root = _root || this.root;\n if (!_root || !_parts.length) {\n return null;\n }\n\n _partyId = (_partyId ? `${_partyId}.` : '') + _parts.shift();\n\n if (_root.children) {\n const item = _root.children.find(i => i.data.id === _partyId);\n if (item) {\n if (item.data.id === id) {\n return item;\n }\n if (_parts.length) {\n return this.findItem(id, _parts, item, _partyId);\n }\n } else {\n return null;\n }\n }\n\n return null;\n }\n\n /**\n * Called when a state changes.\n */\n onStateChange = (id: string, state?: ioBroker.State | null): void => {\n console.log(`> stateChange ${id}`);\n if (this.states[id]) {\n const item = this.findItem(id);\n if (item?.data.state) {\n item.data.state = undefined;\n }\n }\n if (state) {\n this.states[id] = state;\n } else {\n delete this.states[id];\n }\n\n if (!this.pausedSubscribes) {\n if (!this.statesUpdateTimer) {\n this.statesUpdateTimer = setTimeout(() => {\n this.statesUpdateTimer = null;\n this.forceUpdate();\n }, 300);\n }\n } else if (this.statesUpdateTimer) {\n clearTimeout(this.statesUpdateTimer);\n this.statesUpdateTimer = null;\n }\n };\n\n private parseObjectForAdmins(\n columnsForAdmin: Record<string, CustomAdminColumnStored[]> | null,\n obj: ioBroker.AdapterObject,\n ): Record<string, CustomAdminColumnStored[]> | null {\n if (obj.common && obj.common.adminColumns && obj.common.name) {\n const columns: string | (string | ioBroker.CustomAdminColumn)[] = obj.common.adminColumns;\n let aColumns: (string | ioBroker.CustomAdminColumn)[] | undefined;\n if (columns && typeof columns !== 'object') {\n aColumns = [columns];\n } else if (columns) {\n aColumns = columns as (string | ioBroker.CustomAdminColumn)[];\n }\n let cColumns: CustomAdminColumnStored[] | null;\n if (columns) {\n cColumns = aColumns\n .map((_item: string | ioBroker.CustomAdminColumn) => {\n if (typeof _item !== 'object') {\n return { path: _item, name: _item.split('.').pop() };\n }\n const item: ioBroker.CustomAdminColumn = _item;\n // string => array\n if (item.objTypes && typeof item.objTypes !== 'object') {\n item.objTypes = [item.objTypes];\n } else if (!item.objTypes) {\n item.objTypes = undefined;\n }\n\n if (!item.name && item.path) {\n return {\n path: item.path,\n name: item.path.split('.').pop(),\n width: item.width,\n edit: !!item.edit,\n type: item.type,\n objTypes: item.objTypes,\n } as CustomAdminColumnStored;\n }\n if (!item.path) {\n console.warn(`Admin columns for ${obj._id} ignored, because path not found`);\n return null;\n }\n return {\n path: item.path,\n name: getName(item.name || '', this.props.lang),\n width: item.width,\n edit: !!item.edit,\n type: item.type,\n objTypes: item.objTypes,\n } as CustomAdminColumnStored;\n })\n .filter((item: CustomAdminColumnStored) => item);\n } else {\n cColumns = null;\n }\n\n if (cColumns && cColumns.length) {\n columnsForAdmin = columnsForAdmin || {};\n columnsForAdmin[obj.common.name] = cColumns.sort((a, b) =>\n a.path > b.path ? -1 : a.path < b.path ? 1 : 0,\n );\n }\n } else if (obj.common && obj.common.name && columnsForAdmin && columnsForAdmin[obj.common.name]) {\n delete columnsForAdmin[obj.common.name];\n }\n return columnsForAdmin;\n }\n\n onObjectChangeFromWorker = (events: ObjectEvent[]): void => {\n if (Array.isArray(events)) {\n let newState: { columnsForAdmin: Record<string, CustomAdminColumnStored[] | null> | null } | null = null;\n events.forEach(event => {\n const { newInnerState, filtered } = this.processOnObjectChangeElement(event.id, event.obj);\n if (filtered) {\n return;\n }\n if (newInnerState && newState) {\n Object.assign(newState, newInnerState);\n } else {\n newState = newInnerState;\n }\n });\n\n if (newState) {\n this.setState(newState);\n }\n this.afterObjectUpdated();\n }\n };\n\n onObjectChange = (id: string, obj?: ioBroker.Object | null): void => {\n const { newInnerState, filtered } = this.processOnObjectChangeElement(id, obj);\n if (filtered) {\n return;\n }\n\n if (newInnerState) {\n this.setState(newInnerState);\n }\n this.afterObjectUpdated();\n };\n\n afterObjectUpdated(): void {\n if (!this.objectsUpdateTimer && this.objects) {\n this.objectsUpdateTimer = setTimeout(() => {\n this.objectsUpdateTimer = null;\n const { info, root } = buildTree(this.objects, {\n imagePrefix: this.props.imagePrefix,\n root: this.props.root,\n lang: this.props.lang,\n themeType: this.props.themeType,\n });\n this.root = root;\n this.info = info;\n this.lastAppliedFilter = null; // apply filter anew\n\n if (!this.pausedSubscribes) {\n this.forceUpdate();\n }\n // else it will be re-rendered when the dialog will be closed\n }, 500);\n }\n }\n\n // This function is called when the user changes the alias of an object.\n // It updates the aliasMap and returns true if the aliasMap has changed.\n updateAliases(aliasId: string): void {\n if (!this.objects || !this.info?.aliasesMap || !aliasId?.startsWith('alias.')) {\n return;\n }\n // Rebuild aliases map\n const aliasesIds = Object.keys(this.objects).filter(id => id.startsWith('alias.0'));\n\n this.info.aliasesMap = {};\n\n for (const id of aliasesIds) {\n const obj = this.objects[id];\n if (obj?.common?.alias?.id) {\n if (typeof obj.common.alias.id === 'string') {\n const usedId = obj.common.alias.id;\n if (!this.info.aliasesMap[usedId]) {\n this.info.aliasesMap[usedId] = [id];\n } else if (!this.info.aliasesMap[usedId].includes(id)) {\n this.info.aliasesMap[usedId].push(id);\n }\n } else {\n const readId = obj.common.alias.id.read;\n if (readId) {\n if (!this.info.aliasesMap[readId]) {\n this.info.aliasesMap[readId] = [id];\n } else if (!this.info.aliasesMap[readId].includes(id)) {\n this.info.aliasesMap[readId].push(id);\n }\n }\n const writeId = obj.common.alias.id.write;\n if (writeId) {\n if (!this.info.aliasesMap[writeId]) {\n this.info.aliasesMap[writeId] = [id];\n } else if (!this.info.aliasesMap[writeId].includes(id)) {\n this.info.aliasesMap[writeId].push(id);\n }\n }\n }\n }\n }\n }\n\n /**\n * Processes a single element in regard to certain filters, columns for admin and updates object dict\n *\n * @param id The id of the object\n * @param obj The object itself\n * @returns Returns an object containing the new state (if any) and whether the object was filtered.\n */\n processOnObjectChangeElement(\n id: string,\n obj?: ioBroker.Object | null,\n ): {\n filtered: boolean;\n newInnerState: null | { columnsForAdmin: Record<string, CustomAdminColumnStored[]> | null };\n } {\n console.log(`> objectChange ${id}`);\n const type = obj?.type;\n\n // If the object is filtered out, we don't need to update the React state\n if (\n obj &&\n typeof this.props.filterFunc === 'function' &&\n !this.props.filterFunc(obj) &&\n type !== 'channel' &&\n type !== 'device' &&\n type !== 'folder' &&\n type !== 'adapter' &&\n type !== 'instance'\n ) {\n return { newInnerState: null, filtered: true };\n }\n\n let newInnerState = null;\n if (id.startsWith('system.adapter.') && obj?.type === 'adapter') {\n const columnsForAdmin: Record<string, CustomAdminColumnStored[]> | null = JSON.parse(\n JSON.stringify(this.state.columnsForAdmin),\n );\n\n this.parseObjectForAdmins(columnsForAdmin, obj as ioBroker.AdapterObject);\n\n if (JSON.stringify(this.state.columnsForAdmin) !== JSON.stringify(columnsForAdmin)) {\n newInnerState = { columnsForAdmin };\n }\n }\n\n this.objects = this.objects || {};\n\n if (obj) {\n this.objects[id] = obj;\n } else if (this.objects[id]) {\n delete this.objects[id];\n }\n\n this.updateAliases(id);\n\n return { newInnerState, filtered: false };\n }\n\n private subscribe(id: string): void {\n if (!this.subscribes.includes(id)) {\n this.subscribes.push(id);\n console.log(`+ subscribe ${id}`);\n if (!this.pausedSubscribes) {\n this.props.socket\n .subscribeState(id, this.onStateChange)\n .catch(e => console.error(`Cannot subscribe on state ${id}: ${e}`));\n }\n }\n }\n\n private unsubscribe(id: string): void {\n const pos = this.subscribes.indexOf(id);\n if (pos !== -1) {\n this.subscribes.splice(pos, 1);\n if (this.states[id]) {\n delete this.states[id];\n }\n console.log(`- unsubscribe ${id}`);\n this.props.socket.unsubscribeState(id, this.onStateChange);\n\n if (this.pausedSubscribes) {\n console.warn('Unsubscribe during pause?');\n }\n }\n }\n\n private pauseSubscribe(isPause: boolean): void {\n if (!this.pausedSubscribes && isPause) {\n this.pausedSubscribes = true;\n this.subscribes.forEach(id => this.props.socket.unsubscribeState(id, this.onStateChange));\n } else if (this.pausedSubscribes && !isPause) {\n this.pausedSubscribes = false;\n this.subscribes.forEach(id => this.props.socket.subscribeState(id, this.onStateChange));\n }\n }\n\n private onFilter(name?: string, value?: string | boolean): void {\n this.filterTimer = null;\n const filter: ObjectBrowserFilter = { ...this.state.filter };\n\n Object.keys(this.filterRefs).forEach(_name => {\n if (this.filterRefs[_name] && this.filterRefs[_name].current) {\n const filterRef: HTMLSelectElement = this.filterRefs[_name].current;\n for (let i = 0; i < filterRef.children.length; i++) {\n if (filterRef.children[i].tagName === 'INPUT') {\n (filter as Record<string, string>)[_name] = (filterRef.children[i] as HTMLInputElement).value;\n break;\n }\n }\n }\n });\n\n if (name) {\n (filter as Record<string, string | boolean | undefined>)[name] = value;\n if (name === 'expertMode') {\n (((window as any)._sessionStorage as Storage) || window.sessionStorage).setItem(\n 'App.expertMode',\n value ? 'true' : 'false',\n );\n }\n }\n\n if (JSON.stringify(this.state.filter) !== JSON.stringify(filter)) {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectFilter`, JSON.stringify(filter));\n this.setState({ filter }, () => this.props.onFilterChanged && this.props.onFilterChanged(filter));\n }\n }\n\n clearFilter(): void {\n const filter: ObjectBrowserFilter = { ...this.state.filter };\n\n Object.keys(this.filterRefs).forEach(name => {\n if (this.filterRefs[name] && this.filterRefs[name].current) {\n const filterRef: HTMLSelectElement = this.filterRefs[name].current;\n for (let i = 0; i < filterRef.childNodes.length; i++) {\n const item = filterRef.childNodes[i];\n if ((item as HTMLInputElement).tagName === 'INPUT') {\n (filter as Record<string, string>)[name] = '';\n (item as HTMLInputElement).value = '';\n break;\n }\n }\n }\n });\n\n if (JSON.stringify(this.state.filter) !== JSON.stringify(filter)) {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectFilter`, JSON.stringify(filter));\n this.setState(\n { filter, filterKey: this.state.filterKey + 1 },\n () => this.props.onFilterChanged && this.props.onFilterChanged(filter),\n );\n }\n }\n\n isFilterEmpty(): boolean {\n const someNotEmpty = Object.keys(this.state.filter).find(\n attr => attr !== 'expertMode' && (this.state.filter as Record<string, string>)[attr],\n );\n return !someNotEmpty;\n }\n\n private getFilterInput(filterName: string): JSX.Element {\n return (\n <FormControl\n sx={this.styles.filterInput}\n key={`${filterName}_${this.state.filterKey}`}\n // style={{ marginTop: 0, marginBottom: 0 }}\n margin=\"dense\"\n >\n <Input\n ref={this.filterRefs[filterName]}\n classes={{ underline: 'no-underline' }}\n id={filterName}\n placeholder={this.texts[`filter_${filterName}`]}\n defaultValue={(this.state.filter as Record<string, string>)[filterName] || ''}\n onChange={() => {\n if (this.filterTimer) {\n clearTimeout(this.filterTimer);\n }\n this.filterTimer = setTimeout(() => this.onFilter(), 400);\n }}\n autoComplete=\"off\"\n />\n {(this.filterRefs[filterName]?.current?.firstChild as HTMLInputElement)?.value ? (\n <div\n style={{\n position: 'absolute',\n right: 0,\n }}\n >\n <IconButton\n size=\"small\"\n onClick={() => {\n (this.filterRefs[filterName].current?.firstChild as HTMLInputElement).value = '';\n this.onFilter(filterName, '');\n }}\n >\n <IconClose />\n </IconButton>\n </div>\n ) : null}\n </FormControl>\n );\n }\n\n private getFilterSelect(name: string, values?: (string | InputSelectItem)[]): JSX.Element {\n const hasIcons = !!values?.find(item => (item as InputSelectItem).icon);\n\n return (\n <div style={{ position: 'relative' }}>\n <Select\n variant=\"standard\"\n key={`${name}_${this.state.filterKey}`}\n ref={this.filterRefs[name]}\n sx={styles.headerCellInput}\n className=\"no-underline\"\n onChange={() => {\n if (this.filterTimer) {\n clearTimeout(this.filterTimer);\n }\n this.filterTimer = setTimeout(() => this.onFilter(), 400);\n }}\n defaultValue={(this.state.filter as Record<string, string>)[name] || ''}\n inputProps={{ name, id: name }}\n displayEmpty\n >\n <MenuItem\n key=\"empty\"\n value=\"\"\n >\n <span style={styles.selectNone}>{this.texts[`filter_${name}`]}</span>\n </MenuItem>\n {values?.map(item => {\n let id: string;\n let _name: string;\n let icon: null | JSX.Element | undefined;\n if (typeof item === 'object') {\n id = item.value;\n _name = item.name;\n icon = item.icon;\n } else {\n id = item;\n _name = item;\n }\n return (\n <MenuItem\n sx={styles.headerCellSelectItem}\n key={id}\n value={id}\n >\n {icon || (hasIcons ? <div className=\"itemIcon\" /> : null)}\n {_name}\n </MenuItem>\n );\n })}\n </Select>\n {(this.filterRefs[name]?.current?.childNodes[1] as HTMLInputElement)?.value ? (\n <Box\n component=\"div\"\n sx={styles.selectClearButton}\n >\n <IconButton\n size=\"small\"\n onClick={() => {\n const newFilter: ObjectBrowserFilter = { ...this.state.filter };\n (newFilter as Record<string, string>)[name] = '';\n (this.filterRefs[name].current?.childNodes[1] as HTMLInputElement).value = '';\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.objectFilter`,\n JSON.stringify(newFilter),\n );\n this.setState(\n { filter: newFilter, filterKey: this.state.filterKey + 1 },\n () => this.props.onFilterChanged && this.props.onFilterChanged(newFilter),\n );\n }}\n >\n <IconClose />\n </IconButton>\n </Box>\n ) : null}\n </div>\n );\n }\n\n private getFilterSelectRole(): JSX.Element {\n return this.getFilterSelect('role', this.info.roles);\n }\n\n private getFilterSelectRoom(): JSX.Element {\n const rooms: InputSelectItem[] = this.info.roomEnums.map(\n id =>\n ({\n name: getName(this.objects[id]?.common?.name, this.props.lang) || id.split('.').pop(),\n value: id,\n icon: (\n <Icon\n src={this.objects[id]?.common?.icon || ''}\n style={styles.selectIcon}\n />\n ),\n }) as InputSelectItem,\n );\n\n return this.getFilterSelect('room', rooms);\n }\n\n private getFilterSelectFunction(): JSX.Element {\n const func: InputSelectItem[] = this.info.funcEnums.map(\n id =>\n ({\n name: getName(this.objects[id]?.common?.name, this.props.lang) || id.split('.').pop(),\n value: id,\n icon: (\n <Icon\n src={this.objects[id]?.common?.icon || ''}\n style={styles.selectIcon}\n />\n ),\n }) as InputSelectItem,\n );\n\n return this.getFilterSelect('func', func);\n }\n\n private getFilterSelectType(): JSX.Element {\n const types = this.info.types.map(type => ({\n name: type,\n value: type,\n icon: ITEM_IMAGES[type] || null,\n }));\n\n return this.getFilterSelect('type', types);\n }\n\n private getFilterSelectCustoms(): JSX.Element | null {\n if (this.info.customs.length > 1) {\n const customs = this.info.customs.map(id => ({\n name: id === '_' ? this.texts.filterCustomsWithout : id,\n value: id,\n icon:\n id === '_' ? null : (\n <Icon\n src={getSelectIdIconFromObjects(this.objects, id, this.props.lang, this.imagePrefix) || ''}\n style={styles.selectIcon}\n />\n ),\n }));\n return this.getFilterSelect('custom', customs);\n }\n return null;\n }\n\n private onExpandAll(root?: TreeItem, expanded?: string[]): void {\n const _root: TreeItem | null = root || this.root;\n expanded = expanded || [];\n\n _root?.children?.forEach((item: TreeItem) => {\n if (item.data.sumVisibility) {\n expanded.push(item.data.id);\n this.onExpandAll(item, expanded);\n }\n });\n\n if (_root === this.root) {\n expanded.sort();\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n\n this.setState({ expanded });\n }\n }\n\n private onCollapseAll(): void {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify([]));\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectSelected`, '[]');\n this.setState({ expanded: [], depth: 0, selected: [] }, () => this.onAfterSelect());\n }\n\n private expandDepth(root: TreeItem, depth: number, expanded: string[]): void {\n root = root || this.root;\n if (depth > 0) {\n root.children?.forEach(item => {\n if (item.data.sumVisibility) {\n if (!binarySearch(expanded, item.data.id)) {\n expanded.push(item.data.id);\n expanded.sort();\n }\n if (depth - 1 > 0) {\n this.expandDepth(item, depth - 1, expanded);\n }\n }\n });\n }\n }\n\n private static collapseDepth(depth: number, expanded: string[]): string[] {\n return expanded.filter(id => id.split('.').length <= depth);\n }\n\n private onExpandVisible(): void {\n if (this.state.depth < 9) {\n const depth = this.state.depth + 1;\n const expanded = [...this.state.expanded];\n if (this.root) {\n this.expandDepth(this.root, depth, expanded);\n }\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n this.setState({ depth, expanded });\n }\n }\n\n private onStatesViewVisible(): void {\n const statesView = !this.state.statesView;\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectStatesView`, JSON.stringify(statesView));\n this.setState({ statesView });\n }\n\n private onCollapseVisible(): void {\n if (this.state.depth > 0) {\n const depth = this.state.depth - 1;\n const expanded = ObjectBrowserClass.collapseDepth(depth, this.state.expanded);\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n this.setState({ depth, expanded });\n }\n }\n\n private getEnumsForId = (id: string): ioBroker.EnumObject[] | undefined => {\n const result: ioBroker.EnumObject[] = [];\n this.info.enums.forEach(_id => {\n if (this.objects[_id]?.common?.members?.includes(id)) {\n const enumItem: ioBroker.EnumObject = {\n _id: this.objects[_id]._id,\n common: JSON.parse(JSON.stringify(this.objects[_id].common)) as ioBroker.EnumCommon,\n native: this.objects[_id].native,\n type: 'enum',\n } as ioBroker.EnumObject;\n if (enumItem.common) {\n delete enumItem.common.members;\n delete enumItem.common.custom;\n // @ts-expect-error deprecated attribute\n delete enumItem.common.mobile;\n }\n result.push(enumItem);\n }\n });\n\n return result.length ? result : undefined;\n };\n\n private _createAllEnums = async (enums: (string | ioBroker.EnumObject)[], objId: string): Promise<void> => {\n for (let e = 0; e < enums.length; e++) {\n const item: string | ioBroker.EnumObject = enums[e];\n let id: string;\n let newObj: ioBroker.EnumObject | undefined;\n\n // some admin version delivered enums as string\n if (typeof item === 'object') {\n newObj = item;\n id = newObj._id;\n } else {\n id = item;\n }\n\n let oldObj: ioBroker.EnumObject | undefined = this.objects[id] as ioBroker.EnumObject | undefined;\n // if enum does not exist\n if (!oldObj) {\n // create a new one\n oldObj =\n newObj ||\n ({\n _id: id,\n common: {\n name: id.split('.').pop(),\n members: [],\n },\n native: {},\n type: 'enum',\n } as ioBroker.EnumObject);\n\n oldObj.common = oldObj.common || ({} as ioBroker.EnumCommon);\n oldObj.common.members = [objId];\n oldObj.type = 'enum';\n\n await this.props.socket.setObject(id, oldObj);\n } else if (!oldObj.common?.members?.includes(objId)) {\n oldObj.common = oldObj.common || ({} as ioBroker.EnumCommon);\n oldObj.type = 'enum';\n oldObj.common.members = oldObj.common.members || [];\n // add the missing object\n oldObj.common.members.push(objId);\n oldObj.common.members.sort();\n await this.props.socket.setObject(id, oldObj);\n }\n }\n };\n\n private async loadObjects(objs: Record<string, ioBrokerObjectForExport>): Promise<void> {\n if (objs) {\n for (const id in objs) {\n if (!Object.prototype.hasOwnProperty.call(objs, id) || !objs[id]) {\n continue;\n }\n const obj = objs[id];\n let enums = null;\n let val;\n let ack;\n if (obj && obj.common && obj.common.enums) {\n enums = obj.common.enums;\n delete obj.common.enums;\n } else {\n enums = null;\n }\n\n if (obj.val || obj.val === 0) {\n val = obj.val;\n delete obj.val;\n }\n if (obj.ack !== undefined) {\n ack = obj.ack;\n delete obj.ack;\n }\n try {\n await this.props.socket.setObject(id, obj);\n if (enums) {\n await this._createAllEnums(enums, obj._id);\n }\n if (obj.type === 'state') {\n if (val !== undefined && val !== null) {\n try {\n await this.props.socket.setState(obj._id, val, ack !== undefined ? ack : true);\n } catch (e) {\n window.alert(`Cannot set state \"${obj._id} with ${val}\": ${e}`);\n }\n } else {\n try {\n const state = await this.props.socket.getState(obj._id);\n if (!state || state.val === null) {\n try {\n await this.props.socket.setState(\n obj._id,\n !obj.common || obj.common.def === undefined ? null : obj.common.def,\n true,\n );\n } catch (e) {\n window.alert(`Cannot set state \"${obj._id}\": ${e}`);\n }\n }\n } catch (e) {\n window.alert(`Cannot read state \"${obj._id}\": ${e}`);\n }\n }\n }\n } catch (error) {\n window.alert(error);\n }\n }\n }\n }\n\n _getSelectedIdsForExport(): string[] {\n if (this.state.selected.length || this.state.selectedNonObject) {\n const result = [];\n const keys = Object.keys(this.objects);\n keys.sort();\n const id = this.state.selected[0] || this.state.selectedNonObject;\n const idDot = `${id}.`;\n const idLen = idDot.length;\n for (let k = 0; k < keys.length; k++) {\n const key = keys[k];\n if (id === key || key.startsWith(idDot)) {\n result.push(key);\n }\n if (key.substring(0, idLen) > idDot) {\n break;\n }\n }\n\n return result;\n }\n return [];\n }\n\n /**\n * Exports the selected objects based on the given options and triggers file generation\n */\n private async _exportObjects(\n /** Options to filter/reduce the output */\n options: {\n /** Whether all objects should be exported or only the selected ones */\n isAll?: boolean;\n /** Whether the output should be beautified */\n beautify?: boolean;\n /** Whether \"system.repositories\" should be excluded */\n excludeSystemRepositories?: boolean;\n /** Whether translations should be reduced to only the english value */\n excludeTranslations?: boolean;\n /** Whether the values of the states should be not included */\n noStatesByExportImport?: boolean;\n },\n ): Promise<void> {\n if (options.isAll) {\n generateFile('allObjects.json', this.objects, options);\n return;\n }\n if (!(this.state.selected.length || this.state.selectedNonObject)) {\n window.alert(this.props.t('ra_Save of objects-tree is not possible'));\n return;\n }\n const result: Record<string, ioBrokerObjectForExport> = {};\n const id = this.state.selected[0] || this.state.selectedNonObject;\n const ids = this._getSelectedIdsForExport();\n\n for (const key of ids) {\n result[key] = JSON.parse(JSON.stringify(this.objects[key])) as ioBrokerObjectForExport;\n // read states values\n if (result[key]?.type === 'state' && !options.noStatesByExportImport) {\n const state = await this.props.socket.getState(key);\n if (state) {\n result[key].val = state.val;\n result[key].ack = state.ack;\n }\n }\n // add enum information\n if (result[key].common) {\n const enums = this.getEnumsForId(key);\n if (enums) {\n result[key].common.enums = enums;\n }\n }\n }\n\n generateFile(`${id}.json`, result, options);\n }\n\n renderExportDialog(): JSX.Element | null {\n if (this.state.showExportDialog === false) {\n return null;\n }\n return (\n <Dialog\n open={!0}\n maxWidth=\"lg\"\n >\n <DialogTitle>{this.props.t('ra_Select type of export')}</DialogTitle>\n <DialogContent>\n <DialogContentText>\n {this.state.filter.expertMode || this.state.showAllExportOptions ? (\n <>\n {this.props.t('ra_You can export all objects or just the selected branch.')}\n <br />\n {this.props.t('ra_Selected %s object(s)', this.state.showExportDialog)}\n <br />\n <FormControlLabel\n control={\n <Checkbox\n checked={this.state.noStatesByExportImport}\n onChange={e => this.setState({ noStatesByExportImport: e.target.checked })}\n />\n }\n label={this.props.t('ra_Do not export values of states')}\n />\n <br />\n {this.props.t('These options can reduce the size of the export file:')}\n <FormControlLabel\n control={\n <Checkbox\n checked={this.state.beautifyJsonExport}\n onChange={e => this.setState({ beautifyJsonExport: e.target.checked })}\n />\n }\n label={this.props.t('Beautify JSON output')}\n />\n <br />\n <FormControlLabel\n control={\n <Checkbox\n checked={this.state.excludeSystemRepositoriesFromExport}\n onChange={e =>\n this.setState({ excludeSystemRepositoriesFromExport: e.target.checked })\n }\n />\n }\n label={this.props.t('Exclude system repositories from export JSON')}\n />\n <FormControlLabel\n control={\n <Checkbox\n checked={this.state.excludeTranslations}\n onChange={e => this.setState({ excludeTranslations: e.target.checked })}\n />\n }\n label={this.props.t('Exclude translations (except english) from export JSON')}\n />\n </>\n ) : null}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n {this.state.filter.expertMode || this.state.showAllExportOptions ? (\n <Button\n color=\"grey\"\n variant=\"outlined\"\n onClick={() =>\n this.setState({ showExportDialog: false, showAllExportOptions: false }, () =>\n this._exportObjects({\n isAll: true,\n noStatesByExportImport: this.state.noStatesByExportImport,\n beautify: this.state.beautifyJsonExport,\n excludeSystemRepositories: this.state.excludeSystemRepositoriesFromExport,\n excludeTranslations: this.state.excludeTranslations,\n }),\n )\n }\n >\n <span style={{ marginRight: 8 }}>{this.props.t('ra_All objects')}</span>(\n {Object.keys(this.objects).length})\n </Button>\n ) : (\n <Button\n color=\"grey\"\n variant=\"outlined\"\n startIcon={<IconExpert />}\n onClick={() => this.setState({ showAllExportOptions: true })}\n >\n {this.props.t('ra_Advanced options')}\n </Button>\n )}\n <Button\n color=\"primary\"\n variant=\"contained\"\n autoFocus\n onClick={() =>\n this.setState({ showExportDialog: false, showAllExportOptions: false }, () =>\n this._exportObjects({\n isAll: false,\n noStatesByExportImport: this.state.noStatesByExportImport,\n beautify: this.state.beautifyJsonExport,\n excludeSystemRepositories: this.state.excludeSystemRepositoriesFromExport,\n excludeTranslations: this.state.excludeTranslations,\n }),\n )\n }\n >\n <span style={{ marginRight: 8 }}>{this.props.t('ra_Only selected')}</span>(\n {this.state.showExportDialog})\n </Button>\n <Button\n color=\"grey\"\n variant=\"contained\"\n onClick={() => this.setState({ showExportDialog: false, showAllExportOptions: false })}\n startIcon={<IconClose />}\n >\n {this.props.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n private handleJsonUpload(evt: Event): void {\n const target = evt.target as HTMLInputElement;\n const f = target.files?.length && target.files[0];\n if (f) {\n const r = new FileReader();\n r.onload = async e => {\n const contents = e.target?.result;\n try {\n const json = JSON.parse(contents as string);\n const len = Object.keys(json).length;\n const id = json._id;\n // it could be a single object or many objects\n if (id === undefined && len) {\n // many objects\n await this.loadObjects(json as Record<string, ioBrokerObjectForExport>);\n window.alert(this.props.t('ra_%s object(s) processed', len));\n } else {\n // it is only one object in form\n // {\n // \"_id\": \"xxx\",\n // \"common\": \"yyy\",\n // \"native\": \"zzz\"\n // \"val\": JSON.stringify(value)\n // \"ack\": true\n // }\n if (!id) {\n return window.alert(this.props.t('ra_Invalid structure'));\n }\n try {\n let enums;\n let val;\n let ack;\n if (json.common.enums) {\n enums = json.common.enums;\n delete json.common.enums;\n }\n if (json.val) {\n val = json.val;\n delete json.val;\n }\n if (json.ack !== undefined) {\n ack = json.ack;\n delete json.ack;\n }\n await this.props.socket.setObject(json._id, json);\n\n if (json.type === 'state') {\n if (val !== undefined && val !== null) {\n await this.props.socket.setState(json._id, val, ack === undefined ? true : ack);\n } else {\n const state = await this.props.socket.getState(json._id);\n if (!state || state.val === null || state.val === undefined) {\n await this.props.socket.setState(\n json._id,\n json.common.def === undefined ? null : json.common.def,\n true,\n );\n }\n }\n }\n if (enums) {\n await this._createAllEnums(enums, json._id);\n }\n\n window.alert(this.props.t('ra_%s was imported', json._id));\n } catch (err) {\n window.alert(err);\n }\n }\n } catch (err) {\n window.alert(err);\n }\n return null;\n };\n r.readAsText(f);\n } else {\n window.alert(this.props.t('ra_Failed to open JSON File'));\n }\n }\n\n toolTipObjectCreating = (): JSX.Element[] | string => {\n const { t } = this.props;\n\n let value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={2}>{t('ra_Folder → State')}</div>,\n <div key={3}>{t('ra_Folder → Channel → State')}</div>,\n <div key={4}>{t('ra_Folder → Device → Channel → State')}</div>,\n <div key={5}>{t('ra_Device → Channel → State')}</div>,\n <div key={6}>{t('ra_Channel → State')}</div>,\n <div\n key={7}\n style={{ height: 10 }}\n />,\n <div key={8}>{t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}</div>,\n <div key={9}>\n {t(\n 'ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").',\n )}\n </div>,\n ];\n\n if (this.state.selected.length || this.state.selectedNonObject) {\n const id = this.state.selected[0] || this.state.selectedNonObject;\n if (id.split('.').length < 2 || (this.objects[id] && this.objects[id]?.type === 'state')) {\n // show default tooltip\n } else if (this.state.filter.expertMode) {\n switch (this.objects[id]?.type) {\n case 'device':\n value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={5}>{t('ra_Device → Channel → State')}</div>,\n <div\n key={7}\n style={{ height: 10 }}\n />,\n <div key={8}>\n {t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}\n </div>,\n <div key={9}>\n {t(\n 'ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").',\n )}\n </div>,\n ];\n break;\n case 'folder':\n value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={2}>{t('ra_Folder → State')}</div>,\n <div key={3}>{t('ra_Folder → Channel → State')}</div>,\n <div key={4}>{t('ra_Folder → Device → Channel → State')}</div>,\n <div\n key={7}\n style={{ height: 10 }}\n />,\n <div key={8}>\n {t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}\n </div>,\n <div key={9}>\n {t(\n 'ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").',\n )}\n </div>,\n ];\n break;\n case 'channel':\n value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={1}>{t('ra_Channel → State')}</div>,\n <div\n key={7}\n style={{ height: 10 }}\n />,\n <div key={8}>\n {t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}\n </div>,\n <div key={9}>\n {t(\n 'ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").',\n )}\n </div>,\n ];\n break;\n default:\n break;\n }\n } else if (id.startsWith('alias.0') || id.startsWith('0_userdata')) {\n value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={2}>{t('ra_Folder → State')}</div>,\n <div key={3}>{t('ra_Folder → Channel → State')}</div>,\n <div key={4}>{t('ra_Folder → Device → Channel → State')}</div>,\n <div key={5}>{t('ra_Device → Channel → State')}</div>,\n <div key={6}>{t('ra_Channel → State')}</div>,\n <div\n key={7}\n style={{ height: 10 }}\n />,\n <div key={7}>\n {t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}\n </div>,\n <div key={8}>\n {t(\n 'ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").',\n )}\n </div>,\n ];\n }\n }\n\n return value.length ? value : t('ra_Add new child object to selected parent');\n };\n\n /**\n * Renders the toolbar.\n */\n getToolbar(): JSX.Element {\n let allowObjectCreation = false;\n if (this.state.selected.length || this.state.selectedNonObject) {\n const id = this.state.selected[0] || this.state.selectedNonObject;\n\n if (id.split('.').length < 2 || (this.objects[id] && this.objects[id].type === 'state')) {\n allowObjectCreation = false;\n } else if (this.state.filter.expertMode) {\n allowObjectCreation = true;\n } else if (id.startsWith('alias.0') || id.startsWith('0_userdata')) {\n allowObjectCreation = true;\n }\n }\n\n return (\n <div\n style={{\n display: 'flex',\n width: '100%',\n alignItems: 'center',\n overflowX: 'auto',\n }}\n >\n <div\n style={{\n display: 'flex',\n width: '100%',\n alignItems: 'center',\n }}\n >\n <Tooltip\n title={this.props.t('ra_Refresh tree')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div>\n <IconButton\n onClick={() => this.refreshComponent()}\n disabled={this.state.updating}\n size=\"large\"\n >\n <RefreshIcon />\n </IconButton>\n </div>\n </Tooltip>\n {this.props.showExpertButton && !this.props.expertMode && (\n <Tooltip\n title={this.props.t('ra_expertMode')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n key=\"expertMode\"\n color={this.state.filter.expertMode ? 'secondary' : 'default'}\n onClick={() => this.onFilter('expertMode', !this.state.filter.expertMode)}\n size=\"large\"\n >\n <IconExpert />\n </IconButton>\n </Tooltip>\n )}\n {!this.props.disableColumnSelector && this.props.width !== 'xs' && (\n <Tooltip\n title={this.props.t('ra_Configure')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n key=\"columnSelector\"\n color={this.state.columnsAuto ? 'primary' : 'default'}\n onClick={() => this.setState({ columnsSelectorShow: true })}\n size=\"large\"\n >\n <IconColumns />\n </IconButton>\n </Tooltip>\n )}\n {this.props.width !== 'xs' && this.state.expandAllVisible && (\n <Tooltip\n title={this.props.t('ra_Expand all nodes')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n key=\"expandAll\"\n onClick={() => this.onExpandAll()}\n size=\"large\"\n >\n <IconOpen />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip\n title={this.props.t('ra_Collapse all nodes')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n key=\"collapseAll\"\n onClick={() => this.onCollapseAll()}\n size=\"large\"\n >\n <IconClosed />\n </IconButton>\n </Tooltip>\n {this.props.width !== 'xs' && (\n <Tooltip\n title={this.props.t('ra_Expand one step node')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n key=\"expandVisible\"\n color=\"primary\"\n onClick={() => this.onExpandVisible()}\n size=\"large\"\n >\n <Badge\n badgeContent={this.state.depth}\n color=\"secondary\"\n sx={(theme: Theme) => ({\n badge: {\n right: 3,\n top: 3,\n border: `2px solid ${theme.palette.background.paper}`,\n padding: '0 4px',\n },\n })}\n >\n <IconOpen />\n </Badge>\n </IconButton>\n </Tooltip>\n )}\n {this.props.width !== 'xs' && (\n <Tooltip\n title={this.props.t('ra_Collapse one step node')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n key=\"collapseVisible\"\n color=\"primary\"\n onClick={() => this.onCollapseVisible()}\n size=\"large\"\n >\n <Badge\n sx={(theme: Theme) => ({\n badge: {\n right: 3,\n top: 3,\n border: `2px solid ${theme.palette.background.paper}`,\n padding: '0 4px',\n },\n })}\n badgeContent={this.state.depth}\n color=\"secondary\"\n >\n <IconClosed />\n </Badge>\n </IconButton>\n </Tooltip>\n )}\n {this.props.objectStatesView && (\n <Tooltip\n title={this.props.t('ra_Toggle the states view')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n onClick={() => this.onStatesViewVisible()}\n size=\"large\"\n >\n <LooksOneIcon color={this.state.statesView ? 'primary' : 'inherit'} />\n </IconButton>\n </Tooltip>\n )}\n\n <Tooltip\n title={this.props.t('ra_Show/Hide object descriptions')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n onClick={() => {\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.desc`,\n this.state.showDescription ? 'false' : 'true',\n );\n this.setState({ showDescription: !this.state.showDescription });\n }}\n size=\"large\"\n >\n <TextFieldsIcon color={this.state.showDescription ? 'primary' : 'inherit'} />\n </IconButton>\n </Tooltip>\n\n {this.props.objectAddBoolean ? (\n <Tooltip\n title={this.toolTipObjectCreating()}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div>\n <IconButton\n disabled={!allowObjectCreation}\n onClick={() =>\n this.setState({\n modalNewObj: {\n id: this.state.selected[0] || this.state.selectedNonObject,\n },\n })\n }\n size=\"large\"\n >\n <AddIcon />\n </IconButton>\n </div>\n </Tooltip>\n ) : null}\n\n {this.props.objectImportExport && (\n <Tooltip\n title={this.props.t('ra_Add objects tree from JSON file')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n onClick={() => {\n const input = document.createElement('input');\n input.setAttribute('type', 'file');\n input.setAttribute('id', 'files');\n input.setAttribute('opacity', '0');\n input.addEventListener('change', (e: Event) => this.handleJsonUpload(e), false);\n input.click();\n }}\n size=\"large\"\n >\n <PublishIcon />\n </IconButton>\n </Tooltip>\n )}\n {this.props.objectImportExport &&\n (!!this.state.selected.length || this.state.selectedNonObject) && (\n <Tooltip\n title={this.props.t('ra_Save objects tree as JSON file')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n onClick={() =>\n this.setState({ showExportDialog: this._getSelectedIdsForExport().length })\n }\n size=\"large\"\n >\n <PublishIcon style={{ transform: 'rotate(180deg)' }} />\n </IconButton>\n </Tooltip>\n )}\n </div>\n {!!this.props.objectBrowserEditObject && this.props.width !== 'xs' && (\n <div style={{ display: 'flex', whiteSpace: 'nowrap' }}>\n {`${this.props.t('ra_Objects')}: ${Object.keys(this.info.objects).length}, ${this.props.t(\n 'ra_States',\n )}: ${\n Object.keys(this.info.objects).filter(el => this.info.objects[el].type === 'state').length\n }`}\n </div>\n )}\n {this.props.objectEditBoolean && (\n <Tooltip\n title={this.props.t('ra_Edit custom config')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n onClick={() => {\n // get all visible states\n const ids = this.root ? getVisibleItems(this.root, 'state', this.objects) : [];\n\n if (ids.length) {\n this.pauseSubscribe(true);\n\n if (ids.length === 1) {\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.objectSelected`,\n this.state.selected[0],\n );\n this.props.router?.doNavigate(null, 'custom', this.state.selected[0]);\n }\n this.setState({ customDialog: ids, customDialogAll: true });\n } else {\n this.setState({ toast: this.props.t('ra_please select object') });\n }\n }}\n size=\"large\"\n >\n <BuildIcon />\n </IconButton>\n </Tooltip>\n )}\n </div>\n );\n }\n\n private toggleExpanded(id: string): void {\n const expanded = JSON.parse(JSON.stringify(this.state.expanded));\n const pos = expanded.indexOf(id);\n if (pos === -1) {\n expanded.push(id);\n expanded.sort();\n } else {\n expanded.splice(pos, 1);\n }\n\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n\n this.setState({ expanded });\n }\n\n private onCopy(e: React.MouseEvent, text: string | undefined): void {\n e.stopPropagation();\n e.preventDefault();\n if (text) {\n Utils.copyToClipboard(text);\n if (text.length < 50) {\n this.setState({ toast: this.props.t('ra_Copied %s', text) });\n } else {\n this.setState({ toast: this.props.t('ra_Copied') });\n }\n }\n }\n\n renderTooltipAccessControl = (acl: ioBroker.StateACL): null | JSX.Element => {\n // acl ={object,state,owner,ownerGroup}\n if (!acl) {\n return null;\n }\n const check = [\n {\n value: '0x400',\n valueNum: 0x400,\n title: 'read',\n group: 'Owner',\n },\n {\n value: '0x200',\n valueNum: 0x200,\n title: 'write',\n group: 'Owner',\n },\n {\n value: '0x40',\n valueNum: 0x40,\n title: 'read',\n group: 'Group',\n },\n {\n value: '0x20',\n valueNum: 0x20,\n title: 'write',\n group: 'Group',\n },\n {\n value: '0x4',\n valueNum: 0x4,\n title: 'read',\n group: 'Everyone',\n },\n {\n value: '0x2',\n valueNum: 0x2,\n title: 'write',\n group: 'Everyone',\n },\n ];\n const arrayTooltipText = [];\n const funcRenderStateObject = (value: 'object' | 'state'): void => {\n const rights: number = acl[value];\n check.forEach((el, i) => {\n if (rights & el.valueNum) {\n arrayTooltipText.push(\n <span key={value + i}>\n {this.texts[`acl${el.group}_${el.title}_${value}`]},\n <span style={value === 'object' ? styles.rightsObject : styles.rightsState}>\n {el.value}\n </span>\n </span>,\n );\n }\n });\n };\n\n arrayTooltipText.push(\n <span key=\"group\">\n {`${this.texts.ownerGroup}: ${(acl.ownerGroup || '').replace('system.group.', '')}`}\n </span>,\n );\n arrayTooltipText.push(\n <span key=\"owner\">{`${this.texts.ownerUser}: ${(acl.owner || '').replace('system.user.', '')}`}</span>,\n );\n funcRenderStateObject('object');\n if (acl.state) {\n funcRenderStateObject('state');\n }\n\n return arrayTooltipText.length ? (\n <span style={styles.tooltipAccessControl}>{arrayTooltipText.map(el => el)}</span>\n ) : null;\n };\n\n renderColumnButtons(id: string, item: TreeItem): (JSX.Element | null)[] | JSX.Element | null {\n if (!item.data.obj) {\n return this.props.onObjectDelete || this.props.objectEditOfAccessControl ? (\n <div style={styles.buttonDiv}>\n {this.state.filter.expertMode && this.props.objectEditOfAccessControl ? (\n <IconButton\n sx={{\n ...styles.cellButtonsButton,\n ...styles.cellButtonsEmptyButton,\n ...styles.cellButtonMinWidth,\n }}\n onClick={() =>\n this.setState({ modalEditOfAccess: true, modalEditOfAccessObjData: item.data })\n }\n size=\"large\"\n >\n <div style={{ height: 15 }}>---</div>\n </IconButton>\n ) : null}\n {this.props.onObjectDelete && item.children && item.children.length ? (\n <IconButton\n sx={{\n ...styles.cellButtonsButton,\n ...styles.cellButtonsButtonAlone,\n }}\n size=\"small\"\n aria-label=\"delete\"\n title={this.texts.deleteObject}\n onClick={() => {\n // calculate the number of children\n const keys = Object.keys(this.objects);\n keys.sort();\n let count = 0;\n const start = `${id}.`;\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].startsWith(start)) {\n count++;\n } else if (keys[i] > start) {\n break;\n }\n }\n\n if (this.props.onObjectDelete) {\n this.props.onObjectDelete(id, !!item.children?.length, false, count + 1);\n }\n }}\n >\n <IconDelete style={styles.cellButtonsButtonIcon} />\n </IconButton>\n ) : null}\n </div>\n ) : null;\n }\n\n item.data.aclTooltip =\n item.data.aclTooltip || this.renderTooltipAccessControl(item.data.obj.acl as ioBroker.StateACL);\n\n const acl = item.data.obj.acl\n ? item.data.obj.type === 'state'\n ? item.data.obj.acl.state\n : item.data.obj.acl.object\n : 0;\n const aclSystemConfig =\n item.data.obj.acl &&\n (item.data.obj.type === 'state'\n ? this.systemConfig.common.defaultNewAcl.state\n : this.systemConfig.common.defaultNewAcl.object);\n\n const showEdit = this.state.filter.expertMode || ObjectBrowserClass.isNonExpertId(item.data.id);\n\n return [\n this.state.filter.expertMode && this.props.objectEditOfAccessControl ? (\n <Tooltip\n key=\"acl\"\n title={item.data.aclTooltip}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n sx={{\n ...styles.cellButtonsButton,\n ...styles.cellButtonMinWidth,\n opacity: 1,\n }}\n onClick={() => this.setState({ modalEditOfAccess: true, modalEditOfAccessObjData: item.data })}\n size=\"large\"\n >\n <div style={styles.aclText}>\n {Number.isNaN(Number(acl))\n ? Number(aclSystemConfig).toString(16)\n : Number(acl).toString(16)}\n </div>\n </IconButton>\n </Tooltip>\n ) : (\n <div\n key=\"aclEmpty\"\n style={styles.cellButtonMinWidth}\n />\n ),\n\n showEdit ? (\n <IconButton\n key=\"edit\"\n sx={{\n marginRight: '2px',\n ...styles.cellButtonsButton,\n }}\n size=\"small\"\n aria-label=\"edit\"\n title={this.texts.editObject}\n onClick={() => {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectSelected`, id);\n this.setState({ editObjectDialog: id, editObjectAlias: false });\n }}\n >\n <IconEdit style={styles.cellButtonsButtonIcon} />\n </IconButton>\n ) : (\n <Box\n component=\"div\"\n key=\"editDisabled\"\n sx={styles.cellButtonsButton}\n />\n ),\n\n this.props.onObjectDelete && (item.children?.length || !item.data.obj.common?.dontDelete) ? (\n <IconButton\n key=\"delete\"\n sx={styles.cellButtonsButton}\n size=\"small\"\n aria-label=\"delete\"\n onClick={() => {\n const keys = Object.keys(this.objects);\n keys.sort();\n let count = 0;\n const start = `${id}.`;\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].startsWith(start)) {\n count++;\n } else if (keys[i] > start) {\n break;\n }\n }\n if (this.props.onObjectDelete) {\n this.props.onObjectDelete(\n id,\n !!item.children?.length,\n !item.data.obj?.common?.dontDelete,\n count,\n );\n }\n }}\n title={this.texts.deleteObject}\n >\n <IconDelete style={styles.cellButtonsButtonIcon} />\n </IconButton>\n ) : null,\n\n this.props.objectCustomDialog &&\n this.info.hasSomeCustoms &&\n item.data.obj.type === 'state' &&\n // @ts-expect-error deprecated from js-controller 6\n item.data.obj.common?.type !== 'file' ? (\n <IconButton\n sx={{\n ...styles.cellButtonsButton,\n ...(item.data.hasCustoms\n ? this.styles.cellButtonsButtonWithCustoms\n : styles.cellButtonsButtonWithoutCustoms),\n }}\n key=\"custom\"\n size=\"small\"\n aria-label=\"config\"\n title={this.texts.customConfig}\n onClick={() => {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectSelected`, id);\n\n this.pauseSubscribe(true);\n this.props.router?.doNavigate(null, 'customs', id);\n this.setState({ customDialog: [id], customDialogAll: false });\n }}\n >\n <IconConfig style={styles.cellButtonsButtonIcon} />\n </IconButton>\n ) : null,\n ];\n }\n\n private readHistory(id: string): void {\n /* interface GetHistoryOptions {\n instance?: string;\n start?: number;\n end?: number;\n step?: number;\n count?: number;\n from?: boolean;\n ack?: boolean;\n q?: boolean;\n addID?: boolean;\n limit?: number;\n ignoreNull?: boolean;\n sessionId?: any;\n aggregate?: 'minmax' | 'min' | 'max' | 'average' | 'total' | 'count' | 'none';\n } */\n if (\n window.sparkline &&\n this.defaultHistory &&\n this.objects[id]?.common?.custom &&\n this.objects[id].common.custom[this.defaultHistory]\n ) {\n const now = new Date();\n now.setHours(now.getHours() - 24);\n now.setMinutes(0);\n now.setSeconds(0);\n now.setMilliseconds(0);\n const nowMs = now.getTime();\n\n this.props.socket\n .getHistory(id, {\n instance: this.defaultHistory,\n start: nowMs,\n end: Date.now(),\n step: 3600000,\n from: false,\n ack: false,\n q: false,\n addID: false,\n aggregate: 'minmax',\n })\n .then(values => {\n const sparks: HTMLDivElement[] = window.document.getElementsByClassName(\n 'sparkline',\n ) as any as HTMLDivElement[];\n\n for (let s = 0; s < sparks.length; s++) {\n if (sparks[s].dataset.id === id) {\n const v = prepareSparkData(values, nowMs);\n\n window.sparkline.sparkline(sparks[s], v);\n break;\n }\n }\n })\n .catch(e => console.warn(`Cannot read history: ${e}`));\n }\n }\n\n private getTooltipInfo(id: string, cb?: () => void): void {\n const obj = this.objects[id];\n const state = this.states[id];\n\n const { valFull, fileViewer } = formatValue({\n state,\n obj: obj as ioBroker.StateObject,\n texts: this.texts,\n dateFormat: this.props.dateFormat || this.systemConfig.common.dateFormat,\n isFloatComma:\n this.props.isFloatComma === undefined ? this.systemConfig.common.isFloatComma : this.props.isFloatComma,\n full: true,\n });\n const valFullRx: JSX.Element[] = [];\n\n valFull?.forEach(_item => {\n if (_item.t === this.texts.quality && state.q) {\n valFullRx.push(\n <div\n style={styles.cellValueTooltipBoth}\n key={_item.t}\n >\n {_item.t}\n : \n {_item.v}\n </div>,\n );\n // <div style={styles.cellValueTooltipValue} key={item.t + '_v'}>{item.v}</div>,\n if (!_item.nbr) {\n valFullRx.push(<br key={`${_item.t}_br`} />);\n }\n } else {\n valFullRx.push(\n <div\n style={styles.cellValueTooltipTitle}\n key={_item.t}\n >\n {_item.t}\n : \n </div>,\n );\n valFullRx.push(\n <div\n style={styles.cellValueTooltipValue}\n key={`${_item.t}_v`}\n >\n {_item.v}\n </div>,\n );\n if (!_item.nbr) {\n valFullRx.push(<br key={`${_item.t}_br`} />);\n }\n }\n });\n\n if (fileViewer === 'image') {\n valFullRx.push(\n <img\n style={styles.cellValueTooltipImage}\n src={state.val as string}\n alt={id}\n />,\n );\n } else if (\n this.defaultHistory &&\n this.objects[id]?.common?.custom &&\n this.objects[id].common.custom[this.defaultHistory]\n ) {\n valFullRx.push(\n <svg\n key=\"sparkline\"\n className=\"sparkline\"\n data-id={id}\n style={{ fill: '#3d85de' }}\n width=\"200\"\n height=\"30\"\n strokeWidth=\"3\"\n />,\n );\n }\n\n this.setState({ tooltipInfo: { el: valFullRx, id } }, () => cb && cb());\n }\n\n private renderColumnValue(id: string, item: TreeItem, narrowStyleWithDetails?: boolean): JSX.Element | null {\n const obj = item.data.obj;\n if (!obj || !this.states) {\n return null;\n }\n\n if (obj.common?.type === 'file') {\n return (\n <Box\n component=\"div\"\n sx={{ ...styles.cellValueText, ...styles.cellValueFile }}\n >\n [file]\n </Box>\n );\n }\n if (!this.states[id]) {\n if (obj.type === 'state') {\n // we are waiting for state\n if (!this.recordStates.includes(id)) {\n this.recordStates.push(id);\n }\n this.states[id] = { val: null } as ioBroker.State;\n this.subscribe(id);\n }\n return null;\n }\n if (!this.recordStates.includes(id)) {\n this.recordStates.push(id);\n }\n\n const state = this.states[id];\n\n let info = item.data.state;\n if (!info) {\n const { valText } = formatValue({\n state,\n obj: obj as ioBroker.StateObject,\n texts: this.texts,\n dateFormat: this.props.dateFormat || this.systemConfig.common.dateFormat,\n isFloatComma:\n this.props.isFloatComma === undefined\n ? this.systemConfig.common.isFloatComma\n : this.props.isFloatComma,\n });\n const valTextRx: JSX.Element[] = [];\n item.data.state = { valTextRx };\n\n const copyText = valText.v || '';\n valTextRx.push(\n <span\n className={`newValueBrowser-${this.props.themeType || 'light'}`}\n key={`${valText.v.toString()}valText`}\n style={{\n whiteSpace: 'nowrap',\n display: 'inline-block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {valText.v.toString()}\n </span>,\n );\n if (valText.u) {\n valTextRx.push(\n <span\n className={`newValueBrowser-${this.props.themeType || 'light'}`}\n style={styles.cellValueTextUnit}\n key={`${valText.v.toString()}unit`}\n >\n {valText.u}\n </span>,\n );\n }\n if (valText.s !== undefined) {\n valTextRx.push(\n <span\n style={styles.cellValueTextState}\n className={`newValueBrowser-${this.props.themeType || 'light'}`}\n key={`${valText.v.toString()}states`}\n >\n ({valText.s})\n </span>,\n );\n }\n if (!narrowStyleWithDetails) {\n valTextRx.push(\n <IconCopy\n className=\"copyButton\"\n style={this.styles.iconCopy}\n onClick={e => this.onCopy(e, copyText)}\n key=\"cc\"\n />,\n );\n }\n // <IconEdit className=\"copyButton\" style={{{ ...styles.cellButtonsValueButton, styles.cellButtonsValueButtonEdit)} key=\"ce\" />\n\n info = item.data.state;\n }\n\n info.style = getValueStyle({ state, isExpertMode: this.state.filter.expertMode, isButton: item.data.button });\n\n let val: JSX.Element[] = info.valTextRx;\n if (!this.state.filter.expertMode) {\n if (item.data.button) {\n val = [\n <ButtonIcon\n key=\"button\"\n style={{ color: info.style.color, ...styles.cellValueButton }}\n />,\n ];\n } else if (item.data.switch) {\n val = [\n <Switch\n key=\"switch\"\n sx={{\n '& .MuiSwitch-thumb': { color: info.style.color },\n '& .MuiSwitch-track': {\n backgroundColor:\n !!this.states[id].val && this.state.selected.includes(id)\n ? this.props.themeType === 'dark'\n ? '#FFF !important'\n : '#111 !important'\n : undefined,\n },\n }}\n checked={!!this.states[id].val}\n />,\n ];\n }\n }\n\n return (\n <Tooltip\n key=\"value\"\n title={this.state.tooltipInfo?.el}\n slotProps={{\n popper: { sx: styles.cellValueTooltipBox },\n tooltip: { sx: styles.cellValueTooltip },\n }}\n onOpen={() => this.getTooltipInfo(id, () => this.readHistory(id))}\n onClose={() => this.state.tooltipInfo?.id === id && this.setState({ tooltipInfo: null })}\n >\n <Box\n component=\"div\"\n style={info.style}\n sx={{\n ...styles.cellValueText,\n height: narrowStyleWithDetails ? undefined : ROW_HEIGHT,\n '& .admin-button:active': {\n transform: 'translate(0, 2px)',\n },\n }}\n >\n {val}\n </Box>\n </Tooltip>\n );\n }\n\n private _syncEnum(id: string, enumIds: string[], newArray: string[], cb: () => void): void {\n if (!enumIds || !enumIds.length) {\n if (cb) {\n cb();\n }\n return;\n }\n const enumId = enumIds.pop() || '';\n const promises = [];\n if (this.info.objects[enumId]?.common) {\n if (this.info.objects[enumId].common.members?.length) {\n const pos = this.info.objects[enumId].common.members.indexOf(id);\n if (pos !== -1 && !newArray.includes(enumId)) {\n // delete it from members\n const obj = JSON.parse(JSON.stringify(this.info.objects[enumId]));\n obj.common.members.splice(pos, 1);\n promises.push(\n this.props.socket\n .setObject(enumId, obj)\n .then(() => (this.info.objects[enumId] = obj))\n .catch(e => this.showError(e)),\n );\n }\n }\n\n // add to it\n if (newArray.includes(enumId) && !this.info.objects[enumId].common.members?.includes(id)) {\n // add to object\n const obj = JSON.parse(JSON.stringify(this.info.objects[enumId]));\n obj.common.members = obj.common.members || [];\n obj.common.members.push(id);\n obj.common.members.sort();\n promises.push(\n this.props.socket\n .setObject(enumId, obj)\n .then(() => (this.info.objects[enumId] = obj))\n .catch(e => this.showError(e)),\n );\n }\n }\n\n void Promise.all(promises).then(() => {\n setTimeout(() => this._syncEnum(id, enumIds, newArray, cb), 0);\n });\n }\n\n private syncEnum(id: string, enumName: 'func' | 'room', newArray: string[]): Promise<void> {\n const toCheck = [...this.info[enumName === 'func' ? 'funcEnums' : 'roomEnums']];\n\n return new Promise<void>(resolve => {\n this._syncEnum(id, toCheck, newArray, () => {\n // force update of an object\n resolve();\n });\n });\n }\n\n private renderEnumDialog(): JSX.Element | null {\n if (!this.state.enumDialog) {\n return null;\n }\n const type = this.state.enumDialog.type;\n const item = this.state.enumDialog.item;\n const itemEnums: string[] = this.state.enumDialogEnums;\n const enumsOriginal = this.state.enumDialog.enumsOriginal;\n\n const enums = (type === 'room' ? this.info.roomEnums : this.info.funcEnums)\n .map(id => ({\n name: getName(this.objects[id]?.common?.name || id.split('.').pop() || '', this.props.lang),\n value: id,\n icon: getSelectIdIconFromObjects(this.objects, id, this.props.lang, this.imagePrefix),\n }))\n .sort((a, b) => (a.name > b.name ? 1 : -1));\n\n enums.forEach(_item => {\n if (_item.icon && typeof _item.icon === 'string') {\n _item.icon = (\n <Box style={styles.enumIconDiv}>\n <img\n src={_item.icon}\n style={styles.enumIcon}\n alt={_item.name}\n />\n </Box>\n );\n }\n });\n\n // const hasIcons = !!enums.find(item => item.icon);\n\n return (\n <Dialog\n sx={{ '& .MuiPaper-root': styles.enumDialog }}\n onClose={() => this.setState({ enumDialog: null })}\n aria-labelledby=\"enum-dialog-title\"\n open={!0} // true\n >\n <DialogTitle id=\"enum-dialog-title\">\n {type === 'func' ? this.props.t('ra_Define functions') : this.props.t('ra_Define rooms')}\n <Fab\n sx={styles.enumButton}\n color=\"primary\"\n disabled={enumsOriginal === JSON.stringify(itemEnums)}\n size=\"small\"\n onClick={() =>\n this.syncEnum(item.data.id, type, itemEnums).then(() =>\n this.setState({ enumDialog: null, enumDialogEnums: null }),\n )\n }\n >\n <IconCheck />\n </Fab>\n </DialogTitle>\n <List sx={{ '&.MuiList-root': styles.enumList }}>\n {enums.map(_item => {\n let id;\n let name;\n let icon;\n\n if (typeof _item === 'object') {\n id = _item.value;\n name = _item.name;\n icon = _item.icon;\n } else {\n id = _item;\n name = _item;\n }\n const labelId = `checkbox-list-label-${id}`;\n\n return (\n <ListItem\n sx={styles.headerCellSelectItem}\n key={id}\n onClick={() => {\n const pos = itemEnums.indexOf(id);\n const enumDialogEnums = JSON.parse(JSON.stringify(this.state.enumDialogEnums));\n if (pos === -1) {\n enumDialogEnums.push(id);\n enumDialogEnums.sort();\n } else {\n enumDialogEnums.splice(pos, 1);\n }\n this.setState({ enumDialogEnums });\n }}\n secondaryAction={icon}\n >\n <ListItemIcon sx={{ '&.MuiListItemIcon-root': styles.enumCheckbox }}>\n <Checkbox\n edge=\"start\"\n checked={itemEnums.includes(id)}\n tabIndex={-1}\n disableRipple\n inputProps={{ 'aria-labelledby': labelId }}\n />\n </ListItemIcon>\n <ListItemText id={labelId}>{name}</ListItemText>\n </ListItem>\n );\n })}\n </List>\n </Dialog>\n );\n }\n\n private renderEditRoleDialog(): JSX.Element | null {\n if (!this.state.roleDialog || !this.props.objectBrowserEditRole) {\n return null;\n }\n\n if (this.state.roleDialog && this.props.objectBrowserEditRole) {\n const ObjectBrowserEditRole = this.props.objectBrowserEditRole;\n\n return (\n <ObjectBrowserEditRole\n key=\"objectBrowserEditRole\"\n id={this.state.roleDialog}\n socket={this.props.socket}\n t={this.props.t}\n roles={this.info.roles}\n onClose={(obj?: ioBroker.Object | null) => {\n if (obj) {\n this.info.objects[this.state.roleDialog] = obj;\n }\n this.setState({ roleDialog: null });\n }}\n />\n );\n }\n return null;\n }\n\n private onColumnsEditCustomDialogClose(isSave?: boolean): void {\n // cannot be null\n const customColumnDialog: {\n value: boolean | number | string;\n type: 'boolean' | 'number' | 'string';\n initValue: boolean | number | string;\n } = this.customColumnDialog as {\n value: boolean | number | string;\n type: 'boolean' | 'number' | 'string';\n initValue: boolean | number | string;\n };\n\n if (isSave) {\n let value: string | number | boolean = customColumnDialog.value;\n if (customColumnDialog.type === 'boolean') {\n value = value === 'true' || value === true;\n } else if (customColumnDialog.type === 'number') {\n value = parseFloat(value as any as string);\n }\n this.customColumnDialog = null;\n this.props.socket\n .getObject(this.state.columnsEditCustomDialog?.obj?._id || '')\n .then(obj => {\n if (obj && ObjectBrowserClass.setCustomValue(obj, this.state.columnsEditCustomDialog?.it, value)) {\n return this.props.socket.setObject(obj._id, obj);\n }\n throw new Error(this.props.t('ra_Cannot update attribute, because not found in the object'));\n })\n .then(() => this.setState({ columnsEditCustomDialog: null }))\n .catch(e => this.showError(e));\n } else {\n this.customColumnDialog = null;\n this.setState({ columnsEditCustomDialog: null });\n }\n }\n\n private renderColumnsEditCustomDialog(): JSX.Element | null {\n if (!this.state.columnsEditCustomDialog) {\n return null;\n }\n if (!this.customColumnDialog) {\n const value = ObjectBrowserClass.getCustomValue(\n this.state.columnsEditCustomDialog.obj,\n this.state.columnsEditCustomDialog.it,\n );\n this.customColumnDialog = {\n type: (this.state.columnsEditCustomDialog.it.type || typeof value) as 'boolean' | 'string' | 'number',\n initValue: (value === null || value === undefined ? '' : value).toString(),\n value: (value === null || value === undefined ? '' : value).toString(),\n };\n }\n\n return (\n <Dialog\n onClose={() => this.setState({ columnsEditCustomDialog: null })}\n maxWidth=\"md\"\n aria-labelledby=\"custom-dialog-title\"\n open={!0}\n >\n <DialogTitle id=\"custom-dialog-title\">\n {`${this.props.t('ra_Edit object field')}: ${this.state.columnsEditCustomDialog.obj._id}`}\n </DialogTitle>\n <DialogContent>\n <DialogContentText id=\"alert-dialog-description\">\n {this.customColumnDialog.type === 'boolean' ? (\n <FormControlLabel\n control={\n <Checkbox\n onKeyUp={e => e.key === 'Enter' && this.onColumnsEditCustomDialogClose(true)}\n defaultChecked={this.customColumnDialog.value === 'true'}\n onChange={e => {\n const customColumnDialog: {\n value: boolean | number | string;\n type: 'boolean' | 'number' | 'string';\n initValue: boolean | number | string;\n } = this.customColumnDialog as {\n value: boolean | number | string;\n type: 'boolean' | 'number' | 'string';\n initValue: boolean | number | string;\n };\n\n customColumnDialog.value = e.target.checked.toString();\n const changed = customColumnDialog.value !== customColumnDialog.initValue;\n if (changed === !this.state.customColumnDialogValueChanged) {\n this.setState({ customColumnDialogValueChanged: changed });\n }\n }}\n />\n }\n label={`${this.state.columnsEditCustomDialog.it.name} (${this.state.columnsEditCustomDialog.it.pathText})`}\n />\n ) : (\n <TextField\n variant=\"standard\"\n defaultValue={this.customColumnDialog.value}\n fullWidth\n onKeyUp={e => e.key === 'Enter' && this.onColumnsEditCustomDialogClose(true)}\n label={`${this.state.columnsEditCustomDialog.it.name} (${this.state.columnsEditCustomDialog.it.pathText})`}\n onChange={e => {\n const customColumnDialog: {\n value: boolean | number | string;\n type: 'boolean' | 'number' | 'string';\n initValue: boolean | number | string;\n } = this.customColumnDialog as {\n value: boolean | number | string;\n type: 'boolean' | 'number' | 'string';\n initValue: boolean | number | string;\n };\n\n customColumnDialog.value = e.target.value;\n const changed = customColumnDialog.value !== customColumnDialog.initValue;\n if (changed === !this.state.customColumnDialogValueChanged) {\n this.setState({ customColumnDialogValueChanged: changed });\n }\n }}\n autoFocus\n />\n )}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => this.onColumnsEditCustomDialogClose(true)}\n disabled={!this.state.customColumnDialogValueChanged}\n color=\"primary\"\n startIcon={<IconCheck />}\n >\n {this.props.t('ra_Update')}\n </Button>\n <Button\n color=\"grey\"\n variant=\"contained\"\n onClick={() => this.onColumnsEditCustomDialogClose()}\n startIcon={<IconClose />}\n >\n {this.props.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n private static getCustomValue(obj: ioBroker.Object, it: AdapterColumn): string | number | boolean | null {\n if (obj?._id?.startsWith(`${it.adapter}.`) && it.path.length > 1) {\n const p = it.path;\n let value;\n const anyObj: Record<string, any> = obj as Record<string, any>;\n if (anyObj[p[0]] && typeof anyObj[p[0]] === 'object') {\n if (p.length === 2) {\n // most common case\n value = anyObj[p[0]][p[1]];\n } else if (p.length === 3) {\n value =\n anyObj[p[0]][p[1]] && typeof anyObj[p[0]][p[1]] === 'object' ? anyObj[p[0]][p[1]][p[2]] : null;\n } else if (p.length === 4) {\n value =\n anyObj[p[0]][p[1]] && typeof anyObj[p[0]][p[1]] === 'object' && anyObj[p[0]][p[1]][p[2]]\n ? anyObj[p[0]][p[1]][p[2]][p[3]]\n : null;\n } else if (p.length === 5) {\n value =\n anyObj[p[0]][p[1]] &&\n typeof anyObj[p[0]][p[1]] === 'object' &&\n anyObj[p[0]][p[1]][p[2]] &&\n anyObj[p[0]][p[1]][p[2]][p[3]]\n ? anyObj[p[0]][p[1]][p[2]][p[3]][p[4]]\n : null;\n } else if (p.length === 6) {\n value =\n anyObj[p[0]][p[1]] &&\n typeof anyObj[p[0]][p[1]] === 'object' &&\n anyObj[p[0]][p[1]][p[2]] &&\n anyObj[p[0]][p[1]][p[2]][p[3]] &&\n anyObj[p[0]][p[1]][p[2]][p[3]][p[4]]\n ? anyObj[p[0]][p[1]][p[2]][p[3]][p[4]][p[5]]\n : null;\n }\n if (value === undefined || value === null) {\n return null;\n }\n return value;\n }\n }\n\n return null;\n }\n\n private static setCustomValue(obj: ioBroker.Object, it: AdapterColumn, value: string | number | boolean): boolean {\n if (obj?._id?.startsWith(`${it.adapter}.`) && it.path.length > 1) {\n const p = it.path;\n const anyObj: Record<string, any> = obj as Record<string, any>;\n if (anyObj[p[0]] && typeof anyObj[p[0]] === 'object') {\n if (p.length === 2) {\n // most common case\n anyObj[p[0]][p[1]] = value;\n return true;\n }\n if (p.length === 3) {\n if (anyObj[p[0]][p[1]] && typeof anyObj[p[0]][p[1]] === 'object') {\n anyObj[p[0]][p[1]][p[2]] = value;\n return true;\n }\n } else if (p.length === 4) {\n if (\n anyObj[p[0]][p[1]] &&\n typeof anyObj[p[0]][p[1]] === 'object' &&\n anyObj[p[0]][p[1]][p[2]] &&\n typeof anyObj[p[0]][p[1]][p[2]] === 'object'\n ) {\n anyObj[p[0]][p[1]][p[2]][p[3]] = value;\n return true;\n }\n } else if (p.length === 5) {\n if (\n anyObj[p[0]][p[1]] &&\n typeof anyObj[p[0]][p[1]] === 'object' &&\n anyObj[p[0]][p[1]][p[2]] &&\n typeof anyObj[p[0]][p[1]][p[2]] === 'object' &&\n anyObj[p[0]][p[1]][p[2]][p[3]] &&\n typeof anyObj[p[0]][p[1]][p[2]][p[3]] === 'object'\n ) {\n anyObj[p[0]][p[1]][p[2]][p[3]][p[4]] = value;\n return true;\n }\n } else if (p.length === 6) {\n if (\n anyObj[p[0]][p[1]] &&\n typeof anyObj[p[0]][p[1]] === 'object' &&\n anyObj[p[0]][p[1]][p[2]] &&\n typeof anyObj[p[0]][p[1]][p[2]] === 'object' &&\n anyObj[p[0]][p[1]][p[2]][p[3]] &&\n typeof anyObj[p[0]][p[1]][p[2]][p[3]] === 'object' &&\n anyObj[p[0]][p[1]][p[2]][p[3]][p[4]] &&\n typeof anyObj[p[0]][p[1]][p[2]][p[3]][p[4]] === 'object'\n ) {\n anyObj[p[0]][p[1]][p[2]][p[3]][p[4]][p[5]] = value;\n return true;\n }\n }\n }\n }\n return false;\n }\n\n /**\n * Renders a custom value.\n */\n renderCustomValue(obj: ioBroker.Object, it: AdapterColumn, item: TreeItem): JSX.Element | null {\n const text = ObjectBrowserClass.getCustomValue(obj, it);\n if (text !== null && text !== undefined) {\n if (it.edit && !this.props.notEditable && (!it.objTypes || it.objTypes.includes(obj.type))) {\n return (\n <Box\n component=\"div\"\n style={{\n ...styles.columnCustom,\n ...styles.columnCustomEditable,\n ...styles[`columnCustom_${it.align}`],\n }}\n onClick={() =>\n this.setState({\n columnsEditCustomDialog: { item, it, obj },\n customColumnDialogValueChanged: false,\n })\n }\n >\n {text}\n </Box>\n );\n }\n return (\n <Box\n component=\"div\"\n style={{\n ...styles.columnCustom,\n ...styles[`columnCustom_${it.align}`],\n }}\n >\n {text}\n </Box>\n );\n }\n return null;\n }\n\n renderAliasLink(id: string, index?: number, customStyle?: Record<string, any>): JSX.Element | null {\n const _index = index || 0;\n // read the type of operation\n const aliasObj = this.objects[this.info.aliasesMap[id][_index]].common.alias.id;\n if (aliasObj) {\n return (\n <Box\n component=\"div\"\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n const aliasId = this.info.aliasesMap[id][_index];\n // if more than one alias, close the menu\n if (this.info.aliasesMap[id].length > 1) {\n this.setState({ aliasMenu: '' });\n }\n this.onSelect(aliasId);\n setTimeout(() => this.expandAllSelected(() => this.scrollToItem(aliasId)), 100);\n }}\n sx={customStyle || this.styles.aliasAlone}\n >\n <span className=\"admin-browser-arrow\">\n {typeof aliasObj === 'string' || (aliasObj.read === id && aliasObj.write === id)\n ? '↔'\n : aliasObj.read === id\n ? '→'\n : '←'}\n </span>\n {this.info.aliasesMap[id][_index]}\n </Box>\n );\n }\n\n return null;\n }\n\n /**\n * Renders a leaf.\n */\n renderLeaf(\n item: TreeItem,\n isExpanded: boolean | undefined,\n counter: { count: number },\n ): { row: JSX.Element; details: JSX.Element | null } {\n const id = item.data.id;\n counter.count++;\n isExpanded = isExpanded === undefined ? this.state.expanded.includes(id) : isExpanded;\n\n // icon\n let iconFolder;\n const obj = item.data.obj;\n const itemType = obj?.type;\n\n if (\n item.children ||\n itemType === 'folder' ||\n itemType === 'device' ||\n itemType === 'channel' ||\n itemType === 'meta'\n ) {\n iconFolder = isExpanded ? (\n <IconOpen\n style={this.styles.cellIdIconFolder}\n onClick={() => this.toggleExpanded(id)}\n />\n ) : (\n <IconClosed\n style={this.styles.cellIdIconFolder}\n onClick={() => this.toggleExpanded(id)}\n />\n );\n } else if (obj && obj.common && obj.common.write === false && obj.type === 'state') {\n iconFolder = <IconDocumentReadOnly style={this.styles.cellIdIconDocument} />;\n } else {\n iconFolder = <IconDocument style={this.styles.cellIdIconDocument} />;\n }\n\n let iconItem = null;\n if (item.data.icon) {\n if (typeof item.data.icon === 'string') {\n if (item.data.icon.length < 3) {\n iconItem = (\n <span\n className=\"iconOwn\"\n style={styles.cellIdIconOwn}\n >\n {item.data.icon}\n </span>\n ); // utf-8 char\n } else {\n iconItem = (\n <Icon\n style={styles.cellIdIconOwn}\n className=\"iconOwn\"\n src={item.data.icon}\n alt=\"\"\n />\n );\n }\n } else {\n iconItem = item.data.icon;\n }\n }\n\n const common = obj?.common;\n\n const typeImg = (obj?.type && ITEM_IMAGES[obj.type]) || <div className=\"itemIcon\" />;\n\n const paddingLeft = this.levelPadding * (item.data.level || 0);\n\n // recalculate rooms and function names if the language changed\n if (item.data.lang !== this.props.lang) {\n const { rooms, per } = findRoomsForObject(this.info, id, this.props.lang);\n item.data.rooms = rooms.join(', ');\n item.data.per = per;\n const { funcs, pef } = findFunctionsForObject(this.info, id, this.props.lang);\n item.data.funcs = funcs.join(', ');\n item.data.pef = pef;\n item.data.lang = this.props.lang;\n }\n\n const checkbox =\n this.props.multiSelect &&\n this.objects[id] &&\n (!this.props.types || this.props.types.includes(this.objects[id].type)) ? (\n <Checkbox\n style={styles.checkBox}\n checked={this.state.selected.includes(id)}\n />\n ) : null;\n\n let valueEditable =\n !this.props.notEditable &&\n itemType === 'state' &&\n (this.state.filter.expertMode || common?.write !== false);\n if (this.props.objectBrowserViewFile && common?.type === 'file') {\n valueEditable = true;\n }\n const enumEditable =\n !this.props.notEditable &&\n this.objects[id] &&\n (this.state.filter.expertMode || itemType === 'state' || itemType === 'channel' || itemType === 'device');\n\n const checkVisibleObjectType =\n this.state.statesView && (itemType === 'state' || itemType === 'channel' || itemType === 'device');\n\n let newValue = '';\n const newValueTitle = [];\n if (checkVisibleObjectType) {\n newValue = this.states[id]?.from;\n if (newValue === undefined) {\n newValue = ' ';\n } else {\n newValue = newValue ? newValue.replace(/^system\\.adapter\\.|^system\\./, '') : '';\n newValueTitle.push(`${this.texts.stateChangedFrom} ${newValue}`);\n }\n if (obj?.user) {\n const user = obj.user.replace('system.user.', '');\n newValue += `/${user}`;\n newValueTitle.push(`${this.texts.stateChangedBy} ${user}`);\n }\n }\n\n if (obj) {\n if (obj.from) {\n newValueTitle.push(\n `${this.texts.objectChangedFrom} ${obj.from.replace(/^system\\.adapter\\.|^system\\./, '')}`,\n );\n }\n if (obj.user) {\n newValueTitle.push(`${this.texts.objectChangedBy} ${obj.user.replace(/^system\\.user\\./, '')}`);\n }\n if (obj.ts) {\n newValueTitle.push(\n `${this.texts.objectChangedByUser} ${Utils.formatDate(new Date(obj.ts), this.props.dateFormat || this.systemConfig.common.dateFormat)}`,\n );\n }\n }\n\n let readWriteAlias = false;\n let alias: JSX.Element | null = null;\n if (id.startsWith('alias.') && common?.alias?.id) {\n readWriteAlias = typeof common.alias.id === 'object';\n if (readWriteAlias) {\n alias = (\n <div style={styles.cellIdAliasReadWriteDiv}>\n {common.alias.id.read ? (\n <Box\n component=\"div\"\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n this.onSelect(common.alias.id.read);\n setTimeout(\n () => this.expandAllSelected(() => this.scrollToItem(common.alias.id.read)),\n 100,\n );\n }}\n sx={this.styles.aliasReadWrite}\n >\n ←{common.alias.id.read}\n </Box>\n ) : null}\n {common.alias.id.write ? (\n <Box\n component=\"div\"\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n this.onSelect(common.alias.id.write);\n setTimeout(\n () => this.expandAllSelected(() => this.scrollToItem(common.alias.id.write)),\n 100,\n );\n }}\n sx={this.styles.aliasReadWrite}\n >\n →{common.alias.id.write}\n </Box>\n ) : null}\n </div>\n );\n } else {\n alias = (\n <Box\n component=\"div\"\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n this.onSelect(common.alias.id);\n setTimeout(() => this.expandAllSelected(() => this.scrollToItem(common.alias.id)), 100);\n }}\n sx={this.styles.aliasAlone}\n >\n →{common.alias.id}\n </Box>\n );\n }\n } else if (this.info.aliasesMap[id]) {\n // Some alias points to this object. It can be more than one\n if (this.info.aliasesMap[id].length > 1) {\n // Show number of aliases and open a menu by click\n alias = (\n <Box\n component=\"div\"\n id={`alias_${id}`}\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n this.setState({ aliasMenu: id });\n }}\n sx={this.styles.aliasAlone}\n >\n {this.props.t('ra_%s links from aliases', this.info.aliasesMap[id].length)}\n </Box>\n );\n } else {\n // Show name of alias and open it by click\n alias = this.renderAliasLink(id, 0);\n }\n }\n\n let checkColor = common?.color;\n let invertBackground;\n if (checkColor && !this.state.selected.includes(id)) {\n const background =\n this.props.themeName === 'dark' ? '#1f1f1f' : this.props.themeName === 'blue' ? '#222a2e' : '#FFFFFF';\n const distance = Utils.colorDistance(checkColor, background);\n // console.log(`Distance: ${checkColor} - ${background} = ${distance}`);\n if (distance < 1000) {\n invertBackground = this.props.themeType === 'dark' ? '#9a9a9a' : '#565656';\n }\n }\n let bold = false;\n if (id === '0_userdata') {\n checkColor = COLOR_NAME_USERDATA(this.props.themeType);\n bold = true;\n } else if (id === 'alias') {\n checkColor = COLOR_NAME_ALIAS(this.props.themeType);\n bold = true;\n } else if (id === 'javascript') {\n checkColor = COLOR_NAME_JAVASCRIPT(this.props.themeType);\n bold = true;\n } else if (id === 'system') {\n checkColor = COLOR_NAME_SYSTEM(this.props.themeType);\n bold = true;\n } else if (id === 'system.adapter') {\n checkColor = COLOR_NAME_SYSTEM_ADAPTER(this.props.themeType);\n } else if (!checkColor || this.state.selected.includes(id)) {\n checkColor = 'inherit';\n }\n\n const icons = [];\n\n if (common?.statusStates) {\n const ids: Record<string, string> = {};\n Object.keys(common.statusStates).forEach(name => {\n let _id = common.statusStates[name];\n if (_id.split('.').length < 3) {\n _id = `${id}.${_id}`;\n }\n ids[name] = _id;\n\n if (!this.states[_id]) {\n if (this.objects[_id]?.type === 'state') {\n if (!this.recordStates.includes(_id)) {\n this.recordStates.push(_id);\n }\n this.states[_id] = { val: null } as ioBroker.State;\n this.subscribe(_id);\n }\n } else if (!this.recordStates.includes(_id)) {\n this.recordStates.push(_id);\n }\n });\n // calculate color\n // errorId has priority\n let colorSet = false;\n if (common.statusStates.errorId && this.states[ids.errorId] && this.states[ids.errorId].val) {\n checkColor = this.props.themeType === 'dark' ? COLOR_NAME_ERROR_DARK : COLOR_NAME_ERROR_LIGHT;\n colorSet = true;\n icons.push(\n <IconError\n key=\"error\"\n // title={this.texts.deviceError}\n style={this.styles.iconDeviceError}\n />,\n );\n }\n\n if (ids.onlineId && this.states[ids.onlineId]) {\n if (!colorSet) {\n if (this.states[ids.onlineId].val) {\n checkColor =\n this.props.themeType === 'dark' ? COLOR_NAME_CONNECTED_DARK : COLOR_NAME_CONNECTED_LIGHT;\n icons.push(\n <IconConnection\n key=\"conn\"\n // title={this.texts.deviceError}\n style={this.styles.iconDeviceConnected}\n />,\n );\n } else {\n checkColor =\n this.props.themeType === 'dark'\n ? COLOR_NAME_DISCONNECTED_DARK\n : COLOR_NAME_DISCONNECTED_LIGHT;\n icons.push(\n <IconDisconnected\n key=\"disc\"\n // title={this.texts.deviceError}\n style={this.styles.iconDeviceDisconnected}\n />,\n );\n }\n } else if (this.states[ids.onlineId].val) {\n icons.push(\n <IconConnection\n key=\"conn\"\n // title={this.texts.deviceError}\n style={this.styles.iconDeviceConnected}\n />,\n );\n } else {\n icons.push(\n <IconDisconnected\n key=\"disc\"\n // title={this.texts.deviceError}\n style={this.styles.iconDeviceDisconnected}\n />,\n );\n }\n } else if (ids.offlineId && this.states[ids.offlineId]) {\n if (!colorSet) {\n if (this.states[ids.offlineId].val) {\n checkColor =\n this.props.themeType === 'dark'\n ? COLOR_NAME_DISCONNECTED_DARK\n : COLOR_NAME_DISCONNECTED_LIGHT;\n icons.push(\n <IconDisconnected\n key=\"disc\"\n // title={this.texts.deviceError}\n style={this.styles.iconDeviceDisconnected}\n />,\n );\n } else {\n checkColor =\n this.props.themeType === 'dark' ? COLOR_NAME_CONNECTED_DARK : COLOR_NAME_CONNECTED_LIGHT;\n icons.push(\n <IconConnection\n key=\"conn\"\n // title={this.texts.deviceError}\n style={this.styles.iconDeviceConnected}\n />,\n );\n }\n } else if (this.states[ids.offlineId].val) {\n icons.push(\n <IconDisconnected\n key=\"disc\"\n // title={this.texts.deviceError}\n style={this.styles.iconDeviceDisconnected}\n />,\n );\n } else {\n icons.push(\n <IconConnection\n key=\"conn\"\n // title={this.texts.deviceError}\n style={this.styles.iconDeviceConnected}\n />,\n );\n }\n }\n }\n\n const q = checkVisibleObjectType ? Utils.quality2text(this.states[id]?.q || 0).join(', ') : null;\n\n let name: JSX.Element[] | string = item.data?.title || '';\n let useDesc = false;\n if (this.state.showDescription) {\n const oTooltip: string | null = getObjectTooltip(item.data, this.props.lang);\n if (oTooltip) {\n name = [\n <div\n key=\"name\"\n style={styles.cellNameDivDiv}\n >\n {name}\n </div>,\n <div\n key=\"desc\"\n style={styles.cellDescription}\n >\n {oTooltip}\n </div>,\n ];\n useDesc = !!oTooltip;\n }\n }\n\n const narrowStyleWithDetails = this.props.width === 'xs' && this.state.focused === id;\n\n const colID = (\n <Grid2\n container\n wrap=\"nowrap\"\n direction=\"row\"\n sx={styles.cellId}\n style={{ width: this.columnsVisibility.id, paddingLeft }}\n >\n <Grid2\n container\n alignItems=\"center\"\n >\n {checkbox}\n {iconFolder}\n </Grid2>\n <Grid2\n style={{\n ...styles.cellIdSpan,\n ...(invertBackground ? this.styles.invertedBackground : undefined),\n color: checkColor,\n fontWeight: bold ? 'bold' : undefined,\n }}\n >\n <Tooltip\n title={getIdFieldTooltip(item.data, this.props.lang)}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div>{item.data.name}</div>\n </Tooltip>\n {alias}\n {icons}\n </Grid2>\n <div style={{ ...styles.grow, ...(invertBackground ? this.styles.invertedBackgroundFlex : {}) }} />\n <Grid2\n container\n alignItems=\"center\"\n >\n {iconItem}\n </Grid2>\n {this.props.width !== 'xs' ? (\n <div>\n <IconCopy\n className={narrowStyleWithDetails ? '' : 'copyButton'}\n style={styles.cellCopyButton}\n onClick={e => this.onCopy(e, id)}\n />\n </div>\n ) : null}\n </Grid2>\n );\n\n let colName =\n (narrowStyleWithDetails && name) || this.columnsVisibility.name ? (\n <Box\n component=\"div\"\n sx={{\n ...styles.cellName,\n ...(useDesc ? styles.cellNameWithDesc : undefined),\n width: this.props.width !== 'xs' ? this.columnsVisibility.name : undefined,\n ml: narrowStyleWithDetails ? 0 : '5px',\n }}\n >\n {name}\n {!narrowStyleWithDetails && item.data?.title ? (\n <Box style={{ color: checkColor }}>\n <IconCopy\n className=\"copyButton\"\n style={styles.cellCopyButton}\n onClick={e => this.onCopy(e, item.data?.title)}\n />\n </Box>\n ) : null}\n </Box>\n ) : null;\n\n let colMiddle:\n | ({\n el: JSX.Element;\n type:\n | 'filter_type'\n | 'filter_role'\n | 'filter_func'\n | 'filter_room'\n | 'quality'\n | 'from'\n | 'lc'\n | 'ts';\n onClick?: (() => void) | null | undefined;\n } | null)[]\n | null;\n if (!this.state.statesView) {\n colMiddle = [\n (narrowStyleWithDetails && obj?.type) || this.columnsVisibility.type\n ? {\n el: (\n <div\n key=\"type\"\n style={{\n ...styles.cellType,\n width: this.props.width !== 'xs' ? this.columnsVisibility.type : undefined,\n }}\n >\n {typeImg}\n \n {obj?.type}\n </div>\n ),\n type: 'filter_type',\n }\n : null,\n (narrowStyleWithDetails && common) || this.columnsVisibility.role\n ? {\n el: (\n <div\n key=\"role\"\n style={{\n ...styles.cellRole,\n width: this.props.width !== 'xs' ? this.columnsVisibility.role : '100%',\n cursor:\n this.state.filter.expertMode &&\n enumEditable &&\n this.props.objectBrowserEditRole\n ? 'text'\n : 'default',\n }}\n onClick={\n !narrowStyleWithDetails &&\n this.state.filter.expertMode &&\n enumEditable &&\n this.props.objectBrowserEditRole\n ? () => this.setState({ roleDialog: item.data.id })\n : undefined\n }\n >\n {common?.role}\n </div>\n ),\n type: 'filter_role',\n onClick:\n narrowStyleWithDetails &&\n this.state.filter.expertMode &&\n enumEditable &&\n this.props.objectBrowserEditRole\n ? () => this.setState({ roleDialog: item.data.id })\n : undefined,\n }\n : null,\n (narrowStyleWithDetails && common) || this.columnsVisibility.room\n ? {\n el: (\n <div\n key=\"room\"\n style={{\n ...styles.cellRoom,\n ...(item.data.per ? styles.cellEnumParent : {}),\n width: this.props.width !== 'xs' ? this.columnsVisibility.room : '100%',\n cursor: enumEditable ? 'text' : 'default',\n }}\n onClick={\n !narrowStyleWithDetails && enumEditable\n ? () => {\n const enums = findEnumsForObjectAsIds(\n this.info,\n item.data.id,\n 'roomEnums',\n );\n this.setState({\n enumDialogEnums: enums,\n enumDialog: {\n item,\n type: 'room',\n enumsOriginal: JSON.stringify(enums),\n },\n });\n }\n : undefined\n }\n >\n {item.data.rooms}\n </div>\n ),\n type: 'filter_room',\n onClick:\n narrowStyleWithDetails && enumEditable\n ? () => {\n const enums = findEnumsForObjectAsIds(this.info, item.data.id, 'roomEnums');\n this.setState({\n enumDialogEnums: enums,\n enumDialog: {\n item,\n type: 'room',\n enumsOriginal: JSON.stringify(enums),\n },\n });\n }\n : undefined,\n }\n : null,\n (narrowStyleWithDetails && common) || this.columnsVisibility.func\n ? {\n el: (\n <div\n key=\"func\"\n style={{\n ...styles.cellFunc,\n ...(item.data.pef ? styles.cellEnumParent : {}),\n width: this.props.width !== 'xs' ? this.columnsVisibility.func : '100%',\n cursor: enumEditable ? 'text' : 'default',\n }}\n onClick={\n !narrowStyleWithDetails && enumEditable\n ? () => {\n const enums = findEnumsForObjectAsIds(\n this.info,\n item.data.id,\n 'funcEnums',\n );\n this.setState({\n enumDialogEnums: enums,\n enumDialog: {\n item,\n type: 'func',\n enumsOriginal: JSON.stringify(enums),\n },\n });\n }\n : undefined\n }\n >\n {item.data.funcs}\n </div>\n ),\n type: 'filter_func',\n onClick:\n narrowStyleWithDetails && enumEditable\n ? () => {\n const enums = findEnumsForObjectAsIds(this.info, item.data.id, 'funcEnums');\n this.setState({\n enumDialogEnums: enums,\n enumDialog: {\n item,\n type: 'func',\n enumsOriginal: JSON.stringify(enums),\n },\n });\n }\n : undefined,\n }\n : null,\n ];\n } else {\n colMiddle = [\n (narrowStyleWithDetails && checkVisibleObjectType && this.states[id]?.from) ||\n this.columnsVisibility.changedFrom\n ? {\n el: (\n <div\n key=\"from\"\n style={{\n ...styles.cellRole,\n width: this.props.width !== 'xs' ? this.columnsVisibility.changedFrom : undefined,\n }}\n title={newValueTitle.join('\\n')}\n >\n {checkVisibleObjectType && this.states[id]?.from ? newValue : null}\n </div>\n ),\n type: 'from',\n }\n : null,\n (narrowStyleWithDetails && q) || this.columnsVisibility.qualityCode\n ? {\n el: (\n <div\n key=\"q\"\n style={{\n ...styles.cellRole,\n width: this.props.width !== 'xs' ? this.columnsVisibility.qualityCode : undefined,\n }}\n title={q || ''}\n >\n {q}\n </div>\n ),\n type: 'quality',\n }\n : null,\n (narrowStyleWithDetails && checkVisibleObjectType && this.states[id]?.ts) ||\n this.columnsVisibility.timestamp\n ? {\n el: (\n <div\n key=\"ts\"\n style={{\n ...styles.cellRole,\n width: this.props.width !== 'xs' ? this.columnsVisibility.timestamp : undefined,\n }}\n >\n {checkVisibleObjectType && this.states[id]?.ts\n ? Utils.formatDate(\n new Date(this.states[id].ts),\n this.props.dateFormat || this.systemConfig.common.dateFormat,\n )\n : null}\n </div>\n ),\n type: 'ts',\n }\n : null,\n (narrowStyleWithDetails && checkVisibleObjectType && this.states[id]?.lc) ||\n this.columnsVisibility.lastChange\n ? {\n el: (\n <div\n key=\"lc\"\n style={{\n ...styles.cellRole,\n width: this.props.width !== 'xs' ? this.columnsVisibility.lastChange : undefined,\n }}\n >\n {checkVisibleObjectType && this.states[id]?.lc\n ? Utils.formatDate(\n new Date(this.states[id].lc),\n this.props.dateFormat || this.systemConfig.common.dateFormat,\n )\n : null}\n </div>\n ),\n type: 'lc',\n }\n : null,\n ];\n }\n\n let colCustom: JSX.Element[] | null =\n this.adapterColumns?.map(it => (\n <div\n style={{\n ...styles.cellAdapter,\n width:\n this.props.width !== 'xs'\n ? (this.columnsVisibility as Record<string, number>)[it.id]\n : undefined,\n }}\n key={it.id}\n title={`${it.adapter} => ${it.pathText}`}\n >\n {obj ? this.renderCustomValue(obj, it, item) : null}\n </div>\n )) || null;\n\n const columnValue =\n narrowStyleWithDetails || this.columnsVisibility.val\n ? this.renderColumnValue(id, item, narrowStyleWithDetails)\n : null;\n\n let colValue =\n (narrowStyleWithDetails && columnValue) || this.columnsVisibility.val ? (\n <div\n style={{\n ...styles.cellValue,\n width: this.props.width !== 'xs' ? this.columnsVisibility.val : 'calc(100% - 100px)',\n cursor: valueEditable\n ? common?.type === 'file'\n ? 'zoom-in'\n : item.data.button\n ? 'grab'\n : 'text'\n : 'default',\n }}\n onClick={\n valueEditable\n ? () => {\n if (!obj || !this.states) {\n // return;\n } else if (common?.type === 'file') {\n this.setState({ viewFileDialog: id });\n } else if (!this.state.filter.expertMode && item.data.button) {\n // in non-expert mode control button directly\n this.props.socket\n .setState(id, true)\n .catch(e => window.alert(`Cannot write state \"${id}\": ${e}`));\n } else if (!this.state.filter.expertMode && item.data.switch) {\n // in non-expert mode control switch directly\n this.props.socket\n .setState(id, !this.states[id].val)\n .catch(e => window.alert(`Cannot write state \"${id}\": ${e}`));\n } else {\n this.edit = {\n val: this.states[id] ? this.states[id].val : '',\n q: this.states[id] ? this.states[id].q || 0 : 0,\n ack: false,\n id,\n };\n this.setState({ updateOpened: true });\n }\n }\n : undefined\n }\n >\n {columnValue}\n </div>\n ) : null;\n\n let colButtons =\n narrowStyleWithDetails || this.columnsVisibility.buttons ? (\n <div\n style={{\n ...styles.cellButtons,\n width: this.props.width !== 'xs' ? this.columnsVisibility.buttons : undefined,\n }}\n >\n {this.renderColumnButtons(id, item)}\n </div>\n ) : null;\n\n let colDetails: JSX.Element | null = null;\n if (this.props.width === 'xs' && this.state.focused === id) {\n colMiddle = colMiddle.filter(a => a);\n let renderedMiddle: (JSX.Element | null)[] | null;\n if (!colMiddle.length) {\n renderedMiddle = null;\n } else {\n renderedMiddle = colMiddle.map(it => {\n if (!it) {\n return null;\n }\n return (\n <div\n key={it.type}\n style={styles.cellDetailsLine}\n >\n <span style={styles.cellDetailsName}>{this.texts[it.type]}:</span>\n {it.el}\n <div style={{ flexGrow: 1 }} />\n {it.onClick ? (\n <IconEdit\n style={styles.cellCopyButtonInDetails}\n onClick={() => {\n if (it?.onClick) {\n it.onClick();\n }\n }}\n />\n ) : null}\n </div>\n );\n });\n }\n if (!colCustom.length) {\n colCustom = null;\n }\n colDetails = (\n <Paper\n style={{\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n padding: 10,\n backgroundColor: this.props.theme.palette.mode === 'dark' ? '#333' : '#ccc',\n }}\n >\n <div style={styles.cellDetailsLine}>\n <div style={{ flexGrow: 1 }} />\n <IconCopy\n style={styles.cellCopyButtonInDetails}\n onClick={e => this.onCopy(e, id)}\n />\n </div>\n {colName && (\n <div style={styles.cellDetailsLine}>\n <span style={styles.cellDetailsName}>{this.texts.name}:</span>\n {colName}\n <div style={{ flexGrow: 1 }} />\n {item.data?.title ? (\n <IconCopy\n className=\"copyButton\"\n style={styles.cellCopyButtonInDetails}\n onClick={e => this.onCopy(e, item.data?.title)}\n />\n ) : null}\n </div>\n )}\n {renderedMiddle}\n {colCustom && <div style={styles.cellDetailsLine}>{colCustom}</div>}\n {this.objects[id]?.type === 'state' && (\n <div style={styles.cellDetailsLine}>\n <span style={styles.cellDetailsName}>{this.texts.value}:</span>\n {colValue}\n <div style={{ flexGrow: 1 }} />\n <IconCopy\n className=\"copyButton\"\n style={styles.cellCopyButtonInDetails}\n onClick={e => {\n const { valText } = formatValue({\n state: this.states[id],\n obj: this.objects[id] as ioBroker.StateObject,\n texts: this.texts,\n dateFormat: this.props.dateFormat || this.systemConfig.common.dateFormat,\n isFloatComma:\n this.props.isFloatComma === undefined\n ? this.systemConfig.common.isFloatComma\n : this.props.isFloatComma,\n });\n this.onCopy(e, valText.v.toString());\n }}\n key=\"cc\"\n />\n </div>\n )}\n {colButtons && (\n <div style={{ ...styles.cellDetailsLine, justifyContent: 'right' }}>{colButtons}</div>\n )}\n </Paper>\n );\n\n colName = null;\n colMiddle = null;\n colCustom = null;\n colValue = null;\n colButtons = null;\n }\n\n const row = (\n <Grid2\n container\n direction=\"row\"\n wrap=\"nowrap\"\n sx={Utils.getStyle(\n this.props.theme,\n styles.tableRow,\n this.state.linesEnabled && styles.tableRowLines,\n !this.props.dragEnabled && styles.tableRowNoDragging,\n alias && styles.tableRowAlias,\n readWriteAlias && styles.tableRowAliasReadWrite,\n this.state.focused === id && this.props.multiSelect && styles.tableRowFocused,\n !item.data.visible && styles.filteredOut,\n item.data.hasVisibleParent &&\n !item.data.visible &&\n !item.data.hasVisibleChildren &&\n styles.filteredParentOut,\n this.state.selected.includes(id) && styles.itemSelected,\n this.state.selectedNonObject === id && styles.itemSelected,\n )}\n key={id}\n id={id}\n onMouseDown={e => {\n this.onSelect(id);\n let isRightMB;\n if ('which' in e) {\n // Gecko (Firefox), WebKit (Safari/Chrome) & Opera\n isRightMB = e.which === 3;\n } else if ('button' in e) {\n // IE, Opera\n isRightMB = e.button === 2;\n }\n if (isRightMB) {\n this.contextMenu = {\n item,\n ts: Date.now(),\n };\n } else {\n this.contextMenu = null;\n }\n }}\n onDoubleClick={() => {\n if (!item.children) {\n this.onSelect(id, true);\n } else {\n this.toggleExpanded(id);\n }\n }}\n >\n {colID}\n {colName}\n {colMiddle?.map(it => it?.el)}\n {colCustom}\n {colValue}\n {colButtons}\n </Grid2>\n );\n return { row, details: colDetails };\n }\n\n /**\n * Renders an item.\n */\n renderItem(root: TreeItem, isExpanded: boolean | undefined, counter?: { count: number }): JSX.Element[] {\n const items: (JSX.Element | null)[] = [];\n counter = counter || { count: 0 };\n const result = this.renderLeaf(root, isExpanded, counter);\n let leaf: JSX.Element;\n const DragWrapper = this.props.DragWrapper;\n if (this.props.dragEnabled && DragWrapper) {\n if (root.data.sumVisibility) {\n leaf = (\n <DragWrapper\n key={root.data.id}\n item={root}\n style={styles.draggable}\n >\n {result.row}\n </DragWrapper>\n );\n } else {\n // change cursor\n leaf = (\n <div\n key={root.data.id}\n style={styles.nonDraggable}\n >\n {result.row}\n </div>\n );\n }\n } else {\n leaf = result.row;\n }\n if (root.data.id && leaf) {\n items.push(leaf);\n }\n if (result.details) {\n items.push(result.details);\n }\n\n isExpanded = isExpanded === undefined ? binarySearch(this.state.expanded, root.data.id) : isExpanded;\n\n if (!root.data.id || isExpanded) {\n if (!this.state.foldersFirst) {\n if (root.children) {\n items.push(\n root.children.map(item => {\n // do not render too many items in column editor mode\n if (!this.state.columnsSelectorShow || counter.count < 15) {\n if (item.data.sumVisibility) {\n return this.renderItem(item, undefined, counter);\n }\n }\n return null;\n }) as any as JSX.Element,\n );\n }\n } else if (root.children) {\n // first only folder\n items.push(\n root.children.map(item => {\n if (item.children) {\n // do not render too many items in column editor mode\n if (!this.state.columnsSelectorShow || counter.count < 15) {\n if (item.data.sumVisibility) {\n return this.renderItem(item, undefined, counter);\n }\n }\n }\n\n return null;\n }) as any as JSX.Element,\n );\n\n // then items\n items.push(\n root.children.map(item => {\n if (!item.children) {\n // do not render too many items in column editor mode\n if (!this.state.columnsSelectorShow || counter.count < 15) {\n if (item.data.sumVisibility) {\n return this.renderItem(item, undefined, counter);\n }\n }\n }\n return null;\n }) as any as JSX.Element,\n );\n }\n }\n\n return items;\n }\n\n private calculateColumnsVisibility(\n aColumnsAuto?: boolean | null,\n aColumns?: string[] | null,\n aColumnsForAdmin?: Record<string, CustomAdminColumnStored[]> | null,\n aColumnsWidths?: Record<string, number>,\n ): void {\n let columnsWidths: Record<string, number> = aColumnsWidths || this.state.columnsWidths;\n const columnsForAdmin: Record<string, CustomAdminColumnStored[]> | null =\n aColumnsForAdmin || this.state.columnsForAdmin;\n const columns: string[] = aColumns || this.state.columns || [];\n const columnsAuto: boolean = typeof aColumnsAuto !== 'boolean' ? this.state.columnsAuto : aColumnsAuto;\n\n columnsWidths = JSON.parse(JSON.stringify(columnsWidths));\n Object.keys(columnsWidths).forEach(name => {\n if (columnsWidths[name]) {\n columnsWidths[name] = parseInt(columnsWidths[name] as any as string, 10) || 0;\n }\n });\n\n this.adapterColumns = [];\n const WIDTHS = SCREEN_WIDTHS[this.props.width || 'lg'].widths;\n\n if (columnsAuto) {\n this.columnsVisibility = {\n id: SCREEN_WIDTHS[this.props.width || 'lg'].idWidth,\n name: this.visibleCols.includes('name') ? WIDTHS.name || 0 : 0,\n nameHeader: this.visibleCols.includes('name') ? WIDTHS.name || 0 : 0,\n type: this.visibleCols.includes('type') ? WIDTHS.type || 0 : 0,\n role: this.visibleCols.includes('role') ? WIDTHS.role || 0 : 0,\n room: this.visibleCols.includes('room') ? WIDTHS.room || 0 : 0,\n func: this.visibleCols.includes('func') ? WIDTHS.func || 0 : 0,\n changedFrom: this.visibleCols.includes('changedFrom') ? WIDTHS.changedFrom || 0 : 0,\n qualityCode: this.visibleCols.includes('qualityCode') ? WIDTHS.qualityCode || 0 : 0,\n timestamp: this.visibleCols.includes('timestamp') ? WIDTHS.timestamp || 0 : 0,\n lastChange: this.visibleCols.includes('lastChange') ? WIDTHS.lastChange || 0 : 0,\n val: this.visibleCols.includes('val') ? WIDTHS.val || 0 : 0,\n buttons: this.visibleCols.includes('buttons') ? WIDTHS.buttons || 0 : 0,\n };\n\n // in xs name is not visible\n if (this.columnsVisibility.name && !this.customWidth) {\n let widthSum: number = (this.columnsVisibility.id as number) || 0; // id is always visible\n if (this.state.statesView) {\n widthSum += this.columnsVisibility.changedFrom || 0;\n widthSum += this.columnsVisibility.qualityCode || 0;\n widthSum += this.columnsVisibility.timestamp || 0;\n widthSum += this.columnsVisibility.lastChange || 0;\n } else {\n widthSum += this.columnsVisibility.type || 0;\n widthSum += this.columnsVisibility.role || 0;\n widthSum += this.columnsVisibility.room || 0;\n widthSum += this.columnsVisibility.func || 0;\n }\n widthSum += this.columnsVisibility.val || 0;\n widthSum += this.columnsVisibility.buttons || 0;\n this.columnsVisibility.name = `calc(100% - ${widthSum + 5}px)`;\n this.columnsVisibility.nameHeader = `calc(100% - ${widthSum + 5 + this.state.scrollBarWidth}px)`;\n } else if (!this.customWidth) {\n // Calculate the width of ID\n let widthSum = 0; // id is always visible\n if (this.state.statesView) {\n widthSum += this.columnsVisibility.changedFrom || 0;\n widthSum += this.columnsVisibility.qualityCode || 0;\n widthSum += this.columnsVisibility.timestamp || 0;\n widthSum += this.columnsVisibility.lastChange || 0;\n } else {\n widthSum += this.columnsVisibility.type || 0;\n widthSum += this.columnsVisibility.role || 0;\n widthSum += this.columnsVisibility.room || 0;\n widthSum += this.columnsVisibility.func || 0;\n }\n widthSum += this.columnsVisibility.val || 0;\n widthSum += this.columnsVisibility.buttons || 0;\n this.columnsVisibility.id = `calc(100% - ${widthSum + 5}px)`;\n }\n } else {\n const width = this.props.width || 'lg';\n this.columnsVisibility = {\n id: columnsWidths.id || SCREEN_WIDTHS[width].idWidth,\n name: columns.includes('name')\n ? columnsWidths.name || WIDTHS.name || SCREEN_WIDTHS[width].widths.name || 0\n : 0,\n type: columns.includes('type')\n ? columnsWidths.type || WIDTHS.type || SCREEN_WIDTHS[width].widths.type || 0\n : 0,\n role: columns.includes('role')\n ? columnsWidths.role || WIDTHS.role || SCREEN_WIDTHS[width].widths.role || 0\n : 0,\n room: columns.includes('room')\n ? columnsWidths.room || WIDTHS.room || SCREEN_WIDTHS[width].widths.room || 0\n : 0,\n func: columns.includes('func')\n ? columnsWidths.func || WIDTHS.func || SCREEN_WIDTHS[width].widths.func || 0\n : 0,\n };\n let widthSum: number = this.columnsVisibility.id as number; // id is always visible\n if (this.columnsVisibility.name) {\n widthSum += this.columnsVisibility.type || 0;\n widthSum += this.columnsVisibility.role || 0;\n widthSum += this.columnsVisibility.room || 0;\n widthSum += this.columnsVisibility.func || 0;\n }\n\n if (columnsForAdmin && columns) {\n Object.keys(columnsForAdmin)\n .sort()\n .forEach(adapter =>\n columnsForAdmin[adapter].forEach(column => {\n const id = `_${adapter}_${column.path}`;\n if (columns.includes(id)) {\n const item: AdapterColumn = {\n adapter,\n id: `_${adapter}_${column.path}`,\n name: column.name,\n path: column.path.split('.'),\n pathText: column.path,\n };\n if (column.edit) {\n item.edit = true;\n if (column.type) {\n item.type = column.type as 'number' | 'boolean' | 'string';\n }\n if (column.objTypes) {\n item.objTypes = column.objTypes;\n }\n }\n\n this.adapterColumns.push(item);\n (this.columnsVisibility as Record<string, number>)[id] =\n columnsWidths[item.id] ||\n column.width ||\n SCREEN_WIDTHS[width].widths.func ||\n SCREEN_WIDTHS.xl.widths.func ||\n 0;\n widthSum += (this.columnsVisibility as Record<string, number>)[id];\n } else {\n (this.columnsVisibility as Record<string, number>)[id] = 0;\n }\n }),\n );\n }\n this.adapterColumns.sort((a, b) => (a.id > b.id ? -1 : a.id < b.id ? 1 : 0));\n this.columnsVisibility.val = columns.includes('val')\n ? columnsWidths.val || WIDTHS.val || SCREEN_WIDTHS.xl.widths.val\n : 0;\n\n // do not show buttons if not desired\n if (!this.props.columns || this.props.columns.includes('buttons')) {\n this.columnsVisibility.buttons = columns.includes('buttons')\n ? columnsWidths.buttons || WIDTHS.buttons || SCREEN_WIDTHS.xl.widths.buttons\n : 0;\n widthSum += this.columnsVisibility.buttons || 0;\n }\n\n if (this.columnsVisibility.name && !columnsWidths.name) {\n widthSum += this.columnsVisibility.val || 0;\n this.columnsVisibility.name = `calc(100% - ${widthSum}px)`;\n this.columnsVisibility.nameHeader = `calc(100% - ${widthSum + 5 + this.state.scrollBarWidth}px)`;\n } else {\n const newWidth = Object.keys(this.columnsVisibility).reduce((accumulator: number, name: string) => {\n // do not summarize strings\n if (\n name === 'id' ||\n typeof (this.columnsVisibility as Record<string, number | string>)[name] === 'string' ||\n !(this.columnsVisibility as Record<string, number | string>)[name]\n ) {\n return accumulator;\n }\n return accumulator + (this.columnsVisibility as Record<string, number>)[name];\n }, 0);\n this.columnsVisibility.id = `calc(100% - ${newWidth}px)`;\n }\n }\n }\n\n resizerMouseMove = (e: MouseEvent): void => {\n if (this.resizerActiveDiv) {\n let width: number;\n let widthNext: number;\n if (this.resizeLeft) {\n width = this.resizerOldWidth - e.clientX + this.resizerPosition;\n widthNext = this.resizerOldWidthNext + e.clientX - this.resizerPosition;\n } else {\n width = this.resizerOldWidth + e.clientX - this.resizerPosition;\n widthNext = this.resizerOldWidthNext - e.clientX + this.resizerPosition;\n }\n\n if (\n this.resizerActiveName &&\n this.resizerNextName &&\n (!this.resizerMin || width > this.resizerMin) &&\n (!this.resizerNextMin || widthNext > this.resizerNextMin)\n ) {\n this.resizerCurrentWidths[this.resizerActiveName] = width;\n this.resizerCurrentWidths[this.resizerNextName] = widthNext;\n\n this.resizerActiveDiv.style.width = `${width}px`;\n if (this.resizerNextDiv) {\n this.resizerNextDiv.style.width = `${widthNext}px`;\n }\n\n (this.columnsVisibility as Record<string, number | string>)[this.resizerActiveName] = width;\n (this.columnsVisibility as Record<string, number | string>)[this.resizerNextName] = widthNext;\n if (this.resizerNextName === 'nameHeader') {\n this.columnsVisibility.name = widthNext - this.state.scrollBarWidth;\n this.resizerCurrentWidths.name = widthNext - this.state.scrollBarWidth;\n } else if (this.resizerActiveName === 'nameHeader') {\n this.columnsVisibility.name = width - this.state.scrollBarWidth;\n this.resizerCurrentWidths.name = width - this.state.scrollBarWidth;\n }\n this.customWidth = true;\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n this.resizeTimeout = setTimeout(() => {\n this.resizeTimeout = null;\n this.forceUpdate();\n }, 200);\n }\n }\n };\n\n resizerMouseUp = (): void => {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.table`, JSON.stringify(this.resizerCurrentWidths));\n this.resizerActiveName = null;\n this.resizerNextName = null;\n this.resizerActiveDiv = null;\n this.resizerNextDiv = null;\n window.removeEventListener('mousemove', this.resizerMouseMove);\n window.removeEventListener('mouseup', this.resizerMouseUp);\n };\n\n resizerMouseDown = (e: React.MouseEvent<HTMLDivElement>): void => {\n this.storedWidths =\n this.storedWidths ||\n (JSON.parse(JSON.stringify(SCREEN_WIDTHS[this.props.width || 'lg'])) as ScreenWidthOne);\n\n this.resizerCurrentWidths = this.resizerCurrentWidths || {};\n this.resizerActiveDiv = (e.target as HTMLDivElement).parentNode as HTMLDivElement;\n this.resizerActiveName = this.resizerActiveDiv.dataset.name || null;\n if (this.resizerActiveName) {\n let i = 0;\n if ((e.target as HTMLDivElement).dataset.left === 'true') {\n this.resizeLeft = true;\n this.resizerNextDiv = this.resizerActiveDiv.previousElementSibling as HTMLDivElement;\n let handle: HTMLDivElement | null = this.resizerNextDiv.querySelector('.iob-ob-resize-handler');\n while (this.resizerNextDiv && !handle && i < 10) {\n this.resizerNextDiv = this.resizerNextDiv.previousElementSibling as HTMLDivElement;\n handle = this.resizerNextDiv.querySelector('.iob-ob-resize-handler');\n i++;\n }\n if (handle?.dataset.left !== 'true') {\n this.resizerNextDiv = this.resizerNextDiv.nextElementSibling as HTMLDivElement;\n }\n } else {\n this.resizeLeft = false;\n this.resizerNextDiv = this.resizerActiveDiv.nextElementSibling as HTMLDivElement;\n /* while (this.resizerNextDiv && !this.resizerNextDiv.querySelector('.iob-ob-resize-handler') && i < 10) {\n this.resizerNextDiv = this.resizerNextDiv.nextElementSibling;\n i++;\n } */\n }\n this.resizerNextName = this.resizerNextDiv.dataset.name || null;\n\n this.resizerMin = parseInt(this.resizerActiveDiv.dataset.min, 10) || 0;\n this.resizerNextMin = parseInt(this.resizerNextDiv.dataset.min, 10) || 0;\n\n this.resizerPosition = e.clientX;\n\n this.resizerCurrentWidths[this.resizerActiveName] = this.resizerActiveDiv.offsetWidth;\n this.resizerOldWidth = this.resizerCurrentWidths[this.resizerActiveName];\n\n if (this.resizerNextName) {\n this.resizerCurrentWidths[this.resizerNextName] = this.resizerNextDiv.offsetWidth;\n this.resizerOldWidthNext = this.resizerCurrentWidths[this.resizerNextName];\n }\n\n window.addEventListener('mousemove', this.resizerMouseMove);\n window.addEventListener('mouseup', this.resizerMouseUp);\n }\n };\n\n /**\n * Handle keyboard events for navigation\n */\n navigateKeyPress(event: React.KeyboardEvent): void {\n const selectedId = this.state.selectedNonObject || this.state.selected[0];\n\n if (!selectedId) {\n return;\n }\n\n if (event.code === 'ArrowUp' || event.code === 'ArrowDown') {\n event.preventDefault();\n const ids: string[] = [];\n this.tableRef.current?.childNodes.forEach((node: any) => ids.push((node as HTMLDivElement).id));\n const idx = ids.indexOf(selectedId);\n const newIdx = event.code === 'ArrowDown' ? idx + 1 : idx - 1;\n const newId = ids[newIdx] || selectedId;\n this.onSelect(newId);\n this.scrollToItem(newId);\n }\n\n if (event.code === 'ArrowRight' || event.code === 'ArrowLeft') {\n this.toggleExpanded(selectedId);\n }\n\n if (event.code === 'Delete' && this.root && selectedId) {\n const item = ObjectBrowserClass.getItemFromRoot(this.root, selectedId);\n if (item) {\n const { obj } = item.data;\n if (obj && !obj.common?.dontDelete) {\n this.showDeleteDialog({ id: selectedId, obj, item });\n }\n }\n }\n }\n\n /**\n * Find the id from the root\n *\n * @param root The current root\n * @param id The object id to find\n */\n private static getItemFromRoot(root: TreeItem, id: string): TreeItem | null {\n const idArr = id.split('.');\n let currId = '';\n let _root: TreeItem | null | undefined = root;\n\n for (let i = 0; i < idArr.length; i++) {\n const idEntry = idArr[i];\n currId = currId ? `${currId}.${idEntry}` : idEntry;\n let found = false;\n if (_root.children) {\n for (let j = 0; j < _root.children.length; j++) {\n if (_root.children[j].data.id === currId) {\n _root = _root.children[j];\n found = true;\n break;\n }\n }\n }\n if (!found) {\n return null;\n }\n }\n\n return _root || null;\n }\n\n resizerReset = (): void => {\n this.customWidth = false;\n SCREEN_WIDTHS[this.props.width || 'lg'] = JSON.parse(JSON.stringify(this.storedWidths));\n this.calculateColumnsVisibility();\n this.localStorage.removeItem(`${this.props.dialogName || 'App'}.table`);\n this.forceUpdate();\n };\n\n /**\n * Render the right handle for resizing\n */\n renderHandleRight(): JSX.Element {\n return (\n <Box\n component=\"div\"\n className=\"iob-ob-resize-handler\"\n sx={{ ...styles.resizeHandle, ...styles.resizeHandleRight }}\n onMouseDown={this.resizerMouseDown}\n onDoubleClick={this.resizerReset}\n title={this.props.t('ra_Double click to reset table layout')}\n />\n );\n }\n\n private renderHeader(): JSX.Element {\n let filterClearInValue = null;\n\n if (!this.columnsVisibility.buttons && !this.isFilterEmpty()) {\n filterClearInValue = (\n <IconButton\n onClick={() => this.clearFilter()}\n style={styles.buttonClearFilter}\n title={this.props.t('ra_Clear filter')}\n size=\"large\"\n >\n <IconClearFilter />\n <IconClose style={styles.buttonClearFilterIcon} />\n </IconButton>\n );\n }\n\n if (this.props.width === 'xs') {\n return (\n <div style={styles.headerRow}>\n <div style={{ ...styles.headerCell, width: '100%' }}>{this.getFilterInput('id')}</div>\n </div>\n );\n }\n\n return (\n <div style={styles.headerRow}>\n <div\n style={{ ...styles.headerCell, width: this.columnsVisibility.id, position: 'relative' }}\n data-min={240}\n data-name=\"id\"\n >\n {this.getFilterInput('id')}\n {this.renderHandleRight()}\n </div>\n {this.columnsVisibility.name ? (\n <div\n style={{ ...styles.headerCell, width: this.columnsVisibility.nameHeader, position: 'relative' }}\n data-min={100}\n data-name=\"nameHeader\"\n >\n {this.getFilterInput('name')}\n {this.renderHandleRight()}\n </div>\n ) : null}\n {!this.state.statesView && (\n <>\n {this.columnsVisibility.type ? (\n <div\n style={{\n ...styles.headerCell,\n width: this.columnsVisibility.type,\n position: 'relative',\n }}\n data-min={100}\n data-name=\"type\"\n >\n {this.getFilterSelectType()}\n {this.renderHandleRight()}\n </div>\n ) : null}\n {this.columnsVisibility.role ? (\n <div\n style={{\n ...styles.headerCell,\n width: this.columnsVisibility.role,\n position: 'relative',\n }}\n data-min={100}\n data-name=\"role\"\n >\n {this.getFilterSelectRole()}\n {this.renderHandleRight()}\n </div>\n ) : null}\n {this.columnsVisibility.room ? (\n <div\n style={{\n ...styles.headerCell,\n width: this.columnsVisibility.room,\n position: 'relative',\n }}\n data-min={100}\n data-name=\"room\"\n >\n {this.getFilterSelectRoom()}\n {this.renderHandleRight()}\n </div>\n ) : null}\n {this.columnsVisibility.func ? (\n <div\n style={{\n ...styles.headerCell,\n width: this.columnsVisibility.func,\n position: 'relative',\n }}\n data-min={100}\n data-name=\"func\"\n >\n {this.getFilterSelectFunction()}\n {this.renderHandleRight()}\n </div>\n ) : null}\n </>\n )}\n {this.state.statesView && (\n <>\n <div\n style={{\n ...styles.headerCell,\n ...styles.headerCellValue,\n width: this.columnsVisibility.changedFrom,\n position: 'relative',\n }}\n data-min={100}\n data-name=\"changedFrom\"\n >\n {this.props.t('ra_Changed from')}\n {this.renderHandleRight()}\n </div>\n <div\n style={{\n ...styles.headerCell,\n ...styles.headerCellValue,\n width: this.columnsVisibility.qualityCode,\n position: 'relative',\n }}\n data-min={100}\n data-name=\"qualityCode\"\n >\n {this.props.t('ra_Quality code')}\n {this.renderHandleRight()}\n </div>\n <div\n style={{\n ...styles.headerCell,\n ...styles.headerCellValue,\n width: this.columnsVisibility.timestamp,\n position: 'relative',\n }}\n data-min={100}\n data-name=\"timestamp\"\n >\n {this.props.t('ra_Timestamp')}\n {this.renderHandleRight()}\n </div>\n <div\n style={{\n ...styles.headerCell,\n ...styles.headerCellValue,\n width: this.columnsVisibility.lastChange,\n position: 'relative',\n }}\n data-min={100}\n data-name=\"lastChange\"\n >\n {this.props.t('ra_Last change')}\n {this.renderHandleRight()}\n </div>\n </>\n )}\n {this.adapterColumns.map(item => (\n <div\n style={{\n ...styles.headerCell,\n ...styles.headerCellValue,\n width: (this.columnsVisibility as Record<string, number | string>)[item.id],\n }}\n title={item.adapter}\n key={item.id}\n data-min={100}\n data-name={item.id}\n >\n {item.name}\n </div>\n ))}\n {this.columnsVisibility.val ? (\n <div\n style={{\n ...styles.headerCell,\n ...styles.headerCellValue,\n width: this.columnsVisibility.val,\n position: 'relative',\n }}\n data-min={120}\n data-name=\"val\"\n >\n {this.props.t('ra_Value')}\n {filterClearInValue}\n </div>\n ) : null}\n {this.columnsVisibility.buttons ? (\n <div\n title={this.texts.filter_custom}\n style={{ ...styles.headerCell, width: this.columnsVisibility.buttons }}\n >\n {' '}\n {this.getFilterSelectCustoms()}\n </div>\n ) : null}\n </div>\n );\n }\n\n private renderToast(): JSX.Element {\n return (\n <Snackbar\n open={!!this.state.toast}\n autoHideDuration={3000}\n onClick={() => this.setState({ toast: '' })}\n onClose={() => this.setState({ toast: '' })}\n message={this.state.toast}\n action={\n <IconButton\n size=\"small\"\n aria-label=\"close\"\n color=\"inherit\"\n onClick={() => this.setState({ toast: '' })}\n >\n <IconClose fontSize=\"small\" />\n </IconButton>\n }\n />\n );\n }\n\n /**\n * Called when component is updated.\n */\n componentDidUpdate(): void {\n if (this.tableRef.current) {\n const scrollBarWidth = this.tableRef.current.offsetWidth - this.tableRef.current.clientWidth;\n if (this.state.scrollBarWidth !== scrollBarWidth) {\n setTimeout(() => this.setState({ scrollBarWidth }), 100);\n } else if (this.selectFirst) {\n this.scrollToItem(this.selectFirst);\n }\n }\n }\n\n scrollToItem(id: string): void {\n this.selectFirst = '';\n\n const node = window.document.getElementById(id);\n node?.scrollIntoView({\n behavior: 'auto',\n block: 'center',\n inline: 'center',\n });\n }\n\n private renderCustomDialog(): JSX.Element | null {\n if (this.state.customDialog && this.props.objectCustomDialog) {\n const ObjectCustomDialog = this.props.objectCustomDialog;\n\n return (\n <ObjectCustomDialog\n reportChangedIds={(changedIds: string[]) => (this.changedIds = [...changedIds])}\n objectIDs={this.state.customDialog}\n allVisibleObjects={!!this.state.customDialogAll}\n expertMode={this.state.filter.expertMode}\n isFloatComma={\n this.props.isFloatComma === undefined\n ? this.systemConfig.common.isFloatComma\n : this.props.isFloatComma\n }\n t={this.props.t}\n lang={this.props.lang}\n socket={this.props.socket}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n objects={this.objects}\n customsInstances={this.info.customs}\n onClose={() => {\n this.pauseSubscribe(false);\n this.setState({ customDialog: null });\n if (this.changedIds) {\n this.changedIds = null;\n // update all changed IDs\n this.forceUpdate();\n }\n\n this.props.router?.doNavigate('tab-objects');\n }}\n systemConfig={this.systemConfig}\n />\n );\n }\n return null;\n }\n\n private onUpdate(valAck: {\n val: ioBroker.StateValue;\n ack: boolean;\n q: ioBroker.STATE_QUALITY[keyof ioBroker.STATE_QUALITY];\n expire: number | undefined;\n }): void {\n this.props.socket\n .setState(this.edit.id, {\n val: valAck.val,\n ack: valAck.ack,\n q: valAck.q || 0,\n expire: valAck.expire || undefined,\n })\n .catch(e => this.showError(`Cannot write value: ${e}`));\n }\n\n private renderEditObjectDialog(): JSX.Element | null {\n if (!this.state.editObjectDialog || !this.props.objectBrowserEditObject) {\n return null;\n }\n\n const ObjectBrowserEditObject = this.props.objectBrowserEditObject;\n\n return (\n <ObjectBrowserEditObject\n key={this.state.editObjectDialog}\n obj={this.objects[this.state.editObjectDialog]}\n roleArray={this.info.roles}\n objects={this.objects}\n dateFormat={this.props.dateFormat || this.systemConfig.common.dateFormat}\n isFloatComma={\n this.props.isFloatComma === undefined\n ? this.systemConfig.common.isFloatComma\n : this.props.isFloatComma\n }\n themeType={this.props.themeType}\n theme={this.props.theme}\n socket={this.props.socket}\n dialogName={this.props.dialogName}\n aliasTab={this.state.editObjectAlias}\n t={this.props.t}\n expertMode={!!this.state.filter.expertMode}\n onNewObject={(obj: ioBroker.AnyObject) =>\n this.props.socket\n .setObject(obj._id, obj)\n .then(() =>\n this.setState({ editObjectDialog: obj._id, editObjectAlias: false }, () =>\n this.onSelect(obj._id),\n ),\n )\n .catch(e => this.showError(`Cannot write object: ${e}`))\n }\n onClose={(obj?: ioBroker.AnyObject) => {\n if (obj) {\n let updateAlias: string;\n if (this.state.editObjectDialog.startsWith('alias.')) {\n if (\n JSON.stringify(this.objects[this.state.editObjectDialog].common?.alias) !==\n JSON.stringify((obj as ioBroker.StateObject).common?.alias)\n ) {\n updateAlias = this.state.editObjectDialog;\n }\n }\n\n this.props.socket\n .setObject(obj._id, obj)\n .then(() => {\n if (updateAlias && this.subscribes.includes(updateAlias)) {\n this.unsubscribe(updateAlias);\n setTimeout(() => this.subscribe(updateAlias), 100);\n }\n })\n .catch(e => this.showError(`Cannot write object: ${e}`));\n }\n this.setState({ editObjectDialog: '', editObjectAlias: false });\n }}\n width={this.props.width}\n />\n );\n }\n\n private renderViewObjectFileDialog(): JSX.Element | null {\n if (!this.state.viewFileDialog || !this.props.objectBrowserViewFile) {\n return null;\n }\n const ObjectBrowserViewFile = this.props.objectBrowserViewFile;\n\n return (\n <ObjectBrowserViewFile\n key=\"viewFile\"\n obj={this.objects[this.state.viewFileDialog]}\n socket={this.props.socket}\n t={this.props.t}\n onClose={() => this.setState({ viewFileDialog: '' })}\n />\n );\n }\n\n private renderAliasEditorDialog(): JSX.Element | null {\n if (!this.props.objectBrowserAliasEditor || !this.state.showAliasEditor) {\n return null;\n }\n const ObjectBrowserAliasEditor = this.props.objectBrowserAliasEditor;\n\n return (\n <ObjectBrowserAliasEditor\n key=\"editAlias\"\n obj={this.objects[this.state.showAliasEditor]}\n objects={this.objects}\n socket={this.props.socket}\n t={this.props.t}\n onClose={() => this.setState({ showAliasEditor: '' })}\n onRedirect={(id: string, timeout?: number) =>\n setTimeout(\n () =>\n this.onSelect(id, false, () =>\n this.expandAllSelected(() => {\n this.scrollToItem(id);\n setTimeout(\n () =>\n this.setState({\n editObjectDialog: id,\n showAliasEditor: '',\n editObjectAlias: true,\n }),\n 300,\n );\n }),\n ),\n timeout || 0,\n )\n }\n />\n );\n }\n\n showAddDataPointDialog(id: string, initialType: ioBroker.ObjectType, initialStateType?: ioBroker.CommonType): void {\n this.setState({\n showContextMenu: null,\n modalNewObj: {\n id,\n initialType,\n initialStateType,\n },\n });\n }\n\n /** Renders the aliases list for one state (if more than 2) */\n private renderAliasMenu(): JSX.Element | null {\n if (!this.state.aliasMenu) {\n return null;\n }\n\n return (\n <Menu\n key=\"aliasmenu\"\n open={!0}\n anchorEl={window.document.getElementById(`alias_${this.state.aliasMenu}`)}\n onClose={() => this.setState({ aliasMenu: '' })}\n >\n {this.info.aliasesMap[this.state.aliasMenu].map((aliasId, i) => (\n <MenuItem\n key={aliasId}\n onClick={() => this.onSelect(aliasId)}\n >\n <ListItemText>\n {this.renderAliasLink(this.state.aliasMenu, i, {\n '& .admin-browser-arrow': {\n mr: '8px',\n },\n })}\n </ListItemText>\n </MenuItem>\n ))}\n </Menu>\n );\n }\n\n /**\n * Renders the right mouse button context menu\n */\n private renderContextMenu(): JSX.Element | null {\n if (!this.state.showContextMenu) {\n return null;\n }\n const item = this.state.showContextMenu.item;\n const id = item.data.id;\n const items: JSX.Element[] = [];\n // const ctrl = isIOS() ? '⌘' : (this.props.lang === 'de' ? 'Strg+' : 'Ctrl+');\n\n const obj = item.data.obj;\n\n let showACL = '';\n if (this.props.objectEditOfAccessControl && this.state.filter.expertMode) {\n if (!obj) {\n showACL = '---';\n } else {\n const acl = obj.acl ? (obj.type === 'state' ? obj.acl.state : obj.acl.object) : 0;\n const aclSystemConfig =\n obj.acl &&\n (obj.type === 'state'\n ? this.systemConfig.common.defaultNewAcl.state\n : this.systemConfig.common.defaultNewAcl.object);\n showACL = Number.isNaN(Number(acl)) ? Number(aclSystemConfig).toString(16) : Number(acl).toString(16);\n }\n }\n\n const enumEditable =\n !this.props.notEditable &&\n obj &&\n (this.state.filter.expertMode || obj.type === 'state' || obj.type === 'channel' || obj.type === 'device');\n\n const createStateVisible =\n !item.data.obj ||\n item.data.obj.type === 'folder' ||\n item.data.obj.type === 'channel' ||\n item.data.obj.type === 'device' ||\n item.data.id === '0_userdata.0' ||\n item.data.obj.type === 'meta';\n const createChannelVisible =\n !item.data.obj ||\n item.data.obj.type === 'folder' ||\n item.data.obj.type === 'device' ||\n item.data.id === '0_userdata.0' ||\n item.data.obj.type === 'meta';\n const createDeviceVisible =\n !item.data.obj ||\n item.data.obj.type === 'folder' ||\n item.data.id === '0_userdata.0' ||\n item.data.obj.type === 'meta';\n const createFolderVisible =\n !item.data.obj ||\n item.data.obj.type === 'folder' ||\n item.data.id === '0_userdata.0' ||\n item.data.obj.type === 'meta';\n\n const ITEMS: Record<string, ContextMenuItem> = {\n EDIT: {\n key: '0',\n visibility: !!(\n this.props.objectBrowserEditObject &&\n obj &&\n (this.state.filter.expertMode || ObjectBrowserClass.isNonExpertId(id))\n ),\n icon: (\n <IconEdit\n fontSize=\"small\"\n style={this.styles.contextMenuEdit}\n />\n ),\n label: this.texts.editObject,\n onClick: () =>\n this.setState({ editObjectDialog: item.data.id, showContextMenu: null, editObjectAlias: false }),\n },\n EDIT_VALUE: {\n key: '1',\n visibility: !!(\n this.states &&\n !this.props.notEditable &&\n obj &&\n obj.type === 'state' &&\n // @ts-expect-error deprecated from js-controller 6\n obj.common?.type !== 'file' &&\n (this.state.filter.expertMode || obj.common.write !== false)\n ),\n icon: (\n <IconValueEdit\n fontSize=\"small\"\n style={this.styles.contextMenuEditValue}\n />\n ),\n label: this.props.t('ra_Edit value'),\n onClick: () => {\n this.edit = {\n val: this.states[id] ? this.states[id].val : '',\n q: this.states[id] ? this.states[id].q || 0 : 0,\n ack: false,\n id,\n };\n this.setState({ updateOpened: true, showContextMenu: null });\n },\n },\n VIEW: {\n visibility:\n !!this.props.objectBrowserViewFile &&\n obj?.type === 'state' &&\n // @ts-expect-error deprecated from js-controller 6\n obj.common?.type === 'file',\n icon: (\n <FindInPage\n fontSize=\"small\"\n style={this.styles.contextMenuView}\n />\n ),\n label: this.props.t('ra_View file'),\n onClick: () => this.setState({ viewFileDialog: obj?._id || '', showContextMenu: null }),\n },\n CUSTOM: {\n key: '2',\n visibility: !(\n this.props.objectCustomDialog &&\n this.info.hasSomeCustoms &&\n obj &&\n obj.type === 'state' &&\n // @ts-expect-error deprecated from js-controller 6\n obj.common?.type !== 'file'\n ),\n icon: (\n <IconConfig\n fontSize=\"small\"\n style={\n item.data.hasCustoms\n ? this.styles.cellButtonsButtonWithCustoms\n : styles.cellButtonsButtonWithoutCustoms\n }\n />\n ),\n style: this.styles.contextMenuCustom,\n label: this.texts.customConfig,\n onClick: () => {\n this.pauseSubscribe(true);\n this.props.router?.doNavigate(null, 'customs', id);\n this.setState({ customDialog: [id], showContextMenu: null });\n },\n },\n ACL: {\n key: '3',\n visibility: !!showACL,\n icon: showACL,\n iconStyle: { fontSize: 'smaller' },\n listItemIconStyle: this.styles.contextMenuACL,\n style: this.styles.contextMenuACL,\n label: this.props.t('ra_Edit ACL'),\n onClick: () =>\n this.setState({\n showContextMenu: null,\n modalEditOfAccess: true,\n modalEditOfAccessObjData: item.data,\n }),\n },\n ROLE: {\n key: '4',\n visibility: !!(this.state.filter.expertMode && enumEditable && this.props.objectBrowserEditRole),\n icon: (\n <BorderColor\n fontSize=\"small\"\n style={this.styles.contextMenuRole}\n />\n ),\n label: this.props.t('ra_Edit role'),\n onClick: () => this.setState({ roleDialog: item.data.id, showContextMenu: null }),\n },\n FUNCTION: {\n key: '5',\n visibility: !!enumEditable,\n icon: (\n <BedroomParent\n fontSize=\"small\"\n style={this.styles.contextMenuRole}\n />\n ),\n label: this.props.t('ra_Edit function'),\n onClick: () => {\n const enums = findEnumsForObjectAsIds(this.info, item.data.id, 'funcEnums');\n this.setState({\n enumDialogEnums: enums,\n enumDialog: {\n item,\n type: 'func',\n enumsOriginal: JSON.stringify(enums),\n },\n showContextMenu: null,\n });\n },\n },\n ROOM: {\n key: '6',\n visibility: !!enumEditable,\n icon: (\n <Construction\n fontSize=\"small\"\n style={this.styles.contextMenuRoom}\n />\n ),\n label: this.props.t('ra_Edit room'),\n onClick: () => {\n const enums = findEnumsForObjectAsIds(this.info, item.data.id, 'roomEnums');\n this.setState({\n enumDialogEnums: enums,\n enumDialog: {\n item,\n type: 'room',\n enumsOriginal: JSON.stringify(enums),\n },\n showContextMenu: null,\n });\n },\n },\n ALIAS: {\n key: '7',\n visibility: !!(\n !this.props.notEditable &&\n this.props.objectBrowserAliasEditor &&\n this.props.objectBrowserEditObject &&\n obj?.type === 'state' &&\n // @ts-expect-error deprecated from js-controller 6\n obj.common?.type !== 'file'\n ),\n icon: (\n <IconLink\n style={\n obj?.common?.alias\n ? this.styles.cellButtonsButtonWithCustoms\n : styles.cellButtonsButtonWithoutCustoms\n }\n />\n ),\n label: this.info.aliasesMap[item.data.id]\n ? this.props.t('ra_Edit alias')\n : this.props.t('ra_Create alias'),\n onClick: () => {\n if (obj?.common?.alias) {\n this.setState({ showContextMenu: null, editObjectDialog: item.data.id, editObjectAlias: true });\n } else {\n this.setState({ showContextMenu: null, showAliasEditor: item.data.id });\n }\n },\n },\n CREATE: {\n key: '+',\n visibility:\n (item.data.id.startsWith('0_userdata.0') || item.data.id.startsWith('javascript.')) &&\n (createStateVisible || createChannelVisible || createDeviceVisible || createFolderVisible),\n icon: (\n <AddIcon\n fontSize=\"small\"\n style={this.styles.cellButtonsButtonWithCustoms}\n />\n ),\n style: styles.contextMenuWithSubMenu,\n label: this.texts.create,\n subMenu: [\n {\n label: this.texts.createBooleanState,\n visibility: createStateVisible,\n icon: <IconState fontSize=\"small\" />,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'state', 'boolean'),\n },\n {\n label: this.texts.createNumberState,\n visibility: createStateVisible,\n icon: <IconState fontSize=\"small\" />,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'state', 'number'),\n },\n {\n label: this.texts.createStringState,\n visibility: createStateVisible,\n icon: <IconState fontSize=\"small\" />,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'state', 'string'),\n },\n {\n label: this.texts.createState,\n visibility: createStateVisible,\n icon: <IconState fontSize=\"small\" />,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'state'),\n },\n {\n label: this.texts.createChannel,\n visibility: createChannelVisible,\n icon: <IconChannel fontSize=\"small\" />,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'channel'),\n },\n {\n label: this.texts.createDevice,\n visibility: createDeviceVisible,\n icon: <IconDevice fontSize=\"small\" />,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'device'),\n },\n {\n label: this.texts.createFolder,\n icon: <IconFolder fontSize=\"small\" />,\n visibility: createFolderVisible,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'folder'),\n },\n ],\n },\n DELETE: {\n key: 'Delete',\n visibility: !!(\n this.props.onObjectDelete &&\n (item.children?.length || (obj && !obj.common?.dontDelete))\n ),\n icon: (\n <IconDelete\n fontSize=\"small\"\n style={this.styles.contextMenuDelete}\n />\n ),\n style: this.styles.contextMenuDelete,\n label: this.texts.deleteObject,\n onClick: () =>\n this.setState({ showContextMenu: null }, () =>\n this.showDeleteDialog({\n id,\n obj: obj || ({} as ioBroker.Object),\n item,\n }),\n ),\n },\n };\n\n Object.keys(ITEMS).forEach(key => {\n if (ITEMS[key].visibility) {\n if (ITEMS[key].subMenu) {\n items.push(\n <MenuItem\n key={key}\n href=\"\"\n onClick={(e: React.MouseEvent<HTMLAnchorElement>) =>\n this.state.showContextMenu &&\n this.setState({\n showContextMenu: {\n item: this.state.showContextMenu.item,\n position: this.state.showContextMenu.position,\n subItem: key,\n subAnchor: e.target as HTMLLIElement,\n },\n })\n }\n style={ITEMS[key].style}\n >\n <ListItemIcon style={{ ...ITEMS[key].iconStyle, ...ITEMS[key].listItemIconStyle }}>\n {ITEMS[key].icon}\n </ListItemIcon>\n <ListItemText>\n {ITEMS[key].label}\n ...\n </ListItemText>\n <div style={{ ...styles.contextMenuKeys, opacity: 1 }}>\n <ArrowRightIcon />\n </div>\n </MenuItem>,\n );\n\n if (this.state.showContextMenu?.subItem === key) {\n items.push(\n <Menu\n key=\"subContextMenu\"\n open={!0}\n anchorEl={this.state.showContextMenu.subAnchor}\n onClose={() => {\n if (this.state.showContextMenu) {\n this.setState({\n showContextMenu: {\n item: this.state.showContextMenu.item,\n position: this.state.showContextMenu.position,\n },\n });\n }\n this.contextMenu = null;\n }}\n >\n {ITEMS[key].subMenu?.map(subItem =>\n subItem.visibility ? (\n <MenuItem\n key={subItem.label}\n onClick={subItem.onClick}\n style={subItem.style}\n >\n <ListItemIcon\n style={{\n ...subItem.iconStyle,\n ...(subItem.listItemIconStyle || undefined),\n }}\n >\n {subItem.icon}\n </ListItemIcon>\n <ListItemText>{subItem.label}</ListItemText>\n </MenuItem>\n ) : null,\n )}\n </Menu>,\n );\n }\n } else {\n items.push(\n <MenuItem\n key={key}\n onClick={ITEMS[key].onClick}\n sx={ITEMS[key].style}\n >\n <ListItemIcon style={{ ...ITEMS[key].iconStyle, ...ITEMS[key].listItemIconStyle }}>\n {ITEMS[key].icon}\n </ListItemIcon>\n <ListItemText>{ITEMS[key].label}</ListItemText>\n {ITEMS[key].key ? (\n <div style={styles.contextMenuKeys}>\n {`Alt+${ITEMS[key].key === 'Delete' ? this.props.t('ra_Del') : ITEMS[key].key}`}\n </div>\n ) : null}\n </MenuItem>,\n );\n }\n }\n });\n\n if (!items.length) {\n setTimeout(() => this.setState({ showContextMenu: null }), 100);\n return null;\n }\n\n return (\n <Menu\n key=\"contextMenu\"\n open={!0}\n onKeyUp={e => {\n e.preventDefault();\n if (e.altKey) {\n Object.keys(ITEMS).forEach(key => {\n if (e.key === ITEMS[key].key && ITEMS[key].onClick) {\n ITEMS[key].onClick();\n }\n });\n }\n }}\n anchorReference=\"anchorPosition\"\n anchorPosition={this.state.showContextMenu.position}\n onClose={() => {\n this.setState({ showContextMenu: null });\n this.contextMenu = null;\n }}\n >\n {items}\n </Menu>\n );\n }\n\n private renderEditValueDialog(): JSX.Element | null {\n if (!this.state.updateOpened || !this.props.objectBrowserValue) {\n return null;\n }\n\n if (!this.edit.id) {\n console.error(`Invalid ID for edit: ${JSON.stringify(this.edit)}`);\n return null;\n }\n\n if (!this.objects[this.edit.id]) {\n console.error(`Something went wrong. Possibly the object ${this.edit.id} was deleted.`);\n return null;\n }\n\n const type = this.objects[this.edit.id].common?.type\n ? this.objects[this.edit.id].common.type\n : typeof this.edit.val;\n\n const role = this.objects[this.edit.id].common.role;\n\n const ObjectBrowserValue = this.props.objectBrowserValue;\n\n return (\n <ObjectBrowserValue\n t={this.props.t}\n lang={this.props.lang}\n type={type}\n role={role || ''}\n states={Utils.getStates(this.objects[this.edit.id] as ioBroker.StateObject)}\n themeType={this.props.themeType}\n theme={this.props.theme}\n expertMode={!!this.state.filter.expertMode}\n value={this.edit.val}\n socket={this.props.socket}\n object={this.objects[this.edit.id] as ioBroker.StateObject}\n defaultHistory={this.defaultHistory}\n dateFormat={this.props.dateFormat || this.systemConfig.common.dateFormat}\n isFloatComma={\n this.props.isFloatComma === undefined\n ? this.systemConfig.common.isFloatComma\n : this.props.isFloatComma\n }\n onClose={(res?: {\n val: ioBroker.StateValue;\n ack: boolean;\n q: ioBroker.STATE_QUALITY[keyof ioBroker.STATE_QUALITY];\n expire: number | undefined;\n }) => {\n this.setState({ updateOpened: false });\n if (res) {\n this.onUpdate(res);\n }\n }}\n width={this.props.width}\n />\n );\n }\n\n /**\n * The rendering method of this component.\n */\n render(): JSX.Element {\n this.recordStates = [];\n if (this.unsubscribeTimer) {\n clearTimeout(this.unsubscribeTimer);\n }\n\n if (this.styleTheme !== this.props.themeType) {\n this.styles = {\n cellIdIconFolder: Utils.getStyle(this.props.theme, styles.cellIdIconFolder),\n cellIdIconDocument: Utils.getStyle(this.props.theme, styles.cellIdIconDocument),\n iconDeviceError: Utils.getStyle(this.props.theme, styles.iconDeviceError),\n iconDeviceConnected: Utils.getStyle(this.props.theme, styles.iconDeviceConnected),\n iconDeviceDisconnected: Utils.getStyle(this.props.theme, styles.iconDeviceDisconnected),\n cellButtonsButtonWithCustoms: Utils.getStyle(this.props.theme, styles.cellButtonsButtonWithCustoms),\n invertedBackground: Utils.getStyle(this.props.theme, styles.invertedBackground),\n invertedBackgroundFlex: Utils.getStyle(this.props.theme, styles.invertedBackgroundFlex),\n contextMenuEdit: Utils.getStyle(this.props.theme, styles.contextMenuEdit),\n contextMenuEditValue: Utils.getStyle(this.props.theme, styles.contextMenuEditValue),\n contextMenuView: Utils.getStyle(this.props.theme, styles.contextMenuView),\n contextMenuCustom: Utils.getStyle(this.props.theme, styles.contextMenuCustom),\n contextMenuACL: Utils.getStyle(this.props.theme, styles.contextMenuACL),\n contextMenuRoom: Utils.getStyle(this.props.theme, styles.contextMenuRoom),\n contextMenuRole: Utils.getStyle(this.props.theme, styles.contextMenuRole),\n contextMenuDelete: Utils.getStyle(this.props.theme, styles.contextMenuDelete),\n filterInput: Utils.getStyle(this.props.theme, styles.headerCellInput, styles.filterInput),\n iconCopy: Utils.getStyle(\n this.props.theme,\n styles.cellButtonsValueButton,\n styles.cellButtonsValueButtonCopy,\n ),\n aliasReadWrite: Utils.getStyle(this.props.theme, styles.cellIdAlias, styles.cellIdAliasReadWrite),\n aliasAlone: Utils.getStyle(this.props.theme, styles.cellIdAlias, styles.cellIdAliasAlone),\n };\n this.styleTheme = this.props.themeType;\n }\n\n // apply filter if changed\n const jsonFilter = JSON.stringify(this.state.filter);\n\n if (this.lastAppliedFilter !== jsonFilter && this.objects && this.root) {\n const counter = { count: 0 };\n\n applyFilter(\n this.root,\n this.state.filter,\n this.props.lang,\n this.objects,\n undefined,\n counter,\n this.props.customFilter,\n this.props.types,\n );\n\n if (counter.count < 500 && !this.state.expandAllVisible) {\n setTimeout(() => this.setState({ expandAllVisible: true }));\n } else if (counter.count >= 500 && this.state.expandAllVisible) {\n setTimeout(() => this.setState({ expandAllVisible: false }));\n }\n\n this.lastAppliedFilter = jsonFilter;\n }\n\n this.unsubscribeTimer = setTimeout(() => {\n this.unsubscribeTimer = null;\n this.checkUnsubscribes();\n }, 200);\n\n if (!this.state.loaded) {\n return <CircularProgress key={`${this.props.dialogName}_c`} />;\n }\n const items = this.root ? this.renderItem(this.root, undefined) : null;\n\n return (\n <TabContainer key={this.props.dialogName}>\n <style>\n {`\n@keyframes newValueAnimation-light {\n 0% {\n color: #00f900;\n }\n 80% {\n color: #008000;\n }\n 100% {\n color: #000;\n }\n}\n@keyframes newValueAnimation-dark {\n 0% {\n color: #00f900;\n }\n 80% {\n color: #008000;\n }\n 100% {\n color: #fff;\n }\n}\n.newValueBrowser-dark {\n animation: newValueAnimation-dark 2s ease-in-out;\n}\n.newValueBrowser-light {\n animation: newValueAnimation-light 2s ease-in-out;\n}\n`}\n </style>\n <TabHeader>{this.getToolbar()}</TabHeader>\n <TabContent>\n {this.renderHeader()}\n <div\n style={styles.tableDiv}\n ref={this.tableRef}\n onKeyDown={event => this.navigateKeyPress(event)}\n >\n {items}\n </div>\n </TabContent>\n {this.renderContextMenu()}\n {this.renderAliasMenu()}\n {this.renderToast()}\n {this.renderColumnsEditCustomDialog()}\n {this.renderColumnsSelectorDialog()}\n {this.renderCustomDialog()}\n {this.renderEditValueDialog()}\n {this.renderEditObjectDialog()}\n {this.renderViewObjectFileDialog()}\n {this.renderAliasEditorDialog()}\n {this.renderEditRoleDialog()}\n {this.renderEnumDialog()}\n {this.renderErrorDialog()}\n {this.renderExportDialog()}\n {this.state.modalNewObj && this.props.modalNewObject && this.props.modalNewObject(this)}\n {this.state.modalEditOfAccess &&\n this.state.modalEditOfAccessObjData &&\n this.props.modalEditOfAccessControl &&\n this.props.modalEditOfAccessControl(this, this.state.modalEditOfAccessObjData)}\n </TabContainer>\n );\n }\n}\n\nexport const ObjectBrowser = withWidth()(ObjectBrowserClass);\n","import React, { Component, type JSX } from 'react';\n\nimport {\n Input,\n Radio,\n FormControlLabel,\n FormGroup,\n Checkbox,\n MenuItem,\n Select,\n TextField,\n Box,\n type Theme,\n} from '@mui/material';\n\nimport { I18n } from '../i18n';\nimport type { IobTheme } from '../types';\nimport { Utils } from './Utils';\n\nconst styles: Record<string, any> = {\n hr: {\n border: 0,\n borderTop: '1px solid gray',\n },\n scrollWindow: {\n width: '100%',\n overflow: 'auto',\n height: 'calc(100% - 22px)',\n },\n rowDiv: {\n width: '100%',\n },\n modeDiv: {\n width: 200,\n display: 'inline-block',\n verticalAlign: 'top',\n },\n settingsDiv: {\n display: 'inline-block',\n verticalAlign: 'top',\n },\n inputTime: {\n width: 90,\n marginTop: 0,\n marginLeft: 5,\n },\n inputDate: {\n width: 140,\n marginTop: 0,\n marginLeft: 5,\n },\n inputEvery: {\n width: 40,\n marginLeft: 5,\n marginRight: 5,\n },\n inputRadio: {\n padding: '4px 12px',\n verticalAlign: 'top',\n },\n inputGroup: {\n maxWidth: 400,\n display: 'inline-block',\n },\n inputGroupElement: {\n width: 120,\n },\n inputDateDay: {\n width: 60,\n },\n inputDateDayCheck: {\n padding: 4,\n },\n inputSmallCheck: {\n padding: 0,\n },\n rowOnce: {},\n rowDays: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#ddeaff' : '#4b5057',\n }),\n rowDows: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#DDFFDD' : '#52646c',\n }),\n rowDates: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#DDDDFF' : '#747a86',\n }),\n rowWeeks: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#DDDDFF' : '#717680',\n }),\n rowMonths: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#DDFFFF' : '#1f5557',\n }),\n rowMonthsDates: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#EEFFFF' : '#3c5737',\n maxWidth: 600,\n }),\n rowYears: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#fbffdd' : '#574b33',\n }),\n rowDaysDows: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#EEEAFF' : '#573544',\n pl: '10px',\n pb: '10px',\n }),\n rowDowsDows: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#EEFFEE' : '#3d4c54',\n pl: '10px',\n pb: '10px',\n }),\n};\n\nconst WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\nconst PERIODS = {\n minutes: 'minutes',\n hours: 'hours',\n};\nconst ASTRO = [\n 'sunrise',\n 'sunriseEnd',\n 'goldenHourEnd',\n 'solarNoon',\n 'goldenHour',\n 'sunsetStart',\n 'sunset',\n 'dusk',\n 'nauticalDusk',\n 'night',\n 'nightEnd',\n 'nauticalDawn',\n 'dawn',\n 'nadir',\n];\n\nfunction padding(num: number): string {\n if (num < 10) {\n return `0${num}`;\n }\n return `${num}`;\n}\n\ninterface ScheduleConfig {\n time: {\n exactTime: boolean;\n start: string;\n end: string;\n mode: string;\n interval: number;\n };\n period: {\n once: string;\n days: number;\n dows: string;\n dates: string;\n weeks: number;\n months: string | number;\n years: number;\n yearMonth: number;\n yearDate: number;\n };\n valid: {\n from: string;\n to?: string;\n };\n}\n\n// interface TextTimeProps {\n// inputRef: React.RefObject<HTMLInputElement>;\n// placeholder?: string;\n// }\n\n// function TextTime(props: TextTimeProps) {\n// const { inputRef, ...other } = props;\n//\n// return <MaskedInput\n// {...other}\n// ref={inputRef}\n// mask={[/[0-2]/, /[0-9]/, ':', /[0-5]/, /[0-9]/]}\n// placeholderChar={props.placeholder || '00:00'}\n// showMask\n// />;\n// }\n\n// function TextDate(props: TextTimeProps) {\n// const { inputRef, ...other } = props;\n//\n// return <MaskedInput\n// {...other}\n// ref={inputRef}\n// mask={[/[0-3]/, /[0-9]/, '.', /[0-1]/, /[0-9]/, '.', '2', '0', /[0-9]/, /[0-9]/]}\n// placeholderChar={props.placeholder || '01.01.2020'}\n// showMask\n// />;\n// }\n\nconst DEFAULT: ScheduleConfig = {\n time: {\n exactTime: false,\n\n start: '00:00',\n end: '23:59',\n\n mode: 'hours',\n interval: 1,\n },\n period: {\n once: '',\n days: 1,\n dows: '',\n dates: '',\n weeks: 0,\n months: '',\n\n years: 0,\n yearMonth: 0,\n yearDate: 0,\n },\n valid: {\n from: '',\n to: '',\n },\n};\n\nfunction string2USdate(date: string): string {\n const parts = date.split('.');\n if (parts.length === 3) {\n return `${parts[2]}-${parts[1]}-${parts[0]}`;\n }\n return '';\n}\n\ninterface ScheduleProps {\n schedule: string | ScheduleConfig;\n onChange: (schedule: string, desc?: string) => void;\n theme: IobTheme;\n}\n\ninterface ScheduleState {\n schedule: ScheduleConfig;\n desc: string;\n}\n\nexport class Schedule extends Component<ScheduleProps, ScheduleState> {\n private readonly refFrom: React.RefObject<HTMLInputElement>;\n\n private readonly refTo: React.RefObject<HTMLInputElement>;\n\n private readonly refOnce: React.RefObject<HTMLInputElement>;\n\n private timerOnce: ReturnType<typeof setTimeout> | null = null;\n\n private timerFrom: ReturnType<typeof setTimeout> | null = null;\n\n private timerTo: ReturnType<typeof setTimeout> | null = null;\n\n constructor(props: ScheduleProps) {\n super(props);\n let schedule: ScheduleConfig | undefined;\n if (this.props.schedule && typeof this.props.schedule === 'string' && this.props.schedule[0] === '{') {\n try {\n schedule = JSON.parse(this.props.schedule);\n } catch {\n // ignore\n }\n } else if (typeof this.props.schedule === 'object') {\n schedule = this.props.schedule;\n }\n\n if (!schedule || !Object.keys(schedule).length) {\n setTimeout(() => this.onChange(this.state.schedule, true), 200);\n schedule = DEFAULT;\n }\n schedule = { ...DEFAULT, ...schedule };\n schedule.valid.from = schedule.valid.from || Schedule.now2string();\n\n this.refFrom = React.createRef();\n this.refTo = React.createRef();\n this.refOnce = React.createRef();\n\n this.state = {\n schedule,\n desc: Schedule.state2text(schedule),\n };\n\n if (JSON.stringify(schedule) !== this.props.schedule) {\n setTimeout(() => this.props.onChange && this.props.onChange(JSON.stringify(schedule)), 100);\n }\n }\n\n onChange(schedule: ScheduleConfig, force?: boolean): void {\n const isDiff = JSON.stringify(schedule) !== JSON.stringify(this.state.schedule);\n if (force || isDiff) {\n isDiff && this.setState({ schedule, desc: Schedule.state2text(schedule) });\n const copy = JSON.parse(JSON.stringify(schedule));\n if (copy.period.once) {\n const once = copy.period.once;\n delete copy.period;\n copy.period = { once };\n delete copy.valid;\n } else if (copy.period.days) {\n const days = copy.period.days;\n const daysOfWeek = copy.period.dows;\n delete copy.period;\n copy.period = { days };\n if (daysOfWeek && daysOfWeek !== '[]') {\n copy.period.dows = daysOfWeek;\n }\n } else if (copy.period.weeks) {\n const weeks = copy.period.weeks;\n const daysOfWeek = copy.period.dows;\n delete copy.period;\n copy.period = { weeks };\n if (daysOfWeek && daysOfWeek !== '[]') {\n copy.period.dows = daysOfWeek;\n }\n } else if (copy.period.months) {\n const months = copy.period.months;\n const dates = copy.period.dates;\n delete copy.period;\n copy.period = { months };\n if (dates && dates !== '[]') {\n copy.period.dates = dates;\n }\n } else if (copy.period.years) {\n const years = copy.period.years;\n const yearMonth = copy.period.yearMonth;\n const yearDate = copy.period.yearDate;\n delete copy.period;\n copy.period = { years, yearDate };\n if (yearMonth) {\n copy.period.yearMonth = yearMonth;\n }\n }\n\n if (copy.time.exactTime) {\n delete copy.time.end;\n delete copy.time.mode;\n delete copy.time.interval;\n } else {\n delete copy.time.exactTime;\n }\n if (copy.valid) {\n if (!copy.valid.to) {\n delete copy.valid.to;\n }\n if (\n copy.period.days === 1 ||\n copy.period.weeks === 1 ||\n copy.period.months === 1 ||\n copy.period.years === 1\n ) {\n const from = Schedule.string2date(copy.valid.from);\n const today = new Date();\n today.setHours(0);\n today.setMinutes(0);\n today.setSeconds(0);\n today.setMilliseconds(0);\n if (from <= today) {\n delete copy.valid.from;\n }\n }\n if (!copy.valid.from && !copy.valid.to) {\n delete copy.valid;\n }\n }\n\n this.props.onChange && this.props.onChange(JSON.stringify(copy), Schedule.state2text(schedule));\n }\n }\n\n static state2text(schedule: string | ScheduleConfig): string {\n if (typeof schedule === 'string') {\n try {\n schedule = JSON.parse(schedule) as ScheduleConfig;\n } catch {\n return '';\n }\n }\n\n const desc = [];\n const validFrom = Schedule.string2date(schedule.valid.from);\n if (schedule.period.once) {\n // once\n const once = Schedule.string2date(schedule.period.once);\n const now = new Date();\n now.setMilliseconds(0);\n now.setSeconds(0);\n now.setMinutes(0);\n now.setHours(0);\n\n //\n if (once < now) {\n // will be not executed anymore, because start is in the past\n return I18n.t('sch_desc_onceInPast');\n }\n // only once\n desc.push(I18n.t('sch_desc_once_on', schedule.period.once));\n } else if (schedule.period.days) {\n if (schedule.period.days === 1) {\n if (schedule.period.dows) {\n const daysOfWeek = JSON.parse(schedule.period.dows);\n if (daysOfWeek.length === 2 && daysOfWeek[0] === 0 && daysOfWeek[1] === 6) {\n // on weekends\n desc.push(I18n.t('sch_desc_onWeekends'));\n } else if (\n daysOfWeek.length === 5 &&\n daysOfWeek[0] === 1 &&\n daysOfWeek[1] === 2 &&\n daysOfWeek[2] === 3 &&\n daysOfWeek[3] === 4 &&\n daysOfWeek[4] === 5\n ) {\n // on workdays\n desc.push(I18n.t('sch_desc_onWorkdays'));\n } else {\n const tDows = daysOfWeek.map((day: number) => I18n.t(WEEKDAYS[day]));\n if (tDows.length === 1) {\n // on Monday\n desc.push(I18n.t('sch_desc_onWeekday', tDows[0]));\n } else if (tDows.length === 7) {\n // on every day\n desc.push(I18n.t('sch_desc_everyDay'));\n } else {\n const last = tDows.pop();\n // on Monday and Sunday\n desc.push(I18n.t('sch_desc_onWeekdays', tDows.join(', '), last));\n }\n }\n } else {\n desc.push(I18n.t('sch_desc_everyDay'));\n }\n } else {\n desc.push(I18n.t('sch_desc_everyNDay', schedule.period.days.toString()));\n }\n } else if (schedule.period.weeks) {\n if (schedule.period.weeks === 1) {\n desc.push(I18n.t('sch_desc_everyWeek'));\n } else {\n desc.push(I18n.t('sch_desc_everyNWeeks', schedule.period.weeks.toString()));\n }\n\n if (schedule.period.dows) {\n const daysOfWeek = JSON.parse(schedule.period.dows);\n if (daysOfWeek.length === 2 && daysOfWeek[0] === 0 && daysOfWeek[1] === 6) {\n // on weekends\n desc.push(I18n.t('sch_desc_onWeekends'));\n } else if (\n daysOfWeek.length === 5 &&\n daysOfWeek[0] === 1 &&\n daysOfWeek[1] === 2 &&\n daysOfWeek[2] === 3 &&\n daysOfWeek[3] === 4 &&\n daysOfWeek[4] === 5\n ) {\n // on workdays\n desc.push(I18n.t('sch_desc_onWorkdays'));\n } else {\n const tDows = daysOfWeek.map((day: number) => I18n.t(WEEKDAYS[day]));\n if (tDows.length === 1) {\n // on Monday\n desc.push(I18n.t('sch_desc_onWeekday', tDows[0]));\n } else if (tDows.length === 7) {\n // on every day\n desc.push(I18n.t('sch_desc_everyDay'));\n } else {\n const last = tDows.pop();\n // on Monday and Sunday\n desc.push(I18n.t('sch_desc_onWeekdays', tDows.join(', '), last));\n }\n }\n } else {\n return I18n.t('sch_desc_never');\n }\n } else if (schedule.period.months) {\n if (schedule.period.dates) {\n const dates = JSON.parse(schedule.period.dates);\n if (dates.length === 1) {\n // in 1 of month\n desc.push(I18n.t('sch_desc_onDate', dates[0]));\n } else if (dates.length === 31) {\n desc.push(I18n.t('sch_desc_onEveryDate'));\n } else if (!dates.length) {\n return I18n.t('sch_desc_never');\n } else {\n const last = dates.pop();\n // in 1 and 4 of month\n desc.push(I18n.t('sch_desc_onDates', dates.join(', '), last));\n }\n } else {\n desc.push(I18n.t('sch_desc_onEveryDate'));\n }\n\n if (schedule.period.months === 1) {\n desc.push(I18n.t('sch_desc_everyMonth'));\n } else if (typeof schedule.period.months === 'number') {\n desc.push(I18n.t('sch_desc_everyNMonths', schedule.period.months.toString()));\n } else {\n const months = JSON.parse(schedule.period.months);\n const tMonths = months.map((month: number) => I18n.t(MONTHS[month - 1]));\n if (!tMonths.length) {\n // in January\n return I18n.t('sch_desc_never');\n }\n if (tMonths.length === 1) {\n // in January\n desc.push(I18n.t('sch_desc_onMonth', tMonths[0]));\n } else if (tMonths.length === 12) {\n // every month\n desc.push(I18n.t('sch_desc_everyMonth'));\n } else {\n const last = tMonths.pop();\n // in January and May\n desc.push(I18n.t('sch_desc_onMonths', tMonths.join(', '), last));\n }\n }\n } else if (schedule.period.years) {\n if (schedule.period.years === 1) {\n desc.push(I18n.t('sch_desc_everyYear'));\n } else {\n desc.push(I18n.t('sch_desc_everyNYears', schedule.period.years.toString()));\n }\n desc.push(\n I18n.t(\n 'sch_desc_onDate',\n schedule.period.yearDate.toString(),\n schedule.period.yearMonth\n ? I18n.t(MONTHS[schedule.period.yearMonth - 1])\n : I18n.t('sch_desc_everyMonth'),\n ),\n );\n }\n\n // time\n if (schedule.time.exactTime) {\n if (ASTRO.includes(schedule.time.start)) {\n // at sunset\n desc.push(I18n.t('sch_desc_atTime', I18n.t(`sch_astro_${schedule.time.start}`)));\n } else {\n // at HH:MM\n desc.push(I18n.t('sch_desc_atTime', schedule.time.start));\n }\n } else {\n if (schedule.time.mode === PERIODS.minutes) {\n if (schedule.time.interval === 1) {\n // every minute\n desc.push(I18n.t('sch_desc_everyMinute'));\n } else {\n // every N minute\n desc.push(I18n.t('sch_desc_everyNMinutes', schedule.time.interval.toString()));\n }\n } else if (schedule.time.interval === 1) {\n // every minute\n desc.push(I18n.t('sch_desc_everyHour'));\n } else {\n // every N minute\n desc.push(I18n.t('sch_desc_everyNHours', schedule.time.interval.toString()));\n }\n\n const start =\n ASTRO.indexOf(schedule.time.start) !== -1\n ? I18n.t(`sch_astro_${schedule.time.start}`)\n : schedule.time.start;\n const end =\n ASTRO.indexOf(schedule.time.end) !== -1 ? I18n.t(`sch_astro_${schedule.time.end}`) : schedule.time.end;\n if (start !== '00:00' || (end !== '24:00' && end !== '23:59')) {\n // from HH:mm to HH:mm\n desc.push(I18n.t('sch_desc_intervalFromTo', start, end));\n }\n }\n\n if (!schedule.period.once) {\n // valid\n if (validFrom.getTime() > Date.now() && schedule.valid.to) {\n // from XXX to XXXX\n desc.push(I18n.t('sch_desc_validFromTo', schedule.valid.from, schedule.valid.to));\n } else if (validFrom.getTime() > Date.now()) {\n // from XXXX\n desc.push(I18n.t('sch_desc_validFrom', schedule.valid.from));\n } else if (schedule.valid.to) {\n // till XXXX\n desc.push(I18n.t('sch_desc_validTo', schedule.valid.to));\n }\n }\n return desc.join(' ');\n }\n\n getTimePeriodElements(): JSX.Element {\n const schedule = this.state.schedule;\n let wholeDay = false;\n let day = false;\n let night = false;\n let fromTo = true;\n if (schedule.time.start === '00:00' && schedule.time.end === '24:00') {\n wholeDay = true;\n fromTo = false;\n } else if (schedule.time.start === 'sunrise') {\n day = true;\n fromTo = false;\n } else if (schedule.time.start === 'sunset') {\n night = true;\n fromTo = false;\n }\n\n return (\n <div\n key=\"timePeriod\"\n style={styles.rowDiv}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!schedule.time.exactTime}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.exactTime = false;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_intervalTime')}\n />\n </div>\n <div style={styles.settingsDiv}>\n <div style={styles.settingsDiv}>\n {!schedule.time.exactTime && (\n <div>\n <div>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!fromTo}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = '00:00';\n _schedule.time.end = '23:59';\n this.onChange(_schedule);\n }}\n />\n }\n label={!fromTo ? I18n.t('sch_fromTo') : ''}\n />\n {fromTo && [\n <TextField\n variant=\"standard\"\n style={{ ...styles.inputTime, marginRight: 10 }}\n key=\"exactTimeFrom\"\n type=\"time\"\n sx={(theme: Theme) => ({\n '& input[type=\"time\"]::-webkit-calendar-picker-indicator': {\n filter: theme.palette.mode === 'dark' ? 'invert(80%)' : undefined,\n },\n })}\n value={this.state.schedule.time.start}\n // InputProps={{inputComponent: TextTime}}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = e.target.value;\n this.onChange(_schedule);\n }}\n slotProps={{\n inputLabel: { shrink: true },\n }}\n label={I18n.t('sch_from')}\n margin=\"normal\"\n />,\n <TextField\n variant=\"standard\"\n style={styles.inputTime}\n key=\"exactTimeTo\"\n type=\"time\"\n sx={(theme: Theme) => ({\n '& input[type=\"time\"]::-webkit-calendar-picker-indicator': {\n filter: theme.palette.mode === 'dark' ? 'invert(80%)' : undefined,\n },\n })}\n value={this.state.schedule.time.end}\n // InputProps={{inputComponent: TextTime}}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.end = e.target.value;\n this.onChange(_schedule);\n }}\n slotProps={{\n inputLabel: { shrink: true },\n }}\n label={I18n.t('sch_to')}\n margin=\"normal\"\n />,\n ]}\n </div>\n </div>\n )}\n\n {!schedule.time.exactTime && (\n <div>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!wholeDay}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = '00:00';\n _schedule.time.end = '24:00';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_wholeDay')}\n />\n </div>\n )}\n\n {!schedule.time.exactTime && (\n <div>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!day}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = 'sunrise';\n _schedule.time.end = 'sunset';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_astroDay')}\n />\n </div>\n )}\n\n {!schedule.time.exactTime && (\n <div>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!night}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = 'sunset';\n _schedule.time.end = 'sunrise';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_astroNight')}\n />\n </div>\n )}\n </div>\n {!schedule.time.exactTime && this.getPeriodSettingsMinutes(fromTo)}\n </div>\n </div>\n );\n }\n\n getTimeExactElements(): JSX.Element {\n const isAstro = ASTRO.includes(this.state.schedule.time.start);\n\n return (\n <div\n key=\"timeExact\"\n style={styles.rowDiv}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!this.state.schedule.time.exactTime}\n onClick={() => {\n const schedule = JSON.parse(JSON.stringify(this.state.schedule));\n schedule.time.exactTime = true;\n this.onChange(schedule);\n }}\n />\n }\n label={I18n.t('sch_exactTime')}\n />\n </div>\n {this.state.schedule.time.exactTime && (\n <Select\n variant=\"standard\"\n value={isAstro ? this.state.schedule.time.start : '00:00'}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = e.target.value;\n this.onChange(_schedule);\n }}\n >\n <MenuItem\n key=\"specific\"\n value=\"00:00\"\n >\n {I18n.t('sch_specificTime')}\n </MenuItem>\n {ASTRO.map(event => (\n <MenuItem\n key={event}\n value={event}\n >\n {I18n.t(`sch_astro_${event}`)}\n </MenuItem>\n ))}\n </Select>\n )}\n {this.state.schedule.time.exactTime && !isAstro && (\n <div style={styles.settingsDiv}>\n <TextField\n variant=\"standard\"\n style={styles.inputTime}\n key=\"exactTimeValue\"\n value={this.state.schedule.time.start}\n type=\"time\"\n sx={(theme: Theme) => ({\n '& input[type=\"time\"]::-webkit-calendar-picker-indicator': {\n filter: theme.palette.mode === 'dark' ? 'invert(80%)' : undefined,\n },\n })}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = e.target.value;\n this.onChange(_schedule);\n }}\n slotProps={{\n inputLabel: { shrink: true },\n }}\n margin=\"normal\"\n />\n </div>\n )}\n </div>\n );\n }\n\n static getDivider(): JSX.Element {\n return <hr style={styles.hr} />;\n }\n\n getPeriodModes(): JSX.Element[] {\n const schedule = this.state.schedule;\n const isOnce =\n !schedule.period.dows &&\n !schedule.period.months &&\n !schedule.period.dates &&\n !schedule.period.years &&\n !schedule.period.days &&\n !schedule.period.weeks;\n\n if (isOnce && !schedule.period.once) {\n schedule.period.once = Schedule.now2string(true);\n }\n\n return [\n // ----- once ---\n <div\n key=\"once\"\n style={{ ...styles.rowDiv, ...styles.rowOnce }}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!isOnce}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.once = _schedule.period.once || Schedule.now2string(true);\n _schedule.period.dows = '';\n _schedule.period.months = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodOnce')}\n />\n </div>\n {isOnce && (\n <div style={styles.settingsDiv}>\n <TextField\n variant=\"standard\"\n style={styles.inputDate}\n type=\"date\"\n ref={this.refOnce}\n key=\"exactDateAt\"\n defaultValue={string2USdate(schedule.period.once)}\n // InputProps={{inputComponent: TextTime}}\n onChange={e => {\n this.timerOnce && clearTimeout(this.timerOnce);\n this.timerOnce = null;\n\n if (this.refOnce.current) {\n this.refOnce.current.style.background = '#ff000030';\n }\n this.timerOnce = setTimeout(\n value => {\n this.timerOnce = null;\n if (this.refOnce.current) {\n this.refOnce.current.style.background = '';\n }\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const date = Schedule.string2date(value);\n if (date.toString() !== 'Invalid Date') {\n _schedule.period.once = `${padding(date.getDate())}.${padding(date.getMonth() + 1)}.${date.getFullYear()}`;\n this.onChange(_schedule);\n }\n },\n 1500,\n e.target.value,\n );\n }}\n slotProps={{\n inputLabel: { shrink: true },\n }}\n label={I18n.t('sch_at')}\n margin=\"normal\"\n />\n </div>\n )}\n </div>,\n\n // ----- days ---\n <Box\n component=\"div\"\n key=\"days\"\n sx={Utils.getStyle(this.props.theme, styles.rowDiv, styles.rowDays)}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!schedule.period.days}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = 1;\n _schedule.period.dows = '';\n _schedule.period.months = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodDaily')}\n />\n </div>\n <div style={styles.settingsDiv}>\n {this.getPeriodSettingsDaily()}\n {schedule.period.days ? this.getPeriodSettingsWeekdays() : null}\n </div>\n </Box>,\n\n // ----- days of weeks ---\n /*\n !schedule.period.days && (\n <div key=\"dows\" style={styles.rowDiv + ' ' + styles.rowDows}>\n <div style={styles.modeDiv}>\n <FormControlLabel control={<Radio style={styles.inputRadio} checked={!!schedule.period.dows} onClick={() => {\n const schedule = JSON.parse(JSON.stringify(this.state.schedule));\n schedule.period.dows = schedule.period.dows ? '' : '[0,1,2,3,4,5,6]';\n this.onChange(schedule);\n }}/>}\n label={I18n.t('sch_periodWeekdays')} />\n </div>\n <div style={styles.settingsDiv}>\n {this.getPeriodSettingsWeekdays()}\n </div>\n </div>,\n */\n // ----- weeks ---\n <Box\n component=\"div\"\n key=\"weeks\"\n sx={Utils.getStyle(this.props.theme, styles.rowDiv, styles.rowDows)}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!schedule.period.weeks}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = schedule.period.weeks ? 0 : 1;\n _schedule.period.dows = schedule.period.dows || '[0]';\n _schedule.period.months = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodWeekly')}\n />\n </div>\n <Box\n component=\"div\"\n style={styles.settingsDiv}\n >\n <div style={styles.settingsDiv}>{this.getPeriodSettingsWeekly()}</div>\n <Box\n component=\"div\"\n sx={Utils.getStyle(this.props.theme, styles.settingsDiv, styles.rowDowsDows)}\n >\n {this.state.schedule.period.weeks ? this.getPeriodSettingsWeekdays() : null}\n </Box>\n </Box>\n </Box>,\n\n // ----- months ---\n <Box\n component=\"div\"\n key=\"months\"\n sx={Utils.getStyle(this.props.theme, styles.rowDiv, styles.rowMonths)}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!schedule.period.months}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = 1;\n _schedule.period.dows = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodMonthly')}\n />\n </div>\n <div style={styles.settingsDiv}>\n {this.getPeriodSettingsMonthly()}\n {schedule.period.months ? (\n <Box>\n <Box\n component=\"div\"\n sx={Utils.getStyle(this.props.theme, styles.settingsDiv, styles.rowMonthsDates)}\n >\n <FormControlLabel\n control={\n <Checkbox\n style={styles.inputRadio}\n checked={!!schedule.period.dates}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = _schedule.period.months || 1;\n const dates = [];\n for (let i = 1; i <= 31; i++) {\n dates.push(i);\n }\n _schedule.period.dates =\n _schedule.period.dates || JSON.stringify(dates);\n _schedule.period.dows = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodDates')}\n />\n </Box>\n <Box\n component=\"div\"\n sx={Utils.getStyle(this.props.theme, styles.settingsDiv, styles.rowMonthsDates)}\n >\n {this.getPeriodSettingsDates()}\n </Box>\n </Box>\n ) : null}\n </div>\n </Box>,\n\n // ----- years ---\n <Box\n component=\"div\"\n key=\"years\"\n sx={Utils.getStyle(this.props.theme, styles.rowDiv, styles.rowYears)}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!schedule.period.years}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = 1;\n _schedule.period.yearDate = 1;\n _schedule.period.yearMonth = 1;\n _schedule.period.dows = '';\n _schedule.period.months = 0;\n _schedule.period.dates = '';\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodYearly')}\n />\n </div>\n <div style={styles.settingsDiv}>\n <div style={styles.settingsDiv}>{this.getPeriodSettingsYearly()}</div>\n {!!schedule.period.years && (\n <div style={styles.settingsDiv}>\n <span>{I18n.t('sch_on')}</span>\n <Input\n key=\"input\"\n value={this.state.schedule.period.yearDate}\n style={styles.inputEvery}\n type=\"number\"\n inputProps={{ min: 1, max: 31 }}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.yearDate = parseInt(e.target.value, 10);\n if (_schedule.period.yearDate < 1) {\n _schedule.period.yearDate = 31;\n }\n if (_schedule.period.yearDate > 31) {\n _schedule.period.yearDate = 1;\n }\n this.onChange(_schedule);\n }}\n />\n <Select\n variant=\"standard\"\n value={schedule.period.yearMonth}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.yearMonth = e.target.value;\n this.onChange(_schedule);\n }}\n >\n <MenuItem\n key=\"every\"\n value={0}\n >\n {I18n.t('sch_yearEveryMonth')}\n </MenuItem>\n {MONTHS.map((month, i) => (\n <MenuItem\n key={month}\n value={i + 1}\n >\n {I18n.t(month)}\n </MenuItem>\n ))}\n </Select>\n </div>\n )}\n </div>\n </Box>,\n ];\n }\n\n getPeriodSettingsMinutes(fromTo: boolean): JSX.Element {\n return (\n <div style={{ display: 'inline-block', marginTop: fromTo ? 15 : 'inherit' }}>\n <label style={{ marginLeft: 4, marginRight: 4 }}>{I18n.t('sch_every')}</label>\n <Input\n value={this.state.schedule.time.interval}\n style={{\n ...styles.inputEvery,\n verticalAlign: 'bottom',\n }}\n type=\"number\"\n inputProps={{ min: 1 }}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.interval = parseInt(e.target.value, 10);\n this.onChange(_schedule);\n }}\n />\n <Select\n variant=\"standard\"\n value={this.state.schedule.time.mode}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.mode = e.target.value;\n this.onChange(_schedule);\n }}\n >\n <MenuItem value={PERIODS.minutes}>{I18n.t('sch_periodMinutes')}</MenuItem>\n <MenuItem value={PERIODS.hours}>{I18n.t('sch_periodHours')}</MenuItem>\n </Select>\n </div>\n );\n }\n\n getPeriodSettingsWeekdays(): JSX.Element[] {\n // || this.state.schedule.period.dows === '[1, 2, 3, 4, 5]' || this.state.schedule.period.dows === '[0, 6]'\n const schedule = this.state.schedule;\n const isSpecific =\n schedule.period.dows && schedule.period.dows !== '[1, 2, 3, 4, 5]' && schedule.period.dows !== '[0, 6]';\n return [\n <div key=\"workdays\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.dows === '[1, 2, 3, 4, 5]'}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dows = '[1, 2, 3, 4, 5]';\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodWorkdays')}\n />\n </div>,\n\n <div key=\"weekend\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.dows === '[0, 6]'}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dows = '[0, 6]';\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodWeekend')}\n />\n </div>,\n\n <div\n key=\"specific\"\n style={{ verticalAlign: 'top' }}\n >\n <FormControlLabel\n style={{ verticalAlign: 'top' }}\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!isSpecific}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dows = '[0, 1, 2, 3, 4, 5, 6]';\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodWeekdays')}\n />\n {isSpecific && (schedule.period.days === 1 || schedule.period.weeks) && (\n <FormGroup\n row\n style={{ ...styles.inputGroup, width: 150 }}\n >\n {[1, 2, 3, 4, 5, 6, 0].map(i => (\n <FormControlLabel\n key={`specific_${i}`}\n style={styles.inputGroupElement}\n control={\n <Checkbox\n style={styles.inputSmallCheck}\n checked={schedule.period.dows.includes(i.toString())}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n let daysOfWeek: number[];\n try {\n daysOfWeek = JSON.parse(_schedule.period.dows);\n } catch {\n daysOfWeek = [];\n }\n if (e.target.checked && !daysOfWeek.includes(i)) {\n daysOfWeek.push(i);\n } else if (!e.target.checked && daysOfWeek.includes(i)) {\n daysOfWeek.splice(daysOfWeek.indexOf(i), 1);\n }\n daysOfWeek.sort((a: number, b: number) => a - b);\n _schedule.period.dows = JSON.stringify(daysOfWeek);\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t(WEEKDAYS[i])}\n />\n ))}\n </FormGroup>\n )}\n </div>,\n ];\n }\n\n getPeriodSettingsDaily(): JSX.Element[] | null {\n if (!this.state.schedule.period.days) {\n return null;\n }\n const schedule = this.state.schedule;\n return [\n <div key=\"every_day\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.days === 1 && !schedule.period.dows}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = 1;\n _schedule.period.dows = '';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEveryDay')}\n />\n </div>,\n <div key=\"everyN_day\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.days > 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = 2;\n _schedule.period.dows = '';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEvery')}\n />\n {schedule.period.days > 1 && [\n <Input\n key=\"input\"\n value={this.state.schedule.period.days}\n style={styles.inputEvery}\n type=\"number\"\n inputProps={{ min: 2 }}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = parseInt(e.target.value, 10);\n _schedule.period.dows = '';\n this.onChange(_schedule);\n }}\n />,\n <span\n key=\"span\"\n style={{ paddingRight: 10 }}\n >\n {I18n.t('sch_periodDay')}\n </span>,\n ]}\n </div>,\n ];\n }\n\n getPeriodSettingsWeekly(): JSX.Element[] | null {\n if (!this.state.schedule.period.weeks) {\n return null;\n }\n const schedule = this.state.schedule;\n return [\n <div\n key=\"radios\"\n style={{ display: 'inline-block', verticalAlign: 'top' }}\n >\n <div>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.weeks === 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = 1;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEveryWeek')}\n />\n </div>\n <div>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.weeks > 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = 2;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEvery')}\n />\n {schedule.period.weeks > 1 && [\n <Input\n key=\"input\"\n value={this.state.schedule.period.weeks}\n style={styles.inputEvery}\n type=\"number\"\n inputProps={{ min: 2 }}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = parseInt(e.target.value, 10);\n this.onChange(_schedule);\n }}\n />,\n <span key=\"text\">{I18n.t('sch_periodWeek')}</span>,\n ]}\n </div>\n </div>,\n ];\n }\n\n getPeriodSettingsDates(): JSX.Element | null {\n if (!this.state.schedule.period.dates) {\n return null;\n }\n const schedule = this.state.schedule;\n\n const dates = [];\n for (let i = 1; i <= 31; i++) {\n dates.push(i);\n }\n\n const parsedDates = JSON.parse(schedule.period.dates);\n\n return (\n <FormGroup\n row\n style={{ ...styles.inputGroup, maxWidth: 620 }}\n >\n <FormControlLabel\n style={styles.inputDateDay}\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={parsedDates.length === 31}\n onChange={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const _dates = [];\n for (let i = 1; i <= 31; i++) {\n _dates.push(i);\n }\n _schedule.period.dates = JSON.stringify(_dates);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_all')}\n />\n <FormControlLabel\n style={styles.inputDateDay}\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={!parsedDates.length}\n onChange={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dates = '[]';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_no_one')}\n />\n {parsedDates.length !== 31 && !!parsedDates.length && (\n <FormControlLabel\n style={styles.inputDateDay}\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={false}\n onChange={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const result = [];\n const _parsedDates = JSON.parse(_schedule.period.dates);\n for (let i = 1; i <= 31; i++) {\n if (!_parsedDates.includes(i)) {\n result.push(i);\n }\n }\n result.sort((a, b) => a - b);\n _schedule.period.dates = JSON.stringify(result);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_invert')}\n />\n )}\n <div />\n {dates.map(i => (\n <FormControlLabel\n key={`date_${i}`}\n style={\n !i\n ? {\n ...styles.inputDateDay,\n opacity: 0,\n cursor: 'default',\n userSelect: 'none',\n pointerEvents: 'none',\n }\n : styles.inputDateDay\n }\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={JSON.parse(schedule.period.dates).includes(i)}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n let _dates;\n try {\n _dates = JSON.parse(_schedule.period.dates);\n } catch {\n _dates = [];\n }\n if (e.target.checked && !_dates.includes(i)) {\n _dates.push(i);\n } else if (!e.target.checked && _dates.includes(i)) {\n _dates.splice(_dates.indexOf(i), 1);\n }\n _dates.sort((a: number, b: number) => a - b);\n _schedule.period.dates = JSON.stringify(_dates);\n this.onChange(_schedule);\n }}\n />\n }\n label={\n i < 10\n ? [\n <span\n key=\"0\"\n style={{ opacity: 0 }}\n >\n 0\n </span>,\n <span key=\"num\">{i}</span>,\n ]\n : i\n }\n />\n ))}\n </FormGroup>\n );\n }\n\n getPeriodSettingsMonthly(): JSX.Element[] | null {\n if (!this.state.schedule.period.months) {\n return null;\n }\n const schedule = this.state.schedule;\n const parsedMonths = typeof schedule.period.months === 'string' ? JSON.parse(schedule.period.months) : [];\n\n return [\n <div key=\"every\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={typeof schedule.period.months === 'number' && schedule.period.months === 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = 1;\n this.onChange(schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEveryMonth')}\n />\n </div>,\n <div key=\"everyN\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={typeof schedule.period.months === 'number' && schedule.period.months > 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = 2;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEvery')}\n />\n {typeof schedule.period.months === 'number' &&\n schedule.period.months > 1 && [\n <Input\n key=\"input\"\n value={schedule.period.months}\n style={styles.inputEvery}\n type=\"number\"\n inputProps={{ min: 2 }}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = parseInt(e.target.value, 10);\n if (_schedule.period.months < 1) {\n _schedule.period.months = 1;\n }\n this.onChange(_schedule);\n }}\n />,\n <span key=\"text\">{I18n.t('sch_periodMonth')}</span>,\n ]}\n </div>,\n <div\n key=\"specific\"\n style={{ verticalAlign: 'top' }}\n >\n <FormControlLabel\n style={{ verticalAlign: 'top' }}\n control={\n <Radio\n style={styles.inputRadio}\n checked={typeof schedule.period.months === 'string'}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = '[1,2,3,4,5,6,7,8,9,10,11,12]';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodSpecificMonths')}\n />\n {typeof schedule.period.months === 'string' && (\n <FormGroup\n row\n style={styles.inputGroup}\n >\n <FormControlLabel\n style={styles.inputDateDay}\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={parsedMonths.length === 12}\n onChange={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const months = [];\n for (let i = 1; i <= 12; i++) {\n months.push(i);\n }\n _schedule.period.months = JSON.stringify(months);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_all')}\n />\n <FormControlLabel\n style={styles.inputDateDay}\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={!parsedMonths.length}\n onChange={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = '[]';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_no_one')}\n />\n {parsedMonths.length !== 12 && !!parsedMonths.length && (\n <FormControlLabel\n style={styles.inputDateDay}\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={false}\n onChange={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const result = [];\n const _parsedMonths = JSON.parse(_schedule.period.months);\n for (let i = 1; i <= 12; i++) {\n if (!_parsedMonths.includes(i)) {\n result.push(i);\n }\n }\n result.sort((a, b) => a - b);\n _schedule.period.months = JSON.stringify(result);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_invert')}\n />\n )}\n <div />\n {MONTHS.map((month, i) => (\n <FormControlLabel\n key={`month_${i}`}\n style={styles.inputGroupElement}\n control={\n <Checkbox\n style={styles.inputSmallCheck}\n checked={\n typeof schedule.period.months === 'string'\n ? JSON.parse(schedule.period.months).includes(i + 1)\n : schedule.period.months === i\n }\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n let months;\n try {\n months = JSON.parse(_schedule.period.months);\n } catch {\n months = [];\n }\n if (e.target.checked && !months.includes(i + 1)) {\n months.push(i + 1);\n } else if (!e.target.checked && months.includes(i + 1)) {\n months.splice(months.indexOf(i + 1), 1);\n }\n months.sort((a: number, b: number) => a - b);\n _schedule.period.months = JSON.stringify(months);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t(month)}\n />\n ))}\n </FormGroup>\n )}\n </div>,\n ];\n }\n\n getPeriodSettingsYearly(): JSX.Element[] | null {\n if (!this.state.schedule.period.years) {\n return null;\n }\n const schedule = this.state.schedule;\n return [\n <div key=\"year\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.years === 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = 1;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEveryYear')}\n />\n </div>,\n <div key=\"every\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.years > 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = 2;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEvery')}\n />\n {schedule.period.years > 1 && [\n <Input\n key=\"input\"\n value={this.state.schedule.period.years}\n style={styles.inputEvery}\n type=\"number\"\n inputProps={{ min: 2 }}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = parseInt(e.target.value, 10);\n if (_schedule.period.years < 1) {\n _schedule.period.years = 1;\n }\n this.onChange(_schedule);\n }}\n />,\n <span key=\"text\">{I18n.t('sch_periodYear')}</span>,\n ]}\n </div>,\n ];\n }\n\n static now2string(isEnd?: boolean): string {\n const d = new Date();\n d.setHours(0);\n d.setMinutes(0);\n d.setSeconds(0);\n d.setMilliseconds(0);\n if (isEnd) {\n d.setDate(d.getDate() + 2);\n d.setMilliseconds(d.getMilliseconds() - 1);\n }\n\n return `${padding(d.getDate())}.${padding(d.getMonth() + 1)}.${padding(d.getFullYear())}`;\n }\n\n static string2date(str: string): Date {\n let parts = str.split('.'); // 31.12.2019\n if (parts.length === 1) {\n parts = str.split('-'); // 2018-12-31\n return new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10));\n }\n return new Date(parseInt(parts[2], 10), parseInt(parts[1], 10) - 1, parseInt(parts[0], 10));\n }\n\n getValidSettings(): JSX.Element {\n const schedule = this.state.schedule;\n // ----- from ---\n return (\n <div style={styles.rowDiv}>\n <div style={{ ...styles.modeDiv, verticalAlign: 'middle' }}>\n <span style={{ fontWeight: 'bold', paddingRight: 10 }}>{I18n.t('sch_valid')}</span>\n <span>{I18n.t('sch_validFrom')}</span>\n </div>\n <div style={styles.settingsDiv}>\n <TextField\n variant=\"standard\"\n style={{ ...styles.inputDate, marginRight: 10 }}\n key=\"exactTimeFrom\"\n inputRef={this.refFrom}\n defaultValue={string2USdate(schedule.valid.from)}\n type=\"date\"\n // inputComponent={TextDate}\n onChange={e => {\n this.timerFrom && clearTimeout(this.timerFrom);\n\n if (this.refFrom.current) {\n this.refFrom.current.style.background = '#ff000030';\n }\n\n this.timerFrom = setTimeout(\n value => {\n this.timerFrom = null;\n if (this.refFrom.current) {\n this.refFrom.current.style.background = '';\n }\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const date = Schedule.string2date(value);\n if (date.toString() !== 'Invalid Date') {\n _schedule.valid.from = `${padding(date.getDate())}.${padding(date.getMonth() + 1)}.${date.getFullYear()}`;\n this.onChange(_schedule);\n }\n },\n 1500,\n e.target.value,\n );\n }}\n slotProps={{\n inputLabel: { shrink: true },\n }}\n margin=\"normal\"\n />\n <FormControlLabel\n control={\n <Checkbox\n style={styles.inputRadio}\n checked={!!schedule.valid.to}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.valid.to = _schedule.valid.to ? '' : Schedule.now2string(true);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_validTo')}\n />\n {!!schedule.valid.to && (\n <TextField\n variant=\"standard\"\n inputRef={this.refTo}\n style={{ ...styles.inputDate, marginRight: 10 }}\n key=\"exactTimeFrom\"\n type=\"date\"\n defaultValue={string2USdate(schedule.valid.to)}\n // inputComponent={TextDate}\n onChange={e => {\n this.timerTo && clearTimeout(this.timerTo);\n\n if (this.refTo.current) {\n this.refTo.current.style.background = '#ff000030';\n }\n this.timerTo = setTimeout(\n value => {\n this.timerTo = null;\n if (this.refTo.current) {\n this.refTo.current.style.background = '';\n }\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const date = Schedule.string2date(value);\n if (date.toString() !== 'Invalid Date') {\n _schedule.valid.to = `${padding(date.getDate())}.${padding(date.getMonth() + 1)}.${date.getFullYear()}`;\n this.onChange(_schedule);\n }\n },\n 1500,\n e.target.value,\n );\n }}\n slotProps={{\n inputLabel: { shrink: true },\n }}\n margin=\"normal\"\n />\n )}\n </div>\n </div>\n );\n }\n\n render(): JSX.Element {\n return (\n <div style={{ height: 'calc(100% - 48px)', width: '100%', overflow: 'hidden' }}>\n <div>{this.state.desc}</div>\n <div style={styles.scrollWindow}>\n <h5>{I18n.t('sch_time')}</h5>\n {this.getTimePeriodElements()}\n {this.getTimeExactElements()}\n {Schedule.getDivider()}\n <h5>{I18n.t('sch_period')}</h5>\n {this.getPeriodModes()}\n {!this.state.schedule.period.once && Schedule.getDivider()}\n {!this.state.schedule.period.once && this.getValidSettings()}\n </div>\n </div>\n );\n }\n}\n","import React, { Component } from 'react';\n\nimport { FormControl, InputLabel, MenuItem, Select } from '@mui/material';\nimport type { InputProps } from '@mui/material/Input';\n\nimport type { ThemeType, Translate } from '../types';\n\nimport { Icon } from './Icon';\nimport { Utils } from './Utils';\nimport { I18n } from '../i18n';\n\nconst styles: Record<string, React.CSSProperties> = {\n different: {\n opacity: 0.5,\n },\n icon: {\n width: 16,\n height: 16,\n marginRight: 8,\n },\n};\n\ninterface SelectWithIconProps {\n t: Translate;\n lang: ioBroker.Languages;\n themeType: ThemeType;\n value?: string;\n onChange: (id: string) => void;\n disabled?: boolean;\n list?: ioBroker.Object[] | Record<string, ioBroker.Object>; // one of \"list\"(Array) or \"options\"(object) is required\n options?: Record<string, any>; // one of \"list\"(Array) or \"options\"(object) is required\n different?: string | boolean;\n label?: string;\n fullWidth?: boolean;\n className?: string;\n style?: React.CSSProperties;\n removePrefix?: string;\n allowNone?: boolean;\n inputProps?: InputProps['inputProps'];\n dense?: boolean;\n}\n\ninterface TextWithIconItem {\n name: string;\n value: string;\n icon?: string;\n color?: string;\n}\n\ninterface SelectWithIconState {\n list: TextWithIconItem[];\n}\n\nexport class SelectWithIcon extends Component<SelectWithIconProps, SelectWithIconState> {\n private readonly wordDifferent: string | undefined;\n\n private timeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(props: SelectWithIconProps) {\n super(props);\n\n if (props.different) {\n this.wordDifferent = props.t('ra___different__');\n }\n\n let list: TextWithIconItem[];\n if (Array.isArray(props.list || props.options)) {\n list = ((props.list || props.options) as ioBroker.Object[]).map(obj => ({\n name: Utils.getObjectNameFromObj(obj, props.lang)\n .replace('system.group.', '')\n .replace('system.user.', '')\n .replace('enum.rooms.', '')\n .replace('enum.functions.', ''),\n value: obj._id,\n icon: obj.common?.icon,\n color: obj.common?.color,\n }));\n } else {\n list = Object.values((props.list || props.options) as Record<string, ioBroker.Object>).map(obj => ({\n name: Utils.getObjectNameFromObj(obj, props.lang)\n .replace('system.group.', '')\n .replace('system.user.', '')\n .replace('enum.rooms.', '')\n .replace('enum.functions.', ''),\n value: obj._id,\n icon: obj.common?.icon,\n color: obj.common?.color,\n }));\n }\n\n if (props.different && props.value === props.different) {\n list.unshift({ value: props.different, name: this.wordDifferent || '' });\n }\n\n if (props.allowNone) {\n list.unshift({ value: '', name: I18n.t('ra_none') });\n }\n\n this.state = {\n list,\n };\n }\n\n render(): React.JSX.Element {\n if (this.props.allowNone && !this.state.list.find(obj => obj.value === '')) {\n this.timeout =\n this.timeout ||\n setTimeout(() => {\n this.timeout = null;\n const list = JSON.parse(JSON.stringify(this.state.list));\n list.unshift({ value: '', name: I18n.t('ra_none') });\n this.setState({ list });\n }, 100);\n } else if (!this.props.allowNone && this.state.list.find(obj => obj.value === '')) {\n this.timeout =\n this.timeout ||\n setTimeout(() => {\n this.timeout = null;\n const list = JSON.parse(JSON.stringify(this.state.list));\n const i = this.state.list.findIndex(obj => obj.value === '');\n list.splice(i, 1);\n this.setState({ list });\n }, 100);\n }\n\n const item = this.state.list.find(\n it =>\n it.value === this.props.value ||\n (this.props.removePrefix && it.value.replace(this.props.removePrefix, '') === this.props.value),\n );\n\n const style =\n this.props.value === this.props.different\n ? {}\n : {\n color: item?.color || undefined,\n backgroundColor: Utils.getInvertedColor(item?.color || '', this.props.themeType),\n };\n\n if (this.props.dense && this.props.style) {\n Object.assign(style, this.props.style);\n }\n\n const select = (\n <Select\n variant=\"standard\"\n disabled={this.props.disabled}\n value={this.props.value}\n slotProps={{\n input: this.props.inputProps,\n }}\n renderValue={\n (/* value */) => (\n <span>\n {item?.icon ? (\n <Icon\n src={item?.icon}\n style={styles.icon}\n />\n ) : null}\n {item?.name}\n </span>\n )\n }\n sx={{\n '&.MuiSelect-root': this.props.value === this.props.different ? styles.different : {},\n }}\n classes={{\n root: this.props.dense ? this.props.className : '',\n }}\n style={style}\n onChange={el => {\n if (this.props.different && el.target.value !== this.props.different) {\n let pos = null;\n for (let i = 0; i < this.state.list.length; i++) {\n if (this.state.list[i].value === this.props.different) {\n pos = i;\n break;\n }\n }\n if (pos !== null) {\n const list: TextWithIconItem[] = Utils.clone(this.state.list) as TextWithIconItem[];\n list.splice(pos, 1);\n this.setState({ list }, () => this.props.onChange(el.target.value));\n return;\n }\n }\n\n this.props.onChange(\n this.props.removePrefix\n ? el.target.value.replace(this.props.removePrefix, '')\n : el.target.value,\n );\n }}\n >\n {this.state.list.map(el => (\n <MenuItem\n style={\n this.props.different && el.value === this.props.different\n ? styles.different\n : {\n color: el.color || undefined,\n backgroundColor: Utils.getInvertedColor(el.color || '', this.props.themeType),\n }\n }\n key={el.value}\n value={el.value}\n >\n {el.icon ? (\n <Icon\n src={el.icon}\n style={styles.icon}\n />\n ) : null}\n {el.name}\n </MenuItem>\n ))}\n </Select>\n );\n\n if (this.props.dense) {\n return select;\n }\n\n return (\n <FormControl\n variant=\"standard\"\n fullWidth={!!this.props.fullWidth}\n style={this.props.style}\n className={this.props.className}\n >\n <InputLabel>{this.props.label}</InputLabel>\n {select}\n </FormControl>\n );\n }\n}\n","/**\n * Copyright 2022-2024, Denis Haev <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport React, { Component } from 'react';\n\nimport { Table, Skeleton } from '@mui/material';\n\ninterface TableResizeProps {\n name?: string;\n ready?: boolean;\n stickyHeader?: boolean;\n size?: 'small' | 'medium';\n className?: string;\n sx?: Record<string, any>;\n style?: React.CSSProperties;\n initialWidths?: (number | 'auto')[];\n minWidths?: number[];\n dblTitle?: string;\n children?: React.ReactNode;\n}\n\nexport class TableResize extends Component<TableResizeProps> {\n private readonly resizerRefTable: React.RefObject<HTMLTableElement>;\n\n private resizerActiveIndex: number | null;\n\n private resizerActiveDiv: HTMLDivElement | null;\n\n private resizerCurrentWidths: (number | 'auto')[];\n\n private widthFilled: boolean = false;\n\n private installTimeout: ReturnType<typeof setTimeout> | null = null;\n\n private resizerMin: number = 0;\n\n private resizerMinNext: number = 0;\n\n private resizerPosition: number = 0;\n\n private resizerOldWidth: number = 0;\n\n private resizerOldWidthNext: number = 0;\n\n constructor(props: TableResizeProps) {\n super(props);\n this.resizerRefTable = React.createRef();\n this.resizerActiveIndex = null;\n this.resizerActiveDiv = null;\n this.resizerCurrentWidths = [];\n }\n\n componentDidMount(): void {\n this.resizerInstall();\n }\n\n componentWillUnmount(): void {\n this.resizerUninstall();\n }\n\n resizerInstall(): void {\n if (this.resizerRefTable.current && !(this.resizerRefTable.current as any)._installed) {\n (this.resizerRefTable.current as any)._installed = true;\n const ths = this.resizerRefTable.current.querySelectorAll('th');\n\n const widthsStored = ((window as any)._localStorage || window.localStorage).getItem(\n `App.${this.props.name || 'history'}.table`,\n );\n this.widthFilled = false;\n\n if (widthsStored) {\n try {\n this.resizerCurrentWidths = JSON.parse(widthsStored);\n this.widthFilled = true;\n } catch {\n // ignore\n }\n }\n if (this.widthFilled) {\n if (this.resizerCurrentWidths.length !== ths.length) {\n this.resizerCurrentWidths = [];\n this.widthFilled = false;\n } else {\n const tableWidth = this.resizerRefTable.current.offsetWidth;\n let storedWidth: number | null = 0;\n for (let w = 0; w < this.resizerCurrentWidths.length; w++) {\n if (window.isFinite(this.resizerCurrentWidths[w] as number)) {\n storedWidth += this.resizerCurrentWidths[w] as number;\n } else {\n storedWidth = null;\n break;\n }\n }\n if (storedWidth !== null && Math.abs(storedWidth - tableWidth) > 20) {\n this.resizerCurrentWidths = [];\n this.widthFilled = false;\n }\n }\n }\n\n for (let i = 0; i < ths.length; i++) {\n !this.widthFilled && this.resizerCurrentWidths.push(ths[i].offsetWidth);\n\n // last column does need a handle\n if (i < ths.length - 1) {\n const div = window.document.createElement('div');\n div.dataset.index = i.toString();\n div.onmousedown = this.resizerMouseDown;\n div.ondblclick = this.resizerReset;\n div.title = this.props.dblTitle || 'Double click to reset table layout';\n div.className = 'resize-handle';\n ths[i].appendChild(div);\n }\n }\n if (this.widthFilled) {\n this.resizerApplyWidths();\n }\n } else {\n this.installTimeout = setTimeout(() => {\n this.installTimeout = null;\n this.resizerInstall();\n }, 100);\n }\n }\n\n resizerReset = (): void => {\n for (let c = 0; c < this.resizerCurrentWidths.length; c++) {\n this.resizerCurrentWidths[c] = (this.props.initialWidths || [])[c] || 'auto';\n }\n\n ((window as any)._localStorage || window.localStorage).setItem(\n `App.${this.props.name || 'history'}.table`,\n JSON.stringify(this.resizerCurrentWidths),\n );\n this.resizerApplyWidths();\n };\n\n resizerUninstall(): void {\n this.installTimeout && clearTimeout(this.installTimeout);\n this.installTimeout = null;\n\n // resizer\n if (this.resizerRefTable.current && (this.resizerRefTable.current as any)._installed) {\n (this.resizerRefTable.current as any)._installed = false;\n const ths = this.resizerRefTable.current.querySelectorAll('th');\n for (let i = 0; i < ths.length; i++) {\n const div: HTMLDivElement | null = ths[i].querySelector('.resize-handle');\n if (div) {\n div.onmousedown = null;\n div.remove();\n }\n }\n }\n }\n\n resizerApplyWidths(): string | undefined {\n const gridTemplateColumns: string[] = [];\n if (this.resizerCurrentWidths.length) {\n for (let c = 0; c < this.resizerCurrentWidths.length; c++) {\n if (this.resizerCurrentWidths[c]) {\n gridTemplateColumns.push(\n this.resizerCurrentWidths[c] !== 'auto' ? `${this.resizerCurrentWidths[c]}px` : 'auto',\n );\n } else if (this.props.initialWidths && this.props.initialWidths[c]) {\n gridTemplateColumns.push(\n this.props.initialWidths[c] !== 'auto' ? `${this.props.initialWidths[c]}px` : 'auto',\n );\n } else {\n gridTemplateColumns.push('auto');\n }\n }\n } else if (this.props.initialWidths) {\n for (let c = 0; c < this.props.initialWidths.length; c++) {\n if (this.props.initialWidths[c]) {\n gridTemplateColumns.push(\n this.props.initialWidths[c] !== 'auto' ? `${this.props.initialWidths[c]}px` : 'auto',\n );\n } else {\n gridTemplateColumns.push('auto');\n }\n }\n }\n\n if (this.resizerRefTable.current && gridTemplateColumns.length) {\n this.resizerRefTable.current.style.gridTemplateColumns = gridTemplateColumns.join(' ');\n }\n\n return gridTemplateColumns.length ? gridTemplateColumns.join(' ') : undefined;\n }\n\n resizerMouseMove = (e: MouseEvent): void => {\n if (this.resizerActiveDiv && this.resizerActiveIndex !== null) {\n const width = this.resizerOldWidth + e.clientX - this.resizerPosition;\n const widthNext = this.resizerOldWidthNext - e.clientX + this.resizerPosition;\n if (\n (!this.resizerMin || width > this.resizerMin) &&\n (!this.resizerMinNext || widthNext > this.resizerMinNext)\n ) {\n this.resizerCurrentWidths[this.resizerActiveIndex] = width;\n this.resizerCurrentWidths[this.resizerActiveIndex + 1] = widthNext;\n this.resizerApplyWidths();\n }\n }\n };\n\n resizerMouseUp = (): void => {\n ((window as any)._localStorage || window.localStorage).setItem(\n `App.${this.props.name || 'history'}.table`,\n JSON.stringify(this.resizerCurrentWidths),\n );\n\n this.resizerActiveIndex = null;\n this.resizerActiveDiv = null;\n window.removeEventListener('mousemove', this.resizerMouseMove);\n window.removeEventListener('mouseup', this.resizerMouseUp);\n };\n\n resizerMouseDown = (e: MouseEvent): void => {\n if (this.resizerActiveIndex === null || this.resizerActiveIndex === undefined) {\n console.log(`Mouse down ${(e.target as HTMLDivElement)?.dataset.index}`);\n this.resizerActiveIndex = parseInt((e.target as HTMLDivElement)?.dataset.index || '0', 10);\n this.resizerActiveDiv = e.target as HTMLDivElement;\n this.resizerMin = this.props.minWidths ? this.props.minWidths[this.resizerActiveIndex] : 0;\n this.resizerMinNext = this.props.minWidths ? this.props.minWidths[this.resizerActiveIndex + 1] : 0;\n this.resizerPosition = e.clientX;\n let ths;\n if (this.resizerCurrentWidths[this.resizerActiveIndex] === 'auto') {\n ths = this.resizerRefTable.current?.querySelectorAll('th');\n if (ths) {\n this.resizerCurrentWidths[this.resizerActiveIndex] = ths[this.resizerActiveIndex].offsetWidth;\n }\n }\n if (this.resizerCurrentWidths[this.resizerActiveIndex + 1] === 'auto') {\n ths = ths || this.resizerRefTable.current?.querySelectorAll('th');\n if (ths) {\n this.resizerCurrentWidths[this.resizerActiveIndex + 1] =\n ths[this.resizerActiveIndex + 1].offsetWidth;\n }\n }\n\n this.resizerOldWidth = this.resizerCurrentWidths[this.resizerActiveIndex] as number;\n this.resizerOldWidthNext = this.resizerCurrentWidths[this.resizerActiveIndex + 1] as number;\n\n window.addEventListener('mousemove', this.resizerMouseMove);\n window.addEventListener('mouseup', this.resizerMouseUp);\n }\n };\n\n render(): React.JSX.Element {\n if (this.props.ready === false) {\n return <Skeleton />;\n }\n\n const style = { gridTemplateColumns: this.resizerApplyWidths() };\n\n return (\n <Table\n stickyHeader={this.props.stickyHeader}\n size={this.props.size || 'small'}\n className={this.props.className}\n sx={this.props.sx}\n ref={this.resizerRefTable}\n style={{ ...(this.props.style || undefined), ...style }}\n >\n {this.props.children}\n </Table>\n );\n }\n}\n","import React from 'react';\n\nimport { Icon } from './Icon';\nimport { Utils } from './Utils';\nimport type { ThemeType } from '../types';\n\nconst styles: Record<string, React.CSSProperties> = {\n div: {\n borderRadius: 3,\n padding: '0 3px',\n lineHeight: '20px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n },\n icon: {\n width: 16,\n height: 16,\n marginRight: 8,\n verticalAlign: 'middle',\n },\n text: {\n display: 'inline-block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n};\n\ninterface TextWithIconProps {\n lang: ioBroker.Languages;\n themeType?: ThemeType;\n value: string | Record<string, any>;\n list?: ioBroker.Object[] | Record<string, ioBroker.Object>;\n options?: Record<string, any>;\n className?: string;\n style?: React.CSSProperties;\n title?: string;\n removePrefix?: string;\n moreClasses?: {\n root?: string;\n icon?: string;\n text?: string;\n };\n icon?: string;\n color?: string;\n}\n\ninterface TextWithIconItem {\n name: string;\n value: string;\n icon?: string;\n color?: string;\n}\n\nexport function TextWithIcon(props: TextWithIconProps): React.JSX.Element {\n const value = props.value;\n let item: TextWithIconItem;\n const prefix = props.removePrefix || '';\n\n if (typeof value === 'string') {\n const list = props.list || props.options;\n if (list) {\n // if a list is array, then it is list of ioBroker.Object\n if (Array.isArray(list)) {\n const _item: ioBroker.Object = list.find((obj: ioBroker.Object) => obj._id === prefix + value);\n if (_item) {\n item = {\n name: Utils.getObjectNameFromObj(_item, props.lang).replace('system.group.', ''),\n value: _item._id,\n icon: props.icon || _item.common?.icon,\n color: props.color || _item.common?.color,\n };\n } else {\n item = {\n name: value,\n value: prefix + value,\n };\n }\n } else if (list[prefix + value]) {\n // List is object with key-value pairs: {'enum.rooms.1': {common: {name: 'Room 1'}}}\n const obj: ioBroker.Object = list[prefix + value];\n item = {\n name: Utils.getObjectNameFromObj(obj, props.lang).replace('system.group.', ''),\n value: obj._id,\n icon: props.icon || obj.common?.icon,\n color: props.color || obj.common?.color,\n };\n } else {\n // value is a string, ignore list\n item = {\n name: value,\n value: prefix + value,\n icon: props.icon,\n color: props.color,\n };\n }\n } else {\n item = {\n name: value,\n value: prefix + value,\n icon: props.icon,\n color: props.color,\n };\n }\n } else if (!value || typeof value !== 'object') {\n item = {\n name: '',\n value: '',\n icon: props.icon,\n color: props.color,\n };\n } else {\n // Item is an ioBroker.Object\n const obj: ioBroker.Object = value as ioBroker.Object;\n item = {\n name: Utils.getObjectNameFromObj(obj, props.lang)\n .replace('system.group.', '')\n .replace('system.user.', '')\n .replace('enum.rooms.', '')\n .replace('enum.functions.', ''),\n value: obj._id,\n icon: props.icon || obj.common?.icon,\n color: props.color || obj.common?.color,\n };\n }\n\n const style = item?.color\n ? {\n border: `1px solid ${Utils.invertColor(item?.color)}`,\n color: Utils.getInvertedColor(item?.color, props.themeType || 'light', true) || undefined,\n backgroundColor: item?.color,\n }\n : {};\n\n return (\n <div\n style={{ ...(props.style || undefined), ...styles.div, ...(style || undefined) }}\n className={Utils.clsx(props.className, props.moreClasses?.root)}\n title={props.title || item.value}\n >\n {item?.icon ? (\n <Icon\n src={item?.icon}\n className={props.moreClasses?.icon}\n style={styles.icon}\n />\n ) : null}\n <div\n style={styles.text}\n className={props.moreClasses?.text}\n >\n {item?.name}\n </div>\n </div>\n );\n};\n","import React, { type JSX } from 'react';\n\nimport { IconButton, Tooltip } from '@mui/material';\n\nimport {\n Brightness4 as Brightness4Icon,\n Brightness5 as Brightness5Icon,\n Brightness6 as Brightness6Icon,\n Brightness7 as Brightness7Icon,\n} from '@mui/icons-material';\n\ninterface ToggleThemeMenuProps {\n themeName: 'dark' | 'blue' | 'colored' | 'light';\n toggleTheme: () => void;\n t: (key: string) => string;\n className?: string;\n style?: React.CSSProperties;\n size?: 'small' | 'medium' | 'large';\n}\n\nexport function ToggleThemeMenu({\n themeName,\n toggleTheme,\n t,\n className,\n style,\n size,\n}: ToggleThemeMenuProps): JSX.Element {\n return (\n <div\n className={className || undefined}\n style={style || undefined}\n >\n <Tooltip\n title={t('ra_Change color theme')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <IconButton\n onClick={() => toggleTheme()}\n size={size || 'medium'}\n >\n {themeName === 'dark' && <Brightness4Icon className={className} />}\n {themeName === 'blue' && <Brightness5Icon className={className} />}\n {themeName === 'colored' && <Brightness6Icon className={className} />}\n {themeName !== 'dark' && themeName !== 'blue' && themeName !== 'colored' && (\n <Brightness7Icon className={className} />\n )}\n </IconButton>\n </Tooltip>\n </div>\n );\n}\n","/**\n * Copyright 2018-2023 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n// please do not delete React, as without it other projects could not be compiled: ReferenceError: React is not defined\nimport React, { Component, type JSX } from 'react';\n\nimport { Button, DialogTitle, DialogContent, DialogActions, Dialog } from '@mui/material';\n\nimport { Cancel as IconCancel, Check as IconOk } from '@mui/icons-material';\n\nimport type { Connection } from '../Connection';\n\nimport { I18n } from '../i18n';\nimport { ObjectBrowser, type ObjectBrowserFilter } from '../Components/ObjectBrowser';\nimport type { ObjectBrowserColumn, ObjectBrowserCustomFilter, ObjectBrowserType } from '../Components/types';\nimport type { IobTheme } from '../types';\n\nexport interface SelectIDFilters {\n id?: string;\n name?: string;\n room?: string;\n func?: string;\n role?: string;\n type?: string;\n custom?: string;\n}\n\ninterface DialogSelectIDProps {\n /** The internal name of the dialog; default: \"default\". Used to store settings in local storage */\n dialogName?: string;\n /** The dialog title; default: Please select object ID... (translated) */\n title?: string;\n /** Set to true to allow the selection of multiple IDs. */\n multiSelect?: boolean;\n /** Show folders before any leaves. */\n foldersFirst?: boolean;\n /** Path prefix for images (default: '.') */\n imagePrefix?: string;\n /** @deprecated same as imagePrefix */\n prefix?: string;\n /** Show the expert button */\n showExpertButton?: boolean;\n /** Force expert mode */\n expertMode?: boolean;\n /** optional ['name', 'type', 'role', 'room', 'func', 'val', 'buttons'] */\n columns?: ObjectBrowserColumn[];\n /** Object types to show; default: 'state' only */\n types?: ObjectBrowserType | ObjectBrowserType[];\n /** The language. */\n lang?: ioBroker.Languages;\n /** The socket connection. */\n socket: Connection;\n /** Can't objects be edited? (default: true) */\n notEditable?: boolean;\n /** Theme name. */\n themeName?: string;\n /** Theme type: dark or light */\n themeType?: string;\n /** The theme object */\n theme: IobTheme;\n /** The date format for the date columns */\n dateFormat?: string;\n /** Is use comma or point for displaying of float numbers */\n isFloatComma?: boolean;\n /** Custom filter. */\n customFilter?: ObjectBrowserCustomFilter;\n /** The selected IDs. */\n selected?: string | string[];\n /** The ok button text; default: OK (translated) */\n ok?: string;\n /** The cancel button text; default: Cancel (translated) */\n cancel?: string;\n /** Close handler that is always called when the dialog is closed. */\n onClose: () => void;\n /** Handler that is called when the user presses OK. */\n onOk: (selected: string | string[] | undefined, name: string) => void;\n /**\n * Function to filter out all unnecessary objects. Can be string or function.\n * It cannot be used together with \"types\".\n * Example for function: `obj => obj.common?.type === 'boolean'` to show only boolean states\n * In case of string, it must look like `obj.common && obj.common.type === 'boolean'`\n */\n filterFunc?: string | ((obj: ioBroker.Object) => boolean);\n /** predefined filter fields, like {\"id\":\"\",\"name\":\"\",\"room\":\"\",\"func\":\"\",\"role\":\"level\",\"type\":\"\",\"custom\":\"\"} */\n filters?: SelectIDFilters;\n /** Show elements only of this root ID */\n root?: string;\n}\n\ninterface DialogSelectIDState {\n selected: string[];\n name: string;\n}\n\nexport class DialogSelectID extends Component<DialogSelectIDProps, DialogSelectIDState> {\n private readonly dialogName: string;\n\n private filters: ObjectBrowserFilter;\n\n private readonly filterFunc?: (obj: ioBroker.Object) => boolean;\n\n constructor(props: DialogSelectIDProps) {\n super(props);\n this.dialogName = this.props.dialogName || 'default';\n this.dialogName = `SelectID.${this.dialogName}`;\n\n const filters: string = ((window as any)._localStorage || window.localStorage).getItem(this.dialogName) || '{}';\n\n try {\n this.filters = JSON.parse(filters);\n } catch {\n this.filters = {};\n }\n\n if (props.filters) {\n this.filters = { ...this.filters, ...(props.filters || {}) };\n }\n\n let selected = this.props.selected || [];\n if (!Array.isArray(selected)) {\n selected = [selected];\n }\n selected = selected.filter(id => id);\n\n if (props.filterFunc) {\n if (typeof props.filterFunc === 'string') {\n try {\n this.filterFunc = new Function('obj', props.filterFunc) as (obj: ioBroker.Object) => boolean;\n } catch {\n console.error(`Cannot parse filter function: \"obj => ${props.filterFunc}\"`);\n this.filterFunc = undefined;\n }\n } else {\n this.filterFunc = props.filterFunc;\n }\n }\n\n this.state = {\n selected,\n name: '',\n };\n }\n\n handleCancel(): void {\n this.props.onClose();\n }\n\n handleOk(): void {\n this.props.onOk(this.props.multiSelect ? this.state.selected : this.state.selected[0] || '', this.state.name);\n this.props.onClose();\n }\n\n render(): JSX.Element {\n let title;\n if (this.state.name || this.state.selected.length) {\n if (this.state.selected.length === 1) {\n title = [\n <span key=\"selected\">\n {I18n.t('ra_Selected')}\n \n </span>,\n <span\n key=\"id\"\n style={{ fontWeight: 'bold', fontStyle: 'italic' }}\n >\n {(this.state.name || this.state.selected[0]) +\n (this.state.name ? ` [${this.state.selected[0]}]` : '')}\n </span>,\n ];\n } else {\n title = [\n <span key=\"selected\">\n {I18n.t('ra_Selected')}\n \n </span>,\n <span\n key=\"id\"\n style={{ fontWeight: 'bold', fontStyle: 'italic' }}\n >\n {I18n.t('%s items', this.state.selected.length.toString())}\n </span>,\n ];\n }\n } else {\n title = this.props.title || I18n.t('ra_Please select object ID...');\n }\n\n return (\n <Dialog\n onClose={() => {}}\n maxWidth={false}\n sx={{\n '& .MuiDialog-paper': {\n height: '95%',\n p: '4px',\n width: '100%',\n maxWidth: '100%',\n maxHeight: 'calc(100% - 16px)',\n },\n }}\n fullWidth\n open={!0}\n aria-labelledby=\"ar_dialog_selectid_title\"\n >\n <DialogTitle\n id=\"ar_dialog_selectid_title\"\n style={{\n whiteSpace: 'nowrap',\n width: 'calc(100% - 72px)',\n overflow: 'hidden',\n display: 'inline-block',\n textOverflow: 'ellipsis',\n }}\n >\n {title}\n </DialogTitle>\n <DialogContent\n style={{\n height: '100%',\n overflow: 'hidden',\n padding: '8px 4px',\n }}\n >\n <ObjectBrowser\n foldersFirst={this.props.foldersFirst}\n imagePrefix={this.props.imagePrefix || this.props.prefix} // prefix is for back compatibility\n dateFormat={this.props.dateFormat}\n defaultFilters={this.filters}\n dialogName={this.dialogName}\n isFloatComma={this.props.isFloatComma}\n showExpertButton={\n this.props.showExpertButton !== undefined ? this.props.showExpertButton : true\n }\n expertMode={this.props.expertMode}\n // style={{ width: '100%', height: '100%' }}\n columns={this.props.columns || ['name', 'type', 'role', 'room', 'func', 'val']}\n types={\n this.props.types\n ? Array.isArray(this.props.types)\n ? this.props.types\n : [this.props.types]\n : ['state']\n }\n root={this.props.root}\n t={I18n.t}\n lang={this.props.lang || I18n.getLanguage()}\n socket={this.props.socket}\n selected={this.state.selected}\n multiSelect={this.props.multiSelect}\n notEditable={this.props.notEditable === undefined ? true : this.props.notEditable}\n // name={this.state.name}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n customFilter={this.props.customFilter}\n onFilterChanged={(filterConfig: ObjectBrowserFilter) => {\n this.filters = filterConfig;\n ((window as any)._localStorage || window.localStorage).setItem(\n this.dialogName,\n JSON.stringify(filterConfig),\n );\n }}\n onSelect={(_selected: string | string[], name: string, isDouble?: boolean) => {\n let selected: string[];\n if (!Array.isArray(_selected)) {\n selected = [_selected];\n } else {\n selected = _selected;\n }\n if (JSON.stringify(selected) !== JSON.stringify(this.state.selected)) {\n this.setState({ selected, name }, () => isDouble && this.handleOk());\n } else if (isDouble) {\n this.handleOk();\n }\n }}\n filterFunc={this.filterFunc}\n title=\"\"\n classes={{}}\n />\n </DialogContent>\n <DialogActions>\n <Button\n id={`ar_dialog_selectid_ok_${this.props.dialogName || ''}`}\n variant=\"contained\"\n onClick={() => this.handleOk()}\n startIcon={<IconOk />}\n disabled={!this.state.selected.length}\n color=\"primary\"\n >\n {this.props.ok || I18n.t('ra_Ok')}\n </Button>\n <Button\n id={`ar_dialog_selectid_cancel_${this.props.dialogName || ''}`}\n color=\"grey\"\n variant=\"contained\"\n onClick={() => this.handleCancel()}\n startIcon={<IconCancel />}\n >\n {this.props.cancel || I18n.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n","import React, { Component, type JSX } from 'react';\n\nimport { HexColorPicker as ColorPicker } from 'react-colorful';\n\nimport {\n Fab,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TableSortLabel,\n IconButton,\n Select,\n MenuItem,\n TextField,\n Checkbox,\n Dialog,\n} from '@mui/material';\n\nimport {\n Edit as IconEdit,\n Delete as IconDelete,\n NavigateNext as IconExpand,\n ExpandMore as IconCollapse,\n Check as IconCheck,\n Close as IconClose,\n Add as IconAdd,\n ViewHeadline as IconList,\n Colorize as IconColor,\n} from '@mui/icons-material';\n\nimport type { Connection } from '../Connection';\n\nimport { DialogSelectID } from '../Dialogs/SelectID';\nimport { Utils } from './Utils';\nimport type { IobTheme } from '../types';\n\nfunction getAttr(obj: Record<string, any>, attr: string | string[], lookup?: Record<string, string>): any {\n if (typeof attr === 'string') {\n attr = attr.split('.');\n }\n\n if (!obj) {\n return null;\n }\n\n if (attr.length === 1) {\n if (lookup && lookup[obj[attr[0]]]) {\n return lookup[obj[attr[0]]];\n }\n return obj[attr[0]];\n }\n\n const name: string = attr.shift();\n return getAttr(obj[name], attr);\n}\n\nfunction setAttr(obj: Record<string, any>, attr: string | string[], value: any): void {\n if (typeof attr === 'string') {\n attr = attr.split('.');\n }\n\n if (attr.length === 1) {\n return (obj[attr[0]] = value);\n }\n const name: string = attr.shift();\n if (obj[name] === null || obj[name] === undefined) {\n obj[name] = {};\n }\n return setAttr(obj[name], attr, value);\n}\n\nconst styles: Record<string, any> = {\n tableContainer: {\n width: '100%',\n height: '100%',\n overflow: 'auto',\n },\n table: {\n width: '100%',\n minWidth: 800,\n maxWidth: 1920,\n },\n cell: {\n paddingTop: 0,\n paddingBottom: 0,\n paddingLeft: 4,\n paddingRight: 4,\n },\n rowMainWithChildren: {},\n rowMainWithoutChildren: {},\n rowNoEdit: {\n opacity: 0.3,\n },\n cellExpand: {\n width: 30,\n },\n cellButton: {\n width: 30,\n },\n cellHeader: {\n fontWeight: 'bold',\n background: (theme: IobTheme) => (theme.palette.mode === 'dark' ? '#888' : '#888'),\n color: (theme: IobTheme) => (theme.palette.mode === 'dark' ? '#EEE' : '#111'),\n height: 48,\n wordBreak: 'break-word',\n whiteSpace: 'pre',\n },\n width_name_nicknames: {\n maxWidth: 150,\n },\n width_ioType: {\n maxWidth: 100,\n },\n width_type: {\n maxWidth: 100,\n },\n width_displayTraits: {\n maxWidth: 100,\n },\n width_roomHint: {\n maxWidth: 100,\n },\n rowSecondary: {\n fontStyle: 'italic',\n },\n cellSecondary: {\n fontSize: 10,\n },\n visuallyHidden: {\n border: 0,\n clip: 'rect(0 0 0 0)',\n height: 1,\n margin: -1,\n overflow: 'hidden',\n padding: 0,\n position: 'absolute',\n top: 20,\n width: 1,\n },\n fieldEditWithButton: {\n width: 'calc(100% - 33px)',\n display: 'inline-block',\n },\n fieldEdit: {\n width: '100%',\n display: 'inline-block',\n lineHeight: '50px',\n verticalAlign: 'middle',\n },\n fieldButton: {\n width: 30,\n display: 'inline-block',\n },\n colorDialog: {\n overflow: 'hidden',\n padding: 15,\n },\n subText: {\n fontSize: 10,\n fontStyle: 'italic',\n },\n glow: {\n animation: 'glow 0.2s 2 alternate',\n },\n};\n\nfunction descendingComparator(\n a: Record<string, any>,\n b: Record<string, any>,\n orderBy: string,\n lookup?: Record<string, string>,\n): number {\n const _a = getAttr(a, orderBy, lookup) || '';\n const _b = getAttr(b, orderBy, lookup) || '';\n\n if (_b < _a) {\n return -1;\n }\n if (_b > _a) {\n return 1;\n }\n return 0;\n}\n\nfunction getComparator(\n order: 'desc' | 'asc',\n orderBy: string,\n lookup?: Record<string, string>,\n): (a: Record<string, any>, b: Record<string, any>) => number {\n return order === 'desc'\n ? (a, b) => descendingComparator(a, b, orderBy, lookup)\n : (a, b) => -descendingComparator(a, b, orderBy, lookup);\n}\n\nfunction stableSort(\n array: Record<string, any>[],\n comparator: (a: Record<string, any>, b: Record<string, any>) => number,\n): Record<string, any>[] {\n const stabilizedThis: { e: Record<string, any>; i: number }[] = array.map((el, index) => ({ e: el, i: index }));\n\n stabilizedThis.sort((a, b) => {\n const order = comparator(a.e, b.e);\n if (order) {\n return order;\n }\n return a.i - b.i;\n });\n\n return stabilizedThis.map(item => item.e);\n}\n\ninterface Column {\n cellStyle?: Record<string, any>;\n editComponent?: React.FC<{ value: any; rowData: Record<string, any>; onChange: (newValue: any) => void }>;\n field: string;\n headerStyle?: Record<string, any>;\n hidden?: boolean;\n lookup?: Record<string, string>;\n editable?: boolean | 'never';\n title?: string;\n type?: 'string' | 'boolean' | 'numeric' | 'icon' | 'oid' | 'color';\n subField?: string;\n subLookup?: Record<string, string>;\n subStyle?: Record<string, any>;\n}\n\ninterface TreeTableProps {\n data: Record<string, any>[];\n className?: string;\n /** name of table to save settings in localStorage */\n name?: string;\n columns: Column[];\n noSort?: boolean;\n onUpdate?: ((newData: Record<string, any>, oldData: Record<string, any>) => void) | ((addNew: true) => void);\n onDelete?: (oldData: Record<string, any>) => void;\n /** hide add button */\n noAdd?: boolean;\n themeType?: string;\n glowOnChange?: boolean;\n /** only if an oid type is used */\n socket?: Connection;\n /** Shift in pixels for every level */\n levelShift?: number;\n adapterName: string;\n theme: IobTheme;\n}\n\ninterface TreeTableState {\n opened: string[];\n editMode: number | false;\n deleteMode: number | false;\n editData: Record<string, any> | null;\n order: 'desc' | 'asc';\n update: string[] | null;\n orderBy: string;\n showSelectColor: boolean;\n selectIdValue?: string | null;\n showSelectId?: boolean;\n data?: Record<string, any>[];\n}\n\nexport class TreeTable extends Component<TreeTableProps, TreeTableState> {\n private selectCallback: ((selected: string) => void) | null = null;\n\n private updateTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(props: TreeTableProps) {\n super(props);\n\n let opened =\n ((window as any)._localStorage || window.localStorage).getItem(this.props.name || 'iob-table') || '[]';\n try {\n opened = JSON.parse(opened) || [];\n } catch {\n opened = [];\n }\n if (!Array.isArray(opened)) {\n opened = [];\n }\n\n this.state = {\n opened,\n editMode: false,\n deleteMode: false,\n editData: null,\n order: 'asc',\n update: null,\n orderBy: this.props.columns[0].field,\n showSelectColor: false,\n };\n }\n\n static getDerivedStateFromProps(props: TreeTableProps, state: TreeTableState): Partial<TreeTableState> {\n if (props.glowOnChange) {\n const update: string[] = [];\n let count = 0;\n if (props.data && state.data) {\n props.data.forEach(line => {\n count++;\n const oldLine = state.data?.find(it => it.id === line.id);\n if (oldLine) {\n if (JSON.stringify(oldLine) !== JSON.stringify(line)) {\n update.push(line.id);\n }\n } else {\n update.push(line.id);\n }\n });\n }\n\n if (update.length && update.length !== count) {\n return { data: props.data, update };\n }\n return { data: props.data };\n }\n\n return { data: props.data };\n }\n\n renderCellEdit(item: Record<string, any>, col: Column): JSX.Element | null {\n let val = getAttr(item, col.field);\n if (Array.isArray(val)) {\n val = val[0];\n }\n\n if (col.lookup) {\n return this.renderCellEditSelect(col, val);\n }\n if (col.editComponent) {\n return this.renderCellEditCustom(col, val, item);\n }\n if (col.type === 'boolean' || (!col.type && typeof val === 'boolean')) {\n return this.renderCellEditBoolean(col, val);\n }\n if (col.type === 'color') {\n return this.renderCellEditColor(col, val);\n }\n if (col.type === 'oid') {\n return this.renderCellEditObjectID(col, val);\n }\n if (col.type === 'numeric') {\n return this.renderCellEditNumber(col, val);\n }\n\n return this.renderCellEditString(col, val);\n }\n\n onChange(col: Column, oldValue: string | number | boolean, newValue: string | number | boolean): void {\n const editData = this.state.editData ? { ...this.state.editData } : {};\n if (newValue === oldValue) {\n delete editData[col.field];\n } else {\n editData[col.field] = newValue;\n }\n this.setState({ editData });\n }\n\n renderCellEditSelect(col: Column, val: string | number): JSX.Element {\n return (\n <Select\n variant=\"standard\"\n onChange={e => this.onChange(col, val, e.target.value)}\n value={(this.state.editData && this.state.editData[col.field]) || val}\n >\n {col.lookup &&\n Object.keys(col.lookup).map((v, i) => (\n <MenuItem\n key={i}\n value={v}\n >\n {col.lookup?.[v]}\n </MenuItem>\n ))}\n </Select>\n );\n }\n\n renderCellEditString(col: Column, val: string): JSX.Element {\n return (\n <TextField\n variant=\"standard\"\n style={styles.fieldEdit}\n fullWidth\n value={\n this.state.editData && this.state.editData[col.field] !== undefined\n ? this.state.editData[col.field]\n : val\n }\n onChange={e => this.onChange(col, val, e.target.value)}\n />\n );\n }\n\n renderCellEditNumber(col: Column, val: number): JSX.Element {\n return (\n <TextField\n variant=\"standard\"\n style={styles.fieldEdit}\n type=\"number\"\n fullWidth\n value={\n this.state.editData && this.state.editData[col.field] !== undefined\n ? this.state.editData[col.field]\n : val\n }\n onChange={e => this.onChange(col, val, e.target.value)}\n />\n );\n }\n\n renderCellEditCustom(col: Column, val: any, item: Record<string, any>): JSX.Element | null {\n const EditComponent = col.editComponent;\n\n // use new value if exists\n if (this.state.editData && this.state.editData[col.field] !== undefined) {\n val = this.state.editData[col.field];\n item = JSON.parse(JSON.stringify(item));\n item[col.field] = val;\n }\n\n return EditComponent ? (\n <EditComponent\n value={val}\n rowData={item}\n onChange={(newVal: any) => this.onChange(col, val, newVal as string | number)}\n />\n ) : null;\n }\n\n renderCellEditBoolean(col: Column, val: boolean): JSX.Element {\n return (\n <Checkbox\n checked={\n this.state.editData && this.state.editData[col.field] !== undefined\n ? !!this.state.editData[col.field]\n : !!val\n }\n onChange={e => this.onChange(col, !!val, e.target.checked)}\n inputProps={{ 'aria-label': 'checkbox' }}\n />\n );\n }\n\n renderSelectColorDialog(): JSX.Element {\n return (\n <Dialog\n sx={{\n '& .MuiPaper-root': styles.root,\n '& .MuiPaper-paper': styles.paper,\n }}\n onClose={() => {\n this.selectCallback = null;\n this.setState({ showSelectColor: false });\n }}\n open={this.state.showSelectColor}\n >\n <ColorPicker\n color={this.state.selectIdValue}\n onChange={color =>\n this.setState({ selectIdValue: color }, () => {\n if (this.selectCallback) {\n this.selectCallback(color);\n }\n })\n }\n />\n </Dialog>\n );\n }\n\n renderCellEditColor(col: Column, val: string): JSX.Element {\n const _val =\n this.state.editData && this.state.editData[col.field] !== undefined ? this.state.editData[col.field] : val;\n return (\n <div style={styles.fieldEdit}>\n <TextField\n variant=\"standard\"\n fullWidth\n style={styles.fieldEditWithButton}\n value={_val}\n inputProps={{ style: { backgroundColor: _val, color: Utils.isUseBright(_val) ? '#FFF' : '#000' } }}\n onChange={e => this.onChange(col, !!val, e.target.value)}\n />\n\n <IconButton\n style={styles.fieldButton}\n onClick={() => {\n this.selectCallback = newColor => this.onChange(col, val, newColor);\n this.setState({ showSelectColor: true, selectIdValue: val });\n }}\n size=\"large\"\n >\n <IconColor />\n </IconButton>\n </div>\n );\n }\n\n renderSelectIdDialog(): JSX.Element | null {\n if (this.state.showSelectId && this.props.socket) {\n return (\n <DialogSelectID\n key=\"tableSelect\"\n imagePrefix=\"../..\"\n dialogName={this.props.adapterName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n socket={this.props.socket}\n selected={this.state.selectIdValue}\n onClose={() => this.setState({ showSelectId: false })}\n onOk={(selected: string | string[] | undefined) => {\n this.setState({ showSelectId: false, selectIdValue: null });\n const selectedStr: string | undefined = Array.isArray(selected) ? selected[0] : selected;\n if (selectedStr && this.selectCallback) {\n this.selectCallback && this.selectCallback(selectedStr);\n this.selectCallback = null;\n }\n }}\n />\n );\n }\n\n return null;\n }\n\n renderCellEditObjectID(col: Column, val: string): JSX.Element {\n return (\n <div style={styles.fieldEdit}>\n <TextField\n variant=\"standard\"\n fullWidth\n style={styles.fieldEditWithButton}\n value={\n this.state.editData && this.state.editData[col.field] !== undefined\n ? this.state.editData[col.field]\n : val\n }\n onChange={e => this.onChange(col, val, e.target.value)}\n />\n\n <IconButton\n style={styles.fieldButton}\n onClick={() => {\n this.selectCallback = selected => this.onChange(col, val, selected);\n this.setState({ showSelectId: true, selectIdValue: val });\n }}\n size=\"large\"\n >\n <IconList />\n </IconButton>\n </div>\n );\n }\n\n static renderCellNonEdit(item: Record<string, any>, col: Column): JSX.Element | string | number | null {\n let val = getAttr(item, col.field, col.lookup);\n if (Array.isArray(val)) {\n val = val[0];\n }\n\n if (col.type === 'boolean') {\n return (\n <Checkbox\n checked={!!val}\n disabled\n inputProps={{ 'aria-label': 'checkbox' }}\n />\n );\n }\n\n return val;\n }\n\n renderCell(item: Record<string, any>, col: Column, level: number, i: number): JSX.Element {\n if (this.state.editMode === i && col.editable !== 'never' && col.editable !== false) {\n return (\n <TableCell\n key={col.field}\n style={{ ...styles.cell, ...(level ? styles.cellSecondary : undefined), ...col.cellStyle }}\n component=\"th\"\n >\n {this.renderCellEdit(item, col)}\n </TableCell>\n );\n }\n return (\n <TableCell\n key={col.field}\n style={{ ...styles.cell, ...(level ? styles.cellSecondary : undefined), ...col.cellStyle }}\n component=\"th\"\n >\n {TreeTable.renderCellNonEdit(item, col)}\n </TableCell>\n );\n }\n\n static renderCellWithSubField(item: Record<string, any>, col: Column): JSX.Element {\n const main = getAttr(item, col.field, col.lookup);\n if (col.subField) {\n const sub = getAttr(item, col.subField, col.subLookup);\n return (\n <div>\n <div style={styles.mainText}>{main}</div>\n <div style={{ ...styles.subText, ...(col.subStyle || undefined) }}>{sub}</div>\n </div>\n );\n }\n return (\n <div>\n <div style={styles.mainText}>{main}</div>\n </div>\n );\n }\n\n renderLine(item: Record<string, any>, level?: number): JSX.Element | JSX.Element[] | null {\n const levelShift = this.props.levelShift === undefined ? 24 : this.props.levelShift;\n\n level = level || 0;\n const i = this.props.data.indexOf(item);\n if (!item) {\n return null;\n }\n if (!level && item.parentId) {\n return null;\n }\n if (level && !item.parentId) {\n return null; // should never happen\n }\n // try to find children\n const opened = this.state.opened.includes(item.id);\n const children = this.props.data.filter(it => it.parentId === item.id);\n\n const row = (\n <TableRow\n key={item.id}\n className={`table-row-${(item.id || '').toString().replace(/[.$]/g, '_')}`}\n style={{\n ...((this.state.update && this.state.update.includes(item.id) && styles.glow) || undefined),\n ...styles.row,\n ...(level ? styles.rowSecondary : undefined),\n ...(!level && children.length ? styles.rowMainWithChildren : undefined),\n ...(!level && !children.length ? styles.rowMainWithoutChildren : undefined),\n ...(this.state.editMode !== false && this.state.editMode !== i ? styles.rowNoEdit : undefined),\n ...(this.state.deleteMode !== false && this.state.deleteMode !== i ? styles.rowNoEdit : undefined),\n }}\n >\n <TableCell\n style={{ ...styles.cell, ...styles.cellExpand, ...(level ? styles.cellSecondary : undefined) }}\n >\n {children.length ? (\n <IconButton\n onClick={() => {\n const _opened = [...this.state.opened];\n const pos = _opened.indexOf(item.id);\n if (pos === -1) {\n _opened.push(item.id);\n _opened.sort();\n } else {\n _opened.splice(pos, 1);\n }\n\n ((window as any)._localStorage || window.localStorage).setItem(\n this.props.name || 'iob-table',\n JSON.stringify(_opened),\n );\n\n this.setState({ opened: _opened });\n }}\n size=\"small\"\n >\n {opened ? <IconCollapse /> : <IconExpand />}\n </IconButton>\n ) : null}\n </TableCell>\n <TableCell\n scope=\"row\"\n style={{\n ...styles.cell,\n ...(level ? styles.cellSecondary : undefined),\n ...this.props.columns[0].cellStyle,\n paddingLeft: levelShift * level,\n }}\n >\n {this.props.columns[0].subField\n ? TreeTable.renderCellWithSubField(item, this.props.columns[0])\n : getAttr(item, this.props.columns[0].field, this.props.columns[0].lookup)}\n </TableCell>\n\n {this.props.columns.map((col, ii) =>\n !ii && !col.hidden ? null : this.renderCell(item, col, level, i),\n )}\n\n {this.props.onUpdate ? (\n <TableCell style={{ ...styles.cell, ...styles.cellButton }}>\n {this.state.editMode === i || this.state.deleteMode === i ? (\n <IconButton\n disabled={\n this.state.editMode !== false &&\n (!this.state.editData || !Object.keys(this.state.editData).length)\n }\n onClick={() => {\n if (this.state.editMode !== false) {\n const newData = JSON.parse(JSON.stringify(item));\n this.state.editData &&\n Object.keys(this.state.editData).forEach(attr =>\n setAttr(newData, attr, this.state.editData?.[attr]),\n );\n this.setState(\n { editMode: false },\n () => this.props.onUpdate && this.props.onUpdate(newData, item),\n );\n } else {\n this.setState(\n { deleteMode: false },\n () => this.props.onDelete && this.props.onDelete(item),\n );\n }\n }}\n size=\"large\"\n >\n <IconCheck />\n </IconButton>\n ) : (\n <IconButton\n disabled={this.state.editMode !== false}\n onClick={() => this.setState({ editMode: i, editData: null })}\n size=\"large\"\n >\n <IconEdit />\n </IconButton>\n )}\n </TableCell>\n ) : null}\n\n {this.props.onDelete && !this.props.onUpdate ? (\n <TableCell style={{ ...styles.cell, ...styles.cellButton }}>\n {this.state.deleteMode === i ? (\n <IconButton\n disabled={\n this.state.editMode !== false &&\n (!this.state.editData || !Object.keys(this.state.editData).length)\n }\n onClick={() =>\n this.setState(\n { deleteMode: false },\n () => this.props.onDelete && this.props.onDelete(item),\n )\n }\n size=\"large\"\n >\n <IconCheck />\n </IconButton>\n ) : null}\n </TableCell>\n ) : null}\n\n {this.props.onUpdate || this.props.onDelete ? (\n <TableCell style={{ ...styles.cell, ...styles.cellButton }}>\n {this.state.editMode === i || this.state.deleteMode === i ? (\n <IconButton\n onClick={() => this.setState({ editMode: false, deleteMode: false })}\n size=\"large\"\n >\n <IconClose />\n </IconButton>\n ) : this.props.onDelete ? (\n <IconButton\n disabled={this.state.deleteMode !== false}\n onClick={() => this.setState({ deleteMode: i })}\n size=\"large\"\n >\n <IconDelete />\n </IconButton>\n ) : null}\n </TableCell>\n ) : null}\n </TableRow>\n );\n\n if (!level && opened) {\n const items: JSX.Element[] = children.map(it => this.renderLine(it, level + 1)) as JSX.Element[];\n items.unshift(row);\n return items;\n }\n return row;\n }\n\n handleRequestSort(property: string): void {\n const isAsc = this.state.orderBy === property && this.state.order === 'asc';\n this.setState({ order: isAsc ? 'desc' : 'asc', orderBy: property });\n }\n\n renderHead(): JSX.Element {\n return (\n <TableHead>\n <TableRow key=\"headerRow\">\n <TableCell\n component=\"th\"\n sx={Utils.getStyle(this.props.theme, styles.cell, styles.cellHeader, styles.cellExpand)}\n />\n <TableCell\n component=\"th\"\n sx={Utils.getStyle(\n this.props.theme,\n styles.cell,\n styles.cellHeader,\n styles[`width_${this.props.columns[0].field.replace(/\\./g, '_')}`],\n )}\n style={this.props.columns[0].headerStyle || this.props.columns[0].cellStyle}\n sortDirection={\n this.props.noSort\n ? false\n : this.state.orderBy === this.props.columns[0].field\n ? this.state.order\n : false\n }\n >\n {this.props.noSort ? null : (\n <TableSortLabel\n active={this.state.orderBy === this.props.columns[0].field}\n direction={\n this.state.orderBy === this.props.columns[0].field ? this.state.order : 'asc'\n }\n onClick={() => this.handleRequestSort(this.props.columns[0].field)}\n >\n {this.props.columns[0].title || this.props.columns[0].field}\n {this.state.orderBy === this.props.columns[0].field ? (\n <span style={styles.visuallyHidden}>\n {this.state.order === 'desc' ? 'sorted descending' : 'sorted ascending'}\n </span>\n ) : null}\n </TableSortLabel>\n )}\n </TableCell>\n {this.props.columns.map((col, i) =>\n !i && !col.hidden ? null : (\n <TableCell\n key={col.field}\n sx={Utils.getStyle(\n this.props.theme,\n styles.cell,\n styles.cellHeader,\n styles[`width_${col.field.replace(/\\./g, '_')}`],\n )}\n style={col.headerStyle || col.cellStyle}\n component=\"th\"\n >\n {this.props.noSort ? null : (\n <TableSortLabel\n active={this.state.orderBy === col.field}\n direction={this.state.orderBy === col.field ? this.state.order : 'asc'}\n onClick={() => this.handleRequestSort(col.field)}\n >\n {col.title || col.field}\n {this.state.orderBy === col.field ? (\n <span style={styles.visuallyHidden}>\n {this.state.order === 'desc' ? 'sorted descending' : 'sorted ascending'}\n </span>\n ) : null}\n </TableSortLabel>\n )}\n </TableCell>\n ),\n )}\n {this.props.onUpdate ? (\n <TableCell\n component=\"th\"\n sx={Utils.getStyle(this.props.theme, styles.cell, styles.cellHeader, styles.cellButton)}\n >\n {!this.props.noAdd ? (\n <Fab\n color=\"primary\"\n size=\"small\"\n disabled={this.state.editMode !== false}\n onClick={() =>\n this.props.onUpdate && (this.props.onUpdate as (addNew: true) => void)(true)\n }\n >\n <IconAdd />\n </Fab>\n ) : null}\n </TableCell>\n ) : null}\n {this.props.onDelete || this.props.onUpdate ? (\n <TableCell\n component=\"th\"\n sx={Utils.getStyle(this.props.theme, styles.cell, styles.cellHeader, styles.cellButton)}\n />\n ) : null}\n </TableRow>\n </TableHead>\n );\n }\n\n render(): JSX.Element | null {\n const col = this.props.columns.find(_col => _col.field === this.state.orderBy);\n if (col) {\n const lookup = col.lookup;\n const table = stableSort(this.props.data, getComparator(this.state.order, this.state.orderBy, lookup));\n\n if (this.state.update && this.state.update.length) {\n this.updateTimeout && clearTimeout(this.updateTimeout);\n this.updateTimeout = setTimeout(() => {\n this.updateTimeout = null;\n this.setState({ update: null });\n }, 500);\n }\n\n return (\n <div\n style={styles.tableContainer}\n className={this.props.className}\n >\n <Table\n style={styles.table}\n aria-label=\"simple table\"\n size=\"small\"\n stickyHeader\n >\n {this.renderHead()}\n <TableBody>{table.map(it => this.renderLine(it))}</TableBody>\n </Table>\n {this.renderSelectIdDialog()}\n {this.renderSelectColorDialog()}\n </div>\n );\n }\n\n return null;\n }\n}\n/*\nconst columns = [\n {\n title: 'Name of field', // required, else it will be \"field\"\n field: 'fieldIdInData', // required\n editable: false, // or true [default - true]\n cellStyle: { // CSS style - // optional\n maxWidth: '12rem',\n overflow: 'hidden',\n wordBreak: 'break-word'\n },\n lookup: { // optional => edit will be automatically \"SELECT\"\n 'value1': 'text1',\n 'value2': 'text2',\n }\n },\n {\n title: 'Type', // required, else it will be \"field\"\n field: 'myType', // required\n editable: true, // or true [default - true]\n lookup: { // optional => edit will be automatically \"SELECT\"\n 'number': 'Number',\n 'string': 'String',\n 'boolean': 'Boolean',\n },\n type: 'number/string/color/oid/icon/boolean', // oid=ObjectID,icon=base64-icon\n editComponent: props =>\n <div>Prefix{ <br/>\n <textarea\n rows={4}\n style={{width: '100%', resize: 'vertical'}}\n value={props.value}\n onChange={e => props.onChange(e.target.value)}\n />\n Suffix\n </div>,\n },\n];\n*/\n/* const data = [\n {\n id: 'UniqueID1' // required\n fieldIdInData: 'Name1',\n myType: 'number',\n },\n {\n id: 'UniqueID2' // required\n fieldIdInData: 'Name12',\n myType: 'string',\n },\n];\n */\n\n/*\n// STYLES\nconst styles = theme => ({\n tableDiv: {\n width: '100%',\n overflow: 'hidden',\n height: 'calc(100% - 48px)',\n },\n});\n// renderTable\nrenderTable() {\n return <div style={styles.tableDiv}>\n <TreeTable\n columns={this.columns}\n data={lines}\n onUpdate={(newData, oldData) => console.log('Update: ' + JSON.stringify(newData))}\n onDelete={oldData => console.log('Delete: ' + JSON.stringify(oldData))}\n />\n </div>;\n}\n */\n","import React, { Component, createRef, type JSX } from 'react';\nimport Dropzone from 'react-dropzone';\nimport { Cropper, type ReactCropperElement } from 'react-cropper';\n\nimport { Menu, MenuItem, Tooltip, IconButton } from '@mui/material';\n\nimport { Close as IconClose, Crop as CropIcon, UploadFileOutlined as UploadIcon } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\nimport { Icon } from './Icon';\n\n// import 'cropperjs/dist/cropper.css';\nconst cropperStyles = `\n/*!\n * Cropper.js v1.5.12\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2021-06-12T08:00:11.623Z\n */\n\n.cropper-container {\n direction: ltr;\n font-size: 0;\n line-height: 0;\n position: relative;\n -ms-touch-action: none;\n touch-action: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.cropper-container img {\n display: block;\n height: 100%;\n image-orientation: 0deg;\n max-height: none !important;\n max-width: none !important;\n min-height: 0 !important;\n min-width: 0 !important;\n width: 100%;\n}\n\n.cropper-wrap-box,\n.cropper-canvas,\n.cropper-drag-box,\n.cropper-crop-box,\n.cropper-modal {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.cropper-wrap-box,\n.cropper-canvas {\n overflow: hidden;\n}\n\n.cropper-drag-box {\n background-color: #fff;\n opacity: 0;\n}\n\n.cropper-modal {\n background-color: #000;\n opacity: 0.5;\n}\n\n.cropper-view-box {\n display: block;\n height: 100%;\n outline: 1px solid #39f;\n outline-color: rgba(51, 153, 255, 0.75);\n overflow: hidden;\n width: 100%;\n}\n\n.cropper-dashed {\n border: 0 dashed #eee;\n display: block;\n opacity: 0.5;\n position: absolute;\n}\n\n.cropper-dashed.dashed-h {\n border-bottom-width: 1px;\n border-top-width: 1px;\n height: calc(100% / 3);\n left: 0;\n top: calc(100% / 3);\n width: 100%;\n}\n\n.cropper-dashed.dashed-v {\n border-left-width: 1px;\n border-right-width: 1px;\n height: 100%;\n left: calc(100% / 3);\n top: 0;\n width: calc(100% / 3);\n}\n\n.cropper-center {\n display: block;\n height: 0;\n left: 50%;\n opacity: 0.75;\n position: absolute;\n top: 50%;\n width: 0;\n}\n\n.cropper-center::before,\n.cropper-center::after {\n background-color: #eee;\n content: ' ';\n display: block;\n position: absolute;\n}\n\n.cropper-center::before {\n height: 1px;\n left: -3px;\n top: 0;\n width: 7px;\n}\n\n.cropper-center::after {\n height: 7px;\n left: 0;\n top: -3px;\n width: 1px;\n}\n\n.cropper-face,\n.cropper-line,\n.cropper-point {\n display: block;\n height: 100%;\n opacity: 0.1;\n position: absolute;\n width: 100%;\n}\n\n.cropper-face {\n background-color: #fff;\n left: 0;\n top: 0;\n}\n\n.cropper-line {\n background-color: #39f;\n}\n\n.cropper-line.line-e {\n cursor: ew-resize;\n right: -3px;\n top: 0;\n width: 5px;\n}\n\n.cropper-line.line-n {\n cursor: ns-resize;\n height: 5px;\n left: 0;\n top: -3px;\n}\n\n.cropper-line.line-w {\n cursor: ew-resize;\n left: -3px;\n top: 0;\n width: 5px;\n}\n\n.cropper-line.line-s {\n bottom: -3px;\n cursor: ns-resize;\n height: 5px;\n left: 0;\n}\n\n.cropper-point {\n background-color: #39f;\n height: 5px;\n opacity: 0.75;\n width: 5px;\n}\n\n.cropper-point.point-e {\n cursor: ew-resize;\n margin-top: -3px;\n right: -3px;\n top: 50%;\n}\n\n.cropper-point.point-n {\n cursor: ns-resize;\n left: 50%;\n margin-left: -3px;\n top: -3px;\n}\n\n.cropper-point.point-w {\n cursor: ew-resize;\n left: -3px;\n margin-top: -3px;\n top: 50%;\n}\n\n.cropper-point.point-s {\n bottom: -3px;\n cursor: s-resize;\n left: 50%;\n margin-left: -3px;\n}\n\n.cropper-point.point-ne {\n cursor: nesw-resize;\n right: -3px;\n top: -3px;\n}\n\n.cropper-point.point-nw {\n cursor: nwse-resize;\n left: -3px;\n top: -3px;\n}\n\n.cropper-point.point-sw {\n bottom: -3px;\n cursor: nesw-resize;\n left: -3px;\n}\n\n.cropper-point.point-se {\n bottom: -3px;\n cursor: nwse-resize;\n height: 20px;\n opacity: 1;\n right: -3px;\n width: 20px;\n}\n\n@media (min-width: 768px) {\n .cropper-point.point-se {\n height: 15px;\n width: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .cropper-point.point-se {\n height: 10px;\n width: 10px;\n }\n}\n\n@media (min-width: 1200px) {\n .cropper-point.point-se {\n height: 5px;\n opacity: 0.75;\n width: 5px;\n }\n}\n\n.cropper-point.point-se::before {\n background-color: #39f;\n bottom: -50%;\n content: ' ';\n display: block;\n height: 200%;\n opacity: 0;\n position: absolute;\n right: -50%;\n width: 200%;\n}\n\n.cropper-invisible {\n opacity: 0;\n}\n\n.cropper-bg {\n background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC');\n}\n\n.cropper-hide {\n display: block;\n height: 0;\n position: absolute;\n width: 0;\n}\n\n.cropper-hidden {\n display: none !important;\n}\n\n.cropper-move {\n cursor: move;\n}\n\n.cropper-crop {\n cursor: crosshair;\n}\n\n.cropper-disabled .cropper-drag-box,\n.cropper-disabled .cropper-face,\n.cropper-disabled .cropper-line,\n.cropper-disabled .cropper-point {\n cursor: not-allowed;\n}\n`;\n\nconst styles: Record<string, React.CSSProperties> = {\n dropZone: {\n width: '100%',\n height: 100,\n position: 'relative',\n },\n dropZoneEmpty: {},\n image: {\n objectFit: 'contain',\n margin: 'auto',\n display: 'flex',\n width: '100%',\n height: '100%',\n },\n\n uploadDiv: {\n position: 'relative',\n width: '100%',\n height: 300,\n opacity: 0.9,\n marginTop: 30,\n cursor: 'pointer',\n outline: 'none',\n },\n uploadDivDragging: {\n opacity: 1,\n background: 'rgba(128,255,128,0.1)',\n },\n\n uploadCenterDiv: {\n margin: 5,\n border: '3px dashed grey',\n borderRadius: 5,\n width: 'calc(100% - 10px)',\n height: 'calc(100% - 10px)',\n position: 'relative',\n display: 'flex',\n },\n uploadCenterIcon: {\n paddingTop: 10,\n width: 48,\n height: 48,\n },\n uploadCenterText: {\n fontSize: 16,\n },\n uploadCenterTextAndIcon: {\n textAlign: 'center',\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n },\n disabledOpacity: {\n opacity: 0.3,\n cursor: 'default',\n },\n buttonRemoveWrapper: {\n position: 'absolute',\n zIndex: 222,\n right: 0,\n },\n buttonCropWrapper: {\n position: 'absolute',\n zIndex: 222,\n right: 0,\n top: 50,\n },\n error: {\n border: '2px solid red',\n boxSizing: 'border-box',\n },\n};\n\ninterface UploadImageProps {\n maxSize?: number;\n disabled?: boolean;\n crop?: boolean;\n error?: boolean;\n onChange: (base64: string) => void | undefined;\n icon: string | null;\n removeIconFunc: () => void | null;\n accept?: Record<string, string[]>;\n}\n\ninterface UploadImageState {\n uploadFile: boolean | 'dragging';\n anchorEl: HTMLElement | null;\n cropHandler: boolean;\n}\n\nexport class UploadImage extends Component<UploadImageProps, UploadImageState> {\n private readonly cropperRef: React.RefObject<ReactCropperElement>;\n\n constructor(props: UploadImageProps) {\n super(props);\n\n this.state = {\n uploadFile: false,\n anchorEl: null,\n cropHandler: false,\n };\n this.cropperRef = createRef();\n\n if (!window.document.getElementById('cropper-style-json-component')) {\n const style = window.document.createElement('style');\n style.setAttribute('id', 'cropper-style-json-component');\n style.innerHTML = cropperStyles;\n window.document.head.appendChild(style);\n }\n }\n\n onDrop(acceptedFiles: File[]): void {\n const onChange = this.props.onChange;\n const maxSize = this.props.maxSize || 10 * 1024;\n\n const file = acceptedFiles[0];\n const reader = new FileReader();\n\n reader.onabort = () => console.log('file reading was aborted');\n reader.onerror = () => console.log('file reading has failed');\n reader.onload = () => {\n if (!file || !file.name) {\n return;\n }\n const parts = file.name?.split('.');\n let ext = parts?.length ? `image/${parts.pop()?.toLowerCase()}` : 'image/jpeg';\n if (ext === 'image/jpg') {\n ext = 'image/jpeg';\n } else if (ext.includes('svg')) {\n ext = 'image/svg+xml';\n }\n if (file.size > maxSize) {\n window.alert(I18n.t('ra_File is too big. Max %sk allowed. Try use SVG.', Math.round(maxSize / 1024)));\n } else {\n const base64 = `data:${ext};base64,${btoa(\n new Uint8Array(reader.result as ArrayBufferLike).reduce(\n (data, byte) => data + String.fromCharCode(byte),\n '',\n ),\n )}`;\n\n if (onChange) {\n onChange(base64);\n } else {\n console.log(base64);\n }\n }\n };\n reader.readAsArrayBuffer(file);\n }\n\n render(): JSX.Element {\n const { disabled, icon, removeIconFunc, error, crop, onChange } = this.props;\n const maxSize = this.props.maxSize || 10 * 1024;\n let accept = this.props.accept || { 'image/*': [] };\n const { uploadFile, anchorEl, cropHandler } = this.state;\n\n // covert '\"image/png\"' to { 'image/*': [] }\n if (typeof accept === 'string') {\n accept = { [accept]: [] };\n } else if (Array.isArray(accept)) {\n const result: Record<string, string[]> = {};\n accept.forEach(item => {\n result[item] = [];\n });\n accept = result;\n }\n\n return (\n <Dropzone\n disabled={!!disabled || cropHandler}\n key=\"dropzone\"\n multiple={false}\n accept={accept}\n maxSize={maxSize}\n onDragEnter={() => this.setState({ uploadFile: 'dragging' })}\n onDragLeave={() => this.setState({ uploadFile: true })}\n onDrop={(acceptedFiles: File[], errors) => {\n this.setState({ uploadFile: false });\n if (!acceptedFiles.length) {\n window.alert(\n (errors &&\n errors[0] &&\n errors[0].errors &&\n errors[0].errors[0] &&\n errors[0].errors[0].message) ||\n I18n.t('ra_Cannot upload'),\n );\n } else {\n this.onDrop(acceptedFiles);\n }\n }}\n >\n {({ getRootProps, getInputProps }) => (\n <div\n style={{\n ...styles.uploadDiv,\n ...(uploadFile === 'dragging' ? styles.uploadDivDragging : undefined),\n ...styles.dropZone,\n ...(disabled ? styles.disabledOpacity : undefined),\n ...(!icon ? styles.dropZoneEmpty : undefined),\n }}\n {...getRootProps()}\n >\n <input {...getInputProps()} />\n <div style={{ ...styles.uploadCenterDiv, ...(error ? styles.error : undefined) }}>\n {!icon ? (\n <div style={styles.uploadCenterTextAndIcon}>\n <UploadIcon style={styles.uploadCenterIcon} />\n <div style={styles.uploadCenterText}>\n {uploadFile === 'dragging'\n ? I18n.t('ra_Drop file here')\n : I18n.t(\n 'ra_Place your files here or click here to open the browse dialog',\n )}\n </div>\n </div>\n ) : (\n removeIconFunc &&\n !cropHandler && (\n <div style={styles.buttonRemoveWrapper}>\n <Tooltip\n title={I18n.t('ra_Clear')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <IconButton\n size=\"large\"\n onClick={e => {\n removeIconFunc && removeIconFunc();\n e.stopPropagation();\n }}\n >\n <IconClose />\n </IconButton>\n </Tooltip>\n </div>\n )\n )}\n {icon && crop && (\n <div style={styles.buttonCropWrapper}>\n <Tooltip\n title={I18n.t('ra_Crop')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <IconButton\n size=\"large\"\n onClick={e => {\n if (!cropHandler) {\n this.setState({ cropHandler: true });\n } else {\n this.setState({ anchorEl: e.currentTarget });\n }\n e.stopPropagation();\n }}\n >\n <CropIcon color={cropHandler ? 'primary' : 'inherit'} />\n </IconButton>\n </Tooltip>\n <Menu\n anchorEl={anchorEl}\n keepMounted\n open={Boolean(anchorEl)}\n onClose={() => this.setState({ anchorEl: null })}\n >\n <MenuItem\n onClick={() =>\n this.setState({ anchorEl: null, cropHandler: false }, () => {\n const imageElement = this.cropperRef?.current?.cropper;\n if (imageElement) {\n if (onChange) {\n onChange(imageElement.getCroppedCanvas().toDataURL());\n } else {\n console.log(imageElement.getCroppedCanvas().toDataURL());\n }\n }\n })\n }\n >\n {I18n.t('ra_Save')}\n </MenuItem>\n <MenuItem onClick={() => this.setState({ anchorEl: null, cropHandler: false })}>\n {I18n.t('ra_Close')}\n </MenuItem>\n </Menu>\n </div>\n )}\n {icon && !cropHandler ? (\n <Icon\n src={icon}\n style={styles.image}\n alt=\"icon\"\n />\n ) : null}\n\n {icon && crop && cropHandler ? (\n <Cropper\n ref={this.cropperRef}\n style={styles.image}\n src={icon}\n initialAspectRatio={1}\n viewMode={1}\n guides={false}\n minCropBoxHeight={10}\n minCropBoxWidth={10}\n background={false}\n checkOrientation={false}\n />\n ) : null}\n </div>\n </div>\n )}\n </Dropzone>\n );\n }\n}\n","import React from 'react';\n\nimport {\n InputLabel,\n MenuItem,\n Select,\n TextField,\n FormControl,\n FormControlLabel,\n Checkbox,\n type Theme,\n} from '@mui/material';\n\nimport convertCronToText from './cronText';\n\nimport { I18n } from '../../i18n';\n\nconst styles: Record<string, React.CSSProperties> = {\n mainDiv: {\n width: '100%',\n height: '100%',\n overflow: 'auto',\n },\n formControl: {\n margin: 0,\n minWidth: 120,\n },\n formControlMarginRight: {\n marginRight: 5,\n },\n formControlPaddingTop: {\n paddingTop: 6.2,\n },\n};\n\ntype SimpleCronType = 'once' | 'interval' | 'intervalBetween' | 'specific';\nconst PERIODIC = {\n once: 'once',\n interval: 'interval',\n intervalBetween: 'intervalBetween',\n specific: 'specific',\n};\nconst PERIODIC_TYPES = {\n seconds: 'seconds',\n minutes: 'minutes',\n // hours: 'hours',\n};\nconst WEEKDAYS = [\n 'ra_Sunday',\n 'ra_Monday',\n 'ra_Tuesday',\n 'ra_Wednesday',\n 'ra_Thursday',\n 'ra_Friday',\n 'ra_Saturday',\n 'ra_Sunday',\n];\n\nfunction padding(num: number): string {\n if (num < 10) {\n return `0${num}`;\n }\n\n return `${num}`;\n}\nconst DEFAULT_STATE = {\n mode: 'interval',\n interval: {\n period: 1,\n unit: PERIODIC_TYPES.minutes,\n },\n};\n\ninterface SimpleCronProps {\n cronExpression?: string;\n onChange: (cron: string) => void;\n language: ioBroker.Languages;\n}\n\ninterface SimpleCronState {\n extended: boolean;\n cron: string;\n mode: SimpleCronType;\n once: {\n time: string;\n date: string;\n // weekdays?: number[];\n };\n interval: {\n period: number;\n unit: string;\n minutes?: number; // if extended\n hours?: number; // if extended\n };\n intervalBetween: {\n period: number;\n unit: string;\n timeFrom: number;\n timeTo: number;\n weekdays: number[];\n minutes?: number; // if extended\n hours?: number; // if extended\n };\n specific: {\n time: string;\n weekdays: number[];\n };\n}\n\ninterface CronStructure {\n seconds: string | null;\n minutes: string;\n hours: string;\n date: string;\n months: string;\n dow: string;\n}\n\nfunction text2weekdays(text: string): number[] {\n if (text === '*') {\n return [0, 1, 2, 3, 4, 5, 6];\n }\n\n const parts = text.split(',');\n const list: number[] = [];\n parts.forEach(part => {\n const _parts = part.split('-');\n if (_parts.length === 2) {\n const start = parseInt(_parts[0], 10);\n const end = parseInt(_parts[1], 10);\n for (let day = start; day <= end; day++) {\n if (!list.includes(day === 7 ? 0 : day)) {\n list.push(day === 7 ? 0 : day);\n }\n }\n } else {\n if (part === '7') {\n part = '0';\n }\n const numPart = parseInt(part, 10);\n if (!list.includes(numPart)) {\n list.push(numPart);\n }\n }\n });\n list.sort();\n return list;\n}\n\nexport function cron2state(cron: string, force?: boolean): Partial<SimpleCronState> | null {\n cron = cron.replace(/['\"]/g, '').trim();\n const cronParts = cron.split(' ');\n let options: CronStructure;\n let state: Partial<SimpleCronState> | null = null;\n\n if (cronParts.length === 6) {\n options = {\n seconds: cronParts[0] || '*',\n minutes: cronParts[1] || '*',\n hours: cronParts[2] || '*',\n date: cronParts[3] || '*',\n months: cronParts[4] || '*',\n dow: cronParts[5] || '*',\n };\n } else {\n options = {\n seconds: null,\n minutes: cronParts[0] || '*',\n hours: cronParts[1] || '*',\n date: cronParts[2] || '*',\n months: cronParts[3] || '*',\n dow: cronParts[4] || '*',\n };\n }\n\n // * * * * *\n if (\n options.seconds === null &&\n options.minutes === '*' &&\n options.hours === '*' &&\n options.date === '*' &&\n options.months === '*' &&\n (options.dow === '*' || force)\n ) {\n state = {\n mode: 'interval',\n interval: {\n period: 1,\n unit: PERIODIC_TYPES.minutes,\n },\n };\n } // * * * * * *\n\n if (\n options.seconds === '*' &&\n options.minutes === '*' &&\n options.hours === '*' &&\n options.date === '*' &&\n options.months === '*' &&\n (options.dow === '*' || force)\n ) {\n state = {\n mode: 'interval',\n interval: {\n period: 1,\n unit: PERIODIC_TYPES.seconds,\n },\n };\n } else if (\n options.seconds === null &&\n options.minutes.includes('/') &&\n options.hours === '*' &&\n options.date === '*' &&\n options.months === '*' &&\n (options.dow === '*' || force)\n ) {\n // */n * * * *\n state = {\n mode: 'interval',\n interval: {\n period: parseInt(options.minutes.split('/')[1], 10),\n unit: PERIODIC_TYPES.minutes,\n },\n };\n } else if (\n options.seconds !== null &&\n options.seconds.includes('/') &&\n options.minutes === '*' &&\n options.hours === '*' &&\n options.date === '*' &&\n options.months === '*' &&\n (options.dow === '*' || force)\n ) {\n // */n * * * * *\n state = {\n mode: 'interval',\n interval: {\n period: parseInt(options.seconds.split('/')[1], 10),\n unit: PERIODIC_TYPES.seconds,\n },\n };\n } else if (\n options.seconds !== null &&\n options.seconds.includes('/') &&\n options.minutes === '*' &&\n options.hours.includes('-') &&\n options.date === '*' &&\n options.months === '*' &&\n (options.dow === '*' || force)\n ) {\n // */n * 0-23 * * 1-7 or */n * 0-23 * * *\n state = {\n mode: 'intervalBetween',\n intervalBetween: {\n period: parseInt(options.seconds.split('/')[1], 10),\n unit: PERIODIC_TYPES.seconds,\n timeFrom: parseInt(options.hours.split('-')[0], 10),\n timeTo: parseInt(options.hours.split('-')[1], 10),\n weekdays: text2weekdays(options.dow),\n },\n };\n } else if (\n options.seconds === null &&\n options.minutes.includes('/') &&\n options.hours.includes('-') &&\n options.date === '*' &&\n options.months === '*' &&\n (options.dow === '*' || force)\n ) {\n // */n 0-23 * * 1-7 or */n 0-23 * * *\n state = {\n mode: 'intervalBetween',\n intervalBetween: {\n period: parseInt(options.minutes.split('/')[1], 10),\n unit: PERIODIC_TYPES.minutes,\n timeFrom: parseInt(options.hours.split('-')[0], 10),\n timeTo: parseInt(options.hours.split('-')[1], 10),\n weekdays: text2weekdays(options.dow),\n },\n };\n } else if (\n options.seconds === null &&\n parseInt(options.minutes, 10).toString() === options.minutes &&\n parseInt(options.hours, 10).toString() === options.hours &&\n options.date === '*' &&\n options.months === '*' &&\n (options.dow === '*' || force)\n ) {\n // m h * * 1-7 or m h * * *\n state = {\n mode: 'specific',\n specific: {\n time: `${padding(parseInt(options.hours, 10))}:${padding(parseInt(options.minutes, 10))}`,\n weekdays: text2weekdays(options.dow),\n },\n };\n } else if (\n options.seconds === null &&\n parseInt(options.minutes, 10).toString() === options.minutes &&\n parseInt(options.hours, 10).toString() === options.hours &&\n parseInt(options.date, 10).toString() === options.date &&\n parseInt(options.months, 10).toString() === options.months &&\n (options.dow === '*' || force)\n ) {\n // m h d M *\n state = {\n mode: 'once',\n once: {\n time: `${padding(parseInt(options.hours, 10))}:${padding(parseInt(options.minutes, 10))}`,\n date: `${padding(parseInt(options.date, 10))}.${padding(parseInt(options.months, 10))}`,\n },\n };\n }\n\n return state;\n}\n\nexport class SimpleCron extends React.Component<SimpleCronProps, SimpleCronState> {\n constructor(props: SimpleCronProps) {\n super(props);\n let cron =\n typeof props.cronExpression === 'string'\n ? props.cronExpression.replace(/^[\"']/, '').replace(/[\"']\\n?$/, '')\n : '';\n if (cron[0] === '{') {\n cron = '';\n }\n const state = cron2state(cron || '* * * * *', true) || DEFAULT_STATE;\n\n this.state = {\n extended: false,\n cron: SimpleCron.state2cron(state as SimpleCronState),\n mode: 'interval',\n once: {\n time: '00:00',\n date: '',\n },\n interval: {\n period: 1,\n unit: PERIODIC_TYPES.minutes,\n },\n intervalBetween: {\n period: 1,\n unit: PERIODIC_TYPES.minutes,\n timeFrom: 0,\n timeTo: 23,\n weekdays: [0, 1, 2, 3, 4, 5, 6],\n },\n specific: {\n time: '00:00',\n weekdays: [0, 1, 2, 3, 4, 5, 6],\n },\n };\n Object.assign(this.state, state);\n\n if (this.state.cron !== props.cronExpression) {\n setTimeout(() => props.onChange && props.onChange(this.state.cron), 100);\n }\n }\n\n static periodArray2text(list: number[], max: number = 7): string {\n max = max || 7;\n if (list.length === max) {\n return '*';\n }\n const text = [];\n let start = null;\n let end = null;\n if (!list.length) {\n return '_';\n }\n for (let i = 0; i < list.length; i++) {\n if (start === null) {\n start = list[i];\n end = list[i];\n } else if (list[i - 1] + 1 === list[i]) {\n end = list[i];\n } else {\n if (start !== end) {\n text.push(`${start}-${end}`);\n } else {\n text.push(start);\n }\n start = list[i];\n end = list[i];\n }\n }\n if (start !== end) {\n text.push(`${start}-${end}`);\n } else {\n text.push(start);\n }\n return text.join(',');\n }\n\n static text2weekdays(text: string): number[] {\n return text2weekdays(text);\n }\n\n static state2cron(state: Partial<SimpleCronState>): string {\n let cron = '* * * * *';\n if (state.mode === 'interval') {\n const settings = state.interval || {\n period: 1,\n unit: PERIODIC_TYPES.minutes,\n };\n if (settings.period !== undefined && settings.period > 60) {\n settings.period = 60;\n }\n if (settings.period !== undefined && settings.period < 1) {\n settings.period = 1;\n }\n\n if (settings.minutes !== undefined && settings.minutes !== null && settings.minutes > 60) {\n settings.minutes = 60;\n }\n if (settings.minutes !== undefined && settings.minutes !== null && settings.minutes < 1) {\n settings.minutes = 1;\n }\n\n if (settings.hours !== undefined && settings.hours !== null && settings.hours > 24) {\n settings.hours = 24;\n }\n if (settings.hours !== undefined && settings.hours !== null && settings.hours < 1) {\n settings.hours = 1;\n }\n\n if (state.extended) {\n cron = `${settings.minutes !== undefined && settings.minutes !== null && settings.minutes > 1 ? `*/${settings.minutes}` : '*'} ${settings.hours !== undefined && settings.hours !== null && settings.hours > 1 ? `*/${settings.hours}` : '*'} * * *`;\n } else {\n switch (settings.unit) {\n case PERIODIC_TYPES.seconds:\n cron = `${settings.period > 1 ? `*/${settings.period}` : '*'} * * * * *`;\n break;\n case PERIODIC_TYPES.minutes:\n cron = `${settings.period > 1 ? `*/${settings.period}` : '*'} * * * *`;\n break;\n default:\n break;\n }\n }\n } else if (state.mode === 'intervalBetween') {\n const settings = state.intervalBetween || {\n period: 1,\n unit: PERIODIC_TYPES.minutes,\n timeFrom: 0,\n timeTo: 24,\n weekdays: [0, 1, 2, 3, 4, 5, 6],\n };\n let hours;\n settings.timeFrom = settings.timeFrom || 0;\n settings.timeTo = settings.timeTo === undefined ? 24 : settings.timeTo;\n if (settings.timeFrom !== 0 && settings.timeTo === 24) {\n settings.timeTo = 23;\n }\n if (settings.timeFrom === 0 && settings.timeTo === 24) {\n hours = '*';\n } else {\n hours = settings.timeFrom !== settings.timeTo ? `${settings.timeFrom}-${settings.timeTo}` : '*';\n }\n if (settings.period > 60) {\n settings.period = 60;\n }\n if (settings.period < 1) {\n settings.period = 1;\n }\n settings.unit = settings.unit || PERIODIC_TYPES.minutes;\n switch (settings.unit) {\n case PERIODIC_TYPES.seconds:\n cron = `${settings.period > 1 ? `*/${settings.period}` : '*'} * ${hours} * * ${this.periodArray2text(settings.weekdays)}`;\n break;\n case PERIODIC_TYPES.minutes:\n cron = `${settings.period > 1 ? `*/${settings.period}` : '*'} ${hours} * * ${this.periodArray2text(settings.weekdays)}`;\n break;\n default:\n break;\n }\n } else if (state.mode === 'specific') {\n const settings = state.specific || {\n time: '00:00',\n weekdays: [0, 1, 2, 3, 4, 5, 6],\n };\n const parts = (settings.time || '00:00').split(':');\n let minutes = parseInt(parts[1], 10) || 0;\n if (minutes > 59) {\n minutes = 59;\n }\n if (minutes < 0) {\n minutes = 0;\n }\n let hours = parseInt(parts[0], 10) || 0;\n if (hours > 23) {\n hours = 59;\n }\n if (hours < 0) {\n hours = 0;\n }\n\n cron = `${minutes} ${hours} * * ${this.periodArray2text(settings.weekdays || [])}`;\n } else if (state.mode === 'once') {\n const settings = state.once || {\n time: '00:00',\n date: '',\n };\n if (!settings.date) {\n settings.date = `${new Date().getDate()}.${padding(new Date().getMonth() + 1)}`;\n }\n const parts = (settings.time || '00:00').split(':');\n const partsDate = settings.date.split('.');\n let minutes = parseInt(parts[1], 10) || 0;\n if (minutes > 59) {\n minutes = 59;\n }\n if (minutes < 0) {\n minutes = 0;\n }\n let hours = parseInt(parts[0], 10) || 0;\n if (hours > 23) {\n hours = 59;\n }\n if (hours < 0) {\n hours = 0;\n }\n let date = parseInt(partsDate[0], 10) || 1;\n if (date > 31) {\n date = 31;\n }\n if (date < 1) {\n hours = 1;\n }\n let month = parseInt(partsDate[1], 10) || 1;\n if (month > 12) {\n month = 12;\n }\n if (month < 1) {\n month = 1;\n }\n\n cron = `${minutes} ${hours} ${date} ${month} *`;\n }\n return cron;\n }\n\n recalcCron(): void {\n this.onChange(SimpleCron.state2cron(this.state));\n }\n\n getControlsWeekdaysElements(type: 'intervalBetween' | 'specific'): React.JSX.Element {\n const settings = type === 'intervalBetween' ? this.state.intervalBetween : this.state.specific;\n return (\n <div\n key=\"weekdays\"\n style={{ paddingLeft: 8, width: 'calc(100% - 8px)', maxWidth: 600 }}\n >\n <h5>{I18n.t('ra_On weekdays')}</h5>\n {[1, 2, 3, 4, 5, 6, 0].map(day => (\n <FormControlLabel\n key={WEEKDAYS[day]}\n control={\n <Checkbox\n checked={settings.weekdays.includes(day)}\n onChange={e => {\n const _settings = JSON.parse(JSON.stringify(this.state[type]));\n const pos = _settings.weekdays.indexOf(day);\n if (e.target.checked) {\n if (pos === -1) {\n _settings.weekdays.push(day);\n }\n } else {\n if (pos !== -1) {\n _settings.weekdays.splice(pos, 1);\n }\n }\n _settings.weekdays.sort();\n if (type === 'intervalBetween') {\n this.setState({ intervalBetween: _settings }, () => this.recalcCron());\n } else {\n this.setState({ specific: _settings }, () => this.recalcCron());\n }\n }}\n value={day.toString()}\n />\n }\n label={I18n.t(WEEKDAYS[day])}\n />\n ))}\n </div>\n );\n }\n\n getControlsPeriodElements(type: 'interval' | 'intervalBetween'): React.JSX.Element {\n const settings = type === 'interval' ? this.state.interval : this.state.intervalBetween;\n\n if (this.state.extended) {\n return (\n <div\n key=\"period\"\n style={{ paddingLeft: 8, display: 'inline-block' }}\n >\n <h5 style={{ marginBottom: 5 }}>{I18n.t('sc_period')}</h5>\n <TextField\n variant=\"standard\"\n style={{ marginTop: 0, marginBottom: 0, verticalAlign: 'bottom' }}\n key=\"value\"\n label={I18n.t('sc_minutes')}\n value={settings.minutes}\n onChange={e => {\n const _settings = JSON.parse(JSON.stringify(this.state[type]));\n _settings.minutes = parseInt(e.target.value, 10);\n if (_settings.minutes < 1) {\n _settings.minutes = 1;\n }\n if (type === 'interval') {\n this.setState({ interval: _settings }, () => this.recalcCron());\n } else {\n this.setState({ intervalBetween: _settings }, () => this.recalcCron());\n }\n }}\n slotProps={{\n htmlInput: {\n min: 1,\n max: 60,\n },\n inputLabel: {\n shrink: true,\n },\n }}\n type=\"number\"\n margin=\"normal\"\n />\n <TextField\n variant=\"standard\"\n style={{ marginTop: 0, marginBottom: 0, verticalAlign: 'bottom' }}\n key=\"value\"\n label={I18n.t('sc_hours')}\n value={settings.hours}\n onChange={e => {\n const _settings = JSON.parse(JSON.stringify(this.state[type]));\n _settings.hours = parseInt(e.target.value, 10);\n if (_settings.hours < 1) {\n _settings.hours = 1;\n }\n if (type === 'interval') {\n this.setState({ interval: _settings }, () => this.recalcCron());\n } else {\n this.setState({ intervalBetween: _settings }, () => this.recalcCron());\n }\n }}\n slotProps={{\n htmlInput: {\n min: 1,\n max: 24,\n },\n inputLabel: {\n shrink: true,\n },\n }}\n type=\"number\"\n margin=\"normal\"\n />\n </div>\n );\n }\n\n return (\n <div\n key=\"period\"\n style={{ paddingLeft: 8, display: 'inline-block' }}\n >\n <h5 style={{ marginBottom: 5 }}>{I18n.t('sc_period')}</h5>\n <TextField\n variant=\"standard\"\n style={{ marginTop: 0, marginBottom: 0, verticalAlign: 'bottom' }}\n key=\"value\"\n label={I18n.t('sc_every')}\n value={settings.period}\n onChange={e => {\n const _settings = JSON.parse(JSON.stringify(this.state[type]));\n _settings.period = parseInt(e.target.value, 10);\n if (_settings.period < 1) {\n _settings.period = 1;\n }\n if (type === 'interval') {\n this.setState({ interval: _settings }, () => this.recalcCron());\n } else {\n this.setState({ intervalBetween: _settings }, () => this.recalcCron());\n }\n }}\n slotProps={{\n htmlInput: {\n min: 1,\n max: 60,\n },\n inputLabel: {\n shrink: true,\n },\n }}\n type=\"number\"\n margin=\"normal\"\n />\n <Select\n variant=\"standard\"\n style={{ verticalAlign: 'bottom' }}\n value={settings.unit}\n onChange={e => {\n const _settings = JSON.parse(JSON.stringify(this.state[type]));\n _settings.unit = e.target.value;\n if (type === 'interval') {\n this.setState({ interval: _settings }, () => this.recalcCron());\n } else {\n this.setState({ intervalBetween: _settings }, () => this.recalcCron());\n }\n }}\n >\n <MenuItem value=\"seconds\">{I18n.t('sc_seconds')}</MenuItem>)\n <MenuItem value=\"minutes\">{I18n.t('sc_minutes')}</MenuItem>)\n </Select>\n </div>\n );\n }\n\n getControlsTime(type: 'once' | 'specific'): React.JSX.Element {\n const settings = type === 'once' ? this.state.once : this.state.specific;\n return (\n <FormControl\n variant=\"standard\"\n sx={{\n ...styles.formControl,\n '&.MuiFormControl-root': styles.formControlMarginRight,\n }}\n >\n <TextField\n variant=\"standard\"\n key=\"at\"\n label={I18n.t('sc_time')}\n value={settings.time}\n type=\"time\"\n sx={(theme: Theme) => ({\n '& input[type=\"time\"]::-webkit-calendar-picker-indicator': {\n filter: theme.palette.mode === 'dark' ? 'invert(80%)' : undefined,\n },\n })}\n onChange={e => {\n const _settings = JSON.parse(JSON.stringify(this.state[type]));\n _settings.time = e.target.value;\n if (type === 'once') {\n this.setState({ once: _settings }, () => this.recalcCron());\n } else {\n this.setState({ specific: _settings }, () => this.recalcCron());\n }\n }}\n slotProps={{\n inputLabel: {\n shrink: true,\n },\n }}\n margin=\"normal\"\n />\n </FormControl>\n );\n }\n\n getControlsDate(): React.JSX.Element {\n const settings = this.state.once;\n\n if (!settings.date) {\n const d = new Date();\n settings.date = `${d.getDate()}.${padding(d.getMonth() + 1)}`;\n }\n\n // <InputLabel htmlFor=\"formatted-text-mask-input\">{I18n.t('sc_at')}</InputLabel>\n return (\n <FormControl\n variant=\"standard\"\n style={styles.formControl}\n >\n <TextField\n variant=\"standard\"\n key=\"date\"\n label={I18n.t('sc_date')}\n value={settings.date}\n type=\"text\"\n slotProps={{\n htmlInput: {\n style: styles.formControlPaddingTop,\n },\n inputLabel: {\n shrink: true,\n },\n }}\n onChange={e => {\n const _settings = JSON.parse(JSON.stringify(this.state.once));\n _settings.date = e.target.value;\n this.setState({ once: _settings }, () => this.recalcCron());\n }}\n margin=\"normal\"\n />\n </FormControl>\n );\n }\n\n getOnceElements(): React.JSX.Element {\n return (\n <div style={{ marginLeft: 8 }}>\n {this.getControlsTime('once')}\n {this.getControlsDate()}\n </div>\n );\n }\n\n getIntervalElements(): React.JSX.Element {\n return this.getControlsPeriodElements('interval');\n }\n\n getIntervalBetweenElements(): React.JSX.Element[] {\n const settings = this.state.intervalBetween;\n return [\n this.getControlsPeriodElements('intervalBetween'),\n <div\n key=\"between\"\n style={{ paddingLeft: 8, display: 'inline-block', verticalAlign: 'top' }}\n >\n <h5 style={{ marginBottom: 5 }}>{I18n.t('sc_hours')}</h5>\n <FormControl\n variant=\"standard\"\n style={styles.formControl}\n >\n <InputLabel\n shrink\n htmlFor=\"age-label-placeholder\"\n >\n {I18n.t('sc_from')}\n </InputLabel>\n <Select\n variant=\"standard\"\n style={{ width: 100 }}\n value={settings.timeFrom}\n onChange={e => {\n const _settings = JSON.parse(JSON.stringify(this.state.intervalBetween));\n _settings.timeFrom = parseInt(e.target.value as string, 10);\n if (_settings.timeTo === 24) {\n _settings.timeTo = 23;\n }\n this.setState({ intervalBetween: _settings }, () => this.recalcCron());\n }}\n >\n {[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23].map(\n hour => (\n <MenuItem\n key={`B_${hour}`}\n value={hour}\n >\n {`${padding(hour)}:00`}\n </MenuItem>\n ),\n )}\n </Select>\n </FormControl>\n <FormControl\n variant=\"standard\"\n style={styles.formControl}\n >\n <InputLabel\n shrink\n htmlFor=\"age-label-placeholder\"\n >\n {I18n.t('sc_to')}\n </InputLabel>\n <Select\n variant=\"standard\"\n style={{ width: 100 }}\n value={settings.timeTo}\n onChange={e => {\n const _settings = JSON.parse(JSON.stringify(this.state.intervalBetween));\n _settings.timeTo = parseInt(e.target.value as string, 10);\n this.setState({ intervalBetween: _settings }, () => this.recalcCron());\n }}\n >\n {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23].map(\n hour => (\n <MenuItem\n key={`A_${hour}`}\n value={hour}\n >\n {`${padding(hour)}:00`}\n </MenuItem>\n ),\n )}\n {!settings.timeFrom && <MenuItem value={24}>00:00</MenuItem>}\n </Select>\n </FormControl>\n </div>,\n this.getControlsWeekdaysElements('intervalBetween'),\n ];\n }\n\n getSpecificTimeElements(): React.JSX.Element[] {\n return [\n <div\n key=\"time\"\n style={{ marginLeft: 8 }}\n >\n {this.getControlsTime('specific')}\n </div>,\n this.getControlsWeekdaysElements('specific'),\n ];\n }\n\n onModeChange(mode: 'once' | 'interval' | 'intervalBetween' | 'specific'): void {\n if (mode !== this.state.mode) {\n this.setState({ mode }, () => this.recalcCron());\n }\n }\n\n onChange(cron: string): void {\n if (cron !== this.state.cron) {\n this.setState({ cron });\n this.props.onChange && this.props.onChange(cron);\n }\n }\n\n render(): React.JSX.Element {\n return (\n <div style={styles.mainDiv}>\n <div style={{ paddingLeft: 8, width: 'calc(100% - 8px)' }}>\n <TextField\n variant=\"standard\"\n style={{ width: '100%' }}\n value={this.state.cron}\n disabled\n error={this.state.cron.includes('_')}\n />\n </div>\n <div style={{ paddingLeft: 8, width: 'calc(100% - 8px)', height: 60 }}>\n {this.state.cron.includes('_')\n ? I18n.t('sc_invalid_cron')\n : convertCronToText(this.state.cron, this.props.language || 'en')}\n </div>\n <div>\n <FormControl\n variant=\"standard\"\n style={{ ...styles.formControl, marginLeft: 8, marginTop: 8 }}\n >\n <InputLabel>{I18n.t('ra_Repeat')}</InputLabel>\n <Select\n variant=\"standard\"\n value={this.state.mode}\n onChange={e => this.onModeChange(e.target.value as SimpleCronType)}\n inputProps={{ name: 'mode', id: 'mode' }}\n >\n <MenuItem value=\"once\">{I18n.t('sc_once')}</MenuItem>\n <MenuItem value=\"interval\">{I18n.t('sc_interval')}</MenuItem>\n <MenuItem value=\"intervalBetween\">{I18n.t('sc_intervalBetween')}</MenuItem>\n <MenuItem value=\"specific\">{I18n.t('sc_specific')}</MenuItem>\n </Select>\n </FormControl>\n </div>\n {this.state.mode === PERIODIC.once && this.getOnceElements()}\n {this.state.mode === 'interval' && this.getIntervalElements()}\n {this.state.mode === 'intervalBetween' && this.getIntervalBetweenElements()}\n {this.state.mode === 'specific' && this.getSpecificTimeElements()}\n </div>\n );\n }\n}\n","/**\n * Copyright 2021-2024 ioBroker GmbH\n *\n * MIT License\n *\n */\nimport React, { useEffect } from 'react';\nimport { CircularProgress } from '@mui/material';\n\nimport type { ThemeType, ThemeName } from '../../types';\n\n// import './Vendor.css'\nconst vendorStyles = `\n.logo-background-light, .logo-background-colored {\n background: white;\n}\n.logo-background-dark, .logo-background-blue {\n background: black;\n}\n`;\n\ninterface LoaderVendorProps {\n /** The size in pixels of this loader. */\n size?: number;\n /** The chosen theme type. */\n themeType?: ThemeType;\n /** The chosen theme name. */\n themeName?: ThemeName;\n /** Background color */\n backgroundColor?: string;\n /** Background image URL */\n backgroundImage?: string;\n}\n\nexport function LoaderVendor(props: LoaderVendorProps): React.JSX.Element {\n useEffect(() => {\n if (!window.document.getElementById('vendor-iobroker-component')) {\n const style = window.document.createElement('style');\n style.setAttribute('id', 'vendor-iobroker-component');\n style.innerHTML = vendorStyles;\n window.document.head.appendChild(style);\n }\n }, []);\n\n const theme = props.themeType || props.themeName || 'light';\n return (\n <div\n className={`vendor-logo-back logo-background-${theme}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n width: '10%',\n margin: 'auto',\n backgroundImage:\n props.backgroundImage && props.backgroundImage !== '@@loginBackgroundImage@@'\n ? props.backgroundImage\n : window.loadingBackgroundImage && window.loadingBackgroundImage !== '@@loginBackgroundImage@@'\n ? `url(${window.loadingBackgroundImage})`\n : undefined,\n backgroundColor:\n props.backgroundColor && props.backgroundColor !== '@@loginBackgroundColor@@'\n ? props.backgroundColor\n : window.loadingBackgroundColor && window.loadingBackgroundColor !== '@@loginBackgroundColor@@'\n ? window.loadingBackgroundColor\n : props.themeType === 'dark'\n ? '#000'\n : '#FFF',\n backgroundSize: 'cover',\n }}\n >\n <div style={{ flexGrow: 1 }} />\n <CircularProgress\n color=\"secondary\"\n size={props.size || 200}\n thickness={5}\n />\n <div style={{ flexGrow: 1 }} />\n </div>\n );\n}\n","/**\n * Copyright 2021-2024 ioBroker GmbH\n *\n * MIT License\n *\n */\nimport React, { useEffect } from 'react';\n\nimport type { ThemeType, ThemeName } from '../../types';\n\n// import './PT.css'\nconst ptStyles = `\n.logo-background-light, .logo-background-colored {\n background: white;\n}\n.logo-background-dark, .logo-background-blue {\n background: black;\n}\n.pt-logo-div {\n position: absolute;\n top: 50%;\n left: 50%;\n -ms-transform: translateX(-50%) translateY(-50%);\n -webkit-transform: translate(-50%,-50%);\n transform: translate(-50%,-50%);\n z-index: 2;\n}\n.pt-logo-border {\n border-style: solid;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n position: absolute;\n}\n.pt-loader-block {\n height: 65px;\n width: 74px;\n border-radius: 15px;\n position: absolute;\n box-sizing: content-box;\n}\n.pt-loader-blue {\n border: 9px solid #0F99DE;\n transform: rotate(5grad);\n left: 93px;\n top: 0;\n animation: spin-blue 5s ease-in-out infinite;\n}\n.pt-loader-green {\n border: 9px solid #88A536;\n transform: rotate(-6grad);\n left: 70px;\n top: 58px;\n animation: spin-green 5s ease-in-out infinite;\n}\n.pt-loader-red {\n border: 9px solid #BD1B24;\n transform: rotate(-15grad);\n left: 24px;\n top: 100px;\n animation: spin-red 5s ease-in-out infinite;\n}\n\n@keyframes spin-blue {\n 0% {\n transform: rotate(5deg);\n }\n 25% {\n transform: rotate(185deg);\n }\n 50% {\n transform: rotate(185deg);\n }\n 75% {\n transform: rotate(185deg);\n }\n 100% {\n transform: rotate(185deg);\n }\n}\n@keyframes spin-green {\n 0% {\n transform: rotate(-6deg);\n }\n 25% {\n transform: rotate(-6deg);\n }\n 50% {\n transform: rotate(174deg);\n }\n 75% {\n transform: rotate(174deg);\n }\n 100% {\n transform: rotate(-6deg);\n }\n}\n@keyframes spin-red {\n 0% {\n transform: rotate(-15deg);\n }\n 25% {\n transform: rotate(-15deg);\n }\n 50% {\n transform: rotate(-15deg);\n }\n 75% {\n transform: rotate(165deg);\n }\n 100% {\n transform: rotate(165deg);\n }\n}\n`;\n\ninterface LoaderPTProps {\n /** The size in pixels of this loader. */\n size?: number;\n /** The chosen theme type. */\n themeType?: ThemeType;\n /** The chosen theme name. */\n themeName?: ThemeName;\n /** Background color */\n backgroundColor?: string;\n /** Background image URL */\n backgroundImage?: string;\n}\n\n/**\n * A loader component with the vendor-specific logo\n *\n * @param props Properties of the loader of type LoaderPTProps\n */\nexport function LoaderPT(props: LoaderPTProps): React.JSX.Element {\n const size = props.size || 200;\n useEffect(() => {\n if (!window.document.getElementById('pt-iobroker-component')) {\n const style = window.document.createElement('style');\n style.setAttribute('id', 'pt-iobroker-component');\n style.innerHTML = ptStyles;\n window.document.head.appendChild(style);\n }\n }, []);\n\n const themeName = props.themeType || props.themeName || 'light';\n return (\n <div\n className={`pt-logo-back logo-background-${themeName}`}\n style={{\n backgroundImage:\n props.backgroundImage && props.backgroundImage !== '@@loginBackgroundImage@@'\n ? props.backgroundImage\n : window.loadingBackgroundImage && window.loadingBackgroundImage !== '@@loginBackgroundImage@@'\n ? `url(${window.loadingBackgroundImage})`\n : undefined,\n backgroundColor:\n props.backgroundColor && props.backgroundColor !== '@@loginBackgroundColor@@'\n ? props.backgroundColor\n : window.loadingBackgroundColor && window.loadingBackgroundColor !== '@@loginBackgroundColor@@'\n ? window.loadingBackgroundColor\n : props.themeType === 'dark'\n ? '#000'\n : '#FFF',\n backgroundSize: 'cover',\n }}\n >\n <div\n className=\"pt-logo-div\"\n style={{ width: size, height: size }}\n >\n <div style={{ width: 200, height: 200 }}>\n <div className=\"pt-loader-blue pt-loader-block\" />\n <div className=\"pt-loader-green pt-loader-block\" />\n <div className=\"pt-loader-red pt-loader-block\" />\n </div>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport type { ThemeType } from '../../types';\n\ninterface LogoProps {\n themeType?: ThemeType;\n size?: number;\n /** Background color */\n backgroundColor?: string;\n /** Background image URL */\n backgroundImage?: string;\n}\n\n/**\n * Vendor specific loader\n *\n * @param props Properties\n */\nexport function LoaderMV(props: LogoProps): React.JSX.Element {\n const themeType = props.themeType || 'light';\n const size = props.size || 300;\n\n return (\n <div\n style={{\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: 0,\n left: 0,\n backgroundImage:\n props.backgroundImage && props.backgroundImage !== '@@loginBackgroundImage@@'\n ? props.backgroundImage\n : window.loadingBackgroundImage && window.loadingBackgroundImage !== '@@loginBackgroundImage@@'\n ? `url(${window.loadingBackgroundImage})`\n : undefined,\n backgroundColor:\n props.backgroundColor && props.backgroundColor !== '@@loginBackgroundColor@@'\n ? props.backgroundColor\n : window.loadingBackgroundColor && window.loadingBackgroundColor !== '@@loginBackgroundColor@@'\n ? window.loadingBackgroundColor\n : themeType === 'dark'\n ? '#000'\n : '#FFF',\n backgroundSize: 'cover',\n }}\n >\n <div\n style={{\n width: size,\n height: size,\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%,-50%)',\n zIndex: 2,\n }}\n >\n <svg\n viewBox=\"0 0 500 500\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"100%\"\n height=\"100%\"\n >\n <circle\n strokeWidth=\"5\"\n fill=\"none\"\n stroke=\"#01BBF5\"\n cx=\"250\"\n cy=\"250\"\n r=\"200\"\n />\n <circle\n strokeWidth=\"5\"\n fill=\"none\"\n stroke=\"#01BBF5\"\n cx=\"250\"\n cy=\"250\"\n r=\"133\"\n />\n <circle\n strokeWidth=\"5\"\n fill=\"none\"\n stroke=\"#01BBF5\"\n cx=\"250\"\n cy=\"250\"\n r=\"83\"\n />\n <circle\n strokeWidth=\"5\"\n fill=\"none\"\n stroke=\"#01BBF5\"\n cx=\"250\"\n cy=\"250\"\n r=\"66\"\n />\n <circle\n strokeWidth=\"15\"\n fill=\"none\"\n stroke=\"#01BBF5\"\n cx=\"250\"\n cy=\"250\"\n r=\"15\"\n />\n <g>\n <line\n y2=\"185\"\n x2=\"250\"\n y1=\"240\"\n x1=\"250\"\n strokeWidth=\"5\"\n stroke=\"#01BBF5\"\n fill=\"none\"\n />\n <line\n y2=\"315\"\n x2=\"250\"\n y1=\"260\"\n x1=\"250\"\n strokeWidth=\"5\"\n stroke=\"#01BBF5\"\n fill=\"none\"\n />\n <g transform=\"rotate(60, 250, 250)\">\n <line\n y2=\"185\"\n x2=\"250\"\n y1=\"240\"\n x1=\"250\"\n strokeWidth=\"5\"\n stroke=\"#01BBF5\"\n fill=\"none\"\n />\n <line\n y2=\"315\"\n x2=\"250\"\n y1=\"260\"\n x1=\"250\"\n strokeWidth=\"5\"\n stroke=\"#01BBF5\"\n fill=\"none\"\n />\n </g>\n <g transform=\"rotate(120, 250, 250)\">\n <line\n y2=\"185\"\n x2=\"250\"\n y1=\"240\"\n x1=\"250\"\n strokeWidth=\"5\"\n stroke=\"#01BBF5\"\n fill=\"none\"\n />\n <line\n y2=\"315\"\n x2=\"250\"\n y1=\"260\"\n x1=\"250\"\n strokeWidth=\"5\"\n stroke=\"#01BBF5\"\n fill=\"none\"\n />\n </g>\n {[\n 0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, 285,\n 300, 315, 330, 345,\n ].map(angle => (\n <line\n key={angle}\n transform={`rotate(${angle}, 250, 250)`}\n y2=\"250\"\n x2=\"115\"\n y1=\"240\"\n x1=\"135\"\n strokeWidth=\"5\"\n stroke=\"#01BBF5\"\n fill=\"none\"\n />\n ))}\n <animateTransform\n attributeType=\"xml\"\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 250 250\"\n to=\"360 250 250\"\n dur=\"10s\"\n additive=\"sum\"\n repeatCount=\"indefinite\"\n />\n </g>\n <path\n d=\"M 56.089 160.250 C 55.077 162.588, 46.037 182.950, 36 205.500 C 25.963 228.050, 16.923 248.412, 15.911 250.750 L 14.071 255 28.286 254.976 L 42.500 254.952 47.931 242.226 C 50.918 235.227, 54.366 227.250, 55.592 224.500 L 57.822 219.500 66.383 237.250 L 74.945 255 88.973 255 C 96.688 255, 103 254.841, 103 254.646 C 103 254.452, 100.043 248.071, 96.430 240.466 L 89.859 226.638 91.603 222.771 C 92.563 220.644, 93.660 218.710, 94.043 218.473 C 94.426 218.237, 108.609 246.609, 125.562 281.522 L 156.384 345 166.071 345 C 175.705 345, 175.763 344.985, 176.856 342.250 C 179.911 334.602, 208 260.765, 208 260.383 C 208 260.138, 202.546 260.065, 195.879 260.219 L 183.759 260.500 174.629 285.244 C 169.608 298.853, 165.254 309.990, 164.952 309.994 C 164.651 309.997, 148.901 277.389, 129.952 237.532 C 111.004 197.674, 95.275 165.057, 95 165.049 C 94.725 165.041, 90.685 172.415, 86.022 181.435 C 81.358 190.455, 77.308 197.689, 77.022 197.510 C 76.735 197.331, 72.675 187.920, 68 176.598 C 63.325 165.275, 59.147 156.008, 58.714 156.005 C 58.282 156.002, 57.101 157.912, 56.089 160.250 M 55.294 168.694 C 52.241 175.842, 52.166 176.323, 53.718 178.692 L 55.349 181.182 56.706 178.591 C 57.453 177.166, 58.406 176, 58.825 176 C 59.244 176, 60.777 178.363, 62.232 181.250 C 64.829 186.403, 64.879 186.440, 64.939 183.250 C 64.973 181.463, 65.422 180, 65.937 180 C 66.724 180, 60.176 162.824, 58.920 161.596 C 58.689 161.370, 57.057 164.564, 55.294 168.694 M 91.698 175.542 C 89.205 180.626, 89.099 181.308, 90.410 183.792 L 91.840 186.500 92.926 183.669 C 94.349 179.961, 96.024 180.653, 98.588 186.009 L 100.676 190.370 101.324 187.132 C 101.832 184.592, 101.217 182.395, 98.473 176.947 C 96.549 173.126, 94.849 170, 94.696 170 C 94.542 170, 93.193 172.494, 91.698 175.542 M 157.005 192.607 C 143.168 197.636, 134.999 209.202, 135.001 223.761 C 135.002 232.756, 138.710 240.755, 145.856 247.180 C 152.159 252.848, 158.121 255, 167.518 255 C 173.509 255, 175.684 254.499, 180.811 251.936 C 200.823 241.936, 205.088 216.155, 189.337 200.403 C 181.479 192.546, 166.868 189.022, 157.005 192.607 M 206 223 L 206 255 215.472 255 L 224.944 255 225.222 241.419 L 225.500 227.837 230.500 234.660 C 233.250 238.412, 238.002 244.636, 241.060 248.491 L 246.620 255.500 253.810 255.168 L 261 254.836 261 222.918 L 261 191 251.528 191 L 242.056 191 241.778 204.552 L 241.500 218.104 231.111 204.552 L 220.722 191 213.361 191 L 206 191 206 223 M 285.821 192.331 C 276.229 195.045, 270.010 202.130, 270.004 210.349 C 269.995 221.957, 275.913 226.925, 295.801 232.006 C 300.753 233.271, 302.228 235.609, 299.412 237.730 C 296.739 239.746, 288.369 238.774, 281.563 235.657 L 276.132 233.171 272.469 239.320 C 268.119 246.621, 268.341 247.287, 276.524 251.500 C 281.399 254.010, 283.761 254.556, 290.977 254.842 C 302.365 255.294, 307.420 253.846, 312.603 248.649 C 317.383 243.855, 319.463 236.989, 318.043 230.693 C 316.210 222.562, 311.258 218.610, 297.878 214.599 C 288.025 211.645, 285.443 209.631, 288.538 207.315 C 291.104 205.394, 302.270 205.946, 306.769 208.217 L 310.039 209.866 313.104 203.794 C 316.516 197.035, 316.622 197.304, 309.167 193.844 C 303.663 191.289, 292.140 190.542, 285.821 192.331 M 322 199 L 322 207 330 207 L 338 207 338 231 L 338 255 347.500 255 L 357 255 357 231.044 L 357 207.088 364.250 206.794 L 371.500 206.500 371.792 198.750 L 372.084 191 347.042 191 L 322 191 322 199 M 379 223 L 379 255 401 255 L 423 255 423 247.500 L 423 240 409.500 240 L 396 240 396 235 L 396 230 407.500 230 L 419 230 419 222 L 419 214 407.500 214 L 396 214 396 210.529 L 396 207.058 409.250 206.779 L 422.500 206.500 422.792 198.750 L 423.084 191 401.042 191 L 379 191 379 223 M 433 223 L 433 255 442 255 L 451 255 451 247 L 451 239 454.800 239 C 458.555 239, 458.645 239.092, 462.469 246.937 L 466.339 254.874 476.172 255.187 C 481.580 255.359, 486.003 255.111, 486.002 254.636 C 486.001 254.160, 483.277 249.264, 479.949 243.754 C 473.914 233.765, 473.903 233.732, 475.836 231.619 C 480.222 226.824, 482.359 220.791, 482.431 213 C 482.512 204.192, 480.272 198.822, 475.031 195.260 C 469.795 191.703, 465.527 191.012, 448.750 191.006 L 433 191 433 223 M 448.210 213.250 L 448.500 221.500 455.338 221.500 C 461.319 221.500, 462.417 221.204, 464.088 219.139 C 465.995 216.785, 466.556 212.613, 465.379 209.545 C 464.356 206.879, 459.449 205, 453.509 205 L 447.919 205 448.210 213.250 M 163.169 209.017 C 156.337 210.583, 151.176 218.533, 152.339 225.701 C 154.672 240.077, 175.040 242.355, 180.446 228.844 C 184.978 217.516, 175.176 206.267, 163.169 209.017 M 216.676 271.715 C 216.037 272.750, 188 344.021, 188 344.612 C 188 344.863, 192.811 344.940, 198.691 344.784 L 209.381 344.500 211.894 336.750 L 214.406 329 226.550 329 L 238.694 329 242.097 336.992 L 245.500 344.983 255.250 344.992 C 262.399 344.998, 264.994 344.667, 264.979 343.750 C 264.968 343.063, 258.477 326.525, 250.555 307 L 236.150 271.500 226.656 271.215 C 221.434 271.058, 216.943 271.283, 216.676 271.715 M 273 307 C 273 326.800, 272.887 343.337, 272.750 343.750 C 272.613 344.163, 277.102 344.628, 282.727 344.785 L 292.954 345.069 293.227 327.379 L 293.500 309.689 307 327.336 L 320.500 344.982 328.262 344.991 L 336.025 345 335.762 308.250 L 335.500 271.500 326.750 271.211 L 318 270.922 317.882 286.711 C 317.816 295.395, 317.816 302.837, 317.882 303.250 C 317.947 303.663, 317.808 304, 317.574 304 C 317.340 304, 310.809 296.575, 303.060 287.500 L 288.971 271 280.985 271 L 273 271 273 307 M 223.254 303.048 L 220.078 312 226.539 312 C 230.093 312, 233 311.861, 233 311.691 C 233 311.257, 226.886 294.553, 226.636 294.302 C 226.522 294.189, 225.001 298.125, 223.254 303.048\"\n stroke=\"none\"\n fill={props.themeType === 'dark' ? '#EEE' : '#111'}\n fillRule=\"evenodd\"\n />\n </svg>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { type IconProps } from './IconProps';\n\nexport const IconFx = (props: IconProps): React.JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 95 95\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M93.779,63.676c-0.981-1.082-2.24-1.653-3.639-1.653c-1.145,0-3.953,0.396-5.318,4.062\n c-0.344,0.922-0.443,1.413-0.907,1.363c-0.786-0.078-3.845-3.346-4.845-8.145l-2.482-11.6c1.961-3.177,3.977-5.629,5.988-7.292\n c1.08-0.882,2.314-1.349,3.808-1.43c3.815-0.26,5.203-0.74,6.14-1.399c1.547-1.115,2.397-2.728,2.397-4.542\n c0-1.596-0.604-3.019-1.75-4.115c-1.106-1.059-2.581-1.618-4.26-1.618c-2.468,0-5.239,1.142-8.474,3.49\n c-1.91,1.388-3.935,3.406-6.121,6.111c-0.711-2.653-1.319-3.889-1.771-4.628c-1.396-2.303-3.664-2.303-4.41-2.303l-0.813,0.013\n l-23.045,0.544l1.297-5.506c0.828-3.593,1.915-6.436,3.226-8.45c0.638-0.98,1.614-2.148,2.638-2.148\n c0.387,0,1.152,0.063,2.582,0.36c3.978,0.86,5.465,0.959,6.239,0.959c1.708,0,3.21-0.571,4.347-1.651\n c1.176-1.119,1.797-2.583,1.797-4.233c0-1.29-0.424-3.156-2.445-4.722c-1.396-1.081-3.311-1.629-5.691-1.629\n c-3.568,0-7.349,1.141-11.241,3.39c-3.862,2.232-7.038,5.317-9.438,9.171c-2.105,3.379-3.929,8.124-5.555,14.459H21.877\n l-2.238,8.831h10.186l-7.74,31.116c-1.603,6.443-2.777,8.028-3.098,8.361c-0.875,0.904-2.68,1.094-4.04,1.094\n c-1.683,0-3.477-0.121-5.349-0.361c-1.286-0.157-2.265-0.234-2.991-0.234c-1.878,0-3.423,0.488-4.59,1.448\n C0.716,81.858,0,83.403,0,85.14c0,1.357,0.44,3.309,2.539,4.895c1.434,1.08,3.389,1.628,5.813,1.628\n c6.069,0,11.725-2.411,16.813-7.165c4.947-4.624,8.571-11.413,10.773-20.195l6.119-24.935l20.87,0.354l2.244,9.64l-4.573,6.748\n c-0.824,1.209-2.051,2.701-3.658,4.441c-0.84,0.92-1.398,1.426-1.721,1.689c-1.316-1.608-2.809-2.424-4.432-2.424\n c-1.525,0-2.91,0.625-4.002,1.804c-1.036,1.116-1.583,2.514-1.583,4.038c0,1.83,0.783,3.459,2.264,4.709\n c1.357,1.146,3.034,1.728,4.981,1.728c2.414,0,4.884-0.921,7.344-2.737c2.053-1.519,4.697-4.526,8.074-9.189\n c2.17,6.24,5.248,10.252,6.714,11.927c2.313,2.644,6.049,4.22,9.993,4.22c3.348,0,5.244-1.402,6.916-2.641l0.148-0.109\n c2.926-2.164,3.54-4.545,3.54-6.166C95.174,65.965,94.691,64.679,93.779,63.676z\"\n />\n </svg>\n);\n","import React from 'react';\nimport { type IconProps } from './IconProps';\n\nexport const IconLogout = (props: IconProps): React.JSX.Element => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 512 512\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M510.371,226.513c-1.088-2.603-2.645-4.971-4.629-6.955l-63.979-63.979c-8.341-8.32-21.824-8.32-30.165,0 c-8.341,8.341-8.341,21.845,0,30.165l27.584,27.584H320.013c-11.797,0-21.333,9.557-21.333,21.333s9.536,21.333,21.333,21.333 h119.168l-27.584,27.584c-8.341,8.341-8.341,21.845,0,30.165c4.16,4.181,9.621,6.251,15.083,6.251s10.923-2.069,15.083-6.251 l63.979-63.979c1.984-1.963,3.541-4.331,4.629-6.955C512.525,237.606,512.525,231.718,510.371,226.513z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M362.68,298.667c-11.797,0-21.333,9.557-21.333,21.333v106.667h-85.333V85.333c0-9.408-6.187-17.728-15.211-20.437\n l-74.091-22.229h174.635v106.667c0,11.776,9.536,21.333,21.333,21.333s21.333-9.557,21.333-21.333v-128\n C384.013,9.557,374.477,0,362.68,0H21.347c-0.768,0-1.451,0.32-2.197,0.405c-1.003,0.107-1.92,0.277-2.88,0.512\n c-2.24,0.576-4.267,1.451-6.165,2.645c-0.469,0.299-1.045,0.32-1.493,0.661C8.44,4.352,8.376,4.587,8.205,4.715\n C5.88,6.549,3.939,8.789,2.531,11.456c-0.299,0.576-0.363,1.195-0.597,1.792c-0.683,1.621-1.429,3.2-1.685,4.992\n c-0.107,0.64,0.085,1.237,0.064,1.856c-0.021,0.427-0.299,0.811-0.299,1.237V448c0,10.176,7.189,18.923,17.152,20.907\n l213.333,42.667c1.387,0.299,2.795,0.427,4.181,0.427c4.885,0,9.685-1.685,13.525-4.843c4.928-4.053,7.808-10.091,7.808-16.491\n v-21.333H362.68c11.797,0,21.333-9.557,21.333-21.333V320C384.013,308.224,374.477,298.667,362.68,298.667z\"\n />\n </svg>\n);\n","import React, { type JSX } from 'react';\n\nimport { Button, DialogTitle, DialogContent, DialogActions, Dialog } from '@mui/material';\n\nimport { Check as IconOk, Cancel as IconCancel, Delete as IconClear } from '@mui/icons-material';\n\nimport { ComplexCron } from '../Components/ComplexCron';\nimport { DialogConfirm } from '../Dialogs/Confirm';\n\nimport { I18n } from '../i18n';\n\n// Generate cron expression\nconst styles: Record<string, React.CSSProperties> = {\n headerID: {\n fontWeight: 'bold',\n fontStyle: 'italic',\n },\n radio: {\n display: 'inline-block',\n },\n dialogPaper: {\n height: 'calc(100% - 96px)',\n },\n};\n\ninterface DialogCronProps {\n onClose: () => void;\n onOk: (cron: string | false) => void;\n title?: string;\n cron?: string;\n cancel?: string;\n ok?: string;\n clear?: string;\n clearButton?: boolean;\n}\n\ninterface DialogCronState {\n cron: string;\n showWarning: '' | 'everySecond' | 'everyMinute';\n}\n\nexport class DialogComplexCron extends React.Component<DialogCronProps, DialogCronState> {\n constructor(props: DialogCronProps) {\n super(props);\n let cron;\n if (this.props.cron && typeof this.props.cron === 'string' && this.props.cron.replace(/^[\"']/, '')[0] !== '{') {\n cron = this.props.cron.replace(/['\"]/g, '').trim();\n } else {\n cron = this.props.cron || '{}';\n if (typeof cron === 'string') {\n cron = cron.replace(/^[\"']/, '').replace(/[\"']\\n?$/, '');\n }\n }\n\n this.state = {\n showWarning: '',\n cron,\n };\n }\n\n handleCancel(): void {\n this.props.onClose();\n }\n\n handleOk(ignoreCheck?: boolean): void {\n if (!ignoreCheck) {\n // Check if the CRON will be executed every second or every minute and warn about it\n const cron = ComplexCron.cron2state(this.state.cron);\n if (cron.seconds === '*' || cron.seconds === '*/1') {\n this.setState({ showWarning: 'everySecond' });\n return;\n }\n if (cron.minutes === '*' || cron.minutes === '*/1') {\n this.setState({ showWarning: 'everyMinute' });\n return;\n }\n }\n\n this.props.onOk(this.state.cron);\n this.props.onClose();\n }\n\n renderWarningDialog(): JSX.Element | null {\n if (!this.state.showWarning) {\n return null;\n }\n return (\n <DialogConfirm\n title={I18n.t('ra_Please confirm')}\n text={I18n.t(\n this.state.showWarning === 'everySecond'\n ? 'ra_The schedule will be executed every second. Are you sure?'\n : 'ra_The schedule will be executed every minute. Are you sure?',\n )}\n onClose={(ok: boolean) =>\n this.setState({ showWarning: '' }, () => {\n if (ok) {\n this.handleOk(true);\n }\n })\n }\n />\n );\n }\n\n handleClear(): void {\n this.props.onOk(false);\n this.props.onClose();\n }\n\n render(): JSX.Element {\n return (\n <Dialog\n onClose={() => {}}\n maxWidth=\"md\"\n fullWidth\n sx={{ '& .MuiDialog-paper': styles.dialogPaper }}\n open={!0}\n aria-labelledby=\"cron-dialog-title\"\n >\n {this.renderWarningDialog()}\n <DialogTitle id=\"cron-dialog-title\">{this.props.title || I18n.t('ra_Define schedule...')}</DialogTitle>\n <DialogContent style={{ height: '100%', overflow: 'hidden' }}>\n <ComplexCron\n cronExpression={this.state.cron}\n onChange={cron => this.setState({ cron })}\n language={I18n.getLanguage()}\n />\n </DialogContent>\n <DialogActions>\n {!!this.props.clearButton && (\n <Button\n color=\"grey\"\n variant=\"contained\"\n onClick={() => this.handleClear()}\n startIcon={<IconClear />}\n >\n {this.props.clear || I18n.t('ra_Clear')}\n </Button>\n )}\n <Button\n variant=\"contained\"\n onClick={() => this.handleOk()}\n color=\"primary\"\n startIcon={<IconOk />}\n >\n {this.props.ok || I18n.t('ra_Ok')}\n </Button>\n <Button\n color=\"grey\"\n variant=\"contained\"\n onClick={() => this.handleCancel()}\n startIcon={<IconCancel />}\n >\n {this.props.cancel || I18n.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n","import React, { type JSX } from 'react';\n\nimport { Button, DialogTitle, DialogContent, DialogActions, Dialog, Radio } from '@mui/material';\n\nimport { Check as IconOk, Cancel as IconCancel } from '@mui/icons-material';\n\nimport { ComplexCron } from '../Components/ComplexCron';\nimport { SimpleCron, cron2state } from '../Components/SimpleCron';\nimport { Schedule } from '../Components/Schedule';\n\nimport { I18n } from '../i18n';\nimport type { IobTheme } from '../types';\n\n// Generate cron expression\n\nconst styles: Record<string, React.CSSProperties> = {\n dialogPaper: {\n height: 'calc(100% - 96px)',\n },\n};\n\ninterface DialogCronProps {\n onClose: () => void;\n onOk: (cron: string) => void;\n title?: string;\n cron?: string;\n cancel?: string;\n ok?: string;\n /** show only simple configuration */\n simple?: boolean;\n /** show only complex configuration */\n complex?: boolean;\n /** do not show wizard */\n noWizard?: boolean;\n theme: IobTheme;\n}\n\ninterface DialogCronState {\n cron: string;\n mode: 'simple' | 'complex' | 'wizard';\n}\n\nexport class DialogCron extends React.Component<DialogCronProps, DialogCronState> {\n constructor(props: DialogCronProps) {\n super(props);\n let cron;\n if (this.props.cron && typeof this.props.cron === 'string' && this.props.cron.replace(/^[\"']/, '')[0] !== '{') {\n cron = this.props.cron.replace(/['\"]/g, '').trim();\n } else {\n cron = this.props.cron || '{}';\n if (typeof cron === 'string') {\n cron = cron.replace(/^[\"']/, '').replace(/[\"']\\n?$/, '');\n }\n }\n\n this.state = {\n cron,\n mode: this.props.simple\n ? 'simple'\n : this.props.complex\n ? 'complex'\n : (typeof cron === 'object' || cron[0] === '{') && !this.props.noWizard\n ? 'wizard'\n : cron2state(this.props.cron || '* * * * *')\n ? 'simple'\n : 'complex',\n };\n }\n\n handleCancel(): void {\n this.props.onClose();\n }\n\n handleOk(): void {\n this.props.onOk(this.state.cron);\n this.props.onClose();\n }\n\n setMode(mode: 'simple' | 'complex' | 'wizard'): void {\n this.setState({ mode });\n }\n\n render(): JSX.Element {\n return (\n <Dialog\n onClose={() => {}}\n maxWidth=\"md\"\n fullWidth\n sx={{ '& .MuiDialog-paper': styles.dialogPaper }}\n open={!0}\n aria-labelledby=\"cron-dialog-title\"\n >\n <DialogTitle id=\"cron-dialog-title\">{this.props.title || I18n.t('ra_Define schedule...')}</DialogTitle>\n <DialogContent style={{ height: '100%', overflow: 'hidden' }}>\n {(this.props.simple && this.props.complex) || (!this.props.simple && !this.props.complex) ? (\n <div>\n {!this.props.simple && !this.props.complex && !this.props.noWizard && (\n <>\n <Radio\n key=\"wizard\"\n checked={this.state.mode === 'wizard'}\n onChange={() => this.setMode('wizard')}\n />\n <label\n onClick={() => this.setMode('wizard')}\n style={this.state.mode !== 'wizard' ? { color: 'lightgrey' } : {}}\n >\n {I18n.t('sc_wizard')}\n </label>\n </>\n )}\n\n {((!this.props.simple && !this.props.complex) || this.props.simple) && (\n <>\n <Radio\n key=\"simple\"\n checked={this.state.mode === 'simple'}\n onChange={() => this.setMode('simple')}\n />\n <label\n onClick={() => this.setMode('simple')}\n style={this.state.mode !== 'simple' ? { color: 'lightgrey' } : {}}\n >\n {I18n.t('sc_simple')}\n </label>\n </>\n )}\n\n {((!this.props.simple && !this.props.complex) || this.props.complex) && (\n <>\n <Radio\n key=\"complex\"\n checked={this.state.mode === 'complex'}\n onChange={() => this.setMode('complex')}\n />\n <label\n onClick={() => this.setMode('complex')}\n style={this.state.mode !== 'complex' ? { color: 'lightgrey' } : {}}\n >\n {I18n.t('sc_cron')}\n </label>\n </>\n )}\n </div>\n ) : null}\n\n {this.state.mode === 'simple' && (\n <SimpleCron\n cronExpression={this.state.cron}\n onChange={cron => this.setState({ cron })}\n language={I18n.getLanguage()}\n />\n )}\n {this.state.mode === 'wizard' && (\n <Schedule\n theme={this.props.theme}\n schedule={this.state.cron}\n onChange={(cron: string) => this.setState({ cron })}\n />\n )}\n {this.state.mode === 'complex' && (\n <ComplexCron\n cronExpression={this.state.cron}\n onChange={cron => this.setState({ cron })}\n language={I18n.getLanguage()}\n />\n )}\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => this.handleOk()}\n color=\"primary\"\n startIcon={<IconOk />}\n >\n {this.props.ok || I18n.t('ra_Ok')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => this.handleCancel()}\n color=\"grey\"\n startIcon={<IconCancel />}\n >\n {this.props.cancel || I18n.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n","/**\n * Copyright 2018-2023 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\n// please do not delete React, as without it other projects could not be compiled: ReferenceError: React is not defined\nimport React, { Component, type JSX } from 'react';\n\nimport { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material';\n\nimport { Close as IconClose } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\n\ninterface DialogMessageProps {\n /* The dialog title; default: Message (translated) */\n title?: string;\n /* The dialog text */\n text: string | React.JSX.Element | React.JSX.Element[];\n /* Close handler. */\n onClose?: () => void;\n /* if the dialog must be fill sized */\n fullWidth?: boolean;\n /* optional icon */\n icon?: React.JSX.Element;\n /* optional ok button text */\n ok?: string;\n}\n\nexport class DialogMessage extends Component<DialogMessageProps> {\n handleOk(): void {\n if (this.props.onClose) {\n this.props.onClose();\n }\n }\n\n render(): JSX.Element {\n return (\n <Dialog\n open={!0}\n maxWidth=\"sm\"\n fullWidth={this.props.fullWidth !== undefined ? this.props.fullWidth : true}\n onClose={() => this.handleOk()}\n aria-labelledby=\"ar_dialog_message_title\"\n aria-describedby=\"ar_dialog_message_description\"\n >\n <DialogTitle id=\"ar_dialog_message_title\">{this.props.title || I18n.t('ra_Message')}</DialogTitle>\n <DialogContent>\n <DialogContentText id=\"ar_dialog_message_description\">\n <span style={{ marginRight: this.props.icon ? 8 : 0 }}>{this.props.icon || null}</span>\n {this.props.text}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n id=\"ar_dialog_message_ok\"\n variant=\"contained\"\n onClick={() => this.handleOk()}\n color=\"primary\"\n autoFocus\n startIcon={<IconClose />}\n >\n {this.props.ok || I18n.t('ra_Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n","/*\n * Copyright 2022-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n// please do not delete React, as without it other projects could not be compiled: ReferenceError: React is not defined\nimport React, { type JSX } from 'react';\n\nimport { Button, DialogTitle, DialogContent, DialogActions, Dialog } from '@mui/material';\n\nimport { Cancel as IconCancel, Check as IconOk } from '@mui/icons-material';\n\nimport type { Connection } from '@iobroker/socket-client';\n\nimport { I18n } from '../i18n';\nimport { FileBrowser } from '../Components/FileBrowser';\nimport type { IobTheme } from '../types';\n\nconst styles: Record<string, React.CSSProperties> = {\n headerID: {\n fontWeight: 'bold',\n fontStyle: 'italic',\n },\n dialog: {\n height: '95%',\n },\n dialogMobile: {\n // it is sx\n padding: '4px',\n width: '100%',\n maxWidth: '100%',\n maxHeight: 'calc(100% - 16px)',\n height: '100%',\n },\n content: {\n height: '100%',\n overflow: 'hidden',\n },\n contentMobile: {\n padding: '8px 4px',\n },\n titleRoot: {\n whiteSpace: 'nowrap',\n width: 'calc(100% - 72px)',\n overflow: 'hidden',\n display: 'inline-block',\n textOverflow: 'ellipsis',\n },\n};\n\ninterface DialogSelectFileProps {\n /** where to store settings in localStorage * @property {string} [title] The dialog title; default: Please select object ID... (translated) */\n dialogName?: string;\n /** The dialog title; default: Please select object ID... (translated) */\n title?: string;\n /** Set to true to allow the selection of multiple IDs. */\n multiSelect?: boolean;\n /** Image prefix. Normally, admin has '../..' and the web has '../' */\n imagePrefix?: string; // Prefix (default: '.')\n /** @deprecated Image prefix */\n prefix?: string;\n /** Show the expert button? */\n showExpertButton?: boolean;\n /** Language */\n lang?: ioBroker.Languages;\n /** Socket class */\n socket: Connection;\n /** Theme name. */\n themeName?: string;\n /** Theme type. */\n themeType?: 'dark' | 'light';\n /** Theme object. */\n theme: IobTheme;\n /** The selected IDs. */\n selected?: string | string[];\n /** The ok button text; default: OK (translated) */\n ok?: string;\n /** The cancel button text; default: Cancel (translated) */\n cancel?: string;\n /** If download of files enabled */\n allowUpload?: boolean;\n /** If download of files enabled */\n allowDownload?: boolean;\n /** If creation of folders enabled */\n allowCreateFolder?: boolean;\n /** If creation of folders enabled */\n allowDelete?: boolean;\n /** if tile view enabled (default true) */\n allowView?: boolean;\n /** Show toolbar (default true) */\n showToolbar?: boolean;\n /** Limit file browser to one specific objectID of type meta and the following path (like vis.0/main) */\n limitPath?: string;\n /** like `['png', 'svg', 'bmp', 'jpg', 'jpeg', 'gif']` */\n filterFiles?: string[];\n /** images, code, txt, audio, video */\n filterByType?: 'images' | 'code' | 'txt';\n /** allow only folder's selection */\n selectOnlyFolders?: boolean;\n /** Close handler that is always called when the dialog is closed. */\n onClose: () => void;\n /** Handler that is called when the user presses OK or by double click. */\n onOk: (selected: string | string[] | undefined) => void;\n /** The styling class names. */\n filters?: Record<string, string>;\n /** Allow switch views Table<=>Rows */\n showViewTypeButton?: boolean;\n /** If type selector should be shown */\n showTypeSelector?: boolean;\n /** If defined, allow selecting only files from this folder */\n restrictToFolder?: string;\n /** If restrictToFolder defined, allow selecting files outside of this folder */\n allowNonRestricted?: boolean;\n /** force expert mode */\n expertMode?: boolean;\n /** Translate function - optional */\n t?: (text: string, ...args: any[]) => string;\n}\n\ninterface DialogSelectFileState {\n selected: string[];\n}\n\nexport class DialogSelectFile extends React.Component<DialogSelectFileProps, DialogSelectFileState> {\n private readonly dialogName: string;\n\n private readonly filters: Record<string, string>;\n\n constructor(props: DialogSelectFileProps) {\n super(props);\n this.dialogName = this.props.dialogName || 'default';\n this.dialogName = `SelectFile.${this.dialogName}`;\n\n const filters: string = ((window as any)._localStorage || window.localStorage).getItem(this.dialogName) || '{}';\n\n try {\n this.filters = JSON.parse(filters);\n } catch {\n this.filters = {};\n }\n\n if (props.filters) {\n this.filters = { ...this.filters, ...props.filters };\n }\n\n let selected = this.props.selected || [];\n if (typeof selected !== 'object') {\n selected = [selected];\n } else {\n selected = [...selected];\n }\n selected = selected.filter(id => id);\n\n this.state = {\n selected,\n };\n }\n\n handleCancel(): void {\n this.props.onClose();\n }\n\n handleOk(): void {\n this.props.onOk(\n this.props.multiSelect || !Array.isArray(this.state.selected)\n ? this.state.selected\n : this.state.selected[0] || '',\n );\n this.props.onClose();\n }\n\n render(): JSX.Element {\n let title;\n if (this.state.selected.length) {\n if (!Array.isArray(this.state.selected) || this.state.selected.length === 1) {\n title = [\n <span key=\"selected\">\n {I18n.t('ra_Selected')}\n \n </span>,\n <span\n key=\"id\"\n style={styles.headerID}\n >\n {this.state.selected}\n </span>,\n ];\n } else {\n title = [\n <span key=\"selected\">\n {I18n.t('ra_Selected')}\n \n </span>,\n <span\n key=\"id\"\n style={styles.headerID}\n >\n {I18n.t('%s items', this.state.selected.length)}\n </span>,\n ];\n }\n } else {\n title = this.props.title || I18n.t('ra_Please select file...');\n }\n\n return (\n <Dialog\n onClose={() => {}}\n maxWidth={false}\n sx={{ '& .MuiDialog-paper': { ...styles.dialog, ...styles.dialogMobile } }}\n fullWidth\n open={!0}\n aria-labelledby=\"ar_dialog_selectfile_title\"\n >\n <DialogTitle\n id=\"ar_dialog_selectfile_title\"\n sx={{ '&.MuiDialogTitle-root': styles.titleRoot }}\n >\n {title}\n </DialogTitle>\n <DialogContent style={{ ...styles.content, ...styles.contentMobile }}>\n <FileBrowser\n ready\n imagePrefix={this.props.imagePrefix || this.props.prefix || '../'} // prefix is for back compatibility\n allowUpload={!!this.props.allowUpload}\n allowDownload={this.props.allowDownload !== false}\n allowCreateFolder={!!this.props.allowCreateFolder}\n allowDelete={!!this.props.allowDelete}\n allowView={this.props.allowView !== false}\n showViewTypeButton={this.props.showViewTypeButton !== false}\n showToolbar={this.props.showToolbar !== false}\n limitPath={this.props.limitPath}\n filterFiles={this.props.filterFiles}\n filterByType={this.props.filterByType}\n selected={this.props.selected}\n restrictToFolder={this.props.restrictToFolder}\n allowNonRestricted={this.props.allowNonRestricted}\n onSelect={(selected: string | string[], isDoubleClick?: boolean, isFolder?: boolean) => {\n this.setState(\n { selected: Array.isArray(selected) ? selected : [selected] },\n () => isDoubleClick && (!this.props.selectOnlyFolders || isFolder) && this.handleOk(),\n );\n }}\n t={this.props.t || I18n.t}\n lang={this.props.lang || I18n.getLanguage()}\n socket={this.props.socket}\n themeType={this.props.themeType}\n themeName={this.props.themeName}\n theme={this.props.theme}\n showExpertButton={this.props.showExpertButton}\n expertMode={this.props.expertMode}\n showTypeSelector={this.props.showTypeSelector}\n />\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => this.handleOk()}\n startIcon={<IconOk />}\n disabled={!this.state.selected.length}\n color=\"primary\"\n >\n {this.props.ok || I18n.t('ra_Ok')}\n </Button>\n <Button\n color=\"grey\"\n variant=\"contained\"\n onClick={() => this.handleCancel()}\n startIcon={<IconCancel />}\n >\n {this.props.cancel || I18n.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n","import React, { type JSX } from 'react';\nimport { Button, DialogTitle, DialogContent, DialogActions, Dialog } from '@mui/material';\n\nimport { Check as IconOk, Cancel as IconCancel } from '@mui/icons-material';\n\nimport { SimpleCron } from '../Components/SimpleCron';\n\nimport { I18n } from '../i18n';\n\n// Generates cron expression\n\nconst styles: Record<string, React.CSSProperties> = {\n dialogPaper: {\n height: 'calc(100% - 96px)',\n },\n};\n\ninterface DialogCronProps {\n onClose: () => void;\n onOk: (cron: string) => void;\n title?: string;\n cron?: string;\n cancel?: string;\n ok?: string;\n}\n\ninterface DialogCronState {\n cron: string;\n}\n\nexport class DialogSimpleCron extends React.Component<DialogCronProps, DialogCronState> {\n constructor(props: DialogCronProps) {\n super(props);\n\n let cron;\n if (this.props.cron && typeof this.props.cron === 'string' && this.props.cron.replace(/^[\"']/, '')[0] !== '{') {\n cron = this.props.cron.replace(/['\"]/g, '').trim();\n } else {\n cron = this.props.cron || '{}';\n if (typeof cron === 'string') {\n cron = cron.replace(/^[\"']/, '').replace(/[\"']\\n?$/, '');\n }\n }\n\n this.state = {\n cron,\n };\n }\n\n handleCancel(): void {\n this.props.onClose();\n }\n\n handleOk(): void {\n this.props.onOk(this.state.cron);\n this.props.onClose();\n }\n\n render(): JSX.Element {\n return (\n <Dialog\n onClose={() => {}}\n maxWidth=\"md\"\n fullWidth\n sx={{ '& .MuiDialog-paper': styles.dialogPaper }}\n open={!0}\n aria-labelledby=\"cron-dialog-title\"\n >\n <DialogTitle id=\"cron-dialog-title\">{this.props.title || I18n.t('ra_Define CRON...')}</DialogTitle>\n <DialogContent style={{ height: '100%', overflow: 'hidden' }}>\n <SimpleCron\n cronExpression={this.state.cron}\n onChange={(cron: string) => this.setState({ cron })}\n language={I18n.getLanguage()}\n />\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n disabled={!this.state.cron || this.state.cron.includes('_')}\n onClick={() => this.handleOk()}\n color=\"primary\"\n startIcon={<IconOk />}\n >\n {this.props.ok || I18n.t('ra_Ok')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => this.handleCancel()}\n color=\"grey\"\n startIcon={<IconCancel />}\n >\n {this.props.cancel || I18n.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n","/**\n * Copyright 2020-2024, Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport type { IoBJson } from '@iobroker/types/build/config';\n\ndeclare global {\n interface Window {\n adapterName: undefined | string;\n socketUrl: undefined | string;\n registerSocketOnLoad: (func: () => void) => void;\n vendorPrefix: undefined | string;\n io: any;\n iob: any;\n }\n}\n\nexport type Severity = 'info' | 'notify' | 'alert';\n\ntype DockerInformation =\n | {\n /** If it is a Docker installation */\n isDocker: boolean;\n /** If it is the official Docker image */\n isOfficial: true;\n /** Semver string for official Docker image */\n officialVersion: string;\n }\n | {\n /** If it is a Docker installation */\n isDocker: boolean;\n /** If it is the official Docker image */\n isOfficial: false;\n };\nexport interface HostInfo {\n /** Converted OS for human readability */\n Platform: NodeJS.Platform | 'docker' | 'Windows' | 'OSX';\n /** The underlying OS */\n os: NodeJS.Platform;\n /** Information about the docker installation */\n dockerInformation?: DockerInformation;\n /** Host architecture */\n Architecture: string;\n /** Number of CPUs */\n CPUs: number | null;\n /** CPU speed */\n Speed: number | null;\n /** CPU model */\n Model: string | null;\n /** Total RAM of host */\n RAM: number;\n /** System uptime in seconds */\n 'System uptime': number;\n /** Node.JS version */\n 'Node.js': string;\n /** Current time to compare to local time */\n time: number;\n /** Timezone offset to compare to local time */\n timeOffset: number;\n /** Number of available adapters */\n 'adapters count': number;\n /** NPM version */\n NPM: string;\n}\ninterface NotificationMessageObject {\n message: string;\n ts: number;\n}\n\ntype MultilingualObject = Exclude<ioBroker.StringOrTranslated, string>;\n\nexport interface FilteredNotificationInformation {\n [scope: string]: {\n description: MultilingualObject;\n name: MultilingualObject;\n categories: {\n [category: string]: {\n description: MultilingualObject;\n name: MultilingualObject;\n severity: Severity;\n instances: {\n [instance: string]: {\n messages: NotificationMessageObject[];\n };\n };\n };\n };\n };\n}\n\nexport type CompactSystemRepositoryEntry = {\n link: string;\n hash?: string;\n stable?: boolean;\n json:\n | {\n _repoInfo: {\n stable?: boolean;\n name?: ioBroker.StringOrTranslated;\n };\n }\n | null\n | undefined;\n};\n\nexport type CompactSystemRepository = {\n _id: ioBroker.HostObject['_id'];\n common: {\n name: ioBroker.HostCommon['name'];\n dontDelete: boolean;\n };\n native: {\n repositories: Record<string, CompactSystemRepositoryEntry>;\n };\n};\n\n/** Possible progress states. */\nexport const PROGRESS = {\n /** The socket is connecting. */\n CONNECTING: 0,\n /** The socket is successfully connected. */\n CONNECTED: 1,\n /** All objects are loaded. */\n OBJECTS_LOADED: 2,\n /** All states are loaded. */\n STATES_LOADED: 3,\n /** The socket is ready for use. */\n READY: 4,\n};\n\nconst PERMISSION_ERROR = 'permissionError';\nconst NOT_CONNECTED = 'notConnectedError';\nconst TIMEOUT_FOR_ADMIN4 = 1300;\n\nexport const ERRORS = {\n PERMISSION_ERROR,\n NOT_CONNECTED,\n};\n\nexport type BinaryStateChangeHandler = (id: string, base64: string | null) => void;\n\nfunction fixAdminUI(obj: ioBroker.AdapterObject): ioBroker.AdapterObject {\n // @ts-expect-error it is deprecated, but still could appear\n if (obj?.common && !obj.common.adminUI) {\n if (obj.common.noConfig) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.config = 'none';\n // @ts-expect-error it is deprecated, but still could appear\n } else if (obj.common.jsonConfig) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.config = 'json';\n } else if (obj.common.materialize) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.config = 'materialize';\n } else {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.config = 'html';\n }\n\n // @ts-expect-error it is deprecated, but still could appear\n if (obj.common.jsonCustom) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.custom = 'json';\n } else if (obj.common.supportCustoms) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.custom = 'json';\n }\n\n if (obj.common.materializeTab && obj.common.adminTab) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.tab = 'materialize';\n } else if (obj.common.adminTab) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.tab = 'html';\n }\n\n // @ts-expect-error it is deprecated, but still could appear\n if (obj.common.adminUI) {\n console.debug(\n // @ts-expect-error it is deprecated, but still could appear\n `Please add to \"${obj._id.replace(/\\.\\d+$/, '')}\" common.adminUI=${JSON.stringify(obj.common.adminUI)}`,\n );\n }\n }\n return obj;\n}\n\n/** Converts ioB pattern into regex */\nexport function pattern2RegEx(pattern: string): string {\n pattern = (pattern || '').toString();\n\n const startsWithWildcard = pattern[0] === '*';\n const endsWithWildcard = pattern[pattern.length - 1] === '*';\n\n pattern = pattern.replace(/[-/\\\\^$+?.()|[\\]{}]/g, '\\\\$&').replace(/\\*/g, '.*');\n\n return (startsWithWildcard ? '' : '^') + pattern + (endsWithWildcard ? '' : '$');\n}\n\ninterface ConnectionProps {\n /** The socket name. */\n name?: string;\n /** State IDs to always automatically subscribe to. */\n autoSubscribes?: string[];\n /** Automatically subscribe to logging. */\n autoSubscribeLog?: boolean;\n /** The protocol to use for the socket.io connection. */\n protocol: string;\n /** The host name to use for the socket.io connection. */\n host: string;\n /** The port to use for the socket.io connection. */\n port?: string | number;\n /** The socket.io connection timeout. */\n ioTimeout?: number;\n /** The socket.io command timeout. */\n cmdTimeout?: number;\n /** Flag to indicate if all objects should be loaded or not. Default true (not loaded) */\n doNotLoadAllObjects?: boolean;\n /** Flag to indicate if AccessControlList for current user will be loaded or not. Default true (not loaded) */\n doNotLoadACL?: boolean;\n /** Progress callback. */\n onProgress?: (progress: number) => void;\n /** Ready callback. */\n onReady?: (objects: Record<string, ioBroker.Object>) => void;\n /** Log callback. */\n onLog?: (text: string) => void;\n /** Error callback. */\n onError?: (error: any) => void;\n /** Object change callback. */\n onObjectChange?: ioBroker.ObjectChangeHandler;\n /** Gets called when the system language is determined */\n onLanguage?: (lang: ioBroker.Languages) => void;\n /** Forces the use of the Compact Methods, wich only exists in admin 5 UI. */\n admin5only?: boolean;\n /** The device UUID with which the communication must be established */\n uuid?: string;\n /** Authentication token (used only in cloud) */\n token?: string;\n}\n\nexport interface ConnectOptions {\n path?: string;\n query?: string;\n name?: string;\n timeout?: number;\n uuid?: string;\n}\n\nexport interface SocketClient {\n connect(url?: string, options?: ConnectOptions): void;\n close(): void;\n destroy(): void;\n\n readonly connected: boolean;\n\n on(event: string, callback: (...args: any) => void): void;\n off(event: string, callback: (...args: any) => void): void;\n emit(event: string, ...args: any): boolean;\n}\n\ninterface RenameGroupObject extends ioBroker.GroupObject {\n newId?: ioBroker.ObjectIDs.Group;\n}\n\ninterface Promises {\n installedCompact?: {\n [host: string]: Promise<Record<string, ioBroker.AdapterObject>> | null;\n } | null;\n installed?: {\n [host: string]: Promise<Record<string, ioBroker.AdapterObject>> | null;\n } | null;\n systemConfig?: Promise<ioBroker.SystemConfigObject> | null;\n hosts?: Promise<ioBroker.HostObject[]> | null;\n users?: Promise<ioBroker.UserObject[]> | null;\n compactAdapters?: Promise<Record<string, ioBroker.AdapterObject>> | null;\n repoCompact?: Promise<any> | null;\n version?: Promise<{ version: string; serverName: string }> | null;\n groups?: Promise<ioBroker.GroupObject[]> | null;\n repo?: Promise<Record<string, ioBroker.AdapterObject>> | null;\n cert?: Promise<{ name: string; type: 'public' | 'private' | 'chained' | '' }[]> | null;\n webName?: Promise<string> | null;\n compactInstances?: Promise<Record<string, ioBroker.InstanceObject>> | null;\n getCompactSystemRepositories?: Promise<CompactSystemRepository> | null;\n systemConfigPromise?: Promise<ioBroker.SystemConfigObject> | null;\n hostsCompact?: Promise<ioBroker.HostObject[]> | null;\n uuid?: Promise<string | undefined>;\n [feature: `supportedFeatures_${string}`]: Promise<boolean> | null;\n [type: `instances_${string}`]: Promise<any> | null;\n [_enum: `enums_${string}`]: Promise<any> | null;\n [adapter: `adapter_${string}`]: Promise<any> | null;\n [host: `IPs_${string}`]: Promise<string[]> | null;\n [host: `hostInfo_${string}`]: Promise<HostInfo> | null;\n [host: `hostInfoShort_${string}`]: Promise<HostInfo> | null;\n [host: `rIPs_${string}`]: Promise<{ name: string; address: string; family: 'ipv4' | 'ipv6' }[]> | null;\n currentInstance?: Promise<string> | null;\n}\n\nexport class LegacyConnection {\n // Do not define it as null, else we must check for null everywhere\n private _socket: SocketClient;\n\n private _authTimer: ReturnType<typeof setTimeout> | null | undefined;\n\n private systemLang: ioBroker.Languages = 'en';\n\n private readonly _waitForFirstConnection: Promise<void>;\n\n private _waitForFirstConnectionResolve: (() => void) | null = null;\n\n private _promises: Promises = {};\n\n private readonly _instanceSubscriptions: Record<\n string,\n {\n messageType: string;\n callback: (data: Record<string, any>, sourceInstance: string, messageType: string) => void;\n }[]\n >;\n\n private props: ConnectionProps;\n\n private doNotLoadAllObjects: boolean;\n\n private readonly doNotLoadACL: boolean;\n\n private states: Record<string, ioBroker.State> = {};\n\n private objects: Record<string, ioBroker.Object> | null = null;\n\n private scriptLoadCounter: number | undefined;\n\n private acl: Record<string, any> | null = null;\n\n private firstConnect: boolean = true;\n\n private readonly waitForRestart: boolean = false;\n\n private connected: boolean = false;\n\n private readonly statesSubscribes: Record<\n string,\n { reg: RegExp; cbs: (ioBroker.StateChangeHandler | BinaryStateChangeHandler)[] }\n > = {};\n\n private readonly objectsSubscribes: Record<\n string,\n {\n reg: RegExp;\n cbs: ((id: string, obj: ioBroker.Object | null | undefined, oldObj?: ioBroker.Object | null) => void)[];\n }\n > = {};\n\n private readonly filesSubscribes: Record<\n string,\n { regId: RegExp; cbs: ioBroker.FileChangeHandler[]; regFilePattern: RegExp }\n > = {};\n\n private onConnectionHandlers: ((connected: boolean) => void)[] = [];\n\n private onLogHandlers: ((message: string) => void)[] = [];\n\n private readonly onProgress: (progress: number) => void;\n\n private readonly onError: (\n err:\n | string\n | {\n message: string;\n operation: string;\n type: string;\n id: string;\n },\n ) => void;\n\n private loaded: boolean = false;\n\n private loadTimer: ReturnType<typeof setTimeout> | null = null;\n\n private loadCounter: number = 0;\n\n private admin5only: boolean;\n\n private ignoreState: string = '';\n\n private readonly simStates: Record<string, ioBroker.State> = {};\n\n private autoSubscribes: string[];\n\n private readonly autoSubscribeLog: boolean;\n\n private subscribed: boolean | undefined;\n\n public isSecure: boolean | undefined;\n\n private onCmdStdoutHandler: ((id: string, text: string) => void) | undefined;\n\n private onCmdStderrHandler: ((id: string, text: string) => void) | undefined;\n\n private onCmdExitHandler: ((id: string, exitCode: number) => void) | undefined;\n\n public systemConfig: ioBroker.SystemConfigObject | null = null;\n\n constructor(props: ConnectionProps) {\n props = props || { protocol: window.location.protocol, host: window.location.hostname };\n this.props = props;\n\n this.autoSubscribes = this.props.autoSubscribes || [];\n this.autoSubscribeLog = this.props.autoSubscribeLog || false;\n\n this.props.protocol = this.props.protocol || window.location.protocol;\n this.props.host = this.props.host || window.location.hostname;\n this.props.port =\n this.props.port ||\n (window.location.port === '3000' ? (LegacyConnection.isWeb() ? 8082 : 8081) : window.location.port);\n this.props.ioTimeout = Math.max(this.props.ioTimeout || 20000, 20000);\n this.props.cmdTimeout = Math.max(this.props.cmdTimeout || 5000, 5000);\n this._instanceSubscriptions = {};\n\n // breaking change. Do not load all objects by default is true\n this.doNotLoadAllObjects = this.props.doNotLoadAllObjects === undefined ? true : this.props.doNotLoadAllObjects;\n this.doNotLoadACL = this.props.doNotLoadACL === undefined ? true : this.props.doNotLoadACL;\n\n this.states = {};\n this._waitForFirstConnection = new Promise(resolve => {\n this._waitForFirstConnectionResolve = resolve;\n });\n this.onProgress = this.props.onProgress || (() => {});\n this.onError =\n this.props.onError ||\n ((\n err:\n | string\n | {\n message: string;\n operation: string;\n type: string;\n id: string;\n },\n ) => console.error(err));\n this.admin5only = this.props.admin5only || false;\n\n this.startSocket();\n }\n\n /**\n * Checks if this connection is running in a web adapter and not in an admin.\n *\n * @returns True if running in a web adapter or in a socketio adapter.\n */\n static isWeb(): boolean {\n const adapterName: string | undefined = window.adapterName;\n return (\n adapterName === 'material' ||\n adapterName === 'vis' ||\n adapterName?.startsWith('vis-') ||\n adapterName === 'echarts-show' ||\n window.socketUrl !== undefined\n );\n }\n\n /**\n * Starts the socket.io connection.\n */\n startSocket(): void {\n // if socket io is not yet loaded\n if (typeof window.io === 'undefined' && typeof window.iob === 'undefined') {\n // if in index.html the onLoad function not defined\n if (typeof window.registerSocketOnLoad !== 'function') {\n // poll if loaded\n this.scriptLoadCounter = this.scriptLoadCounter || 0;\n this.scriptLoadCounter++;\n\n if (this.scriptLoadCounter < 30) {\n // wait till the script loaded\n setTimeout(() => this.startSocket(), 100);\n return;\n }\n window.alert('Cannot load socket.io.js!');\n } else {\n // register on load\n window.registerSocketOnLoad(() => this.startSocket());\n }\n return;\n }\n if (this._socket) {\n // socket was initialized, do not repeat\n return;\n }\n\n let host = this.props.host;\n let port = this.props.port;\n let protocol = this.props.protocol.replace(':', '');\n let path = window.location.pathname;\n\n if (window.location.hostname === 'iobroker.net' || window.location.hostname === 'iobroker.pro') {\n path = '';\n } else {\n // if web adapter, socket io could be on another port or even host\n if (window.socketUrl) {\n const parsed = new URL((window as any).socketUrl as string);\n host = parsed.hostname;\n port = parsed.port;\n protocol = parsed.protocol.replace(':', '');\n }\n // get a current path\n const pos = path.lastIndexOf('/');\n if (pos !== -1) {\n path = path.substring(0, pos + 1);\n }\n\n if (LegacyConnection.isWeb()) {\n // remove one level, like echarts, vis, .... We have here: '/echarts/'\n const parts = path.split('/');\n if (parts.length > 2) {\n parts.pop();\n // if it is a version, like in material, so remove it too\n if (parts[parts.length - 1].match(/\\d+\\.\\d+\\.\\d+/)) {\n parts.pop();\n }\n parts.pop();\n path = parts.join('/');\n if (!path.endsWith('/')) {\n path += '/';\n }\n }\n }\n }\n\n const url = port ? `${protocol}://${host}:${port}${path}` : `${protocol}://${host}${path}`;\n\n this._socket = (window.io || window.iob).connect(url, {\n path: path.endsWith('/') ? `${path}socket.io` : `${path}/socket.io`,\n query: 'ws=true',\n name: this.props.name,\n timeout: this.props.ioTimeout,\n uuid: this.props.uuid,\n });\n\n this._socket.on('connect', (noTimeout: boolean | undefined) => {\n // If the user is not admin, it takes some time to install the handlers, because all rights must be checked\n if (noTimeout !== true) {\n setTimeout(\n () =>\n this.getVersion().then(info => {\n const [major, minor, patch] = info.version.split('.');\n const v = parseInt(major, 10) * 10000 + parseInt(minor, 10) * 100 + parseInt(patch, 10);\n if (v < 40102) {\n this._authTimer = null;\n // possible this is an old version of admin\n this.onPreConnect(false, false);\n } else {\n this._socket.emit('authenticate', (isOk: boolean, isSecure: boolean) =>\n this.onPreConnect(isOk, isSecure),\n );\n }\n }),\n 500,\n );\n } else {\n // iobroker websocket waits, till all handlers are installed\n this._socket.emit('authenticate', (isOk: boolean, isSecure: boolean) =>\n this.onPreConnect(isOk, isSecure),\n );\n }\n });\n\n this._socket.on('reconnect', () => {\n this.onProgress(PROGRESS.READY);\n this.connected = true;\n\n if (this.waitForRestart) {\n window.location.reload();\n } else {\n this._subscribe(true);\n this.onConnectionHandlers.forEach(cb => cb(true));\n }\n });\n\n this._socket.on('disconnect', () => {\n this.connected = false;\n this.subscribed = false;\n this.onProgress(PROGRESS.CONNECTING);\n this.onConnectionHandlers.forEach(cb => cb(false));\n });\n\n this._socket.on('reauthenticate', () => LegacyConnection.authenticate());\n\n this._socket.on('log', message => {\n this.props.onLog && this.props.onLog(message);\n this.onLogHandlers.forEach(cb => cb(message));\n });\n\n this._socket.on('error', (err: string | null) => {\n let _err = err || '';\n if (typeof _err.toString !== 'function') {\n _err = JSON.stringify(_err);\n console.error(`Received strange error: ${_err}`);\n }\n _err = _err.toString();\n if (_err.includes('User not authorized')) {\n LegacyConnection.authenticate();\n } else {\n window.alert(`Socket Error: ${err}`);\n }\n });\n\n this._socket.on('connect_error', (err: string) => console.error(`Connect error: ${err}`));\n\n this._socket.on('permissionError', (err: { operation: string; type: string; id?: string }) =>\n this.onError({\n message: 'no permission',\n operation: err.operation,\n type: err.type,\n id: err.id || '',\n }),\n );\n\n this._socket.on('objectChange', (id: string, obj: ioBroker.Object | null) =>\n setTimeout(() => this.objectChange(id, obj), 0),\n );\n\n this._socket.on('stateChange', (id: string, state) => setTimeout(() => this.stateChange(id, state), 0));\n\n this._socket.on('im', (messageType: string, from: string, data) =>\n setTimeout(() => this.instanceMessage(messageType, from, data), 0),\n );\n\n this._socket.on('fileChange', (id: string, fileName: string, size: number | null) =>\n setTimeout(() => this.fileChange(id, fileName, size), 0),\n );\n\n this._socket.on(\n 'cmdStdout',\n (id: string, text: string) => this.onCmdStdoutHandler && this.onCmdStdoutHandler(id, text),\n );\n\n this._socket.on(\n 'cmdStderr',\n (id: string, text: string) => this.onCmdStderrHandler && this.onCmdStderrHandler(id, text),\n );\n\n this._socket.on(\n 'cmdExit',\n (id: string, exitCode: number) => this.onCmdExitHandler && this.onCmdExitHandler(id, exitCode),\n );\n }\n\n /**\n * Called internally.\n */\n private onPreConnect(_isOk: boolean, isSecure: boolean): void {\n if (this._authTimer) {\n clearTimeout(this._authTimer);\n this._authTimer = null;\n }\n\n this.connected = true;\n this.isSecure = isSecure;\n\n if (this.waitForRestart) {\n window.location.reload();\n } else {\n if (this.firstConnect) {\n // retry strategy\n this.loadTimer = setTimeout(() => {\n this.loadTimer = null;\n this.loadCounter++;\n if (this.loadCounter < 10) {\n void this.onConnect().catch(e => this.onError(e));\n }\n }, 1000);\n\n if (!this.loaded) {\n void this.onConnect().catch(e => this.onError(e));\n }\n } else {\n this.onProgress(PROGRESS.READY);\n }\n\n this._subscribe(true);\n this.onConnectionHandlers.forEach(cb => cb(true));\n }\n\n if (this._waitForFirstConnectionResolve) {\n this._waitForFirstConnectionResolve();\n this._waitForFirstConnectionResolve = null;\n }\n }\n\n /**\n * Checks if running in ioBroker cloud\n */\n static isCloud(): boolean {\n if (window.location.hostname.includes('amazonaws.com') || window.location.hostname.includes('iobroker.in')) {\n return true;\n }\n if (typeof window.socketUrl === 'undefined') {\n return false;\n }\n return window.socketUrl.includes('iobroker.in') || window.socketUrl.includes('amazonaws');\n }\n\n /**\n * Checks if the socket is connected.\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Checks if the socket is connected.\n * Promise resolves if once connected.\n */\n waitForFirstConnection(): Promise<void> {\n return this._waitForFirstConnection;\n }\n\n /**\n * Called internally.\n */\n private async _getUserPermissions(): Promise<Record<string, any> | null> {\n if (this.doNotLoadACL) {\n return null;\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('getUserPermissions', (err: string | null, acl: Record<string, any> | null) =>\n err ? reject(new Error(err)) : resolve(acl),\n );\n });\n }\n\n /**\n * Called internally.\n */\n private async onConnect(): Promise<void> {\n let acl: Record<string, any> | null | undefined;\n try {\n acl = await this._getUserPermissions();\n } catch (e) {\n const knownError = e as Error;\n this.onError(`Cannot read user permissions: ${knownError.message}`);\n return;\n }\n if (!this.doNotLoadACL) {\n if (this.loaded) {\n return;\n }\n this.loaded = true;\n this.loadTimer && clearTimeout(this.loadTimer);\n this.loadTimer = null;\n\n this.onProgress(PROGRESS.CONNECTED);\n this.firstConnect = false;\n\n this.acl = acl;\n }\n\n // Read system configuration\n let data: ioBroker.SystemConfigObject | null;\n try {\n if (this.admin5only && !window.vendorPrefix) {\n data = await this.getCompactSystemConfig();\n } else {\n data = await this.getSystemConfig();\n }\n if (this.doNotLoadACL) {\n if (this.loaded) {\n return;\n }\n this.loaded = true;\n this.loadTimer && clearTimeout(this.loadTimer);\n this.loadTimer = null;\n\n this.onProgress(PROGRESS.CONNECTED);\n this.firstConnect = false;\n }\n\n this.systemConfig = data;\n if (this.systemConfig && this.systemConfig.common) {\n this.systemLang = this.systemConfig.common.language;\n } else {\n // @ts-expect-error userLanguage is not standard\n this.systemLang = window.navigator.userLanguage || window.navigator.language;\n\n if (/^(en|de|ru|pt|nl|fr|it|es|pl|uk)-?/.test(this.systemLang)) {\n this.systemLang = this.systemLang.substr(0, 2) as ioBroker.Languages;\n } else if (!/^(en|de|ru|pt|nl|fr|it|es|pl|uk|zh-cn)$/.test(this.systemLang)) {\n this.systemLang = 'en';\n }\n }\n\n this.props.onLanguage && this.props.onLanguage(this.systemLang);\n\n if (!this.doNotLoadAllObjects) {\n await this.getObjects();\n this.onProgress(PROGRESS.READY);\n this.props.onReady && this.objects && this.props.onReady(this.objects);\n } else {\n this.objects = this.admin5only ? {} : { 'system.config': data };\n this.onProgress(PROGRESS.READY);\n this.props.onReady && this.props.onReady(this.objects);\n }\n } catch (e) {\n this.onError(`Cannot read system config: ${e}`);\n }\n }\n\n /**\n * Called internally.\n */\n private static authenticate(): void {\n if (window.location.search.includes('&href=')) {\n window.location.href = `${window.location.protocol}//${window.location.host}${window.location.pathname}${window.location.search}${window.location.hash}`;\n } else {\n window.location.href = `${window.location.protocol}//${window.location.host}${window.location.pathname}?login&href=${window.location.search}${window.location.hash}`;\n }\n }\n\n /**\n * Subscribe to changes of the given state.\n *\n * @param id The ioBroker state ID or array of states\n * @param binary Set to true if the given state is binary and requires Base64 decoding\n * @param cb The callback\n */\n subscribeState(\n id: string | string[],\n binary: boolean | ioBroker.StateChangeHandler | BinaryStateChangeHandler,\n cb?: ioBroker.StateChangeHandler | BinaryStateChangeHandler,\n ): void {\n if (typeof binary === 'function') {\n cb = binary;\n binary = false;\n }\n\n let ids: string[];\n if (!Array.isArray(id)) {\n ids = [id];\n } else {\n ids = id;\n }\n if (!cb) {\n console.error('No callback found for subscribeState');\n return;\n }\n const toSubscribe = [];\n for (let i = 0; i < ids.length; i++) {\n const _id = ids[i];\n if (!this.statesSubscribes[_id]) {\n let reg = _id\n .replace(/\\./g, '\\\\.')\n .replace(/\\*/g, '.*')\n .replace(/\\(/g, '\\\\(')\n .replace(/\\)/g, '\\\\)')\n .replace(/\\+/g, '\\\\+')\n .replace(/\\[/g, '\\\\[');\n\n if (!reg.includes('*')) {\n reg += '$';\n }\n this.statesSubscribes[_id] = { reg: new RegExp(reg), cbs: [cb] };\n if (_id !== this.ignoreState) {\n toSubscribe.push(_id);\n }\n } else {\n !this.statesSubscribes[_id].cbs.includes(cb) && this.statesSubscribes[_id].cbs.push(cb);\n }\n }\n\n if (!this.connected) {\n return;\n }\n\n if (toSubscribe.length) {\n // no answer from server required\n this._socket.emit('subscribe', toSubscribe);\n }\n\n if (binary) {\n for (let i = 0; i < ids.length; i++) {\n this.getBinaryState(ids[i])\n .then((base64: string) => cb && (cb as BinaryStateChangeHandler)(ids[i], base64))\n .catch(e => console.error(`Cannot getBinaryState \"${ids[i]}\": ${JSON.stringify(e)}`));\n }\n } else {\n this._socket.emit(\n LegacyConnection.isWeb() ? 'getStates' : 'getForeignStates',\n id,\n (err: string | null, states: Record<string, ioBroker.State>) => {\n err && console.error(`Cannot getForeignStates \"${id}\": ${JSON.stringify(err)}`);\n states && Object.keys(states).forEach(_id => (cb as ioBroker.StateChangeHandler)(_id, states[_id]));\n },\n );\n }\n }\n\n /**\n * Subscribe to changes of the given state.\n */\n subscribeStateAsync(\n /** The ioBroker state ID or array of states */\n id: string | string[],\n /** The callback. */\n cb: ioBroker.StateChangeHandler,\n ): Promise<void> {\n let ids: string[];\n if (!Array.isArray(id)) {\n ids = [id];\n } else {\n ids = id;\n }\n const toSubscribe = [];\n for (let i = 0; i < ids.length; i++) {\n const _id = ids[i];\n if (!this.statesSubscribes[_id]) {\n let reg = _id\n .replace(/\\./g, '\\\\.')\n .replace(/\\*/g, '.*')\n .replace(/\\(/g, '\\\\(')\n .replace(/\\)/g, '\\\\)')\n .replace(/\\+/g, '\\\\+')\n .replace(/\\[/g, '\\\\[');\n\n if (!reg.includes('*')) {\n reg += '$';\n }\n this.statesSubscribes[_id] = { reg: new RegExp(reg), cbs: [] };\n this.statesSubscribes[_id].cbs.push(cb);\n if (_id !== this.ignoreState) {\n // no answer from server required\n toSubscribe.push(_id);\n }\n } else {\n !this.statesSubscribes[_id].cbs.includes(cb) && this.statesSubscribes[_id].cbs.push(cb);\n }\n }\n\n if (toSubscribe.length && this.connected) {\n // no answer from server required\n this._socket.emit('subscribe', toSubscribe);\n }\n\n return new Promise((resolve, reject) => {\n if (typeof cb === 'function' && this.connected) {\n this._socket.emit(\n LegacyConnection.isWeb() ? 'getStates' : 'getForeignStates',\n id,\n (err: string | null, states: Record<string, ioBroker.State>) => {\n err && console.error(`Cannot getForeignStates \"${id}\": ${JSON.stringify(err)}`);\n states && Object.keys(states).forEach(_id => cb(_id, states[_id]));\n states\n ? resolve()\n : reject(new Error(`Cannot getForeignStates \"${id}\": ${JSON.stringify(err)}`));\n },\n );\n } else {\n this.connected ? reject(new Error('callback is not a function')) : reject(new Error('not connected'));\n }\n });\n }\n\n /**\n * Unsubscribes all or the given callback from changes of the given state.\n */\n unsubscribeState(\n /** The ioBroker state ID or array of states */\n id: string | string[],\n /** The callback. */\n cb?: ioBroker.StateChangeHandler | BinaryStateChangeHandler,\n ): void {\n let ids: string[];\n if (!Array.isArray(id)) {\n ids = [id];\n } else {\n ids = id;\n }\n const toUnsubscribe = [];\n for (let i = 0; i < ids.length; i++) {\n const _id = ids[i];\n\n if (this.statesSubscribes[_id]) {\n if (cb) {\n const pos = this.statesSubscribes[_id].cbs.indexOf(cb);\n pos !== -1 && this.statesSubscribes[_id].cbs.splice(pos, 1);\n } else {\n this.statesSubscribes[_id].cbs = [];\n }\n\n if (!this.statesSubscribes[_id].cbs || !this.statesSubscribes[_id].cbs.length) {\n delete this.statesSubscribes[_id];\n if (_id !== this.ignoreState) {\n toUnsubscribe.push(_id);\n }\n }\n }\n }\n\n if (toUnsubscribe.length && this.connected) {\n // no answer from server required\n this._socket.emit('unsubscribe', toUnsubscribe);\n }\n }\n\n /**\n * Subscribe to changes of the given object.\n *\n * @param id The ioBroker object ID or array of objects\n * @param cb The callback\n */\n subscribeObject(id: string | string[], cb: ioBroker.ObjectChangeHandler): Promise<void> {\n let ids: string[];\n if (!Array.isArray(id)) {\n ids = [id];\n } else {\n ids = id;\n }\n const toSubscribe = [];\n for (let i = 0; i < ids.length; i++) {\n const _id = ids[i];\n if (!this.objectsSubscribes[_id]) {\n let reg = _id.replace(/\\./g, '\\\\.').replace(/\\*/g, '.*');\n if (!reg.includes('*')) {\n reg += '$';\n }\n this.objectsSubscribes[_id] = { reg: new RegExp(reg), cbs: [cb] };\n toSubscribe.push(_id);\n } else {\n !this.objectsSubscribes[_id].cbs.includes(cb) && this.objectsSubscribes[_id].cbs.push(cb);\n }\n }\n if (this.connected && toSubscribe.length) {\n this._socket.emit('subscribeObjects', toSubscribe);\n }\n\n return Promise.resolve();\n }\n\n /**\n * Unsubscribes all or the given callback from changes of the given object.\n *\n * @param id The ioBroker object ID or array of objects\n * @param cb The callback\n */\n unsubscribeObject(id: string | string[], cb?: ioBroker.ObjectChangeHandler): Promise<void> {\n let ids: string[];\n if (!Array.isArray(id)) {\n ids = [id];\n } else {\n ids = id;\n }\n const toUnsubscribe = [];\n for (let i = 0; i < ids.length; i++) {\n const _id = ids[i];\n if (this.objectsSubscribes[_id]) {\n if (cb) {\n const pos = this.objectsSubscribes[_id].cbs.indexOf(cb);\n pos !== -1 && this.objectsSubscribes[_id].cbs.splice(pos, 1);\n } else {\n this.objectsSubscribes[_id].cbs = [];\n }\n\n if (this.connected && (!this.objectsSubscribes[_id].cbs || !this.objectsSubscribes[_id].cbs.length)) {\n delete this.objectsSubscribes[_id];\n toUnsubscribe.push(_id);\n }\n }\n }\n\n if (this.connected && toUnsubscribe.length) {\n this._socket.emit('unsubscribeObjects', toUnsubscribe);\n }\n\n return Promise.resolve();\n }\n\n /**\n * Called internally.\n */\n private fileChange(id: string, fileName: string, size: number | null): void {\n for (const sub of Object.values(this.filesSubscribes)) {\n if (sub.regId.test(id) && sub.regFilePattern.test(fileName)) {\n for (const cb of sub.cbs) {\n try {\n cb(id, fileName, size);\n } catch (e) {\n console.error(`Error by callback of fileChange: ${e}`);\n }\n }\n }\n }\n }\n\n /**\n * Subscribe to changes of the files.\n *\n * @param id The ioBroker state ID for meta-object. Could be a pattern\n * @param filePattern Pattern or file name, like 'main/*' or 'main/visViews.json`\n * @param cb The callback.\n */\n async subscribeFiles(\n /** The ioBroker state ID for meta-object. Could be a pattern */\n id: string,\n /** Pattern or file name, like 'main/*' or 'main/visViews.json` */\n filePattern: string | string[],\n /** The callback. */\n cb: ioBroker.FileChangeHandler,\n ): Promise<void> {\n if (typeof cb !== 'function') {\n throw new Error('The state change handler must be a function!');\n }\n let filePatterns;\n if (Array.isArray(filePattern)) {\n filePatterns = filePattern;\n } else {\n filePatterns = [filePattern];\n }\n const toSubscribe = [];\n for (let f = 0; f < filePatterns.length; f++) {\n const pattern = filePatterns[f];\n const key = `${id}$%$${pattern}`;\n\n if (!this.filesSubscribes[key]) {\n this.filesSubscribes[key] = {\n regId: new RegExp(pattern2RegEx(id)),\n regFilePattern: new RegExp(pattern2RegEx(pattern)),\n cbs: [cb],\n };\n\n toSubscribe.push(pattern);\n } else {\n !this.filesSubscribes[key].cbs.includes(cb) && this.filesSubscribes[key].cbs.push(cb);\n }\n }\n if (this.connected && toSubscribe.length) {\n this._socket.emit('subscribeFiles', id, toSubscribe);\n }\n return Promise.resolve();\n }\n\n /**\n * Unsubscribes the given callback from changes of files.\n *\n * @param id The ioBroker state ID.\n * @param filePattern Pattern or file name, like 'main/*' or 'main/visViews.json`\n * @param cb The callback.\n */\n unsubscribeFiles(id: string, filePattern: string, cb?: ioBroker.FileChangeHandler): void {\n let filePatterns: string[];\n if (Array.isArray(filePattern)) {\n filePatterns = filePattern;\n } else {\n filePatterns = [filePattern];\n }\n const toUnsubscribe = [];\n for (let f = 0; f < filePatterns.length; f++) {\n const pattern = filePatterns[f];\n const key = `${id}$%$${pattern}`;\n if (this.filesSubscribes[key]) {\n const sub = this.filesSubscribes[key];\n if (cb) {\n const pos = sub.cbs.indexOf(cb);\n pos !== -1 && sub.cbs.splice(pos, 1);\n } else {\n sub.cbs = [];\n }\n\n if (!sub.cbs || !sub.cbs.length) {\n delete this.filesSubscribes[key];\n this.connected && toUnsubscribe.push(pattern);\n }\n }\n }\n\n if (this.connected && toUnsubscribe.length) {\n this._socket.emit('unsubscribeFiles', id, toUnsubscribe);\n }\n }\n\n /**\n * Called internally.\n */\n private objectChange(id: string, obj: ioBroker.Object | null): void {\n // update main.objects cache\n if (!this.objects) {\n return;\n }\n\n let oldObj: Partial<ioBroker.Object> | null;\n\n let changed = false;\n if (obj) {\n if (this.objects[id]) {\n // @ts-expect-error fix later\n oldObj = { _id: id, type: this.objects[id].type };\n }\n\n if (!this.objects[id] || JSON.stringify(this.objects[id]) !== JSON.stringify(obj)) {\n this.objects[id] = obj;\n changed = true;\n }\n } else if (this.objects[id]) {\n // @ts-expect-error fix later\n oldObj = { _id: id, type: this.objects[id].type };\n delete this.objects[id];\n changed = true;\n }\n\n Object.keys(this.objectsSubscribes).forEach(_id => {\n if (_id === id || this.objectsSubscribes[_id].reg.test(id)) {\n this.objectsSubscribes[_id].cbs.forEach(cb => {\n try {\n cb(id, obj, oldObj as ioBroker.Object);\n } catch (e) {\n console.error(`Error by callback of objectChange: ${e}`);\n }\n });\n }\n });\n\n if (changed && this.props.onObjectChange) {\n void this.props.onObjectChange(id, obj);\n }\n }\n\n /**\n * Called internally.\n */\n private stateChange(id: string, state: ioBroker.State | null): void {\n for (const task in this.statesSubscribes) {\n if (\n Object.prototype.hasOwnProperty.call(this.statesSubscribes, task) &&\n this.statesSubscribes[task].reg.test(id)\n ) {\n this.statesSubscribes[task].cbs.forEach(cb => {\n try {\n void (cb as ioBroker.StateChangeHandler)(id, state);\n } catch (e) {\n const knownError = e as Error;\n console.error(`Error by callback of stateChange: ${knownError?.message}`);\n }\n });\n }\n }\n }\n\n /**\n * Called internally.\n *\n * @param messageType The message type\n * @param sourceInstance The source instance\n * @param data Payload\n */\n instanceMessage(messageType: string, sourceInstance: string, data: Record<string, any>): void {\n if (this._instanceSubscriptions[sourceInstance]) {\n this._instanceSubscriptions[sourceInstance].forEach(sub => {\n if (sub.messageType === messageType) {\n sub.callback(data, sourceInstance, messageType);\n }\n });\n }\n }\n\n /**\n * Gets all states.\n *\n * @param pattern The pattern to filter states\n * @param disableProgressUpdate Don't call onProgress() when done\n */\n getStates(pattern?: string | boolean, disableProgressUpdate?: boolean): Promise<Record<string, ioBroker.State>> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (typeof pattern === 'boolean') {\n disableProgressUpdate = pattern;\n pattern = undefined;\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('getStates', pattern, (err: string | null, res: Record<string, ioBroker.State>) => {\n this.states = res;\n !disableProgressUpdate && this.onProgress(PROGRESS.STATES_LOADED);\n err ? reject(new Error(err)) : resolve(this.states);\n });\n });\n }\n\n /**\n * Gets the given state.\n *\n * @param id The state ID\n */\n getState(id: string): Promise<ioBroker.State | null> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n if (id && id === this.ignoreState) {\n return Promise.resolve(this.simStates[id] || ({ val: null, ack: true } as ioBroker.State));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('getState', id, (err: string | null, state: ioBroker.State) =>\n err ? reject(new Error(err)) : resolve(state),\n );\n });\n }\n\n /**\n * Get the given binary state.\n *\n * @deprecated since js-controller 5.0. Use files instead.\n * @param id The state ID.\n */\n getBinaryState(id: string): Promise<string> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n // the data will come in base64\n return new Promise((resolve, reject) => {\n this._socket.emit('getBinaryState', id, (err: string | null, base64: string) =>\n err ? reject(new Error(err)) : resolve(base64),\n );\n });\n }\n\n /**\n * Set the given binary state.\n *\n * @deprecated since js-controller 5.0. Use files instead.\n * @param id The state ID.\n * @param base64 The Base64 encoded binary data.\n */\n setBinaryState(id: string, base64: string): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n // the data will come in base64\n return new Promise((resolve, reject) => {\n this._socket.emit('setBinaryState', id, base64, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Sets the given state value.\n *\n * @param id The state ID\n * @param val The state value\n * @param ack The acknowledgment flag\n */\n setState(id: string, val: string | number | boolean | ioBroker.SettableState | null, ack?: boolean): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n // extra handling for \"nothing_selected\" state for vis\n if (id && id === this.ignoreState) {\n let state: ioBroker.State;\n if (typeof ack === 'boolean') {\n state = val as ioBroker.State;\n } else if (typeof val === 'object' && (val as ioBroker.State).val !== undefined) {\n state = val as ioBroker.State;\n } else {\n state = {\n val: val as string | number | boolean | null,\n ack: false,\n ts: Date.now(),\n lc: Date.now(),\n from: 'system.adapter.vis.0',\n };\n }\n\n this.simStates[id] = state;\n\n // inform subscribers about changes\n if (this.statesSubscribes[id]) {\n for (const cb of this.statesSubscribes[id].cbs) {\n try {\n void (cb as ioBroker.StateChangeHandler)(id, state);\n } catch (e) {\n console.error(`Error by callback of stateChanged: ${e}`);\n }\n }\n }\n\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('setState', id, val, (err: string | null) => (err ? reject(new Error(err)) : resolve()));\n });\n }\n\n /**\n * Gets all objects.\n *\n * @param update Set to true to retrieve all objects from the server (instead of using the local cache)\n * @param disableProgressUpdate Don't call onProgress() when done\n */\n getObjects(update?: boolean, disableProgressUpdate?: boolean): Promise<Record<string, ioBroker.Object>> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n if (!update && this.objects) {\n resolve(this.objects);\n } else {\n this._socket.emit(\n LegacyConnection.isWeb() ? 'getObjects' : 'getAllObjects',\n (err: string | null, res: Record<string, ioBroker.Object>) => {\n this.objects = res;\n disableProgressUpdate && this.onProgress(PROGRESS.OBJECTS_LOADED);\n err ? reject(new Error(err)) : resolve(this.objects);\n },\n );\n }\n });\n }\n\n /**\n * Gets objects by list of IDs.\n *\n * @param list Array of object IDs to retrieve\n */\n getObjectsById(list: string[]): Promise<Record<string, ioBroker.Object>> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('getObjects', list, (err: string | null, res: Record<string, ioBroker.Object>) =>\n err ? reject(new Error(err)) : resolve(res),\n );\n });\n }\n\n /**\n * Called internally.\n */\n private _subscribe(isEnable: boolean): void {\n if (isEnable && !this.subscribed) {\n this.subscribed = true;\n this.autoSubscribes.forEach(id => this._socket.emit('subscribeObjects', id));\n // re-subscribe objects\n Object.keys(this.objectsSubscribes).forEach(id => this._socket.emit('subscribeObjects', id));\n // re-subscribe logs\n this.autoSubscribeLog && this._socket.emit('requireLog', true);\n // re-subscribe states\n const ids = Object.keys(this.statesSubscribes);\n ids.forEach(id => this._socket.emit('subscribe', id));\n ids.length &&\n this._socket.emit(\n LegacyConnection.isWeb() ? 'getStates' : 'getForeignStates',\n ids,\n (err: string | null, states: Record<string, ioBroker.State>) => {\n err && console.error(`Cannot getForeignStates: ${JSON.stringify(err)}`);\n // inform about states\n states && Object.keys(states).forEach(id => this.stateChange(id, states[id]));\n },\n );\n } else if (!isEnable && this.subscribed) {\n this.subscribed = false;\n // un-subscribe objects\n this.autoSubscribes.forEach(id => this._socket.emit('unsubscribeObjects', id));\n Object.keys(this.objectsSubscribes).forEach(id => this._socket.emit('unsubscribeObjects', id));\n // un-subscribe logs\n this.autoSubscribeLog && this._socket.emit('requireLog', false);\n\n // un-subscribe states\n Object.keys(this.statesSubscribes).forEach(id => this._socket.emit('unsubscribe', id));\n }\n }\n\n /**\n * Requests log updates.\n *\n * @param isEnabled Set to true to get logs\n */\n requireLog(isEnabled: boolean): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('requireLog', isEnabled, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Deletes the given object.\n *\n * @param id The object ID\n * @param maintenance Force deletion of non-conform IDs\n */\n delObject(id: string, maintenance?: boolean): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('delObject', id, { maintenance: !!maintenance }, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Deletes the given object and all its children.\n *\n * @param id The object ID\n * @param maintenance Force deletion of non-conform IDs\n */\n delObjects(id: string, maintenance?: boolean): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('delObjects', id, { maintenance: !!maintenance }, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Sets the object.\n */\n setObject(id: string, obj: ioBroker.SettableObject): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (!obj) {\n return Promise.reject(new Error('Null object is not allowed'));\n }\n\n obj = JSON.parse(JSON.stringify(obj));\n\n if (Object.prototype.hasOwnProperty.call(obj, 'from')) {\n delete obj.from;\n }\n if (Object.prototype.hasOwnProperty.call(obj, 'user')) {\n delete obj.user;\n }\n if (Object.prototype.hasOwnProperty.call(obj, 'ts')) {\n delete obj.ts;\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('setObject', id, obj, (err: string | null) => (err ? reject(new Error(err)) : resolve()));\n });\n }\n\n /**\n * Gets the object with the given id from the server.\n */\n getObject(id: string): Promise<ioBroker.Object> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n if (id && id === this.ignoreState) {\n return Promise.resolve({\n _id: this.ignoreState,\n type: 'state',\n common: {\n name: 'ignored state',\n type: 'mixed',\n read: true,\n write: true,\n role: 'state',\n },\n native: {},\n });\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('getObject', id, (err: string | null, obj: ioBroker.Object) =>\n err ? reject(new Error(err)) : resolve(obj),\n );\n });\n }\n\n /**\n * Get all instances of the given adapter or all instances of all adapters.\n *\n * @param adapter The name of the adapter\n * @param update Force update\n */\n getAdapterInstances(adapter?: string | boolean, update?: boolean): Promise<ioBroker.InstanceObject[]> {\n if (typeof adapter === 'boolean') {\n update = adapter;\n adapter = '';\n }\n adapter = adapter || '';\n\n if (!update && this._promises[`instances_${adapter}`]) {\n return this._promises[`instances_${adapter}`] as Promise<ioBroker.InstanceObject[]>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises[`instances_${adapter}`] = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n timeout = null;\n this.getObjectView(\n `system.adapter.${adapter ? `${adapter}.` : ''}`,\n `system.adapter.${adapter ? `${adapter}.` : ''}\\u9999`,\n 'instance',\n )\n .then(items =>\n resolve(Object.keys(items).map(id => fixAdminUI(items[id] as ioBroker.AdapterObject))),\n )\n .catch(e => reject(new Error(e)));\n }, TIMEOUT_FOR_ADMIN4);\n\n this._socket.emit(\n 'getAdapterInstances',\n adapter,\n (err: string | null, instances: ioBroker.InstanceObject[]) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n err ? reject(new Error(err)) : resolve(instances);\n }\n },\n );\n });\n\n return this._promises[`instances_${adapter}`] as Promise<ioBroker.InstanceObject[]>;\n }\n\n /**\n * Get adapters with the given name or all adapters.\n *\n * @param adapter The name of the adapter\n * @param update Force update\n */\n getAdapters(adapter?: string | boolean, update?: boolean): Promise<ioBroker.AdapterObject[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (typeof adapter === 'boolean') {\n update = adapter;\n adapter = '';\n }\n\n adapter = adapter || '';\n\n if (!update && this._promises[`adapter_${adapter}`]) {\n return this._promises[`adapter_${adapter}`] as Promise<ioBroker.AdapterObject[]>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises[`adapter_${adapter}`] = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n timeout = null;\n this.getObjectView(`system.adapter.${adapter}.`, `system.adapter.${adapter}.\\u9999`, 'adapter')\n .then(items => {\n resolve(Object.keys(items).map(id => fixAdminUI(items[id] as ioBroker.AdapterObject)));\n })\n .catch(e => reject(new Error(e)));\n }, TIMEOUT_FOR_ADMIN4);\n\n this._socket.emit('getAdapters', adapter, (err: string | null, adapters: ioBroker.AdapterObject[]) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n err ? reject(new Error(err)) : resolve(adapters);\n }\n });\n });\n\n return this._promises[`adapter_${adapter}`] as Promise<ioBroker.AdapterObject[]>;\n }\n\n /**\n * Called internally.\n */\n private _renameGroups(objs: RenameGroupObject[], cb: (err: string | null) => void): void {\n if (!objs || !objs.length) {\n cb && cb(null);\n } else {\n const obj = objs.pop();\n if (!obj) {\n setTimeout(() => this._renameGroups(objs, cb), 0);\n return;\n }\n const oldId = obj._id;\n obj._id = obj.newId as ioBroker.ObjectIDs.Group;\n delete obj.newId;\n\n this.setObject(obj._id, obj)\n .then(() => this.delObject(oldId))\n .then(() => setTimeout(() => this._renameGroups(objs, cb), 0))\n .catch((err: string | null) => cb && cb(err));\n }\n }\n\n /**\n * Rename a group.\n *\n * @param id The id.\n * @param newId The new id.\n * @param newName The new name.\n */\n async renameGroup(id: string, newId: string, newName: ioBroker.StringOrTranslated): Promise<void> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n const groups = await this.getGroups(true);\n if (groups.length) {\n // find all elements\n const groupsToRename: RenameGroupObject[] = (groups as RenameGroupObject[]).filter(group =>\n group._id.startsWith(`${id}.`),\n );\n\n groupsToRename.forEach(group => {\n group.newId = (newId + group._id.substring(id.length)) as ioBroker.ObjectIDs.Group;\n });\n\n await new Promise((resolve, reject) => {\n this._renameGroups(groupsToRename, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(null),\n );\n });\n const obj = groups.find(group => group._id === id);\n\n if (obj) {\n obj._id = newId as ioBroker.ObjectIDs.Group;\n if (newName !== undefined) {\n obj.common = obj.common || ({} as ioBroker.GroupCommon);\n // @ts-expect-error will be corrected in the next js-controller release\n obj.common.name = newName;\n }\n\n return this.setObject(obj._id, obj).then(() => this.delObject(id));\n }\n }\n\n return Promise.resolve();\n }\n\n /**\n * Sends a message to a specific instance or all instances of some specific adapter.\n *\n * @param instance The instance to send this message to.\n * @param command Command name of the target instance.\n * @param data The message data to send.\n */\n sendTo(instance: string, command: string, data: any): Promise<{ result?: any; error?: string }> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise(resolve => {\n this._socket.emit('sendTo', instance, command, data, (result: { result?: any; error?: string }) =>\n resolve(result),\n );\n });\n }\n\n /**\n * Extend an object and create it if it might not exist.\n *\n * @param id The id.\n * @param obj The object.\n */\n extendObject(id: string, obj: ioBroker.PartialObject): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n obj = JSON.parse(JSON.stringify(obj));\n\n if (Object.prototype.hasOwnProperty.call(obj, 'from')) {\n delete obj.from;\n }\n if (Object.prototype.hasOwnProperty.call(obj, 'user')) {\n delete obj.user;\n }\n if (Object.prototype.hasOwnProperty.call(obj, 'ts')) {\n delete obj.ts;\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('extendObject', id, obj, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Register a handler for log messages.\n */\n registerLogHandler(handler: (message: string) => void): void {\n !this.onLogHandlers.includes(handler) && this.onLogHandlers.push(handler);\n }\n\n /**\n * Unregister a handler for log messages.\n */\n unregisterLogHandler(handler: (message: string) => void): void {\n const pos = this.onLogHandlers.indexOf(handler);\n pos !== -1 && this.onLogHandlers.splice(pos, 1);\n }\n\n /**\n * Register a handler for the connection state.\n */\n registerConnectionHandler(handler: (connected: boolean) => void): void {\n !this.onConnectionHandlers.includes(handler) && this.onConnectionHandlers.push(handler);\n }\n\n /**\n * Unregister a handler for the connection state.\n */\n unregisterConnectionHandler(handler: (connected: boolean) => void): void {\n const pos = this.onConnectionHandlers.indexOf(handler);\n pos !== -1 && this.onConnectionHandlers.splice(pos, 1);\n }\n\n /**\n * Set the handler for standard output of a command.\n *\n * @param handler The handler.\n */\n registerCmdStdoutHandler(handler: (id: string, text: string) => void): void {\n this.onCmdStdoutHandler = handler;\n }\n\n /**\n * Unset the handler for standard output of a command.\n */\n unregisterCmdStdoutHandler(/* handler */): void {\n this.onCmdStdoutHandler = undefined;\n }\n\n /**\n * Set the handler for standard error of a command.\n *\n * @param handler The handler.\n */\n registerCmdStderrHandler(handler: (id: string, text: string) => void): void {\n this.onCmdStderrHandler = handler;\n }\n\n /**\n * Unset the handler for standard error of a command.\n */\n unregisterCmdStderrHandler(): void {\n this.onCmdStderrHandler = undefined;\n }\n\n /**\n * Set the handler for exit of a command.\n */\n registerCmdExitHandler(handler: (id: string, exitCode: number) => void): void {\n this.onCmdExitHandler = handler;\n }\n\n /**\n * Unset the handler for exit of a command.\n */\n unregisterCmdExitHandler(): void {\n this.onCmdExitHandler = undefined;\n }\n\n /**\n * Get all enums with the given name.\n */\n getEnums(\n /** The name of the enum. */\n _enum?: string,\n /** Force update. */\n update?: boolean,\n ): Promise<Record<string, ioBroker.EnumObject>> {\n if (!update && this._promises[`enums_${_enum || 'all'}`]) {\n return this._promises[`enums_${_enum || 'all'}`] as Promise<Record<string, ioBroker.EnumObject>>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises[`enums_${_enum || 'all'}`] = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getObjectView',\n 'system',\n 'enum',\n { startkey: `enum.${_enum || ''}`, endkey: `enum.${_enum ? `${_enum}.` : ''}\\u9999` },\n (err: string | null, res: { rows: { value: ioBroker.EnumObject; id: string }[] }) => {\n if (!err && res) {\n const _res: Record<string, ioBroker.EnumObject> = {};\n for (let i = 0; i < res.rows.length; i++) {\n if (_enum && res.rows[i].id === `enum.${_enum}`) {\n continue;\n }\n _res[res.rows[i].id] = res.rows[i].value;\n }\n resolve(_res);\n } else if (err) {\n reject(new Error(err));\n } else {\n reject(new Error('Invalid response while getting enums'));\n }\n },\n );\n });\n\n return this._promises[`enums_${_enum || 'all'}`] as Promise<Record<string, ioBroker.EnumObject>>;\n }\n\n /**\n * Query a predefined object view.\n *\n * @param design design - 'system' or other designs like `custom`.\n * @param type The type of object.\n * @param start The start ID.\n * @param end The end ID.\n */\n getObjectViewCustom(\n /** The design: 'system' or other designs like `custom`. */\n design: string,\n /** The type of object. */\n type: ioBroker.ObjectType,\n /** The start ID. */\n start: string,\n /** The end ID. */\n end?: string,\n ): Promise<Record<string, ioBroker.Object>> {\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'getObjectView',\n design,\n type,\n { startkey: start, endkey: end },\n (err: string | null, res: { rows: { value: ioBroker.Object; id: string }[] }) => {\n if (!err) {\n const _res: Record<string, ioBroker.Object> = {};\n if (res && res.rows) {\n for (let i = 0; i < res.rows.length; i++) {\n _res[res.rows[i].id] = res.rows[i].value;\n }\n }\n resolve(_res);\n } else {\n reject(new Error(err));\n }\n },\n );\n });\n }\n\n /**\n * Query a predefined object view.\n *\n * @param type The type of object.\n * @param start The start ID.\n * @param end The end ID.\n */\n getObjectViewSystem(\n type: ioBroker.ObjectType,\n start: string,\n end?: string,\n ): Promise<Record<string, ioBroker.Object>> {\n return this.getObjectViewCustom('system', type, start, end);\n }\n\n /**\n * @deprecated since version 1.1.15, cause parameter order does not match backend\n *\n * Query a predefined object view.\n * @param start The start ID.\n * @param end The end ID.\n * @param type The type of object.\n */\n getObjectView(start: string, end: string, type: ioBroker.ObjectType): Promise<Record<string, ioBroker.Object>> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n start = start || '';\n end = end || '\\u9999';\n return this.getObjectViewCustom('system', type, start, end);\n }\n\n /**\n * Get the stored certificates.\n *\n * @param update Force update.\n */\n getCertificates(update?: boolean): Promise<{ name: string; type: 'public' | 'private' | 'chained' | '' }[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (this._promises.cert && !update) {\n return this._promises.cert;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.cert = this.getObject('system.certificates').then(res => {\n const certs: { name: string; type: 'public' | 'private' | 'chained' | '' }[] = [];\n if (res && res.native && res.native.certificates) {\n Object.keys(res.native.certificates).forEach(c => {\n const cert: string = res.native.certificates[c];\n if (!cert) {\n return;\n }\n const _cert: { name: string; type: 'public' | 'private' | 'chained' | '' } = {\n name: c,\n type: '',\n };\n // If it is a filename, it could be everything\n if (cert.length < 700 && (cert.includes('/') || cert.includes('\\\\'))) {\n if (c.toLowerCase().includes('private')) {\n _cert.type = 'private';\n } else if (cert.toLowerCase().includes('private')) {\n _cert.type = 'private';\n } else if (c.toLowerCase().includes('public')) {\n _cert.type = 'public';\n } else if (cert.toLowerCase().includes('public')) {\n _cert.type = 'public';\n }\n certs.push(_cert);\n } else {\n _cert.type =\n cert.substring(0, '-----BEGIN RSA PRIVATE KEY'.length) === '-----BEGIN RSA PRIVATE KEY' ||\n cert.substring(0, '-----BEGIN PRIVATE KEY'.length) === '-----BEGIN PRIVATE KEY'\n ? 'private'\n : 'public';\n\n if (_cert.type === 'public') {\n const m = cert.split('-----END CERTIFICATE-----');\n if (m.filter((t: string) => t.replace(/\\r\\n|\\r|\\n/, '').trim()).length > 1) {\n _cert.type = 'chained';\n }\n }\n\n certs.push(_cert);\n }\n });\n }\n return certs;\n });\n\n return this._promises.cert;\n }\n\n /**\n * Get the logs from a host (only for admin connection).\n */\n getLogs(host: string, linesNumber?: number): Promise<string[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise(resolve => {\n this._socket.emit('sendToHost', host, 'getLogs', linesNumber || 200, (lines: string[]) => resolve(lines));\n });\n }\n\n /**\n * Get the log files (only for admin connection).\n */\n getLogsFiles(host: string): Promise<string[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('readLogs', host, (err: string | null, files: string[]) =>\n err ? reject(new Error(err)) : resolve(files),\n );\n });\n }\n\n /**\n * Delete the logs from a host (only for admin connection).\n */\n delLogs(host: string): Promise<void> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('sendToHost', host, 'delLogs', null, (error: string | null) =>\n error ? reject(new Error(error)) : resolve(),\n );\n });\n }\n\n /**\n * Read the meta items.\n */\n readMetaItems(): Promise<ioBroker.MetaObject[]> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'getObjectView',\n 'system',\n 'meta',\n { startkey: '', endkey: '\\u9999' },\n (err: string | null, objs: { rows: { value: ioBroker.MetaObject; id: string }[] }) =>\n err\n ? reject(new Error(err))\n : resolve(\n objs.rows &&\n objs.rows.map((obj: { value: ioBroker.MetaObject; id: string }) => obj.value),\n ),\n );\n });\n }\n\n /**\n * Read the directory of an adapter.\n *\n * @param adapter The adapter name.\n * @param fileName The directory name.\n */\n readDir(adapter: string, fileName: string): Promise<ioBroker.ReadDirResult[]> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('readDir', adapter, fileName, (err: string | null, files: ioBroker.ReadDirResult[]) =>\n err ? reject(new Error(err)) : resolve(files),\n );\n });\n }\n\n /**\n * Read a file of an adapter.\n *\n * @param adapter The adapter name.\n * @param fileName The file name.\n * @param base64 If it must be a base64 format.\n */\n readFile(adapter: string, fileName: string, base64?: boolean): Promise<string | { data: string; type: string }> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n if (!base64) {\n this._socket.emit('readFile', adapter, fileName, (err: string | null, data: string, type: string) => {\n err ? reject(new Error(err)) : resolve({ data, type });\n });\n } else {\n this._socket.emit('readFile64', adapter, fileName, base64, (err: string | null, data: string) =>\n err ? reject(new Error(err)) : resolve(data),\n );\n }\n });\n }\n\n /**\n * Write a file of an adapter.\n *\n * @param adapter The adapter name.\n * @param fileName The file name.\n * @param data The data (if it's a Buffer, it will be converted to Base64)\n */\n writeFile64(adapter: string, fileName: string, data: Buffer | string): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n if (typeof data === 'string') {\n this._socket.emit('writeFile', adapter, fileName, data, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n } else {\n const base64 = btoa(\n new Uint8Array(data).reduce((_data, byte) => _data + String.fromCharCode(byte), ''),\n );\n\n this._socket.emit('writeFile64', adapter, fileName, base64, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n }\n });\n }\n\n /**\n * Delete a file of an adapter.\n *\n * @param adapter The adapter name.\n * @param fileName The file name.\n */\n deleteFile(adapter: string, fileName: string): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('unlink', adapter, fileName, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Delete a folder of an adapter.\n * All files in folder will be deleted.\n *\n * @param adapter The adapter name.\n * @param folderName The folder name.\n */\n deleteFolder(adapter: string, folderName: string): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('deleteFolder', adapter, folderName, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Get the list of all hosts.\n *\n * @param update Force update.\n */\n getHosts(update?: boolean): Promise<ioBroker.HostObject[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!update && this._promises.hosts) {\n return this._promises.hosts;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.hosts = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getObjectView',\n 'system',\n 'host',\n { startkey: 'system.host.', endkey: 'system.host.\\u9999' },\n (err: string | null, doc: { rows: { value: ioBroker.HostObject; id: string }[] }) => {\n if (err) {\n reject(new Error(err));\n } else {\n resolve(doc.rows.map(item => item.value));\n }\n },\n );\n });\n\n return this._promises.hosts;\n }\n\n /**\n * Get the list of all users.\n *\n * @param update Force update.\n */\n getUsers(update?: boolean): Promise<ioBroker.UserObject[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!update && this._promises.users) {\n return this._promises.users;\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.users = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getObjectView',\n 'system',\n 'user',\n { startkey: 'system.user.', endkey: 'system.user.\\u9999' },\n (err: string | null, doc: { rows: { value: ioBroker.UserObject; id: string }[] }) => {\n if (err) {\n reject(new Error(err));\n } else {\n resolve(doc.rows.map(item => item.value));\n }\n },\n );\n });\n\n return this._promises.users;\n }\n\n /**\n * Get the list of all groups.\n *\n * @param update Force update.\n */\n getGroups(update?: boolean): Promise<ioBroker.GroupObject[]> {\n if (!update && this._promises.groups) {\n return this._promises.groups;\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.groups = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getObjectView',\n 'system',\n 'group',\n { startkey: 'system.group.', endkey: 'system.group.\\u9999' },\n (err: string | null, doc: { rows: { value: ioBroker.GroupObject; id: string }[] }) => {\n if (err) {\n reject(new Error(err));\n } else {\n resolve(doc.rows.map(item => item.value));\n }\n },\n );\n });\n\n return this._promises.groups;\n }\n\n /**\n * Get the host information.\n *\n * @param host The host name.\n * @param update Force update.\n * @param timeoutMs Optional read timeout.\n */\n getHostInfo(host: string, update?: boolean, timeoutMs?: number): Promise<HostInfo> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!host.startsWith('system.host.')) {\n host += `system.host.${host}`;\n }\n\n if (!update && this._promises[`hostInfo_${host}`]) {\n return this._promises[`hostInfo_${host}`] as Promise<HostInfo>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises[`hostInfo_${host}`] = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('getHostInfo timeout'));\n }\n }, timeoutMs || this.props.cmdTimeout);\n\n this._socket.emit('sendToHost', host, 'getHostInfo', null, (data: string | HostInfo) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getHostInfo\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"getHostInfo\"'));\n } else {\n resolve(data);\n }\n }\n });\n });\n\n return this._promises[`hostInfo_${host}`] as Promise<HostInfo>;\n }\n\n /**\n * Get the host information (short version).\n *\n * @param host The host name.\n * @param update Force update.\n * @param timeoutMs Optional read timeout.\n */\n getHostInfoShort(host: string, update?: boolean, timeoutMs?: number): Promise<HostInfo> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!host.startsWith('system.host.')) {\n host += `system.host.${host}`;\n }\n if (!update && this._promises[`hostInfoShort_${host}`]) {\n return this._promises[`hostInfoShort_${host}`] as Promise<HostInfo>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises[`hostInfoShort_${host}`] = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('hostInfoShort timeout'));\n }\n }, timeoutMs || this.props.cmdTimeout);\n\n this._socket.emit('sendToHost', host, 'getHostInfoShort', null, (data: string | HostInfo) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getHostInfoShort\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"getHostInfoShort\"'));\n } else {\n resolve(data);\n }\n }\n });\n });\n\n return this._promises[`hostInfoShort_${host}`] as Promise<HostInfo>;\n }\n\n /**\n * Get the repository.\n *\n * @param host The host name.\n * @param options Options.\n * @param update Force update.\n * @param timeoutMs Timeout in ms.\n */\n getRepository(\n host: string,\n options?: { update: boolean; repo: string } | string,\n update?: boolean,\n timeoutMs?: number,\n ): Promise<Record<string, ioBroker.AdapterObject>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!update && this._promises.repo) {\n return this._promises.repo;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (!host.startsWith('system.host.')) {\n host += `system.host.${host}`;\n }\n\n this._promises.repo = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('getRepository timeout'));\n }\n }, timeoutMs || this.props.cmdTimeout);\n\n this._socket.emit(\n 'sendToHost',\n host,\n 'getRepository',\n options,\n (data: string | Record<string, ioBroker.AdapterObject>) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getRepository\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"getRepository\"'));\n } else {\n resolve(data);\n }\n }\n },\n );\n });\n\n return this._promises.repo;\n }\n\n /**\n * Get the installed.\n *\n * @param host The host name.\n * @param update Force update.\n * @param cmdTimeout Timeout in ms.\n */\n getInstalled(host: string, update?: boolean, cmdTimeout?: number): Promise<Record<string, ioBroker.AdapterObject>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n this._promises.installed = this._promises.installed || {};\n\n if (!update && this._promises.installed[host]) {\n return this._promises.installed[host] as Promise<Record<string, ioBroker.AdapterObject>>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (!host.startsWith('system.host.')) {\n host += `system.host.${host}`;\n }\n\n this._promises.installed[host] = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('getInstalled timeout'));\n }\n }, cmdTimeout || this.props.cmdTimeout);\n\n this._socket.emit(\n 'sendToHost',\n host,\n 'getInstalled',\n null,\n (data: string | Record<string, ioBroker.AdapterObject>) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getInstalled\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"getInstalled\"'));\n } else {\n resolve(data);\n }\n }\n },\n );\n });\n\n return this._promises.installed[host] as Promise<Record<string, ioBroker.AdapterObject>>;\n }\n\n /**\n * Rename file or folder in ioBroker DB\n *\n * @param adapter Instance name, like `vis-2.0`.\n * @param oldName The current file name, e.g., main/vis-views.json\n * @param newName The new file name, e.g., main/vis-views-new.json\n */\n rename(adapter: string, oldName: string, newName: string): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('rename', adapter, oldName, newName, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Rename file in ioBroker DB\n */\n renameFile(\n /** instance name */\n adapter: string,\n /** current file name, e.g., main/vis-views.json */\n oldName: string,\n /** new file name, e.g., main/vis-views-new.json */\n newName: string,\n ): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('renameFile', adapter, oldName, newName, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Execute a command on a host.\n */\n cmdExec(\n /** The host name. */\n host: string,\n /** The command. */\n cmd: string,\n /** The command ID. */\n cmdId: string,\n /** Timeout of command in ms */\n cmdTimeout: number,\n ): Promise<void> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (!host.startsWith(host)) {\n host += `system.host.${host}`;\n }\n\n return new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = cmdTimeout\n ? setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('cmdExec timeout'));\n }\n }, cmdTimeout)\n : null;\n\n this._socket.emit('cmdExec', host, cmdId, cmd, null, (err: string | null) => {\n if (!cmdTimeout || timeout) {\n timeout && clearTimeout(timeout);\n timeout = null;\n if (err) {\n reject(new Error(err));\n } else {\n resolve();\n }\n }\n });\n });\n }\n\n /**\n * Checks if a given feature is supported.\n */\n checkFeatureSupported(\n /** The feature to check. */\n feature: string,\n /** Force update. */\n update?: boolean,\n ): Promise<boolean> {\n if (!update && this._promises[`supportedFeatures_${feature}`]) {\n return this._promises[`supportedFeatures_${feature}`] as Promise<boolean>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises[`supportedFeatures_${feature}`] = new Promise((resolve, reject) => {\n this._socket.emit('checkFeatureSupported', feature, (err: string | null, supported: boolean) =>\n err ? reject(new Error(err)) : resolve(supported),\n );\n });\n\n return this._promises[`supportedFeatures_${feature}`] as Promise<boolean>;\n }\n\n /**\n * Read the base settings of a given host.\n */\n async readBaseSettings(host: string): Promise<Record<string, any>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n const result = await this.checkFeatureSupported('CONTROLLER_READWRITE_BASE_SETTINGS');\n if (result) {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('readBaseSettings timeout'));\n }\n }, this.props.cmdTimeout);\n\n if (host.startsWith('system.host.')) {\n host = host.replace(/^system\\.host\\./, '');\n }\n\n this._socket.emit(\n 'sendToHost',\n host,\n 'readBaseSettings',\n null,\n (data: Record<string, any> | string) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"BaseSettings\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"BaseSettings\"'));\n } else {\n resolve(data);\n }\n }\n },\n );\n });\n }\n return Promise.reject(new Error('Not supported'));\n }\n\n /**\n * Write the base settings of a given host.\n *\n * @param host The host name.\n * @param config The new base settings.\n */\n writeBaseSettings(host: string, config: IoBJson): Promise<{ result?: 'ok'; error?: string }> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n return this.checkFeatureSupported('CONTROLLER_READWRITE_BASE_SETTINGS').then(result => {\n if (result) {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('writeBaseSettings timeout'));\n }\n }, this.props.cmdTimeout);\n\n this._socket.emit(\n 'sendToHost',\n host,\n 'writeBaseSettings',\n config,\n (data: { result?: 'ok'; error?: string } | string) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not write \"BaseSettings\"'));\n } else if (!data) {\n reject(new Error('Cannot write \"BaseSettings\"'));\n } else {\n resolve(data as { result?: 'ok'; error?: string });\n }\n }\n },\n );\n });\n }\n\n return Promise.reject(new Error('Not supported'));\n });\n }\n\n /**\n * Send command to restart the iobroker on host\n */\n restartController(host: string): Promise<boolean> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('sendToHost', host, 'restartController', null, (error: string | null) => {\n error ? reject(new Error(error)) : resolve(true);\n });\n });\n }\n\n /**\n * Read statistics information from host\n *\n * @param host Host name\n * @param typeOfDiag one of none, normal, no-city, extended\n */\n getDiagData(host: string, typeOfDiag: 'none' | 'normal' | 'no-city' | 'extended'): Promise<Record<string, any>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n return new Promise(resolve => {\n this._socket.emit('sendToHost', host, 'getDiagData', typeOfDiag, (result: Record<string, any>) =>\n resolve(result),\n );\n });\n }\n\n /**\n * Read all states (which might not belong to this adapter) which match the given pattern.\n */\n getForeignStates(pattern?: string): Promise<Record<string, ioBroker.State>> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n if (LegacyConnection.isWeb()) {\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'getStates',\n pattern || '*',\n (err: string | null, states: Record<string, ioBroker.State>) =>\n err ? reject(new Error(err)) : resolve(states),\n );\n });\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'getForeignStates',\n pattern || '*',\n (err: string | null, states: Record<string, ioBroker.State>) =>\n err ? reject(new Error(err)) : resolve(states),\n );\n });\n }\n\n /**\n * Get foreign objects by pattern, by specific type and resolve their enums. (Only admin)\n */\n getForeignObjects(pattern: string, type?: ioBroker.ObjectType): Promise<Record<string, ioBroker.State>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'getForeignObjects',\n pattern || '*',\n type,\n (err: string | null, states: Record<string, ioBroker.State>) =>\n err ? reject(new Error(err)) : resolve(states),\n );\n });\n }\n\n /**\n * Gets the system configuration.\n *\n * @param update Force update.\n */\n getSystemConfig(update?: boolean): Promise<ioBroker.SystemConfigObject> {\n if (!update && this._promises.systemConfig) {\n return this._promises.systemConfig;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.systemConfig = this.getObject('system.config').then(obj => {\n const systemConfig: ioBroker.SystemConfigObject = (obj || {}) as ioBroker.SystemConfigObject;\n systemConfig.common = systemConfig.common || ({} as ioBroker.SystemConfigCommon);\n systemConfig.native = systemConfig.native || {};\n return systemConfig;\n });\n\n return this._promises.systemConfig;\n }\n\n /**\n * Sets the system configuration.\n */\n setSystemConfig(\n obj: ioBroker.SettableObjectWorker<ioBroker.SystemConfigObject>,\n ): Promise<ioBroker.SystemConfigObject> {\n return this.setObject('system.config', obj).then(\n () => (this._promises.systemConfig = Promise.resolve(obj as ioBroker.SystemConfigObject)),\n );\n }\n\n /**\n * Get the raw socket.io socket.\n */\n getRawSocket(): SocketClient {\n return this._socket;\n }\n\n /**\n * Get the history of a given state.\n */\n getHistory(id: string, options: ioBroker.GetHistoryOptions): Promise<ioBroker.GetHistoryResult> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('getHistory', id, options, (err: string | null, values: ioBroker.GetHistoryResult) =>\n err ? reject(new Error(err)) : resolve(values),\n );\n });\n }\n\n /**\n * Get the history of a given state.\n */\n getHistoryEx(\n id: string,\n options: ioBroker.GetHistoryOptions,\n ): Promise<{ values: ioBroker.GetHistoryResult; sessionId: string; stepIgnore: number }> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'getHistory',\n id,\n options,\n (err: string | null, values: ioBroker.GetHistoryResult, stepIgnore: number, sessionId: string) =>\n err ? reject(new Error(err)) : resolve({ values, sessionId, stepIgnore }),\n );\n });\n }\n\n /**\n * Change the password of the given user.\n */\n changePassword(user: string, password: string): Promise<void> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('changePassword', user, password, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Get the IP addresses of the given host.\n */\n getIpAddresses(\n host: string,\n /** Force update. */\n update?: boolean,\n ): Promise<string[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!host.startsWith('system.host.')) {\n host = `system.host.${host}`;\n }\n\n if (!update && this._promises[`IPs_${host}`]) {\n return this._promises[`IPs_${host}`] as Promise<string[]>;\n }\n this._promises[`IPs_${host}`] = this.getObject(host).then(obj => (obj?.common ? obj.common.address || [] : []));\n\n return this._promises[`IPs_${host}`] as Promise<string[]>;\n }\n\n /**\n * Get the IP addresses with interface names of the given host or find host by IP.\n */\n getHostByIp(\n ipOrHostName: string,\n /** Force update. */\n update?: boolean,\n ): Promise<{ name: string; address: string; family: 'ipv4' | 'ipv6' }[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (ipOrHostName.startsWith('system.host.')) {\n ipOrHostName = ipOrHostName.replace(/^system\\.host\\./, '');\n }\n\n if (!update && this._promises[`rIPs_${ipOrHostName}`]) {\n return this._promises[`rIPs_${ipOrHostName}`] as Promise<\n { name: string; address: string; family: 'ipv4' | 'ipv6' }[]\n >;\n }\n this._promises[`rIPs_${ipOrHostName}`] = new Promise(resolve => {\n this._socket.emit('getHostByIp', ipOrHostName, (ip: string, host: any) => {\n const IPs4: {\n name: string;\n address: string;\n family: 'ipv4' | 'ipv6';\n }[] = [{ name: '[IPv4] 0.0.0.0 - Listen on all IPs', address: '0.0.0.0', family: 'ipv4' }];\n const IPs6: {\n name: string;\n address: string;\n family: 'ipv4' | 'ipv6';\n }[] = [{ name: '[IPv6] :: - Listen on all IPs', address: '::', family: 'ipv6' }];\n if (host?.native?.hardware?.networkInterfaces) {\n for (const eth in host.native.hardware.networkInterfaces) {\n if (!Object.prototype.hasOwnProperty.call(host.native.hardware.networkInterfaces, eth)) {\n continue;\n }\n for (let num = 0; num < host.native.hardware.networkInterfaces[eth].length; num++) {\n if (host.native.hardware.networkInterfaces[eth][num].family !== 'IPv6') {\n IPs4.push({\n name: `[${host.native.hardware.networkInterfaces[eth][num].family}] ${host.native.hardware.networkInterfaces[eth][num].address} - ${eth}`,\n address: host.native.hardware.networkInterfaces[eth][num].address,\n family: 'ipv4',\n });\n } else {\n IPs6.push({\n name: `[${host.native.hardware.networkInterfaces[eth][num].family}] ${host.native.hardware.networkInterfaces[eth][num].address} - ${eth}`,\n address: host.native.hardware.networkInterfaces[eth][num].address,\n family: 'ipv6',\n });\n }\n }\n }\n }\n for (let i = 0; i < IPs6.length; i++) {\n IPs4.push(IPs6[i]);\n }\n resolve(IPs4);\n });\n });\n\n return this._promises[`rIPs_${ipOrHostName}`] as Promise<\n { name: string; address: string; family: 'ipv4' | 'ipv6' }[]\n >;\n }\n\n /**\n * Encrypt a text\n */\n encrypt(text: string): Promise<string> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('encrypt', text, (err: string | null, _text: string) =>\n err ? reject(new Error(err)) : resolve(_text),\n );\n });\n }\n\n /**\n * Decrypt a text\n */\n decrypt(encryptedText: string): Promise<string> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('decrypt', encryptedText, (err: string | null, text: string) =>\n err ? reject(new Error(err)) : resolve(text),\n );\n });\n }\n\n /**\n * Gets the version.\n */\n getVersion(update?: boolean): Promise<{ version: string; serverName: string }> {\n if (update && this._promises.version) {\n delete this._promises.version;\n }\n\n this._promises.version =\n this._promises.version ||\n new Promise((resolve, reject) => {\n this._socket.emit('getVersion', (err: string | null, version: string, serverName: string) => {\n // support of old socket.io\n if (err && !version && typeof err === 'string' && err.match(/\\d+\\.\\d+\\.\\d+/)) {\n resolve({ version: err, serverName: 'socketio' });\n } else {\n err ? reject(new Error(err)) : resolve({ version, serverName });\n }\n });\n });\n\n return this._promises.version;\n }\n\n /**\n * Gets the web server name.\n */\n getWebServerName(): Promise<string> {\n this._promises.webName =\n this._promises.webName ||\n new Promise((resolve, reject) => {\n this._socket.emit('getAdapterName', (err: string | null, name: string) =>\n err ? reject(new Error(err)) : resolve(name),\n );\n });\n\n return this._promises.webName;\n }\n\n /**\n * Gets the admin version.\n *\n * @deprecated use getVersion()\n */\n getAdminVersion(): Promise<{ version: string; serverName: string }> {\n console.log('Deprecated: use getVersion');\n return this.getVersion();\n }\n\n /**\n * Change access rights for a file\n *\n * @param adapter The adapter name.\n * @param fileName file name with a full path. It could be like vis.0/*\n * @param options like {mode: 0x644}\n * @param options.mode Access rights. Default is 0x644\n */\n chmodFile(\n adapter: string,\n fileName: string,\n options?: { mode: number },\n ): Promise<{ entries: ioBroker.ChownFileResult[]; id: string }> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'chmodFile',\n adapter,\n fileName,\n options,\n (err: string | null, entries: ioBroker.ChownFileResult[], id: string) =>\n err ? reject(new Error(err)) : resolve({ entries, id }),\n );\n });\n }\n\n /**\n * Change an owner or/and owner group for a file\n *\n * @param adapter The adapter name.\n * @param fileName file name with a full path. It could be like vis.0/*\n * @param options like {owner: 'user', ownerGroup: 'group'}\n * @param options.owner User name\n * @param options.ownerGroup Group name\n */\n chownFile(\n adapter: string,\n fileName: string,\n options: { owner?: string; ownerGroup?: string },\n ): Promise<{ entries: ioBroker.ChownFileResult[]; id: string }> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'chownFile',\n adapter,\n fileName,\n options,\n (err: string | null, entries: ioBroker.ChownFileResult[], id: string) =>\n err ? reject(new Error(err)) : resolve({ entries, id }),\n );\n });\n }\n\n /**\n * Check if the file exists\n *\n * @param adapter The adapter name.\n * @param fileName file name with a full path. It could be like vis.0/*\n */\n fileExists(adapter: string, fileName: string): Promise<boolean> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('fileExists', adapter, fileName, (err: string | null, exists: boolean) =>\n err ? reject(new Error(err)) : resolve(exists),\n );\n });\n }\n\n /**\n * Get the alarm notifications from a host (only for admin connection).\n */\n getNotifications(host: string, category?: string): Promise<FilteredNotificationInformation> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise(resolve => {\n this._socket.emit(\n 'sendToHost',\n host,\n 'getNotifications',\n { category },\n (notifications: FilteredNotificationInformation) => resolve(notifications),\n );\n });\n }\n\n /**\n * Clear the alarm notifications on a host (only for admin connection).\n *\n * @param host The host name.\n * @param category optional\n */\n clearNotifications(host: string, category?: string): Promise<{ result: 'ok' }> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise(resolve => {\n this._socket.emit('sendToHost', host, 'clearNotifications', { category }, (result: { result: 'ok' }) =>\n resolve(result),\n );\n });\n }\n\n /**\n * Read if only easy mode is allowed (only for admin connection).\n */\n getIsEasyModeStrict(): Promise<boolean> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('getIsEasyModeStrict', (error: null | string, isStrict: boolean) =>\n error ? reject(new Error(error)) : resolve(isStrict),\n );\n });\n }\n\n /**\n * Read easy mode configuration (only for admin connection).\n */\n getEasyMode(): Promise<any> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('getEasyMode', (error: string | null, config: any) =>\n error ? reject(new Error(error)) : resolve(config),\n );\n });\n }\n\n /**\n * Read current user\n */\n getCurrentUser(): Promise<string> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise(resolve => {\n this._socket.emit('authEnabled', (isSecure: boolean, user: string) => resolve(user));\n });\n }\n\n getCurrentSession(cmdTimeout?: number): Promise<{ expireInSec: number }> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n const controller = new AbortController();\n\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n controller.abort();\n reject(new Error('getCurrentSession timeout'));\n }\n }, cmdTimeout || 5000);\n\n fetch('./session', { signal: controller.signal })\n .then(res => res.json())\n .then(json => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n resolve(json);\n }\n })\n .catch(e => reject(new Error(`getCurrentSession: ${e}`)));\n });\n }\n\n /**\n * Read adapter ratings\n */\n getRatings(update?: boolean): Promise<any> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('getRatings', update, (err: string | null, ratings: any) =>\n err ? reject(new Error(err)) : resolve(ratings),\n );\n });\n }\n\n /**\n * Read current web, socketio or admin namespace, like admin.0\n */\n getCurrentInstance(): Promise<string> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.currentInstance =\n this._promises.currentInstance ||\n new Promise((resolve, reject) => {\n this._socket.emit('getCurrentInstance', (err: string | null, namespace: string) =>\n err ? reject(new Error(err)) : resolve(namespace),\n );\n });\n\n return this._promises.currentInstance;\n }\n\n // returns very optimized information for adapters to minimize a connection load\n getCompactAdapters(update?: boolean): Promise<Record<string, ioBroker.AdapterObject>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!update && this._promises.compactAdapters) {\n return this._promises.compactAdapters;\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n this._promises.compactAdapters = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getCompactAdapters',\n (err: string | null, adapters: Record<string, ioBroker.AdapterObject>) =>\n err ? reject(new Error(err)) : resolve(adapters),\n );\n });\n\n return this._promises.compactAdapters;\n }\n\n getAdaptersResetCache(adapter?: string): void {\n adapter = adapter || '';\n delete this._promises.compactAdapters;\n delete this._promises[`adapter_${adapter}`];\n }\n\n // returns very optimized information for adapters to minimize a connection load\n getCompactInstances(update?: boolean): Promise<Record<string, ioBroker.InstanceObject>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!update && this._promises.compactInstances) {\n return this._promises.compactInstances;\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.compactInstances = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getCompactInstances',\n (err: string | null, instances: Record<string, ioBroker.InstanceObject>) =>\n err ? reject(new Error(err)) : resolve(instances),\n );\n });\n\n return this._promises.compactInstances;\n }\n\n getAdapternInstancesResetCache(adapter?: string): void {\n adapter = adapter || '';\n delete this._promises.compactInstances;\n delete this._promises[`instances_${adapter}`];\n }\n\n /**\n * Returns very optimized information for adapters to minimize a connection load.\n * Reads only version of installed adapter\n */\n getCompactInstalled(\n host: string,\n update?: boolean,\n cmdTimeout?: number,\n ): Promise<Record<string, ioBroker.AdapterObject>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n this._promises.installedCompact = this._promises.installedCompact || {};\n\n if (!update && this._promises.installedCompact[host]) {\n return this._promises.installedCompact[host] as Promise<Record<string, ioBroker.AdapterObject>>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (!host.startsWith('system.host.')) {\n host += `system.host.${host}`;\n }\n\n this._promises.installedCompact[host] = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('getCompactInstalled timeout'));\n }\n }, cmdTimeout || this.props.cmdTimeout);\n\n this._socket.emit('getCompactInstalled', host, (data: Record<string, ioBroker.AdapterObject> | string) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getCompactInstalled\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"getCompactInstalled\"'));\n } else {\n resolve(data);\n }\n }\n });\n });\n\n return this._promises.installedCompact[host] as Promise<Record<string, ioBroker.AdapterObject>>;\n }\n\n // returns very optimized information for adapters to minimize a connection load.\n // reads only version of installed adapter\n getCompactSystemRepositories(update?: boolean, cmdTimeout?: number): Promise<CompactSystemRepository> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (!update && this._promises.getCompactSystemRepositories) {\n return this._promises.getCompactSystemRepositories;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.getCompactSystemRepositories = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('getCompactSystemRepositories timeout'));\n }\n }, cmdTimeout || this.props.cmdTimeout);\n\n this._socket.emit('getCompactSystemRepositories', (data: CompactSystemRepository | string) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getCompactSystemRepositories\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"getCompactSystemRepositories\"'));\n } else {\n resolve(data);\n }\n }\n });\n });\n\n return this._promises.getCompactSystemRepositories;\n }\n\n // returns very optimized information for adapters to minimize a connection load\n getCompactSystemConfig(update?: boolean): Promise<ioBroker.SystemConfigObject> {\n if (!update && this._promises.systemConfigPromise) {\n return this._promises.systemConfigPromise;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.systemConfigPromise = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getCompactSystemConfig',\n (err: string | null, systemConfig: ioBroker.SystemConfigObject) =>\n err ? reject(new Error(err)) : resolve(systemConfig),\n );\n });\n\n return this._promises.systemConfigPromise;\n }\n\n /**\n * Get the repository in compact form (only version and icon).\n *\n * @param host The host name.\n * @param update Force update.\n * @param timeoutMs timeout in ms.\n */\n getCompactRepository(\n host: string,\n update?: boolean,\n timeoutMs?: number,\n ): Promise<Record<string, { version: string; icon: string }>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (!update && this._promises.repoCompact) {\n return this._promises.repoCompact;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (!host.startsWith('system.host.')) {\n host += `system.host.${host}`;\n }\n\n this._promises.repoCompact = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('getCompactRepository timeout'));\n }\n }, timeoutMs || this.props.cmdTimeout);\n\n this._socket.emit(\n 'getCompactRepository',\n host,\n (data: Record<string, { version: string; icon: string }> | string) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getCompactRepository\"'));\n } else if (!data) {\n reject(new Error('Cannot read \"getCompactRepository\"'));\n } else {\n resolve(data);\n }\n }\n },\n );\n });\n\n return this._promises.repoCompact;\n }\n\n getInstalledResetCache(): void {\n delete this._promises.repoCompact;\n delete this._promises.repo;\n }\n\n /**\n * Get the list of all hosts in compact form (only _id, common.name, common.icon, common.color, native.hardware.networkInterfaces)\n */\n getCompactHosts(update?: boolean): Promise<ioBroker.HostObject[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!update && this._promises.hostsCompact) {\n return this._promises.hostsCompact;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.hostsCompact = new Promise((resolve, reject) => {\n this._socket.emit('getCompactHosts', (err: string | null, hosts: ioBroker.HostObject[]) =>\n err ? reject(new Error(err)) : resolve(hosts),\n );\n });\n\n return this._promises.hostsCompact;\n }\n\n /**\n * Get uuid\n */\n getUuid(): Promise<string | undefined> {\n if (this._promises.uuid) {\n return this._promises.uuid;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.uuid = this.getObject('system.meta.uuid').then(obj => obj?.native?.uuid);\n\n return this._promises.uuid;\n }\n\n /**\n * Subscribe on instance message\n *\n * @param targetInstance instance, like 'cameras.0'\n * @param messageType message type like 'startCamera/cam3'\n * @param data optional data object\n * @param callback message handler\n */\n subscribeOnInstance(\n targetInstance: string,\n messageType: string,\n data: any,\n callback: (_data: Record<string, any>, sourceInstance: string, _messageType: string) => void,\n ): Promise<{ error?: string; accepted?: boolean; heartbeat?: number }> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'clientSubscribe',\n targetInstance,\n messageType,\n data,\n (err: string | null, result: { error?: string; accepted?: boolean; heartbeat?: number }) => {\n if (err) {\n reject(new Error(err));\n } else if (result?.error) {\n reject(new Error(result.error));\n } else {\n if (!targetInstance.startsWith('system.adapter.')) {\n targetInstance = `system.adapter.${targetInstance}`;\n }\n // save callback\n this._instanceSubscriptions[targetInstance] = this._instanceSubscriptions[targetInstance] || [];\n if (\n !this._instanceSubscriptions[targetInstance].find(\n sub => sub.messageType === messageType && sub.callback === callback,\n )\n ) {\n this._instanceSubscriptions[targetInstance].push({\n messageType,\n callback,\n });\n }\n resolve(result);\n }\n },\n );\n });\n }\n\n /**\n * Unsubscribe from instance message\n *\n * @param targetInstance instance, like 'cameras.0'\n * @param messageType message type like 'startCamera/cam3'\n * @param callback message handler. Could be null if all callbacks for this messageType should be unsubscribed\n */\n unsubscribeFromInstance(\n targetInstance: string,\n messageType?: string,\n callback?: (data: Record<string, any>, sourceInstance: string, _messageType: string) => void,\n ): Promise<boolean> {\n if (!targetInstance.startsWith('system.adapter.')) {\n targetInstance = `system.adapter.${targetInstance}`;\n }\n let deleted;\n const promiseResults: Promise<boolean>[] = [];\n do {\n deleted = false;\n const index = this._instanceSubscriptions[targetInstance]?.findIndex(\n sub => (!messageType || sub.messageType === messageType) && (!callback || sub.callback === callback),\n );\n\n if (index !== undefined && index !== null && index !== -1) {\n deleted = true;\n // remember messageType\n const _messageType = this._instanceSubscriptions[targetInstance][index].messageType;\n\n this._instanceSubscriptions[targetInstance].splice(index, 1);\n if (!this._instanceSubscriptions[targetInstance].length) {\n delete this._instanceSubscriptions[targetInstance];\n }\n\n // try to find another subscription for this instance and messageType\n const found =\n this._instanceSubscriptions[targetInstance] &&\n this._instanceSubscriptions[targetInstance].find(sub => sub.messageType === _messageType);\n\n if (!found) {\n promiseResults.push(\n new Promise((resolve, reject) => {\n this._socket.emit(\n 'clientUnsubscribe',\n targetInstance,\n messageType,\n (err: string | null, wasSubscribed: boolean) => {\n if (err) {\n reject(new Error(err));\n } else {\n resolve(wasSubscribed);\n }\n },\n );\n }),\n );\n }\n }\n } while (deleted && (!callback || !messageType));\n\n if (promiseResults.length) {\n return Promise.all(promiseResults).then((results: boolean[]) => results.find(result => result) || false);\n }\n\n return Promise.resolve(false);\n }\n\n /**\n * Send log to ioBroker log\n */\n log(text: string, level?: 'info' | 'debug' | 'warn' | 'error' | 'silly'): void {\n text && this._socket.emit('log', text, level || 'debug');\n }\n\n /**\n * Logout current user\n */\n logout(): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('logout', (err: string | null) => (err ? reject(new Error(err)) : resolve()));\n });\n }\n\n /**\n * This is a special method for vis.\n * It is used to not send to server the changes about \"nothing_selected\" state\n *\n * @param id The state that has to be ignored by communication\n */\n setStateToIgnore(id?: string | null): void {\n this.ignoreState = id || '';\n }\n}\n"],"names":["step","toInt","hex","rgb","r","g","b","length","parseInt","substr","getElevation","color","overlayColor","elevation","overlay","int","Math","round","toString","getElevations","elevations","i","backgroundColor","Theme","type","overrides","_options$palette","_options$palette$prim","_palette$grey","_palette$grey2","_palette$text","_palette$action","_palette$text2","_palette$action2","_palette$text3","_palette$text4","_palette$action3","options","localOverrides","MuiAppBar","colorDefault","MuiLink","root","textTransform","transition","orange","MuiPaper","name","palette","mode","background","paper","default","primary","main","secondary","expert","text","disabled","dark","light","toolbar","height","saveToolbar","button","borderRadius","grey","theme","createTheme","undefined","components","MuiButton","variants","props","variant","style","getContrastText","borderColor","border","action","disabledBackground","alpha","hoverOpacity","printPrompt","console","log","loaderStyles","Loader","useEffect","window","document","getElementById","createElement","setAttribute","innerHTML","head","appendChild","size","themeName","themeType","React","className","backgroundImage","loadingBackgroundImage","loadingBackgroundColor","backgroundSize","loadingHideLogo","width","left","borderWidth","top","bottom","Router","Component","constructor","super","this","onHashChangedBound","onHashChanged","bind","componentDidMount","addEventListener","componentWillUnmount","removeEventListener","getLocation","hash","location","replace","parts","split","map","item","decodeURIComponent","error","tab","dialog","id","arg","doNavigate","clipboardToIE11Formatting","defaultMessage","copy","reselectPrevious","range","selection","mark","success","debug","_selection","_active","getSelection","rangeCount","active","activeElement","ranges","push","getRangeAt","tagName","toUpperCase","blur","removeAllRanges","forEach","addRange","focus","deselectCurrent","createRange","textContent","ariaHidden","all","position","clip","whiteSpace","userSelect","e","_options","stopPropagation","format","preventDefault","clipboardData","_window$clipboardData","_window$clipboardData2","warn","clearData","_format","setData","_e$clipboardData","_e$clipboardData2","body","selectNodeContents","execCommand","Error","err","message","copyKey","test","navigator","userAgent","prompt","removeRange","removeChild","I18n","setLanguage","lang","extendTranslations","words","prefix","wordsWithPrefix","Object","keys","key","_lang","_words","wordsOfOneLanguage","word","startsWith","translations","languageDictionary","en","de","ru","wordsOfOneLang","assign","_word","setTranslations","getLanguage","t","translation","w","unknownTranslations","includes","_disableWarning","wordEn","_len","arguments","args","Array","_key","i18nShow","filter","result","JSON","stringify","disableWarning","disable","sysLang","i18nDisableWarning","NAMESPACE","days","months","QUALITY_BITS","SIGNATURES","JVBERi0","R0lGODdh","R0lGODlh","iVBORw0KGgo","PHN2Zw","Qk1","AAABAA","Utils","CapitalWords","substring","toLowerCase","join","formatSeconds","seconds","days_","floor","hours","padStart","minutes","secondsStr","getObjectName","objects","settings","isDesc","_settings","_item$common","_text","language","common","textObj","desc","pos","lastIndexOf","trim","getObjectNameFromObj","obj","noTrim","_settings2","_item$common2","_item$common3","_id","getSettingsOrder","forEnumId","_common","prototype","hasOwnProperty","call","custom","user","subOrder","parse","order","getSettingsCustomURLs","_common2","subURLs","URLs","reorder","list","source","dest","from","removed","splice","getSettings","defaultEnabling","_common3","enabled","useCustom","icon","setSettings","s","useCommon","getIcon","alt","src","getObjectIcon","_obj2","_obj2$common","_obj","pathname","match","splitCamelCase","isUseBright","defaultValue","slice","getTimeString","parseFloat","Number","isNaN","secs","getWindDirection","angle","padding","num","setDataFormat","dateFormat","indexOf","date2string","now","m","a","year","find","y","day","mm","Date","abs","getTime","date","getDay","getDate","getMonth","renderTextWithA","start","index","href","target","rel","title","getSmartName","states","instanceId","noCommon","_obj$common2","_obj$common","smartName","getSmartNameFromObj","_obj$common3","_obj$common3$custom","enableSmartName","removeSmartName","updateSmartName","newSmartName","byON","smartType","nnn","native","_smartName","role","empty","nl","pl","it","fr","pt","es","uk","disableSmartName","copyToClipboard","getFileExtension","fileName","formatBytes","bytes","units","u","toFixed","getInvertedColor","invert","invertedColor","invertColor","bw","alfa","rs","gs","bd","color2rgb","rgb2lab","x","z","colorDistance","color1","color2","rgb1","rgb2","lab1","lab2","dltL","dltA","dltB","c1","sqrt","dltC","dltH","dltCkcsc","dltHkhsh","_toVal","mix","str","isArray","k","clsx","tmp","_i","getThemeName","vendorPrefix","_localStorage","localStorage","getItem","matchMedia","matches","getThemeType","setThemeName","setItem","toggleTheme","themes","getThemeNames","newTheme","parseQuery","query","part","attr","value","f","getParentId","p","pop","formatDate","dateObj","dd","getFullYear","getHours","getMinutes","getSeconds","getMilliseconds","formatTime","d","h","MDtext2link","openLink","url","open","MDgetTitle","_header$title","MDextractHeader","header","lines","attrs","line","pos_","MDremoveDocsify","doc","generateFile","json","el","encodeURIComponent","display","click","quality2text","quality","clone","object","getStates","_obj$common4","false","true","getSvg","response","fetch","blob","Promise","resolve","reader","FileReader","onload","_this$result","readAsDataURL","detectMimeType","base64","signature","isStableRepository","activeRepo","isStringInteger","isValidDate","getStyle","attr1","namespace","INSTANCES","FORBIDDEN_CHARS","styles","buttonIcon","marginRight","SaveCloseButtons","newReact","isIFrame","self","render","noTextOnButtons","buttonStyle","paddingLeft","right","dense","minHeight","Toolbar","Fab","changed","onClick","onSave","IconSave","marginLeft","IconClose","flexGrow","onClose","suppress","fontSize","suppressRoot","marginTop","DialogConfirm","dialogName","suppressQuestionMinutes","removeItem","state","handleOk","handleCancel","setTimeout","Dialog","maxWidth","fullWidth","event","reason","DialogTitle","DialogContent","DialogContentText","FormControlLabel","sx","control","Checkbox","checked","onChange","setState","label","suppressText","DialogActions","Button","autoFocus","startIcon","IconCheck","ok","cancel","DialogError","dictionary","GenericApp","_ref","_settings$instance","ConnectionClass","Connection","isWeb","io","port","SocketClient","sentryStarted","sentryInited","resizeTimer","onSystemConfigChanged","_this$_systemConfig","socket","systemLang","_systemConfig","expertMode","getExpertMode","onReceiveMessage","data","newThemeName","onThemeChange","onThemeChanged","onToggleExpertMode","onResize","clearTimeout","getWidth","search","instance","adapterName","themeInstance","selectedTab","selectedTabNum","errorText","connected","loaded","isConfigurationError","toast","bottomButtons","confirmClose","_alert","_alertType","_alertMessage","savedNative","encryptedFields","sentryDSN","socketUrl","protocol","hostname","alertDialogRendered","oldAlert","alert","showAlert","doNotLoadAllObjects","onProgress","progress","PROGRESS","CONNECTING","READY","onReady","subscribeObject","then","getSystemConfig","_secret","secret","getObject","async","_await$this$socket$ge","_this$_systemConfig2","waitPromise","instanceObj","sentryEnabled","getState","val","diag","version","disableDataReporting","host","Sentry","dsn","release","integrations","uuidObj","uuid","setUser","onPrepareLoad","encryptedNative","onConnectionReady","catch","onError","showError","renderAlertSnackbar","Snackbar","autoHideDuration","_e","SIZES","xs","sm","md","lg","xl","innerWidth","reverse","currentTheme","_newThemeName","_expertMode","_this$_systemConfig3","sessionStorage","encrypt","String","fromCharCode","charCodeAt","decrypt","selectTab","onPrepareSave","getExtendableInstances","instances","getObjectViewSystem","values","_instance$common","webExtendable","getIpAddresses","_this$common","ips","getHostByIp","ip4","ip","address","ip6","isClose","oldObj","_oldObj","setObject","reject","globalThis","parent","postMessage","renderToast","_this$props$classes","anchorOrigin","vertical","horizontal","ContentProps","IconButton","classes","close","$iframeDialog","renderError","getIsChanged","isChanged","onLoadConfig","newNative","setConfigurationError","renderSaveCloseButtons","isYes","_updateNativeValue","shift","updateNativeValue","cb","showToast","renderHelperDialogs","delButton","swatch","mt","boxShadow","cursor","verticalAlign","swatchDisabled","opacity","popover","textAlign","popoverList","closeButton","cover","textDense","mb","picker","iconButton","minWidth","ColorPicker","handleClick","displayColorPicker","anchorEl","currentTarget","handleClose","handleChange","getColor","isHex","oColor","rColor","rgb2hex","componentDidUpdate","_prevProps","prevState","renderCustomPalette","customPalette","flexWrap","_this$props$theme","Box","component","noInputField","TextField","margin","mr","IconDelete","boxSizing","barWidth","Menu","ChromePicker","onChangeComplete","_color","cron","cronstrue","locale","mainDiv","periodSelect","slider","tabContent","overflow","numberButton","numberButtonBreak","appBar","warning","WEEKDAYS","MONTHS","convertMinusIntoArray","max","items","iMax","sort","convertArrayIntoMinus","newParts","end","ComplexCron","cronExpression","cron2state","extended","state2cron","modes","dates","dow","cronParts","recalcCron","onToggle","setCronAttr","nums","getDigitsSelector","getPeriodsTab","select","every","everyN","valueNumber","Select","MenuItem","slotProps","htmlInput","min","inputLabel","shrink","convertCronToText","everyMinute","everySecond","AppBar","Tabs","_tab","Tab","modalDialog","overflowHidden","titleIcon","content","languageButton","languageButtonActive","CustomModal","toggleTranslation","noTranslation","help","applyDisabled","applyButton","children","titleButtonApply","titleButtonClose","onApply","textInput","setValue","useState","Icon","disableEscapeKeyDown","LanguageIcon","paddingTop","autoComplete","multiline","CheckIcon","CloseIcon","withWidth","WrappedComponent","useTheme","breakpoints","reduce","output","useMediaQuery","up","useWidth","DialogTextInput","setText","input","setError","titleText","promptText","helperText","labelText","onKeyUp","code","_error","verify","rule","applyText","cancelText","IconExpert","viewBox","xmlns","fill","IconClosed","IconOpen","IconNoIcon","IconAlias","getSystemIcon","IconSystem","IconPhoto","IconGroup","IconUser","IconHost","endsWith","IconConnection","IconInfo","IconMeta","getSelectIdIcon","imagePrefix","cIcon","REMOTE_SERVER","REMOTE_PREFIX","styleUTF8","_props$style","_props$style2","_props$style3","SVG","ref","textarea","img","objectFit","dialogTitle","justifyContent","EXTENSIONS","images","txt","audio","video","bufferToBase64","buffer","isFull","binary","Uint8Array","len","byteLength","btoa","FileViewerClass","timeout","onFileChanged","_fileName","readFile","forceUpdate","ext","editing","editingValue","copyPossible","imgError","adapter","fileData","file","newState","atob","supportSubscribes","subscribeFiles","getEditorOrViewer","readOnly","getContent","getStyleBackgroundImage","onerror","alignItems","controls","scroll","setStateBackgroundImage","Brightness5Icon","CopyIcon","SaveIcon","FileViewer","ROW_HEIGHT","BUTTON_WIDTH","TILE_HEIGHT","NOT_FOUND","FILE_TYPE_ICONS","FileIcon","TypeIconImages","JSIcon","TypeIconTxt","TypeIconAudio","TypeIconVideo","filesDiv","overflowX","overflowY","filesDivHint","fontStyle","filesDivTable","filesDivTile","alignContent","flex","itemTile","itemNameFolderTile","fontWeight","itemNameTile","textOverflow","wordBreak","itemFolderIconTile","itemFolderIconBack","zIndex","itemSizeTile","itemImageTile","itemIconTile","itemSelected","itemTable","lineHeight","itemNameTable","direction","itemNameFolderTable","itemSizeTable","itemAccessTable","paddingRight","itemImageTable","maxHeight","itemNoImageTable","itemIconTable","itemFolderTable","itemFolderTemp","itemFolderIconTable","itemDownloadButtonTable","itemDownloadEmptyTable","itemAclButtonTable","itemDeleteButtonTable","uploadDiv","uploadDivDragging","uploadCenterDiv","uploadCenterIcon","uploadCenterText","uploadCloseButton","uploadCenterTextAndIcon","menuButtonExpertActive","menuButtonRestrictActive","pathDiv","ml","pathDivInput","pathDivBreadcrumbDir","pr","pathDivBreadcrumbSelected","backgroundImageLight","backgroundImageDark","backgroundImageColored","specialFolder","tooltip","pointerEvents","USER_DATA","getParentDir","dir","isFile","path","TABLE","TILE","sortFolders","folder","FileBrowserClass","limitToObjectID","limitToPath","lastSelect","setOpacityTimer","cacheFoldersTimeout","foldersLoading","cacheFolders","onFileChange","folders","_tempTimeout","browseFolder","array","expandedStr","limitPath","expanded","viewType","_this$limitToPath","showViewTypeButton","currentDir","selected","restrictToFolder","filterEmpty","addFolder","uploadFile","deleteItem","viewer","formatEditFile","modalEditOfAccess","queueLength","loadAllFolders","fileErrors","filterByType","showTypesMenu","pathFocus","levelPadding","mounted","suppressDeleteConfirm","browseList","browseListRunning","initialReadFinished","getDerivedStateFromProps","loadFolders","browseFolders","findItem","scrollToSelected","scrollIntoView","checkFeatureSupported","unsubscribeFiles","timer","browseFoldersCb","foldersList","newFoldersNotNull","_newFolders","readDirSerial","relPath","processBrowseList","level","processing","readDir","files","folderId","_checkEmpty","force","objs","readMetaItems","_folders","userData","findIndex","meta","ts","acl","unshift","knownError","_file$stats","isDir","stats","modified","modifiedAt","toggleFolder","temp","changeFolder","_folder","altKey","shiftKey","ctrlKey","metaKey","onSelect","filterFiles","getText","renderFolder","IconEl","isUserData","isSpecialData","iconStyle","onDoubleClick","formatAcl","allowDownload","allowDelete","DeleteIcon","renderBackFolder","IconBack","formatSize","access","permissions","accessStr","modalEditOfAccessControl","getFileIcon","JsonIcon","CssIcon","HtmlIcon","MusicIcon","getEditFile","renderFile","EditIcon","tabIndex","download","DownloadIcon","renderItems","res","totalResult","_item","CircularProgress","renderToolbar","IconType","showTypeSelector","isInFolder","findFirstFolder","allowNonRestricted","edge","menuButton","RestrictedIcon","showExpertButton","IconList","IconTile","EmptyFilterIcon","RefreshIcon","allowCreateFolder","AddFolderIcon","allowUpload","UploadIcon","Tooltip","popper","MyIcon","ListItemIcon","ListItemText","parentFolder","renderInputDialog","getElementsByClassName","writeFile64","renderUpload","Dropzone","onDragEnter","onDragLeave","onDrop","acceptedFiles","count","onabort","readAsArrayBuffer","_ref2","getRootProps","getInputProps","deleteRecursive","deleteFolder","parentId","deleteFile","renderDeleteDialog","renderViewDialog","FileViewerComponent","updateItemsAcl","info","changeToPath","renderBreadcrumb","Breadcrumbs","renderPath","Input","onKeyDown","endAdornment","EnterIcon","onBlur","ready","showToolbar","allowView","LinearProgress","FileBrowser","devices","rooms","IconSelector","opened","names","icons","loading","isAnyName","loadAllIcons","promises","templates","onlyRooms","onlyDevices","_templates","template","roomsIcons","offset","_templates2","devicesIcons","placeholder","ClearIcon","formContainer","formControl","divContainer","dragField","formIcon","IconPicker","_props$customStyles","_props$customClasses","_props$customStyles2","_props$customClasses2","IconCustom","useCallback","isDragActive","useDropzone","FormControl","InputLabel","customStyles","customClasses","previewStyle","previewClassName","Image","_this$props$src","svg","created","getSvgFromData","_props$src","svgContainer","firstElementChild","remove","getElementFromSource","inner","svgProps","ret","prop","serializeAttrs","attributes","dangerouslySetInnerHTML","__html","Logo","handleFileSelect","evt","_r$result","contents","onLoad","readAsText","news","titleLang","upload","readme","float","win","IconHelp","IconUpload","IconDownload","MDUtils","text2link","getTitle","extractHeader","removeDocsify","onCopy","IconAdapter","IconChannel","rx","strokeWidth","stroke","ry","cy","cx","y2","x2","y1","x1","fillOpacity","strokeOpacity","IconCopy","IconDevice","IconDocument","IconDocumentReadOnly","IconInstance","IconState","IconClearFilter","container","TabContainer","_props$styles","Paper","Grid2","wrap","overflowAuto","TabContent","TabHeader","ICON_SIZE","SMALL_BUTTON_SIZE","COLOR_NAME_USERDATA","COLOR_NAME_ALIAS","COLOR_NAME_ERROR_DARK","COLOR_NAME_ERROR_LIGHT","COLOR_NAME_CONNECTED_DARK","COLOR_NAME_CONNECTED_LIGHT","COLOR_NAME_DISCONNECTED_DARK","COLOR_NAME_DISCONNECTED_LIGHT","toolbarButtons","switchColumnAuto","dialogColumns","dialogColumnsLabel","columnCustom","columnCustomEditable","columnCustom_center","columnCustom_left","columnCustom_right","width100","transparent_10","transparent_20","transparent_30","transparent_40","transparent_50","transparent_60","transparent_70","transparent_80","transparent_90","transparent_100","headerRow","buttonClearFilter","buttonClearFilterIcon","tableDiv","tableRow","tableRowLines","borderBottom","borderRight","tableRowNoDragging","tableRowAlias","tableRowAliasReadWrite","tableRowFocused","checkBox","cellId","cellIdSpan","cellIdIconFolder","cellIdIconDocument","cellIdIconOwn","cellIdTooltip","cellIdTooltipLink","cellCopyButton","cellCopyButtonInDetails","cellEditButton","cellName","cellNameWithDesc","cellNameDivDiv","cellDescription","cellIdAlias","cellIdAliasReadWriteDiv","cellIdAliasAlone","cellIdAliasReadWrite","cellType","cellRole","cellRoom","cellEnumParent","cellFunc","cellValue","cellValueButton","cellValueButtonFalse","cellAdapter","cellValueTooltip","cellValueText","cellValueFile","cellValueTooltipTitle","cellValueTooltipValue","cellValueTooltipImage","cellValueTooltipBoth","cellValueTooltipBox","cellValueTextUnit","cellValueTextState","cellValueTooltipCopy","cellValueTooltipEdit","cellButtons","cellButtonsButton","cellButtonsEmptyButton","cellButtonMinWidth","cellButtonsButtonAlone","cellButtonsButtonWithCustoms","cellButtonsButtonWithoutCustoms","cellButtonsValueButton","cellButtonsValueButtonCopy","cellButtonsValueButtonEdit","cellDetailsLine","cellDetailsName","filteredOut","filteredParentOut","filterInput","selectIcon","selectNone","headerCell","headerCellValue","headerCellInput","headerCellSelectItem","visibleButtons","grow","enumIconDiv","enumIcon","enumDialog","enumList","enumButton","enumCheckbox","buttonDiv","aclText","rightsObject","rightsState","textCenter","tooltipAccessControl","flexDirection","fontSizeTitle","draggable","nonDraggable","selectClearButton","iconDeviceConnected","iconDeviceDisconnected","iconDeviceError","resizeHandle","resizeHandleRight","borderRightStyle","invertedBackground","invertedBackgroundFlex","contextMenuEdit","contextMenuEditValue","contextMenuView","contextMenuCustom","contextMenuACL","contextMenuRoom","contextMenuRole","contextMenuDelete","contextMenuKeys","contextMenuWithSubMenu","ButtonIcon","filterObject","filterKeys","excludeTranslations","iteratee","copiedObject","walkThroughArray","isObject","walkThroughObject","excludeSystemRepositories","filteredObject","beautify","binarySearch","_start","_end","middle","getName","getSelectIdIconFromObjects","_id_","aIcon","applyFilter","filters","context","counter","customFilter","selectedTypes","_depth","_objects$filters$room","_objects$filters$room2","_objects$filters$func","_objects$filters$func2","room","members","func","_data$obj","_customFilter$common","_customFilter$common2","_customFilter$common3","_customFilter$common4","_customFilter$common5","filterOfCustom","customs","cst","fID","fName","visible","hasVisibleChildren","sumVisibility","hasVisibleParent","getVisibleItems","_result","_item$children","IconLink","IconData","getObjectTooltip","_data$obj2","_data$obj2$common","getIdFieldTooltip","buildTree","ids","currentPathArr","currentPath","currentPathLen","funcEnums","roomEnums","roles","types","enums","hasSomeCustoms","aliasesMap","cRoot","_common$adminUI","_obj$common$alias","supportCustoms","adminUI","alias","usedId","readId","read","writeId","write","repeat","_obj$common5","_obj$common6","_obj$common7","curPath","_cRoot","generated","hasCustoms","switch","move","_objects$a","_objects$a$common","_objects$b","_objects$b$common","aName","bName","_objects$a2","_objects$a2$common","_objects$b2","_objects$b2$common","findNode","_parts","_path","_level","found","findRoomsForObject","per","_info$objects$room","_common$members","ownEnums","findEnumsForObjectAsIds","enumName","funcs","_info$objects$info$en","_common$members2","findFunctionsForObject","pef","_info$objects$info$fu","_common$members3","formatValue","isFloatComma","texts","isCommon","fileViewer","v","parsedDate","isInteger","valText","valFull","unit","full","ack","lc","c","q","nbr","prepareSparkData","time","nm1","ITEM_IMAGES","channel","device","enum","IconEnum","chart","IconChart","config","IconConfig","group","schedule","IconSchedule","script","IconScript","SCREEN_WIDTHS","idWidth","fields","widths","buttons","changedFrom","qualityCode","timestamp","lastChange","objectsAlreadyLoaded","DEFAULT_FILTER","_NON_EXPERT_NAMESPACES","_classPrivateFieldLooseKey","ObjectBrowserClass","lastAppliedFilter","pausedSubscribes","subscribes","unsubscribeTimer","statesUpdateTimer","objectsUpdateTimer","filterTimer","adapterColumns","styleTheme","edit","customWidth","resizeTimeout","resizerNextName","resizerActiveName","resizerCurrentWidths","resizeLeft","resizerOldWidth","resizerMin","resizerNextMin","resizerOldWidthNext","resizerPosition","resizerActiveDiv","resizerNextDiv","storedWidths","defaultHistory","columnsVisibility","changedIds","contextMenu","recordStates","customColumnDialog","onContextMenu","showContextMenu","clientX","clientY","onStateChange","onObjectChangeFromWorker","events","newInnerState","filtered","processOnObjectChangeElement","afterObjectUpdated","onObjectChange","getEnumsForId","_this$objects$_id","_this$objects$_id$com","_this$objects$_id$com2","enumItem","mobile","_createAllEnums","objId","_oldObj$common","_oldObj$common$member","newObj","toolTipObjectCreating","selectedNonObject","_this$objects$id","_this$objects$id2","renderTooltipAccessControl","check","valueNum","arrayTooltipText","funcRenderStateObject","rights","ownerGroup","ownerUser","owner","resizerMouseMove","widthNext","scrollBarWidth","resizerMouseUp","resizerMouseDown","parentNode","dataset","_handle","previousElementSibling","handle","querySelector","nextElementSibling","offsetWidth","resizerReset","calculateColumnsVisibility","lastSelectedItemStr","selectFirst","lastSelectedItems","filterStr","defaultFilters","_sessionStorage","tableRef","createRef","filterRefs","visibleCols","columns","possibleCols","customDialog","router","pauseSubscribe","columnsStr","foldersFirst","columnsWidths","foldersFirstStr","statesView","objectStatesView","filterKey","focused","depth","expandAllVisible","editObjectDialog","editObjectAlias","viewFileDialog","showAliasEditor","roleDialog","columnsForAdmin","columnsSelectorShow","columnsAuto","columnsDialogTransparent","columnsEditCustomDialog","customColumnDialogValueChanged","showExportDialog","showAllExportOptions","linesEnabled","showDescription","noStatesByExportImport","beautifyJsonExport","excludeSystemRepositoriesFromExport","tooltipInfo","aliasMenu","categories","editObject","deleteObject","customConfig","copyState","editState","filter_id","filter_name","filter_type","filter_role","filter_room","filter_func","filter_custom","filterCustomsWithout","objectChangedByUser","objectChangedBy","objectChangedFrom","stateChangedBy","stateChangedFrom","deviceError","deviceDisconnected","deviceConnected","aclOwner_read_object","aclOwner_read_state","aclOwner_write_object","aclOwner_write_state","aclGroup_read_object","aclGroup_read_state","aclGroup_write_object","aclGroup_write_state","aclEveryone_read_object","aclEveryone_read_state","aclEveryone_write_object","aclEveryone_write_state","create","createBooleanState","createNumberState","createStringState","createState","createChannel","createDevice","createFolder","resizerCurrentWidthsStr","loadAllObjects","update","updating","objectsWorker","getObjects","moreObjects","systemConfig","defaultNewAcl","filterFunc","propsTypes","setObjectsReference","getAdditionalColumns","node","expandAllSelected","onAfterSelect","e1","isNonExpertId","_classPrivateFieldLooseBase","saveNamespace","isDouble","_this$state$selected","registerHandler","unregisterHandler","unsubscribeObject","pattern","unsubscribeState","showDeleteDialog","_item$children2","_obj$common8","onObjectDelete","dontDelete","refreshComponent","renderErrorDialog","toggleItem","multiSelect","_renderDefinedList","isLast","cols","_this$state$columns","ListItemButton","disableRipple","renderColumnsSelectorDialog","Switch","List","column","_this$state$columns2","getAdapters","parseObjectForAdmins","checkUnsubscribes","unsubscribe","_root","_partyId","adminColumns","aColumns","cColumns","objTypes","updateAliases","aliasId","_this$info","aliasesIds","_obj$common9","_obj$common9$alias","subscribe","subscribeState","isPause","onFilter","_name","current","filterRef","onFilterChanged","clearFilter","childNodes","isFilterEmpty","getFilterInput","filterName","_this$filterRefs$filt","_this$filterRefs$filt2","_this$filterRefs$filt3","underline","firstChild","_this$filterRefs$filt4","getFilterSelect","_this$filterRefs$name","_this$filterRefs$name2","_this$filterRefs$name3","hasIcons","inputProps","displayEmpty","_this$filterRefs$name4","newFilter","getFilterSelectRole","getFilterSelectRoom","_this$objects$id3","_this$objects$id3$com","_this$objects$id4","_this$objects$id4$com","getFilterSelectFunction","_this$objects$id5","_this$objects$id5$com","_this$objects$id6","_this$objects$id6$com","getFilterSelectType","getFilterSelectCustoms","onExpandAll","_root$children","onCollapseAll","expandDepth","_root$children2","collapseDepth","onExpandVisible","onStatesViewVisible","onCollapseVisible","loadObjects","def","_getSelectedIdsForExport","idDot","idLen","_exportObjects","isAll","_result$key","renderExportDialog","handleJsonUpload","_target$files","_e$target","getToolbar","allowObjectCreation","disableColumnSelector","IconColumns","Badge","badgeContent","badge","LooksOneIcon","TextFieldsIcon","objectAddBoolean","modalNewObj","AddIcon","objectImportExport","PublishIcon","transform","objectBrowserEditObject","objectEditBoolean","_this$props$router","customDialogAll","BuildIcon","toggleExpanded","renderColumnButtons","_item$children4","_item$data$obj$common","_item$data$obj$common3","objectEditOfAccessControl","modalEditOfAccessObjData","_item$children3","cellButtonsButtonIcon","aclTooltip","aclSystemConfig","showEdit","IconEdit","_item$children5","_item$data$obj","_item$data$obj$common2","objectCustomDialog","_this$props$router2","readHistory","_this$objects$id7","_this$objects$id7$com","sparkline","setHours","setMinutes","setSeconds","setMilliseconds","nowMs","getHistory","addID","aggregate","sparks","getTooltipInfo","_this$objects$id8","_this$objects$id8$com","valFullRx","renderColumnValue","narrowStyleWithDetails","_obj$common10","_this$state$tooltipIn","valTextRx","copyText","iconCopy","getValueStyle","isExpertMode","isButton","onOpen","_this$state$tooltipIn2","_syncEnum","enumIds","newArray","_this$info$objects$en","enumId","_this$info$objects$en2","_this$info$objects$en3","syncEnum","toCheck","renderEnumDialog","itemEnums","enumDialogEnums","enumsOriginal","_this$objects$id9","_this$objects$id9$com","labelId","ListItem","secondaryAction","renderEditRoleDialog","objectBrowserEditRole","ObjectBrowserEditRole","onColumnsEditCustomDialogClose","isSave","_this$state$columnsEd","_this$state$columnsEd2","_this$state$columnsEd3","setCustomValue","renderColumnsEditCustomDialog","getCustomValue","initValue","defaultChecked","pathText","_obj$_id","anyObj","_obj$_id2","renderCustomValue","notEditable","align","renderAliasLink","customStyle","_index","aliasObj","scrollToItem","aliasAlone","renderLeaf","isExpanded","_common$alias","_this$states$id2","_item$data","_item$data2","_this$adapterColumns","_colMiddle","iconFolder","itemType","iconItem","typeImg","checkbox","valueEditable","objectBrowserViewFile","enumEditable","checkVisibleObjectType","newValue","newValueTitle","_this$states$id","readWriteAlias","aliasReadWrite","invertBackground","checkColor","bold","statusStates","_this$objects$_id2","colorSet","errorId","IconError","onlineId","IconDisconnected","offlineId","useDesc","oTooltip","colID","colMiddle","colName","_item$data3","_this$states$id3","_this$states$id4","_this$states$id5","_this$states$id6","_this$states$id7","_this$states$id8","colCustom","columnValue","colValue","updateOpened","colButtons","colDetails","_item$data4","_this$objects$id10","renderedMiddle","_item$data5","row","dragEnabled","onMouseDown","isRightMB","which","details","renderItem","leaf","DragWrapper","aColumnsAuto","aColumnsForAdmin","aColumnsWidths","WIDTHS","nameHeader","widthSum","newWidth","accumulator","navigateKeyPress","selectedId","_this$tableRef$curren","idx","newIdx","newId","getItemFromRoot","_obj$common11","idArr","currId","idEntry","j","renderHandleRight","renderHeader","filterClearInValue","clientWidth","behavior","block","inline","renderCustomDialog","ObjectCustomDialog","reportChangedIds","objectIDs","allVisibleObjects","customsInstances","_this$props$router3","onUpdate","valAck","expire","renderEditObjectDialog","ObjectBrowserEditObject","roleArray","aliasTab","onNewObject","updateAlias","_this$objects$this$st","_obj$common12","renderViewObjectFileDialog","ObjectBrowserViewFile","renderAliasEditorDialog","objectBrowserAliasEditor","ObjectBrowserAliasEditor","onRedirect","showAddDataPointDialog","initialType","initialStateType","renderAliasMenu","renderContextMenu","_obj$common13","_obj$common14","_obj$common15","_obj$common16","_obj$common17","_item$children6","_obj$common19","showACL","createStateVisible","createChannelVisible","createDeviceVisible","createFolderVisible","ITEMS","EDIT","visibility","EDIT_VALUE","IconValueEdit","VIEW","FindInPage","CUSTOM","_this$props$router4","ACL","listItemIconStyle","ROLE","BorderColor","FUNCTION","BedroomParent","ROOM","Construction","ALIAS","_obj$common18","CREATE","subMenu","IconFolder","DELETE","_this$state$showConte","_ITEMS$key$subMenu","subItem","subAnchor","ArrowRightIcon","anchorReference","anchorPosition","renderEditValueDialog","_this$objects$this$ed","objectBrowserValue","ObjectBrowserValue","jsonFilter","modalNewObject","defineProperty","writable","ObjectBrowser","hr","borderTop","scrollWindow","rowDiv","modeDiv","settingsDiv","inputTime","inputDate","inputEvery","inputRadio","inputGroup","inputGroupElement","inputDateDay","inputDateDayCheck","inputSmallCheck","rowOnce","rowDays","rowDows","rowDates","rowWeeks","rowMonths","rowMonthsDates","rowYears","rowDaysDows","pb","rowDowsDows","PERIODS","ASTRO","DEFAULT","exactTime","interval","period","once","dows","weeks","years","yearMonth","yearDate","valid","to","string2USdate","Schedule","timerOnce","timerFrom","timerTo","now2string","refFrom","refTo","refOnce","state2text","isDiff","daysOfWeek","string2date","today","validFrom","tDows","last","tMonths","month","getTimePeriodElements","wholeDay","night","fromTo","Radio","_schedule","getPeriodSettingsMinutes","getTimeExactElements","isAstro","getDivider","getPeriodModes","isOnce","getPeriodSettingsDaily","getPeriodSettingsWeekdays","getPeriodSettingsWeekly","getPeriodSettingsMonthly","getPeriodSettingsDates","getPeriodSettingsYearly","isSpecific","FormGroup","parsedDates","_dates","_parsedDates","parsedMonths","_parsedMonths","isEnd","setDate","getValidSettings","inputRef","different","SelectWithIcon","wordDifferent","allowNone","removePrefix","renderValue","TableResize","widthFilled","installTimeout","resizerMinNext","initialWidths","resizerApplyWidths","resizerActiveIndex","_e$target2","ths","_this$resizerRefTable","_this$resizerRefTable2","minWidths","resizerRefTable","querySelectorAll","resizerInstall","resizerUninstall","_installed","widthsStored","tableWidth","storedWidth","isFinite","div","onmousedown","ondblclick","dblTitle","gridTemplateColumns","Skeleton","Table","stickyHeader","TextWithIcon","_item2","_item3","_item4","_item5","_props$moreClasses","_item6","_item7","_props$moreClasses2","_props$moreClasses3","_item8","moreClasses","ToggleThemeMenu","Brightness4Icon","Brightness6Icon","Brightness7Icon","DialogSelectID","Function","onOk","filterConfig","_selected","IconOk","IconCancel","getAttr","lookup","setAttr","tableContainer","table","cell","paddingBottom","rowMainWithChildren","rowMainWithoutChildren","rowNoEdit","cellExpand","cellButton","cellHeader","width_name_nicknames","width_ioType","width_type","width_displayTraits","width_roomHint","rowSecondary","cellSecondary","visuallyHidden","fieldEditWithButton","fieldEdit","fieldButton","colorDialog","subText","glow","animation","descendingComparator","orderBy","_a","_b","TreeTable","selectCallback","updateTimeout","editMode","deleteMode","editData","field","showSelectColor","glowOnChange","_state$data","oldLine","renderCellEdit","col","renderCellEditSelect","editComponent","renderCellEditCustom","renderCellEditBoolean","renderCellEditColor","renderCellEditObjectID","renderCellEditNumber","renderCellEditString","oldValue","_col$lookup","EditComponent","rowData","newVal","renderSelectColorDialog","selectIdValue","_val","newColor","IconColor","renderSelectIdDialog","showSelectId","selectedStr","renderCellNonEdit","renderCell","editable","TableCell","cellStyle","renderCellWithSubField","subField","sub","subLookup","mainText","subStyle","renderLine","levelShift","TableRow","_opened","IconCollapse","IconExpand","scope","ii","hidden","newData","_this$state$editData","onDelete","handleRequestSort","property","isAsc","renderHead","TableHead","headerStyle","sortDirection","noSort","TableSortLabel","noAdd","IconAdd","_col","comparator","stabilizedThis","stableSort","getComparator","TableBody","dropZone","dropZoneEmpty","image","outline","disabledOpacity","buttonRemoveWrapper","buttonCropWrapper","UploadImage","cropHandler","cropperRef","maxSize","_file$name","_parts$pop","byte","removeIconFunc","crop","accept","multiple","errors","CropIcon","keepMounted","Boolean","_this$cropperRef","_this$cropperRef$curr","imageElement","cropper","getCroppedCanvas","toDataURL","Cropper","initialAspectRatio","viewMode","guides","minCropBoxHeight","minCropBoxWidth","checkOrientation","formControlMarginRight","formControlPaddingTop","PERIODIC","PERIODIC_TYPES","DEFAULT_STATE","text2weekdays","numPart","intervalBetween","timeFrom","timeTo","weekdays","specific","SimpleCron","periodArray2text","partsDate","getControlsWeekdaysElements","getControlsPeriodElements","marginBottom","getControlsTime","getControlsDate","getOnceElements","getIntervalElements","getIntervalBetweenElements","htmlFor","hour","getSpecificTimeElements","onModeChange","vendorStyles","LoaderVendor","thickness","ptStyles","LoaderPT","LoaderMV","attributeType","attributeName","dur","additive","repeatCount","fillRule","IconFx","IconLogout","headerID","radio","dialogPaper","DialogComplexCron","showWarning","ignoreCheck","renderWarningDialog","handleClear","clearButton","IconClear","clear","DialogCron","simple","complex","noWizard","setMode","DialogMessage","dialogMobile","contentMobile","titleRoot","DialogSelectFile","isDoubleClick","isFolder","selectOnlyFolders","DialogSimpleCron","PERMISSION_ERROR","NOT_CONNECTED","fixAdminUI","noConfig","jsonConfig","materialize","jsonCustom","materializeTab","adminTab","pattern2RegEx","startsWithWildcard","endsWithWildcard","LegacyConnection","_waitForFirstConnectionResolve","_promises","firstConnect","waitForRestart","statesSubscribes","objectsSubscribes","filesSubscribes","onConnectionHandlers","onLogHandlers","loadTimer","loadCounter","ignoreState","simStates","autoSubscribes","autoSubscribeLog","ioTimeout","cmdTimeout","_instanceSubscriptions","doNotLoadACL","_waitForFirstConnection","admin5only","startSocket","iob","registerSocketOnLoad","scriptLoadCounter","_socket","parsed","URL","connect","on","noTimeout","getVersion","major","minor","patch","_authTimer","onPreConnect","emit","isOk","isSecure","reload","_subscribe","subscribed","authenticate","onLog","_err","operation","objectChange","stateChange","messageType","instanceMessage","fileChange","onCmdStdoutHandler","onCmdStderrHandler","exitCode","onCmdExitHandler","_isOk","onConnect","isCloud","isConnected","waitForFirstConnection","_getUserPermissions","getCompactSystemConfig","userLanguage","onLanguage","toSubscribe","cbs","reg","RegExp","getBinaryState","subscribeStateAsync","toUnsubscribe","regId","regFilePattern","filePattern","filePatterns","task","sourceInstance","callback","disableProgressUpdate","setBinaryState","getObjectsById","isEnable","requireLog","isEnabled","delObject","maintenance","delObjects","getAdapterInstances","getObjectView","adapters","_renameGroups","oldId","renameGroup","newName","groups","getGroups","groupsToRename","sendTo","command","extendObject","registerLogHandler","handler","unregisterLogHandler","registerConnectionHandler","unregisterConnectionHandler","registerCmdStdoutHandler","unregisterCmdStdoutHandler","registerCmdStderrHandler","unregisterCmdStderrHandler","registerCmdExitHandler","unregisterCmdExitHandler","getEnums","_enum","startkey","endkey","_res","rows","getObjectViewCustom","design","getCertificates","cert","certs","certificates","_cert","getLogs","linesNumber","getLogsFiles","delLogs","_data","folderName","getHosts","hosts","getUsers","users","getHostInfo","timeoutMs","getHostInfoShort","getRepository","repo","getInstalled","installed","rename","oldName","renameFile","cmdExec","cmd","cmdId","feature","supported","readBaseSettings","writeBaseSettings","restartController","getDiagData","typeOfDiag","getForeignStates","getForeignObjects","setSystemConfig","getRawSocket","getHistoryEx","stepIgnore","sessionId","changePassword","password","ipOrHostName","_host$native","_host$native$hardware","IPs4","family","IPs6","hardware","networkInterfaces","eth","encryptedText","serverName","getWebServerName","webName","getAdminVersion","chmodFile","entries","chownFile","fileExists","exists","getNotifications","category","notifications","clearNotifications","getIsEasyModeStrict","isStrict","getEasyMode","getCurrentUser","getCurrentSession","controller","AbortController","abort","signal","getRatings","ratings","getCurrentInstance","currentInstance","getCompactAdapters","compactAdapters","getAdaptersResetCache","getCompactInstances","compactInstances","getAdapternInstancesResetCache","getCompactInstalled","installedCompact","getCompactSystemRepositories","systemConfigPromise","getCompactRepository","repoCompact","getInstalledResetCache","getCompactHosts","hostsCompact","getUuid","_obj$native","subscribeOnInstance","targetInstance","unsubscribeFromInstance","deleted","promiseResults","_this$_instanceSubscr","_messageType","wasSubscribed","results","logout","setStateToIgnore"],"sourceRoot":""}
|