iobroker.admin 7.4.8 → 7.4.9

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.
Files changed (30) hide show
  1. package/README.md +5 -5
  2. package/adminWww/asset-manifest.json +15 -15
  3. package/adminWww/index.html +1 -1
  4. package/adminWww/static/js/{288.23e8413f.chunk.js → 288.18e82468.chunk.js} +2 -2
  5. package/adminWww/static/js/{288.23e8413f.chunk.js.map → 288.18e82468.chunk.js.map} +1 -1
  6. package/adminWww/static/js/4289.a5fc8b2e.chunk.js +2 -0
  7. package/adminWww/static/js/4289.a5fc8b2e.chunk.js.map +1 -0
  8. package/adminWww/static/js/6853.6655ed69.chunk.js +2 -0
  9. package/adminWww/static/js/6853.6655ed69.chunk.js.map +1 -0
  10. package/adminWww/static/js/{7137.7b5ca6b5.chunk.js → 7137.c988b7e1.chunk.js} +2 -2
  11. package/adminWww/static/js/7137.c988b7e1.chunk.js.map +1 -0
  12. package/adminWww/static/js/{7424.223daaa3.chunk.js → 7424.5cf79afc.chunk.js} +2 -2
  13. package/adminWww/static/js/7424.5cf79afc.chunk.js.map +1 -0
  14. package/adminWww/static/js/9823.8a42dea5.chunk.js +3 -0
  15. package/adminWww/static/js/9823.8a42dea5.chunk.js.map +1 -0
  16. package/adminWww/static/js/{main.a833ed54.js → main.dbb63dc9.js} +2 -2
  17. package/adminWww/static/js/{main.a833ed54.js.map → main.dbb63dc9.js.map} +1 -1
  18. package/build-backend/main.js +5 -0
  19. package/build-backend/main.js.map +1 -1
  20. package/io-package.json +14 -14
  21. package/package.json +4 -4
  22. package/adminWww/static/js/4289.cbde8e52.chunk.js +0 -2
  23. package/adminWww/static/js/4289.cbde8e52.chunk.js.map +0 -1
  24. package/adminWww/static/js/6853.ff130602.chunk.js +0 -2
  25. package/adminWww/static/js/6853.ff130602.chunk.js.map +0 -1
  26. package/adminWww/static/js/7137.7b5ca6b5.chunk.js.map +0 -1
  27. package/adminWww/static/js/7424.223daaa3.chunk.js.map +0 -1
  28. package/adminWww/static/js/9823.f3f5cd8c.chunk.js +0 -3
  29. package/adminWww/static/js/9823.f3f5cd8c.chunk.js.map +0 -1
  30. /package/adminWww/static/js/{9823.f3f5cd8c.chunk.js.LICENSE.txt → 9823.8a42dea5.chunk.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/js/7424.223daaa3.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/icons/src/icons/IconButtonImage.tsx","../../../adapter-react-v5/build/icons/src/icons/IconVacuum.tsx","../../../adapter-react-v5/build/icons/src/icons/IconInstance.tsx","../../../adapter-react-v5/build/Components/src/Components/IconDeviceType.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/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","../../../adapter-react-v5/build/Components/src/Components/IobUri.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\\s?\\/?>|<b>[^<]+<\\/b>|<i>[^<]+<\\/i>/) : null;\n if (!m && text) {\n // put the rest text\n 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/, '&nbsp;'));\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 = (): void => resolve(reader.result?.toString() || '');\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\nexport function convertCronToText(cron: string, lang?: ioBroker.Languages): string {\n return cronstrue.toString(cron, { locale: lang });\n}\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\nexport interface 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 || undefined}\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 || undefined}\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 || undefined}\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 || undefined}\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 || undefined}\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', 'ico'],\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 as unknown as { data: number[]; type: 'Buffer' })?.data || 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: { file: string | Buffer; mimeType: string }) => {\n let fileData: string | Buffer = '';\n if (data.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 ((fileData as unknown 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(fileData as unknown as Buffer, true));\n } catch {\n console.error('Cannot convert base64 to string');\n fileData = '';\n }\n } else {\n const ext = Utils.detectMimeType(bufferToBase64(fileData as unknown as Buffer));\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): any => ({\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): any => ({\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): React.CSSProperties => ({\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): React.CSSProperties => ({\n background: theme.palette.primary.main,\n color: Utils.invertColor(theme.palette.primary.main, true),\n }),\n\n itemTable: (theme: IobTheme): any => ({\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): React.CSSProperties => ({\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): any => ({\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): any => ({\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): any => ({\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): any => ({\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): React.CSSProperties => ({\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): void => {\n Promise.all(\n newFoldersNotNull[folderId]\n .filter(item => item.folder)\n .map(item =>\n this.browseFolder(item.id, newFoldersNotNull, true).catch((): undefined => undefined),\n ),\n )\n .then((): void => resolve(newFoldersNotNull))\n .catch((error: unknown): void => reject(new Error(error as string)));\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 =>\n this.browseFolder(item.id, newFoldersNotNull, true).catch((): undefined => undefined),\n ),\n ).then((): Folders => 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 from 'react';\nimport { type IconProps } from './IconProps';\n\n// Copyright Bluefox\nexport const IconButtonImage = (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 436 436\"\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 <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","import React, { type JSX } from 'react';\nimport { type IconProps } from './IconProps';\n\nexport const IconVacuum = (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 339 339\"\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=\"M 318.371 88.485 C 332.371 114.538 339.207 142.418 338.881 172.125 C 338.874 172.605 338.631 172.845 338.151 172.845 L 335.411 172.845 C 335.077 172.845 334.911 173.012 334.911 173.345 L 334.911 181.215 C 334.911 181.635 335.121 181.845 335.541 181.845 L 337.711 181.845 C 338.157 181.845 338.364 182.068 338.331 182.515 C 331.921 264.525 267.321 330.135 185.931 337.995 C 89.911 347.265 6.491 275.385 0.301 179.465 C 0.274 179.052 0.467 178.845 0.881 178.845 L 2.381 178.845 C 2.741 178.845 2.921 178.665 2.921 178.305 L 2.911 171.465 C 2.904 171.052 2.694 170.845 2.281 170.845 L 0.441 170.845 C 0.147 170.845 0.001 170.698 0.001 170.405 C -0.289 83.535 64.591 10.095 151.421 0.955 C 211.511 -5.375 269.171 20.055 305.341 68.135 C 305.538 68.391 305.938 68.338 306.062 68.039 C 306.065 68.031 306.068 68.023 306.071 68.015 L 311.541 51.395 C 311.63 51.125 311.924 50.977 312.201 51.065 L 316.881 52.625 C 317.274 52.758 317.407 53.022 317.281 53.415 L 310.271 74.305 C 310.157 74.645 310.197 74.968 310.391 75.275 L 314.011 80.905 C 314.204 81.205 314.481 81.378 314.841 81.425 L 336.771 84.365 C 337.124 84.412 337.277 84.612 337.231 84.965 L 336.601 89.775 C 336.547 90.182 336.321 90.358 335.921 90.305 L 318.721 87.975 C 318.267 87.915 318.151 88.085 318.371 88.485 Z M 200.701 172.615 C 170.541 200.245 121.671 181.975 117.251 140.865 C 117.211 140.518 117.017 140.345 116.671 140.345 L 8.941 140.345 C 8.68 140.346 8.46 140.532 8.421 140.785 C -10.469 249.095 80.901 345.385 189.421 331.625 C 265.701 321.955 325.741 260.435 332.311 183.415 C 343.611 50.895 200.811 -38.365 85.961 28.845 C 47.041 51.625 20.601 89.335 9.791 133.265 C 9.611 133.985 9.891 134.345 10.631 134.345 L 116.371 134.345 C 116.664 134.345 116.824 134.202 116.851 133.915 C 118.397 116.288 126.001 103.005 139.661 94.065 C 172.821 72.345 214.571 95.715 216.891 133.845 C 216.911 134.178 217.087 134.345 217.421 134.345 L 330.342 134.345 C 330.842 134.345 331.092 134.595 331.092 135.095 L 331.092 139.595 C 331.092 140.095 330.842 140.345 330.342 140.345 L 217.161 140.345 C 216.827 140.345 216.641 140.512 216.601 140.845 C 215.141 153.652 209.841 164.242 200.701 172.615 Z M 210.861 135.845 C 210.861 111.572 191.183 91.895 166.911 91.895 C 142.638 91.895 122.961 111.572 122.961 135.845 C 122.961 160.118 142.638 179.795 166.911 179.795 C 191.183 179.795 210.861 160.118 210.861 135.845 Z\"\n transform=\"matrix(0.9999999999999999, 0, 0, 0.9999999999999999, -5.684341886080802e-14, 0)\"\n />\n <path\n fill=\"currentColor\"\n d=\"M 222.771 42.215 C 224.237 43.708 223.741 45.092 221.281 46.365 C 220.5 46.768 219.574 46.779 218.781 46.395 C 183.761 29.182 149.014 29.638 114.541 47.765 C 113.252 48.444 111.662 47.8 111.211 46.415 C 110.891 45.435 110.867 44.465 111.141 43.505 C 111.234 43.158 111.437 42.898 111.751 42.725 C 145.631 23.545 186.631 23.045 221.051 41.045 C 221.831 41.452 222.404 41.842 222.771 42.215 Z\"\n transform=\"matrix(0.9999999999999999, 0, 0, 0.9999999999999999, -5.684341886080802e-14, 0)\"\n />\n <text\n style={{\n whiteSpace: 'pre',\n fontFamily: 'Arial, sans-serif',\n fontSize: 16,\n }}\n x=\"139.395\"\n y=\"288.084\"\n transform=\"matrix(0.9999999999999999, 0, 0, 0.9999999999999999, -5.684341886080802e-14, 0)\"\n >\n vacuum\n </text>\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 from 'react';\nimport {\n AcUnit,\n Air,\n Blinds,\n BlindsClosed,\n ColorLens,\n ControlCamera,\n DeviceHub,\n DirectionsRun,\n DoorSliding,\n Gradient,\n Hub,\n Image,\n Info,\n Lightbulb,\n LocationOn,\n Lock,\n Palette,\n PlayArrowRounded,\n Polyline,\n Power,\n QuestionMark,\n SensorDoor,\n type SvgIconComponent,\n Thermostat,\n Timeline,\n TipsAndUpdates,\n Tune,\n Videocam,\n VolumeUp,\n Warning,\n Water,\n WaterDrop,\n WbIridescent,\n WbSunny,\n Whatshot,\n Window,\n} from '@mui/icons-material';\nimport { Icon, type IconProps } from './Icon';\nimport { Utils } from './Utils';\nimport { IconButtonImage } from '../icons/IconButtonImage';\nimport { IconVacuum } from '../icons/IconVacuum';\nimport { IconInstance } from '../icons/IconInstance';\n\n// Taken from type detector: https://github.com/ioBroker/ioBroker.type-detector/blob/master/src/types.ts#L27\nconst deviceTypes = [\n 'unknown',\n 'airCondition',\n 'blind',\n 'blindButtons',\n 'button',\n 'buttonSensor',\n 'camera',\n 'chart',\n 'cie',\n 'ct',\n 'dimmer',\n 'door',\n 'fireAlarm',\n 'floodAlarm',\n 'gate',\n 'hue',\n 'humidity',\n 'illuminance',\n 'image',\n 'info',\n 'instance',\n 'light',\n 'location',\n 'lock',\n 'media',\n 'motion',\n 'rgb',\n 'rgbSingle',\n 'rgbwSingle',\n 'slider',\n 'socket',\n 'temperature',\n 'thermostat',\n 'vacuumCleaner',\n 'volume',\n 'volumeGroup',\n 'warning',\n 'weatherCurrent',\n 'weatherForecast',\n 'window',\n 'windowTilt',\n 'hub3',\n 'node',\n 'controller',\n 'hub5',\n] as const;\n\nexport type DeviceType = (typeof deviceTypes)[number];\n\nexport function isDeviceIcon(icon: string): DeviceType | null {\n if (deviceTypes.includes(icon as DeviceType)) {\n return icon as DeviceType;\n }\n return null;\n}\n\nexport function getDeviceIcon(type: DeviceType, props?: IconProps): React.JSX.Element | null {\n let SvgComponent: SvgIconComponent | undefined;\n if (type === 'hub3') {\n SvgComponent = DeviceHub;\n }\n if (type === 'node') {\n SvgComponent = Polyline;\n }\n if (type === 'hub5') {\n SvgComponent = Hub;\n }\n if (type === 'controller') {\n SvgComponent = ControlCamera;\n }\n if (type === 'airCondition') {\n SvgComponent = AcUnit;\n }\n if (type === 'blind') {\n SvgComponent = Blinds;\n }\n if (type === 'camera') {\n SvgComponent = Videocam;\n }\n if (type === 'chart') {\n SvgComponent = Timeline;\n }\n if (type === 'ct') {\n SvgComponent = Gradient;\n }\n if (type === 'dimmer') {\n SvgComponent = TipsAndUpdates;\n }\n if (type === 'door') {\n SvgComponent = SensorDoor;\n }\n if (type === 'fireAlarm') {\n SvgComponent = Whatshot;\n }\n if (type === 'floodAlarm') {\n SvgComponent = Water;\n }\n if (type === 'humidity') {\n SvgComponent = WaterDrop;\n }\n if (type === 'illuminance') {\n SvgComponent = WbIridescent;\n }\n if (type === 'image') {\n SvgComponent = Image;\n }\n if (type === 'light') {\n SvgComponent = Lightbulb;\n }\n if (type === 'lock') {\n SvgComponent = Lock;\n }\n if (type === 'location') {\n SvgComponent = LocationOn;\n }\n if (type === 'media') {\n SvgComponent = PlayArrowRounded;\n }\n if (type === 'motion') {\n SvgComponent = DirectionsRun;\n }\n if (type === 'rgb') {\n SvgComponent = Palette;\n }\n if (type === 'rgbSingle') {\n SvgComponent = Palette;\n }\n if (type === 'rgbwSingle') {\n SvgComponent = Palette;\n }\n if (type === 'slider') {\n SvgComponent = Tune;\n }\n if (type === 'socket') {\n SvgComponent = Power;\n }\n if (type === 'temperature') {\n SvgComponent = Thermostat;\n }\n if (type === 'thermostat') {\n SvgComponent = Thermostat;\n }\n if (type === 'volume') {\n SvgComponent = VolumeUp;\n }\n if (type === 'volumeGroup') {\n SvgComponent = VolumeUp;\n }\n if (type === 'weatherCurrent') {\n SvgComponent = Air;\n }\n if (type === 'weatherForecast') {\n SvgComponent = WbSunny;\n }\n if (type === 'window') {\n SvgComponent = Window;\n }\n if (type === 'windowTilt') {\n SvgComponent = Window;\n }\n if (type === 'blindButtons') {\n SvgComponent = BlindsClosed;\n }\n if (type === 'button') {\n SvgComponent = IconButtonImage as SvgIconComponent;\n }\n if (type === 'buttonSensor') {\n SvgComponent = IconButtonImage as SvgIconComponent;\n }\n if (type === 'cie') {\n SvgComponent = ColorLens;\n }\n if (type === 'gate') {\n SvgComponent = DoorSliding;\n }\n if (type === 'hue') {\n SvgComponent = ColorLens;\n }\n if (type === 'info') {\n SvgComponent = Info;\n }\n if (type === 'instance') {\n SvgComponent = IconInstance as SvgIconComponent;\n }\n if (type === 'unknown') {\n SvgComponent = QuestionMark;\n }\n if (type === 'vacuumCleaner') {\n SvgComponent = IconVacuum as SvgIconComponent;\n }\n if (type === 'warning') {\n SvgComponent = Warning;\n }\n\n if (SvgComponent) {\n return (\n <SvgComponent\n style={props?.style || undefined}\n className={Utils.clsx(props?.className, 'iconOwn')}\n />\n );\n }\n return null;\n}\n\nexport function IconDeviceType(props: IconProps): React.JSX.Element | null {\n const icon = getDeviceIcon(props.src as DeviceType, props);\n if (icon) {\n return icon;\n }\n\n return <Icon {...props} />;\n}\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: HTMLElement = getElementFromSource(src);\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 reader = new window.FileReader();\n reader.onload = () => {\n const contents: string = reader.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 reader.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/, '&nbsp;'));\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, { 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 { ThemeType, ThemeName, IobTheme, Translate } from '../types';\nimport type { Router } from './Router';\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\nexport interface 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): any => ({\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): any => ({\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): any => ({\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): React.CSSProperties => ({\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): any => ({\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): React.CSSProperties => ({\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): any => ({\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): React.CSSProperties => ({\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): React.CSSProperties => ({\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): React.CSSProperties => ({\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): React.CSSProperties => ({\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): React.CSSProperties => ({\n backgroundColor: theme.palette.mode === 'dark' ? '#9a9a9a' : '#565656',\n padding: '0 3px',\n borderRadius: '2px 0 0 2px',\n }),\n invertedBackgroundFlex: (theme: IobTheme): React.CSSProperties => ({\n backgroundColor: theme.palette.mode === 'dark' ? '#9a9a9a' : '#565656',\n borderRadius: '0 2px 2px 0',\n }),\n contextMenuEdit: (theme: IobTheme): React.CSSProperties => ({\n color: theme.palette.mode === 'dark' ? '#ffee48' : '#cbb801',\n }),\n contextMenuEditValue: (theme: IobTheme): React.CSSProperties => ({\n color: theme.palette.mode === 'dark' ? '#5dff45' : '#1cd301',\n }),\n contextMenuView: (theme: IobTheme): React.CSSProperties => ({\n color: theme.palette.mode === 'dark' ? '#FFF' : '#000',\n }),\n contextMenuCustom: (theme: IobTheme): React.CSSProperties => ({\n color: theme.palette.mode === 'dark' ? '#42eaff' : '#01bbc2',\n }),\n contextMenuACL: (theme: IobTheme): React.CSSProperties => ({\n color: theme.palette.mode === 'dark' ? '#e079ff' : '#500070',\n }),\n contextMenuRoom: (theme: IobTheme): React.CSSProperties => ({\n color: theme.palette.mode === 'dark' ? '#ff9a33' : '#642a00',\n }),\n contextMenuRole: (theme: IobTheme): React.CSSProperties => ({\n color: theme.palette.mode === 'dark' ? '#ffdb43' : '#562d00',\n }),\n contextMenuDelete: (theme: IobTheme): React.CSSProperties => ({\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: ObjectBrowserFilter,\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\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: ObjectBrowserPossibleColumns[];\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\nexport interface 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}\nexport type ObjectBrowserColumn = 'name' | 'type' | 'role' | 'room' | 'func' | 'val' | 'buttons';\n\ntype ObjectBrowserPossibleColumns =\n | 'name'\n | 'type'\n | 'role'\n | 'room'\n | 'func'\n | 'val'\n | 'buttons'\n | 'changedFrom'\n | 'qualityCode'\n | 'timestamp'\n | 'lastChange'\n | 'id';\n\nexport interface 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?: ObjectBrowserColumn[];\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: ObjectBrowserPossibleColumns[] | 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: ObjectBrowserPossibleColumns[];\n\n private readonly texts: Record<string, string>;\n\n private readonly possibleCols: ObjectBrowserPossibleColumns[];\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: ObjectBrowserPossibleColumns[] | 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: ObjectBrowserPossibleColumns =\n `_${adapter}_${column.path}` as ObjectBrowserPossibleColumns;\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(\n `_${adapter}_${column.path}` as ObjectBrowserPossibleColumns,\n )\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 :&nbsp;\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 :&nbsp;\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 = '&nbsp;';\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 &nbsp;\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:\n this.info.aliasesMap[item.data.id] || item.data.id.startsWith('alias.0.')\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\nexport interface 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 {\n ObjectBrowser,\n type ObjectBrowserFilter,\n type ObjectBrowserColumn,\n type ObjectBrowserCustomFilter,\n} from '../Components/ObjectBrowser';\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?: ioBroker.ObjectType | ioBroker.ObjectType[];\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 &nbsp;\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 &nbsp;\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&#123; <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, { type FileRejection } 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: FileRejection[]) => {\n this.setState({ uploadFile: false });\n if (!acceptedFiles.length) {\n window.alert(errors?.[0]?.errors?.[0]?.message || I18n.t('ra_Cannot upload'));\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 &nbsp;\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 &nbsp;\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';\n\nexport const ERRORS = {\n PERMISSION_ERROR,\n NOT_CONNECTED,\n};\n\nexport type BinaryStateChangeHandler = (id: string, base64: string | null) => void;\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 /** 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 readonly 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 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\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 systemConfig: ioBroker.SystemConfigObject | null;\n try {\n systemConfig = 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 = systemConfig;\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 = { 'system.config': systemConfig };\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 async subscribeState(\n id: string | string[],\n binary: boolean | ioBroker.StateChangeHandler | BinaryStateChangeHandler,\n cb?: ioBroker.StateChangeHandler | BinaryStateChangeHandler,\n ): Promise<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 Promise.reject(new Error('No callback found for subscribeState'));\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 let base64: string | undefined;\n for (let i = 0; i < ids.length; i++) {\n try {\n // deprecated, but we still support it\n base64 = await this.getBinaryState(ids[i]);\n } catch (e) {\n console.error(`Cannot getBinaryState \"${ids[i]}\": ${JSON.stringify(e)}`);\n base64 = undefined;\n }\n if (base64 !== undefined && cb) {\n (cb as BinaryStateChangeHandler)(ids[i], base64);\n }\n }\n } else {\n return new Promise((resolve: () => void, reject: (error: unknown) => void): void => {\n this._socket.emit(\n LegacyConnection.isWeb() ? 'getStates' : 'getForeignStates',\n ids,\n (err: string | null, states: Record<string, ioBroker.State>) => {\n if (err) {\n console.error(`Cannot getForeignStates \"${id}\": ${JSON.stringify(err)}`);\n reject(new Error(err));\n } else {\n if (states) {\n Object.keys(states).forEach(_id =>\n (cb as ioBroker.StateChangeHandler)(_id, states[_id]),\n );\n }\n resolve();\n }\n },\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<T = ioBroker.Object>(id: string): Promise<T> {\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 } as T);\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 as T),\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}`] instanceof Promise) {\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 this._socket.emit(\n 'getAdapterInstances',\n adapter,\n (err: string | null, instances: ioBroker.InstanceObject[]) =>\n err ? reject(new Error(err)) : resolve(instances),\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}`] instanceof Promise) {\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(\n (resolve: (adapters: ioBroker.AdapterObject[]) => void, reject) => {\n this._socket.emit('getAdapters', adapter, (err: string | null, adapters: ioBroker.AdapterObject[]) => {\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;\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 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'}`] instanceof Promise) {\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<T = ioBroker.Object>(\n type: ioBroker.ObjectType,\n start: string,\n end?: string,\n ): Promise<Record<string, T>> {\n return this.getObjectViewCustom('system', type, start, end) as Promise<Record<string, T>>;\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 instanceof Promise && !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 instanceof Promise) {\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 instanceof Promise) {\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 instanceof Promise) {\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}`] instanceof Promise) {\n return this._promises[`hostInfo_${host}`];\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}`];\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}`] instanceof Promise) {\n return this._promises[`hostInfoShort_${host}`];\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}`];\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 instanceof Promise) {\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] instanceof Promise) {\n return this._promises.installed[host];\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];\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}`] instanceof Promise) {\n return this._promises[`supportedFeatures_${feature}`];\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}`];\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 instanceof Promise) {\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; step: 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, step: number, sessionId: string) =>\n err ? reject(new Error(err)) : resolve({ values, sessionId, step }),\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}`] instanceof Promise) {\n return this._promises[`IPs_${host}`];\n }\n this._promises[`IPs_${host}`] = this.getObject(host).then(obj => (obj?.common ? obj.common.address || [] : []));\n\n return this._promises[`IPs_${host}`];\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}`] instanceof Promise) {\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 instanceof Promise) {\n return this._promises.version;\n }\n\n this._promises.version = 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 if (this._promises.webName instanceof Promise) {\n return this._promises.webName;\n }\n\n this._promises.webName = 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 if (this._promises.currentInstance instanceof Promise) {\n return this._promises.currentInstance;\n }\n\n this._promises.currentInstance = 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 instanceof Promise) {\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 instanceof Promise) {\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] instanceof Promise) {\n return this._promises.installedCompact[host];\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];\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 instanceof Promise) {\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 instanceof Promise) {\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 instanceof Promise) {\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 instanceof Promise) {\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 instanceof Promise) {\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","import type { Connection } from '@/index';\n\nexport type IobUri = string;\nexport type IobUriType = 'object' | 'state' | 'file' | 'http' | 'base64';\n\nexport type IobUriParsed = { type: IobUriType; address: string; path?: string };\n\nexport function iobUriToString(uri: IobUriParsed): IobUri {\n if (uri.type === 'object') {\n return `iobobject://${uri.address}/${uri.path || ''}`;\n }\n if (uri.type === 'state') {\n return `iobstate://${uri.address}`;\n }\n if (uri.type === 'file') {\n return `iobfile://${uri.address}/${uri.path || ''}`;\n }\n if (uri.type === 'http') {\n return uri.address;\n }\n if (uri.path?.includes('/')) {\n return `iobfile://${uri.address}/${uri.path}`;\n }\n if (uri.path) {\n return `iobobject://${uri.address}/${uri.path}`;\n }\n return `iobstate://${uri.address}`;\n}\n\n/** Parse ioBroker URI */\nexport function iobUriParse(uri: string): IobUriParsed {\n const result: IobUriParsed = {\n type: 'object',\n address: '',\n };\n if (uri.startsWith('iobobject://')) {\n result.type = 'object';\n uri = uri.replace('iobobject://', '');\n const parts = uri.split('/');\n result.address = parts[0];\n result.path = parts[1]; // native.schemas.myObject\n } else if (uri.startsWith('iobstate://')) {\n result.type = 'state';\n uri = uri.replace('iobstate://', '');\n const parts = uri.split('/');\n result.address = parts[0];\n result.path = parts[1]; // val, ts, lc, from, q, ...\n } else if (uri.startsWith('iobfile://')) {\n result.type = 'file';\n uri = uri.replace('iobfile://', '');\n const parts = uri.split('/');\n result.address = parts.shift();\n result.path = parts.join('/'); // main/img/hello.png\n } else if (uri.startsWith('http://') || uri.startsWith('https://')) {\n result.type = 'http';\n result.address = uri; // https://googlw.com/path/uri?lakds=7889\n } else if (uri.startsWith('data:')) {\n // data:image/jpeg;base64,\n result.type = 'base64';\n result.address = uri; // data:image/jpeg;base64,...\n } else {\n // no protocol provided\n const parts = uri.split('/');\n if (parts.length === 2) {\n result.address = parts[0];\n result.path = parts[1];\n if (result.path.includes('.')) {\n result.type = 'object';\n } else if (result.path) {\n if (\n result.path === 'val' ||\n result.path === 'q' ||\n result.path === 'ack' ||\n result.path === 'ts' ||\n result.path === 'lc' ||\n result.path === 'from' ||\n result.path === 'user' ||\n result.path === 'expire' ||\n result.path === 'c'\n ) {\n result.type = 'state';\n } else if (\n result.path === 'common' ||\n result.path === 'native' ||\n result.path === 'from' ||\n result.path === 'acl' ||\n result.path === 'type'\n ) {\n result.type = 'object';\n } else {\n throw new Error(`Unknown path: ${result.path}`);\n }\n } else {\n result.type = 'state';\n }\n } else if (parts.length === 1) {\n result.address = parts[0];\n result.type = 'state';\n } else {\n // it is a file\n result.address = parts.shift();\n result.type = 'file';\n result.path = parts.join('/');\n }\n }\n return result;\n}\n\nexport function getAttrInObject(\n obj: Record<string, any> | null | undefined,\n path: string[] | undefined,\n _position?: number,\n): any {\n _position = _position || 0;\n if (obj === undefined || obj === null || !path) {\n return obj;\n }\n if (path.length - 1 === _position) {\n return obj[path[_position]];\n }\n if (typeof obj === 'object') {\n return getAttrInObject(obj[path[_position]], path, _position + 1);\n }\n return undefined;\n}\n\nexport function setAttrInObject(\n obj: Record<string, any> | null | undefined,\n path: string[] | undefined,\n value: any,\n _position?: number,\n): any {\n _position = _position || 0;\n if (obj === undefined || obj === null || !path) {\n return value;\n }\n if (path.length - 1 === _position) {\n obj[path[_position]] = value;\n return obj;\n }\n if (typeof obj === 'object') {\n return setAttrInObject(obj[path[_position]], path, value, _position + 1);\n }\n}\n\nexport async function iobUriRead(uri: IobUri | IobUriParsed, socket: Connection): Promise<any> {\n if (typeof uri === 'string') {\n uri = iobUriParse(uri);\n }\n if (uri.type === 'object') {\n const obj: ioBroker.Object | null | undefined = await socket.getObject(uri.address);\n return getAttrInObject(obj, uri.path?.split('.'));\n }\n if (uri.type === 'state') {\n const state: ioBroker.State | null | undefined = await socket.getState(uri.address);\n if (!uri.path) {\n return state;\n }\n return (state as Record<string, any>)?.[uri.path];\n }\n if (uri.type === 'file') {\n return await socket.readFile(uri.address, uri.path, true);\n }\n if (uri.type === 'http') {\n return fetch(uri.address)\n .then(response => response.text())\n .then(text => {\n if ((text.startsWith('{') && text.endsWith('}')) || (text.startsWith('[') && text.endsWith(']'))) {\n try {\n return JSON.parse(text);\n } catch {\n // ignore\n }\n }\n return text;\n });\n }\n throw new Error(`Unknown type: ${uri.type}`);\n}\n"],"names":["step","toInt","hex","rgb","r","g","b","length","parseInt","substr","getElevation","color","overlayColor","elevation","overlay","int","concat","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","_objectSpread","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","_unused","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","_reader$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","_unused2","getIpAddresses","_this$common","ips","getHostByIp","ip4","ip","address","ip6","isClose","oldObj","_oldObj","setObject","reject","globalThis","parent","postMessage","_unused3","renderToast","_this$props$classes","anchorOrigin","vertical","horizontal","ContentProps","IconButton","classes","close","$iframeDialog","_unused4","renderError","getIsChanged","isChanged","onLoadConfig","newNative","setConfigurationError","renderSaveCloseButtons","isYes","_updateNativeValue","shift","updateNativeValue","cb","_unused5","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","convertCronToText","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","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","IconButtonImage","IconVacuum","transform","fontFamily","IconInstance","deviceTypes","isDeviceIcon","IconDeviceType","SvgComponent","DeviceHub","Polyline","Hub","ControlCamera","AcUnit","Blinds","Videocam","Timeline","Gradient","TipsAndUpdates","SensorDoor","Whatshot","Water","WaterDrop","WbIridescent","Image","Lightbulb","Lock","LocationOn","PlayArrowRounded","DirectionsRun","Palette","Tune","Power","Thermostat","VolumeUp","Air","WbSunny","Window","BlindsClosed","ColorLens","DoorSliding","Info","QuestionMark","Warning","getDeviceIcon","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","_this$props$src","svg","created","getSvgFromData","_props$src","svgContainer","firstElementChild","remove","getElementFromSource","inner","svgProps","ret","prop","serializeAttrs","attributes","dangerouslySetInnerHTML","__html","Logo","handleFileSelect","evt","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","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","_unused6","foldersFirstStr","statesView","objectStatesView","_unused7","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","_unused8","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","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","_errors$","_errors$$errors","_errors$$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","pattern2RegEx","startsWithWildcard","endsWithWildcard","LegacyConnection","_waitForFirstConnectionResolve","_promises","firstConnect","waitForRestart","statesSubscribes","objectsSubscribes","filesSubscribes","onConnectionHandlers","onLogHandlers","loadTimer","loadCounter","ignoreState","simStates","autoSubscribes","autoSubscribeLog","ioTimeout","cmdTimeout","_instanceSubscriptions","doNotLoadACL","_waitForFirstConnection","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","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","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","getObjectView","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","sessionId","changePassword","password","ipOrHostName","_ip","_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","_isSecure","getCurrentSession","controller","AbortController","abort","signal","getRatings","ratings","getCurrentInstance","currentInstance","getCompactAdapters","compactAdapters","getAdaptersResetCache","getCompactInstances","compactInstances","getAdapternInstancesResetCache","getCompactInstalled","installedCompact","getCompactSystemRepositories","getCompactSystemConfig","systemConfigPromise","getCompactRepository","repoCompact","getInstalledResetCache","getCompactHosts","hostsCompact","getUuid","_obj$native","subscribeOnInstance","targetInstance","unsubscribeFromInstance","deleted","promiseResults","_this$_instanceSubscr","_messageType","wasSubscribed","results","logout","setStateToIgnore","iobUriToString","uri","_uri$path","iobUriParse","getAttrInObject","_position","setAttrInObject","iobUriRead","_uri$path2"],"sourceRoot":""}