iobroker.admin 7.4.1 → 7.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +5 -5
  2. package/admin/i18n/de/translations.json +1 -1
  3. package/adminWww/asset-manifest.json +13 -13
  4. package/adminWww/index.html +1 -1
  5. package/adminWww/static/js/288.7aa5c1cd.chunk.js +2 -0
  6. package/adminWww/static/js/288.7aa5c1cd.chunk.js.map +1 -0
  7. package/adminWww/static/js/4720.4d2f2008.chunk.js +2 -0
  8. package/adminWww/static/js/4720.4d2f2008.chunk.js.map +1 -0
  9. package/adminWww/static/js/6853.d4463ea5.chunk.js +2 -0
  10. package/adminWww/static/js/6853.d4463ea5.chunk.js.map +1 -0
  11. package/adminWww/static/js/{7137.59c61794.chunk.js → 7137.3d55bb2a.chunk.js} +2 -2
  12. package/adminWww/static/js/7137.3d55bb2a.chunk.js.map +1 -0
  13. package/adminWww/static/js/7424.25b03f3d.chunk.js +2 -0
  14. package/adminWww/static/js/7424.25b03f3d.chunk.js.map +1 -0
  15. package/adminWww/static/js/main.d9df93d8.js +2 -0
  16. package/adminWww/static/js/main.d9df93d8.js.map +1 -0
  17. package/io-package.json +222 -37
  18. package/package.json +4 -4
  19. package/adminWww/static/js/288.8fd137b7.chunk.js +0 -2
  20. package/adminWww/static/js/288.8fd137b7.chunk.js.map +0 -1
  21. package/adminWww/static/js/4720.f547d551.chunk.js +0 -2
  22. package/adminWww/static/js/4720.f547d551.chunk.js.map +0 -1
  23. package/adminWww/static/js/591.675e66af.chunk.js +0 -2
  24. package/adminWww/static/js/591.675e66af.chunk.js.map +0 -1
  25. package/adminWww/static/js/6853.be661c6e.chunk.js +0 -2
  26. package/adminWww/static/js/6853.be661c6e.chunk.js.map +0 -1
  27. package/adminWww/static/js/7137.59c61794.chunk.js.map +0 -1
  28. package/adminWww/static/js/main.d185596b.js +0 -2
  29. package/adminWww/static/js/main.d185596b.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/js/591.675e66af.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"],"sourcesContent":["import { type CSSProperties } from 'react';\nimport { createTheme, alpha, type PaletteOptions as PaletteOptionsMui } from '@mui/material/styles';\nimport { orange, grey } from '@mui/material/colors';\n\nimport type { SimplePaletteColorOptions } from '@mui/material/styles/createPalette';\nimport type { ThemeOptions as ThemeOptionsMui } from '@mui/material/styles/createTheme';\nimport type { IobTheme, ThemeName, ThemeType } from './types';\n\nconst step = (16 - 5) / 23 / 100;\n\n/**\n * Convert hex color in the format '#rrggbb' or '#rgb' to an RGB object.\n */\nfunction toInt(hex: string): { r: number; g: number; b: number } {\n const rgb: { r: number; g: number; b: number } = {\n r: 0,\n g: 0,\n b: 0,\n };\n\n if (hex.length === 7) {\n rgb.r = parseInt(hex.substr(1, 2), 16);\n rgb.g = parseInt(hex.substr(3, 2), 16);\n rgb.b = parseInt(hex.substr(5, 2), 16);\n } else if (hex.length === 4) {\n const r = hex.substr(1, 1);\n const g = hex.substr(2, 1);\n const b = hex.substr(3, 1);\n\n rgb.r = parseInt(r + r, 16);\n rgb.g = parseInt(g + g, 16);\n rgb.b = parseInt(b + b, 16);\n }\n\n return rgb;\n}\n\n/**\n * Convert an RGB object to a hex color string in the format '#rrggbb'.\n */\nfunction toHex(int: { r: number; g: number; b: number }): string {\n return `#${Math.round(int.r).toString(16)}${Math.round(int.g).toString(16)}${Math.round(int.b).toString(16)}`;\n}\n\n/** Returns the hex color string in the format '#rrggbb' */\nfunction getElevation(\n /** color in the format '#rrggbb' or '#rgb' */\n color: string,\n /** overlay color in the format '#rrggbb' or '#rgb' */\n overlayColor: string,\n /** elevation as an integer starting with 1 */\n elevation: number,\n): string {\n const rgb: { r: number; g: number; b: number } = toInt(color);\n const overlay: { r: number; g: number; b: number } = toInt(overlayColor);\n\n rgb.r += overlay.r * (0.05 + step * (elevation - 1));\n rgb.g += overlay.g * (0.05 + step * (elevation - 1));\n rgb.b += overlay.b * (0.05 + step * (elevation - 1));\n\n return toHex(rgb);\n}\n\n/**\n * Get all 24 elevations of the given color and overlay.\n *\n * @param color color in the format '#rrggbb' or '#rgb'\n * @param overlay overlay color in the format '#rrggbb' or '#rgb'\n */\nfunction getElevations(color: string, overlay: string): Record<string, CSSProperties> {\n const elevations: Record<string, CSSProperties> = {};\n\n for (let i = 1; i <= 24; i++) {\n elevations[`elevation${i}`] = {\n backgroundColor: getElevation(color, overlay, i),\n };\n }\n\n return elevations;\n}\n\n// const buttonsPalette = () => ({\n// palette: {\n// // mode: \"dark\",\n// grey: {\n// main: grey[300],\n// dark: grey[400],\n// },\n// },\n// });\n\n// const buttonsTheme = theme => ({\n// components: {\n// MuiButton: {\n// variants: [\n// {\n// props: { variant: 'contained', color: 'grey' },\n// style: {\n// color: theme.palette.getContrastText(theme.palette.grey[300]),\n// },\n// },\n// {\n// props: { variant: 'outlined', color: 'grey' },\n// style: {\n// color: theme.palette.text.primary,\n// borderColor:\n// theme.palette.mode === 'light'\n// ? 'rgba(0, 0, 0, 0.23)'\n// : 'rgba(255, 255, 255, 0.23)',\n// '&.Mui-disabled': {\n// border: `1px solid ${theme.palette.action.disabledBackground}`,\n// },\n// '&:hover': {\n// borderColor:\n// theme.palette.mode === 'light'\n// ? 'rgba(0, 0, 0, 0.23)'\n// : 'rgba(255, 255, 255, 0.23)',\n// backgroundColor: alpha(\n// theme.palette.text.primary,\n// theme.palette.action.hoverOpacity,\n// ),\n// },\n// },\n// },\n// {\n// props: { color: 'grey', variant: 'text' },\n// style: {\n// color: 'black',\n// '&:hover': {\n// backgroundColor: alpha(\n// theme.palette.text.primary,\n// theme.palette.action.hoverOpacity,\n// ),\n// },\n// },\n// },\n// ],\n// },\n// },\n// });\n\ninterface PaletteOptions extends PaletteOptionsMui {\n mode: ThemeType;\n expert: string;\n grey?: {\n main?: string;\n dark?: string;\n 50?: string;\n 100?: string;\n 200?: string;\n 300?: string;\n 400?: string;\n 500?: string;\n 600?: string;\n 700?: string;\n 800?: string;\n 900?: string;\n A100?: string;\n A200?: string;\n A400?: string;\n A700?: string;\n };\n}\n\ninterface ThemeOptions extends ThemeOptionsMui {\n name: ThemeName;\n palette?: PaletteOptions;\n toolbar?: CSSProperties;\n saveToolbar?: {\n background: string;\n button: CSSProperties;\n };\n}\n\n/**\n * The theme creation factory function.\n */\nexport function Theme(type: ThemeName, overrides?: Record<string, any>): IobTheme {\n let options: ThemeOptions;\n let localOverrides: Record<string, any>;\n\n if (type === 'dark') {\n localOverrides = {\n MuiAppBar: {\n colorDefault: {\n backgroundColor: '#272727',\n },\n },\n MuiLink: {\n root: {\n textTransform: 'uppercase',\n transition: 'color .3s ease',\n color: orange[200],\n '&:hover': {\n color: orange[100],\n },\n },\n },\n MuiPaper: getElevations('#121212', '#fff'),\n };\n\n options = {\n name: type,\n palette: {\n mode: 'dark',\n background: {\n paper: '#121212',\n default: '#121212',\n },\n primary: {\n main: '#4dabf5',\n },\n secondary: {\n main: '#436a93',\n },\n expert: '#14bb00',\n text: {\n primary: '#ffffff',\n secondary: '#ffffff',\n },\n },\n };\n } else if (type === 'blue') {\n localOverrides = {\n MuiAppBar: {\n colorDefault: {\n backgroundColor: '#3399CC',\n },\n },\n MuiLink: {\n root: {\n textTransform: 'uppercase',\n transition: 'color .3s ease',\n color: orange[400],\n '&:hover': {\n color: orange[300],\n },\n },\n },\n };\n\n options = {\n name: type,\n palette: {\n mode: 'dark',\n background: {\n paper: '#151d21',\n default: '#151d21',\n },\n primary: {\n main: '#4dabf5',\n },\n secondary: {\n main: '#436a93',\n },\n expert: '#14bb00',\n text: {\n primary: '#ffffff',\n secondary: '#ffffff',\n },\n },\n };\n } else if (type === 'colored') {\n localOverrides = {\n MuiAppBar: {\n colorDefault: {\n backgroundColor: '#2a3135',\n },\n },\n MuiLink: {\n root: {\n textTransform: 'uppercase',\n transition: 'color .3s ease',\n color: orange[200],\n '&:hover': {\n color: orange[100],\n },\n },\n },\n MuiPaper: getElevations('#151d21', '#fff'),\n };\n\n options = {\n name: type,\n palette: {\n mode: 'light',\n primary: {\n main: '#3399CC',\n },\n secondary: {\n main: '#164477',\n },\n expert: '#96fc96',\n },\n };\n } else if (type === 'PT') {\n localOverrides = {\n MuiAppBar: {\n colorDefault: {\n backgroundColor: '#0F99DE',\n },\n },\n MuiLink: {\n root: {\n textTransform: 'uppercase',\n transition: 'color .3s ease',\n color: orange[400],\n '&:hover': {\n color: orange[300],\n },\n },\n },\n };\n\n options = {\n name: type,\n palette: {\n mode: 'light',\n primary: {\n main: '#0F99DE',\n },\n secondary: {\n main: '#88A536',\n },\n expert: '#BD1B24',\n },\n };\n } else if (type === 'DX') {\n localOverrides = {\n MuiAppBar: {\n colorDefault: {\n backgroundColor: '#a9a9a9',\n },\n },\n MuiLink: {\n root: {\n textTransform: 'uppercase',\n transition: 'color .3s ease',\n color: orange[400],\n '&:hover': {\n color: orange[300],\n },\n },\n },\n };\n\n options = {\n name: type,\n palette: {\n mode: 'light',\n primary: {\n main: '#F5F5F7',\n },\n secondary: {\n main: '#a9a9a9',\n },\n expert: '#BD1B24',\n text: {\n primary: '#007AFE',\n secondary: '#007AFE',\n disabled: '#007AFEAA',\n },\n },\n };\n } else {\n localOverrides = {\n MuiLink: {\n root: {\n textTransform: 'uppercase',\n transition: 'color .3s ease',\n color: orange[400],\n '&:hover': {\n color: orange[300],\n },\n },\n },\n };\n\n options = {\n name: type,\n palette: {\n mode: 'light',\n primary: {\n main: '#3399CC',\n dark: '#256c97',\n light: '#76d0fd',\n },\n secondary: {\n main: '#164477',\n },\n expert: '#14bb00',\n },\n };\n }\n\n options.toolbar = {\n height: 48,\n };\n\n options.saveToolbar = {\n background: (options.palette?.primary as SimplePaletteColorOptions)?.main,\n button: {\n borderRadius: 3,\n height: 32,\n },\n };\n\n if (options.palette) {\n options.palette.grey = {\n main: grey[300],\n dark: grey[400],\n };\n }\n\n const theme: IobTheme = createTheme(options) as IobTheme;\n\n const palette: PaletteOptions = theme.palette as PaletteOptions;\n\n return createTheme(theme, {\n ...(overrides || undefined),\n components: {\n ...localOverrides,\n MuiButton: {\n variants: [\n {\n props: { variant: 'contained', color: 'grey' },\n style: {\n backgroundColor: palette.grey?.[300],\n color:\n palette.getContrastText && palette.grey?.[300]\n ? palette.getContrastText(palette.grey[300])\n : undefined,\n },\n },\n {\n props: { variant: 'outlined', color: 'grey' },\n style: {\n color: palette.text?.primary,\n borderColor: palette.mode === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)',\n '&.Mui-disabled': {\n border: `1px solid ${palette.action?.disabledBackground}`,\n },\n '&:hover': {\n borderColor:\n palette.mode === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)',\n backgroundColor: alpha(\n palette.text?.primary || '',\n palette.action?.hoverOpacity || 0.04,\n ),\n },\n },\n },\n {\n props: { variant: 'text', color: 'grey' },\n style: {\n color: palette.text?.primary,\n '&:hover': {\n backgroundColor: alpha(\n palette.text?.primary || '',\n palette.action?.hoverOpacity || 0.04,\n ),\n },\n },\n },\n ],\n },\n ...(overrides?.components || undefined),\n },\n }) as IobTheme;\n}\n","/**\n * Print the ioBroker welcome screen to the developer console.\n */\nexport function printPrompt(): void {\n const prompt = `\n██╗ ██████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗███████╗██████╗ \n██║██╔═══██╗██╔══██╗██╔══██╗██╔═══██╗██║ ██╔╝██╔════╝██╔══██╗\n██║██║ ██║██████╔╝██████╔╝██║ ██║█████╔╝ █████╗ ██████╔╝\n██║██║ ██║██╔══██╗██╔══██╗██║ ██║██╔═██╗ ██╔══╝ ██╔══██╗\n██║╚██████╔╝██████╔╝██║ ██║╚██████╔╝██║ ██╗███████╗██║ ██║\n╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝\n`;\n\n console.log(prompt);\n console.log(\n 'Nice to see you here! :) Join our dev community here https://github.com/ioBroker/ioBroker or here https://github.com/iobroker-community-adapters',\n );\n console.log('Help us to create open source project with reactJS!');\n console.log('See you :)');\n}\n\nexport default printPrompt;\n","/**\n * Copyright 2018-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport React, { useEffect } from 'react';\nimport type { ThemeName, ThemeType } from '../types';\n// import './loader.css'\n\ndeclare global {\n interface Window {\n loadingBackgroundImage: undefined | string;\n loadingBackgroundColor: undefined | string;\n loadingHideLogo: undefined | 'true';\n }\n}\n\nconst loaderStyles = `\n/**\n * Copyright 2018-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n **/\n\n.logo-background-light, .logo-background-colored {\n background: white;\n}\n.logo-background-dark, .logo-background-blue {\n background: black;\n}\n.logo-div {\n position: absolute;\n top: 50%;\n left: 50%;\n -ms-transform: translateX(-50%) translateY(-50%);\n -webkit-transform: translate(-50%,-50%);\n transform: translate(-50%,-50%);\n overflow: hidden;\n border-radius: 50%;\n z-index: 2;\n}\n.logo-border {\n /*border-color: #164477;*/\n border-top-color: #3399CC;\n border-left-color: #164477;\n border-bottom-color: #164477;\n border-right-color: #164477;\n border-radius: 50%;\n border-style: solid;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n position: absolute;\n}\n.logo-top {\n position: absolute;\n width: 4.5%;\n height: 16%;\n top: 0;\n z-index: 2;\n}\n.logo-i {\n position: absolute;\n width: 14.5%;\n height: 60%;\n top: 20%;\n left: 42%;\n background: #3399CC;\n}\n.logo-i-top {\n position: absolute;\n width: 14.5%;\n height: 4%;\n left: 42%;\n background: #3399CC;\n border-radius: 100%;\n}\n.logo-back {\n width: 100%;\n height: 100%;\n z-index: 0;\n overflow: hidden;\n}\n@keyframes logo-grow {\n 0% {\n width: 230px;\n height: 230px;\n transform: translate(-50%,-50%) scale(1);\n opacity: 1\n }\n 99% {\n width: 230px;\n height: 230px;\n transform: translate(-50%,-50%) scale(10);\n opacity: 0;\n }\n 100% {\n width: 0;\n height: 0;\n opacity: 0;\n }\n}\n@keyframes logo-spin { 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } }\n@keyframes logo-color-inside-light {\n 0% {\n background: #FEFEFE;\n }\n 100% {\n background: #3399CC;\n }\n}\n@keyframes logo-color-inside-dark {\n 0% {\n background: #030303;\n }\n 100% {\n background: #3399CC;\n }\n}\n@keyframes logo-color-inside-colored {\n 0% {\n background: #FEFEFE;\n }\n 100% {\n background: #3399CC;\n }\n}\n@keyframes logo-color-inside-blue {\n 0% {\n background: #030303;\n }\n 100% {\n background: #3399CC;\n }\n}\n\n@keyframes logo-color-outside-light {\n 0% {\n border-color: #FEFEFE;\n }\n 100% {\n border-top-color: #3399CC;\n border-left-color: #164477;\n border-bottom-color: #164477;\n border-right-color: #164477;\n }\n}\n@keyframes logo-color-outside-dark {\n 0% {\n border-color: #040404;\n }\n 100% {\n border-top-color: #3399CC;\n border-left-color: #164477;\n border-bottom-color: #164477;\n border-right-color: #164477;\n }\n}\n@keyframes logo-color-outside-colored {\n 0% {\n border-color: #FEFEFE;\n }\n 100% {\n border-top-color: #3399CC;\n border-left-color: #164477;\n border-bottom-color: #164477;\n border-right-color: #164477;\n }\n}\n@keyframes logo-color-outside-blue {\n 0% {\n border-color: #040404;\n }\n 100% {\n border-top-color: #3399CC;\n border-left-color: #164477;\n border-bottom-color: #164477;\n border-right-color: #164477;\n }\n}\n\n.logo-animate-wait {\n animation: logo-color-outside 1.5s, logo-spin 1.5s linear infinite;\n}\n\n.logo-animate-grow-light {\n background: #DDD;\n}\n.logo-animate-grow-dark {\n background: #1d1d1d;\n}\n.logo-animate-grow-colored {\n background: #DDD;\n}\n.logo-animate-grow-blue {\n background: #1d1d1d;\n}\n\n.logo-animate-grow {\n display: inline-block;\n text-align: center;\n z-index: 1;\n top: 50%;\n left: 50%;\n -ms-transform: translateX(-50%) translateY(-50%);\n -webkit-transform: translate(-50%,-50%);\n transform: translate(-50%,-50%);\n width: 245px;\n height: 245px;\n border-radius: 50%;\n position: absolute;\n animation: logo-grow 1s 1 ease forwards;\n}\n\n.logo-animate-color-inside-light {\n animation: logo-color-inside-light 2.5s;\n}\n.logo-animate-color-inside-dark {\n animation: logo-color-inside-dark 2.5s;\n}\n.logo-animate-color-inside-colored {\n animation: logo-color-inside-colored 2.5s;\n}\n.logo-animate-color-inside-blue {\n animation: logo-color-inside-blue 2.5s;\n}\n\n.logo-animate-color-outside-light {\n animation: logo-color-outside-light 1.5s;\n}\n.logo-animate-color-outside-dark {\n animation: logo-color-outside-dark 1.5s;\n}\n.logo-animate-color-outside-colored {\n animation: logo-color-outside-colored 1.5s;\n}\n.logo-animate-color-outside-blue {\n animation: logo-color-outside-blue 1.5s;\n}\n`;\n\ninterface LoaderProps {\n /** The size in pixels of this loader. */\n size?: number;\n /** The chosen theme type. */\n themeType?: ThemeType;\n /** Theme name */\n themeName?: ThemeName;\n /** @deprecated Theme name. use themeName instead */\n theme?: ThemeName;\n /** Background color */\n backgroundColor?: string;\n /** Background image URL */\n backgroundImage?: string;\n}\n\nexport function Loader(props: LoaderProps): React.JSX.Element {\n useEffect(() => {\n if (!window.document.getElementById('loader-iobroker-component')) {\n const style = window.document.createElement('style');\n style.setAttribute('id', 'loader-iobroker-component');\n style.innerHTML = loaderStyles;\n window.document.head.appendChild(style);\n }\n }, []);\n\n const size = props.size || 234;\n const theme = props.themeName || props.theme || props.themeType || 'light';\n return (\n <div\n className={`logo-back logo-background-${theme}`}\n style={{\n backgroundImage:\n props.backgroundImage && props.backgroundImage !== '@@loginBackgroundImage@@'\n ? props.backgroundImage\n : window.loadingBackgroundImage && window.loadingBackgroundImage !== '@@loginBackgroundImage@@'\n ? `url(${window.loadingBackgroundImage})`\n : undefined,\n backgroundColor:\n props.backgroundColor && props.backgroundColor !== '@@loginBackgroundColor@@'\n ? props.backgroundColor\n : window.loadingBackgroundColor && window.loadingBackgroundColor !== '@@loginBackgroundColor@@'\n ? window.loadingBackgroundColor\n : undefined,\n backgroundSize: 'cover',\n }}\n >\n {window.loadingHideLogo === 'true' ? null : (\n <>\n <div\n className=\"logo-div\"\n style={{ width: size, height: size }}\n >\n <div\n className={`logo-top logo-background-${theme}`}\n style={{ left: '37%' }}\n />\n <div\n className={`logo-top logo-background-${theme}`}\n style={{ left: '57%' }}\n />\n <div\n className={`logo-border logo-background-${theme} logo-animate-wait`}\n style={{ borderWidth: size * 0.132 }}\n />\n <div className={`logo-i logo-animate-color-inside-${theme}`} />\n <div\n className={`logo-i-top logo-animate-color-inside-${theme}`}\n style={{ top: '18%' }}\n />\n <div\n className={`logo-i-top logo-animate-color-inside-${theme}`}\n style={{ bottom: '18%' }}\n />\n </div>\n <div\n className={`logo-animate-grow logo-animate-grow-${theme}`}\n style={{ width: size + 11, height: size + 11 }}\n />\n </>\n )}\n </div>\n );\n}\n","import { Component } from 'react';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport class Router<P = {}, S = {}> extends Component<P, S> {\n protected onHashChangedBound: () => void;\n\n constructor(props: P) {\n super(props);\n this.onHashChangedBound = this.onHashChanged.bind(this);\n }\n\n componentDidMount(): void {\n window.addEventListener('hashchange', this.onHashChangedBound);\n }\n\n componentWillUnmount(): void {\n window.removeEventListener('hashchange', this.onHashChangedBound);\n }\n\n // eslint-disable-next-line class-methods-use-this\n onHashChanged(): void {\n // override this function\n }\n\n /**\n * Gets the location object.\n */\n static getLocation(): { tab: string; dialog: string; id: string; arg: string } {\n let hash = window.location.hash;\n hash = hash.replace(/^#/, '');\n const parts = hash.split('/').map(item => {\n try {\n return item ? decodeURIComponent(item) : '';\n } catch {\n console.error(`Router: Cannot decode ${item}`);\n return item;\n }\n });\n // #tabName/dialogName/deviceId\n return {\n tab: parts[0] || '',\n dialog: parts[1] || '',\n id: parts[2] || '',\n arg: parts[3] || '',\n };\n }\n\n /**\n * Navigate to a new location. Any parameters that are not set will be taken from the current location.\n */\n static doNavigate(\n tab: string | undefined | null,\n dialog?: string | null,\n id?: string | null,\n arg?: string | null,\n ): void {\n let hash = '';\n const location = Router.getLocation();\n if (arg !== undefined && !id) {\n id = location.id;\n }\n if (id && !dialog) {\n dialog = location.dialog;\n }\n if (dialog && !tab) {\n tab = location.tab;\n } else if (tab === null) {\n tab = location.tab;\n }\n\n if (tab) {\n hash = `#${tab}`;\n if (dialog) {\n hash += `/${dialog}`;\n\n if (id) {\n hash += `/${id}`;\n if (arg !== undefined) {\n hash += `/${arg}`;\n }\n }\n }\n }\n if (window.location.hash !== hash) {\n window.location.hash = hash;\n }\n }\n}\n","/*\nMIT License\n\nCopyright (c) 2017 sudodoki <smd.deluzion@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n */\n// https://github.com/sudodoki/toggle-selection/blob/gh-pages/index.js\nfunction deselectCurrent() {\n const selection = document.getSelection();\n if (!selection?.rangeCount) {\n return () => {};\n }\n let active = document.activeElement as HTMLElement | null;\n\n const ranges: Range[] = [];\n for (let i = 0; i < selection.rangeCount; i++) {\n ranges.push(selection.getRangeAt(i));\n }\n\n switch (\n active?.tagName.toUpperCase() // .toUpperCase handles XHTML\n ) {\n case 'INPUT':\n case 'TEXTAREA':\n active.blur();\n break;\n\n default:\n active = null;\n break;\n }\n\n selection.removeAllRanges();\n return () => {\n selection.type === 'Caret' && selection.removeAllRanges();\n\n if (!selection.rangeCount) {\n ranges.forEach(range => selection.addRange(range));\n }\n\n active && active.focus();\n };\n}\n\n// https://github.com/sudodoki/copy-to-clipboard/blob/master/index.js\n\nconst clipboardToIE11Formatting = {\n 'text/plain': 'Text',\n 'text/html': 'Url',\n default: 'Text',\n};\n\nconst defaultMessage = 'Copy to clipboard: #{key}, Enter';\n\nfunction format(message: string): string {\n const copyKey = `${/mac os x/i.test(navigator.userAgent) ? '⌘' : 'Ctrl'}+C`;\n return message.replace(/#{\\s*key\\s*}/g, copyKey);\n}\n\n/**\n * Copy text to clipboard\n *\n * @param text Text to copy\n * @param options Options\n * @param options.debug Debug mode\n * @param options.format Format of the data\n * @param options.message Message to show in prompt\n */\nexport function copy(\n text: string,\n options?: { debug?: boolean; format?: 'text/plain' | 'text/html'; message?: string },\n): boolean {\n let reselectPrevious;\n let range;\n let selection;\n let mark;\n let success = false;\n options = options || {};\n const debug = options.debug || false;\n try {\n reselectPrevious = deselectCurrent();\n\n range = document.createRange();\n selection = document.getSelection();\n\n mark = document.createElement('span');\n mark.textContent = text;\n // avoid screen readers from reading out loud the text\n mark.ariaHidden = 'true';\n // reset user styles for span element\n mark.style.all = 'unset';\n // prevents scrolling to the end of the page\n mark.style.position = 'fixed';\n mark.style.top = '0px';\n mark.style.clip = 'rect(0, 0, 0, 0)';\n // used to preserve spaces and line breaks\n mark.style.whiteSpace = 'pre';\n // do not inherit user-select (it may be `none`)\n mark.style.userSelect = 'text';\n mark.addEventListener('copy', e => {\n e.stopPropagation();\n if (options?.format) {\n e.preventDefault();\n if (typeof e.clipboardData === 'undefined') {\n // IE 11\n debug && console.warn('unable to use e.clipboardData');\n debug && console.warn('trying IE specific stuff');\n (window as any).clipboardData?.clearData();\n const _format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting.default;\n (window as any).clipboardData?.setData(_format, text);\n } else {\n // all other browsers\n e.clipboardData?.clearData();\n e.clipboardData?.setData(options.format, text);\n }\n }\n });\n\n document.body.appendChild(mark);\n\n range.selectNodeContents(mark);\n selection?.addRange(range);\n\n // there is no alternative for execCommand\n const successful = document.execCommand('copy');\n if (!successful) {\n throw new Error('copy command was unsuccessful');\n }\n success = true;\n } catch (err) {\n debug && console.error('unable to copy using execCommand: ', err);\n debug && console.warn('trying IE specific stuff');\n try {\n (window as any).clipboardData.setData(options.format || 'text', text);\n // options.onCopy && options.onCopy((window as any).clipboardData);\n success = true;\n } catch (error) {\n debug && console.error('unable to copy using clipboardData: ', error);\n debug && console.error('falling back to prompt');\n const message = format('message' in options ? options.message || '' : defaultMessage);\n window.prompt(message, text);\n }\n } finally {\n if (selection) {\n if (range && typeof selection.removeRange === 'function') {\n selection.removeRange(range);\n } else {\n selection.removeAllRanges();\n }\n }\n\n if (mark) {\n document.body.removeChild(mark);\n }\n reselectPrevious && reselectPrevious();\n }\n\n return success;\n}\n","/**\n * Copyright 2018-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\ndeclare global {\n interface Window {\n sysLang: ioBroker.Languages;\n i18nShow: (filter: string | RegExp) => void;\n i18nDisableWarning: (disable: boolean) => void;\n }\n}\n\ntype I18nWordDictionary = Record<ioBroker.Languages, string>;\n\ntype I18nWordsDictionary = Record<string, I18nWordDictionary>;\n\ntype I18nOneLanguageDictionary = Record<string, string>;\n\ntype I18nDictionary = {\n [lang in ioBroker.Languages]?: I18nOneLanguageDictionary;\n};\n\ntype I18nWordsWithPrefix = I18nDictionary & { prefix?: string };\n\n/**\n * Translation string management.\n */\nexport class I18n {\n /** List of all languages with their translations. */\n static translations: I18nDictionary = {};\n\n /** List of unknown translations during development. */\n static unknownTranslations: string[] = [];\n\n /** The currently displayed language. */\n static lang: ioBroker.Languages = window.sysLang || 'en';\n\n static _disableWarning: boolean = false;\n\n /**\n * Set the language to display\n *\n * @param lang The default language for translations.\n */\n static setLanguage(lang: ioBroker.Languages): void {\n if (lang) {\n I18n.lang = lang;\n }\n }\n\n /**\n * Add translations\n * User can provide two types of structures:\n * - {\"word1\": \"translated word1\", \"word2\": \"translated word2\"}, but in this case the lang must be provided\n * - {\"word1\": {\"en\": \"translated en word1\", \"de\": \"translated de word1\"}, \"word2\": {\"en\": \"translated en word2\", \"de\": \"translated de word2\"}}, but no lang must be provided\n *\n * @param words additional words for specific language\n * @param lang language for the words\n */\n static extendTranslations(\n words: I18nWordsWithPrefix | I18nOneLanguageDictionary | I18nWordsDictionary,\n lang?: ioBroker.Languages,\n ): void {\n // automatically extend all languages with prefix\n if ((words as I18nWordsWithPrefix).prefix) {\n const wordsWithPrefix = words as I18nWordsWithPrefix;\n if (typeof wordsWithPrefix.prefix === 'string') {\n const prefix = wordsWithPrefix.prefix;\n delete wordsWithPrefix.prefix;\n Object.keys(wordsWithPrefix).forEach(key => {\n const _lang = key as ioBroker.Languages;\n const _words: I18nOneLanguageDictionary = {};\n const wordsOfOneLanguage = wordsWithPrefix[_lang];\n Object.keys(wordsOfOneLanguage as Record<string, string>).forEach(word => {\n if (!word) {\n return;\n }\n if (wordsOfOneLanguage) {\n if (!word.startsWith(prefix)) {\n _words[`${prefix}${word}`] = wordsOfOneLanguage[word];\n } else {\n _words[word] = wordsOfOneLanguage[word];\n }\n }\n });\n words[_lang] = _words;\n });\n } else {\n console.warn('Found prefix in translations, but it is not a string');\n }\n }\n\n try {\n if (!lang) {\n // if it is a dictionary with all/many languages\n if (words.en && words.de && words.ru) {\n Object.keys(words).forEach(key => {\n const _lang = key as ioBroker.Languages;\n I18n.translations[_lang] = I18n.translations[_lang] || {};\n const wordsOfOneLang: I18nOneLanguageDictionary | undefined = I18n.translations[_lang];\n Object.assign(wordsOfOneLang as Record<string, string>, words[_lang]);\n });\n } else {\n // It could be vice versa: words.word1 = {en: 'translated word1', de: 'übersetztes Wort2'}\n Object.keys(words).forEach(word => {\n const _word: I18nWordDictionary = (words as I18nWordsDictionary)[word];\n Object.keys(_word).forEach(key => {\n const _lang = key as ioBroker.Languages;\n const languageDictionary: I18nOneLanguageDictionary | undefined = I18n.translations[_lang];\n if (!languageDictionary) {\n console.warn(`Used unknown language: ${_lang}`);\n } else if (!languageDictionary[word]) {\n languageDictionary[word] = _word[_lang];\n } else if (languageDictionary[word] !== _word[_lang]) {\n console.warn(\n `Translation for word \"${word}\" in \"${_lang}\" was ignored: existing = \"${languageDictionary[word]}\", new = ${_word[_lang]}`,\n );\n }\n });\n });\n }\n } else {\n // translations for one language\n if (!I18n.translations[lang]) {\n console.warn(`Used unknown language: ${lang}`);\n }\n I18n.translations[lang] = I18n.translations[lang] || {};\n const languageDictionary: I18nOneLanguageDictionary | undefined = I18n.translations[lang];\n if (languageDictionary) {\n Object.keys(words).forEach(word => {\n if (!languageDictionary[word]) {\n languageDictionary[word] = (words as I18nOneLanguageDictionary)[word];\n } else if (languageDictionary[word] !== (words as I18nOneLanguageDictionary)[word]) {\n console.warn(\n `Translation for word \"${word}\" in \"${lang}\" was ignored: existing = \"${languageDictionary[word]}\", new = ${(words as I18nOneLanguageDictionary)[word]}`,\n );\n }\n });\n }\n }\n } catch (e: any) {\n console.error(`Cannot apply translations: ${e}`);\n }\n }\n\n /**\n * Sets all translations (in all languages).\n *\n * @param translations The translations to add.\n */\n static setTranslations(translations: I18nDictionary): void {\n if (translations) {\n I18n.translations = translations;\n }\n }\n\n /**\n * Get the currently chosen language.\n *\n * @returns The current language.\n */\n static getLanguage(): ioBroker.Languages {\n return I18n.lang;\n }\n\n /**\n * Translate the given string to the selected language\n *\n * @param word The (key) word to look up the string.\n * @param args Optional arguments which will replace the first (second, third, ...) occurrences of %s\n */\n static t(word: string, ...args: any[]): string {\n const translation = I18n.translations[I18n.lang];\n if (translation) {\n const w = translation[word];\n if (w) {\n word = w;\n } else {\n if (!I18n.unknownTranslations.includes(word)) {\n I18n.unknownTranslations.push(word);\n !I18n._disableWarning && console.log(`Translate: ${word}`);\n }\n // fallback to english\n if (I18n.lang !== 'en' && I18n.translations.en) {\n const wordEn = I18n.translations.en[word];\n if (wordEn) {\n word = wordEn;\n }\n }\n }\n }\n for (const arg of args) {\n word = word.replace('%s', arg);\n }\n return word;\n }\n\n /**\n * Show non-translated words\n * Required during development\n *\n * @param filter The filter to apply to the list of non-translated words.\n */\n static i18nShow(filter?: string | RegExp): void {\n /** List words with their translations. */\n const result: Record<string, string> = {};\n if (!filter) {\n I18n.unknownTranslations.forEach(word => (result[word] = word));\n console.log(JSON.stringify(result, null, 2));\n } else if (typeof filter === 'string') {\n I18n.unknownTranslations.forEach(word => {\n if (word.startsWith(filter)) {\n result[word] = word.replace(filter, '');\n }\n });\n console.log(JSON.stringify(result, null, 2));\n } else if (typeof filter === 'object') {\n I18n.unknownTranslations.forEach(word => {\n if (filter.test(word)) {\n result[word] = word;\n }\n });\n console.log(JSON.stringify(result, null, 2));\n }\n }\n\n /**\n * Disable warning about non-translated words\n * Required during development\n *\n * @param disable Whether to disable the warning\n */\n static disableWarning(disable: boolean): void {\n I18n._disableWarning = !!disable;\n }\n}\n\n// install global handlers\nwindow.i18nShow = I18n.i18nShow;\nwindow.i18nDisableWarning = I18n.disableWarning;\n\n/*\nI18n.translations = {\n 'en': require('./i18n/en'),\n 'ru': require('./i18n/ru'),\n 'de': require('./i18n/de'),\n};\nI18n.fallbacks = true;\nI18n.t = function () {};\n*/\n","/**\n * Copyright 2018-2024 Denis Haev <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport React from 'react';\n\nimport { copy } from './CopyToClipboard';\nimport { I18n } from '../i18n';\nimport type { IobTheme, ThemeName, ThemeType } from '../types';\n\nconst NAMESPACE = 'material';\nconst days = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst QUALITY_BITS: Record<ioBroker.STATE_QUALITY[keyof ioBroker.STATE_QUALITY], string> = {\n 0x00: '0x00 - good',\n\n 0x01: '0x01 - general problem',\n 0x02: '0x02 - no connection problem',\n\n 0x10: '0x10 - substitute value from controller',\n 0x20: '0x20 - substitute initial value',\n 0x40: '0x40 - substitute value from device or instance',\n 0x80: '0x80 - substitute value from sensor',\n\n 0x11: '0x11 - general problem by instance',\n 0x41: '0x41 - general problem by device',\n 0x81: '0x81 - general problem by sensor',\n\n 0x12: '0x12 - instance not connected',\n 0x42: '0x42 - device not connected',\n 0x82: '0x82 - sensor not connected',\n\n 0x44: '0x44 - device reports error',\n 0x84: '0x84 - sensor reports error',\n};\nconst SIGNATURES: Record<string, string> = {\n JVBERi0: 'pdf',\n R0lGODdh: 'gif',\n R0lGODlh: 'gif',\n iVBORw0KGgo: 'png',\n '/9j/': 'jpg',\n PHN2Zw: 'svg',\n Qk1: 'bmp',\n AAABAA: 'ico', // 00 00 01 00 according to https://en.wikipedia.org/wiki/List_of_file_signatures\n};\n\ntype SmartName =\n | null\n | false\n | string\n | ({ [lang in ioBroker.Languages]?: string } & {\n /** Which kind of device it is */\n smartType?: string | null;\n /** Which value to set when the ON command is issued */\n byON?: string | null;\n });\n\ntype ClassDictionary = Record<string, any>;\ntype ClassValue = ClassArray | ClassDictionary | string | number | null | boolean | undefined;\ntype ClassArray = ClassValue[];\n\nexport class Utils {\n static namespace = NAMESPACE;\n\n static INSTANCES = 'instances';\n\n static dateFormat = ['DD', 'MM'];\n\n static FORBIDDEN_CHARS = /[^._\\-/ :!#$%&()+=@^{}|~\\p{Ll}\\p{Lu}\\p{Nd}]+/gu;\n\n /**\n * Capitalize words.\n */\n static CapitalWords(name: string | null | undefined): string {\n return (name || '')\n .split(/[\\s_]/)\n .filter(item => item)\n .map(word => (word ? word[0].toUpperCase() + word.substring(1).toLowerCase() : ''))\n .join(' ');\n }\n\n static formatSeconds(seconds: number): string {\n const days_ = Math.floor(seconds / (3600 * 24));\n seconds %= 3600 * 24;\n\n const hours = Math.floor(seconds / 3600)\n .toString()\n .padStart(2, '0');\n seconds %= 3600;\n\n const minutes = Math.floor(seconds / 60)\n .toString()\n .padStart(2, '0');\n seconds %= 60;\n\n const secondsStr = Math.floor(seconds).toString().padStart(2, '0');\n\n let text = '';\n if (days_) {\n text += `${days_} ${I18n.t('ra_daysShortText')} `;\n }\n text += `${hours}:${minutes}:${secondsStr}`;\n\n return text;\n }\n\n /**\n * Get the name of the object by id from the name or description.\n */\n static getObjectName(\n objects: Record<string, ioBroker.Object>,\n id: string,\n settings?: { name: ioBroker.StringOrTranslated } | ioBroker.Languages | null,\n options?: { language?: ioBroker.Languages },\n /** Set to true to get the description. */\n isDesc?: boolean,\n ): string {\n const item = objects[id];\n let text: string | undefined;\n\n if (typeof settings === 'string' && !options) {\n options = { language: settings };\n settings = null;\n }\n\n options = options || {};\n if (!options.language) {\n options.language =\n (objects['system.config'] &&\n objects['system.config'].common &&\n objects['system.config'].common.language) ||\n window.sysLang ||\n 'en';\n }\n if ((settings as { name: ioBroker.StringOrTranslated })?.name) {\n const textObj = (settings as { name: ioBroker.StringOrTranslated }).name;\n if (typeof textObj === 'object') {\n text = (options.language && textObj[options.language]) || textObj.en;\n } else {\n text = textObj;\n }\n } else if (isDesc && item?.common?.desc) {\n const textObj = item.common.desc;\n if (typeof textObj === 'object') {\n text = (options.language && textObj[options.language]) || textObj.en || textObj.de || textObj.ru || '';\n } else {\n text = textObj;\n }\n text = (text || '').toString().replace(/[_.]/g, ' ');\n\n if (text === text.toUpperCase()) {\n text = text[0] + text.substring(1).toLowerCase();\n }\n } else if (!isDesc && item?.common) {\n const textObj = item.common.name || item.common.desc;\n if (textObj && typeof textObj === 'object') {\n text = (options.language && textObj[options.language]) || textObj.en || textObj.de || textObj.ru || '';\n } else {\n text = textObj as string;\n }\n text = (text || '').toString().replace(/[_.]/g, ' ');\n\n if (text === text.toUpperCase()) {\n text = text[0] + text.substring(1).toLowerCase();\n }\n } else {\n const pos = id.lastIndexOf('.');\n text = id.substring(pos + 1).replace(/[_.]/g, ' ');\n text = Utils.CapitalWords(text);\n }\n\n return text?.trim() || '';\n }\n\n /**\n * Get the name of the object from the name or description.\n */\n static getObjectNameFromObj(\n obj: ioBroker.PartialObject,\n /** settings or language */\n settings: { name: ioBroker.StringOrTranslated } | ioBroker.Languages | null,\n options?: { language?: ioBroker.Languages },\n /** Set to true to get the description. */\n isDesc?: boolean,\n /** Allow using spaces in name (by edit) */\n noTrim?: boolean,\n ): string {\n const item = obj;\n let text = (obj && obj._id) || '';\n\n if (typeof settings === 'string' && !options) {\n options = { language: settings };\n settings = null;\n }\n\n options = options || {};\n\n if ((settings as { name: ioBroker.StringOrTranslated })?.name) {\n const name = (settings as { name: ioBroker.StringOrTranslated }).name;\n if (typeof name === 'object') {\n text = (options.language && name[options.language]) || name.en;\n } else {\n text = name;\n }\n } else if (isDesc && item?.common?.desc) {\n const desc: ioBroker.StringOrTranslated = item.common.desc;\n if (typeof desc === 'object') {\n text = (options.language && desc[options.language]) || desc.en;\n } else {\n text = desc;\n }\n text = (text || '').toString().replace(/[_.]/g, ' ');\n\n if (text === text.toUpperCase()) {\n text = text[0] + text.substring(1).toLowerCase();\n }\n } else if (!isDesc && item?.common?.name) {\n let name = item.common.name;\n if (!name && item.common.desc) {\n name = item.common.desc;\n }\n if (typeof name === 'object') {\n text = (options.language && name[options.language]) || name.en;\n } else {\n text = name;\n }\n text = (text || '').toString().replace(/[_.]/g, ' ');\n\n if (text === text.toUpperCase()) {\n text = text[0] + text.substring(1).toLowerCase();\n }\n }\n return noTrim ? text : text.trim();\n }\n\n /**\n * Extracts from the object material settings, depends on username\n */\n static getSettingsOrder(\n obj: ioBroker.StateObject | ioBroker.StateCommon,\n forEnumId: string,\n options: { user?: string },\n ): string | null {\n let common: ioBroker.StateCommon | undefined;\n if (obj && Object.prototype.hasOwnProperty.call(obj, 'common')) {\n common = (obj as ioBroker.StateObject).common;\n } else {\n common = obj as any as ioBroker.StateCommon;\n }\n let settings;\n if (common?.custom) {\n settings = common.custom[NAMESPACE];\n const user = options.user || 'admin';\n if (settings && settings[user]) {\n if (forEnumId) {\n if (settings[user].subOrder && settings[user].subOrder[forEnumId]) {\n return JSON.parse(JSON.stringify(settings[user].subOrder[forEnumId]));\n }\n } else if (settings[user].order) {\n return JSON.parse(JSON.stringify(settings[user].order));\n }\n }\n }\n return null;\n }\n\n /**\n Used in material\n */\n static getSettingsCustomURLs(\n obj: ioBroker.StateObject | ioBroker.StateCommon,\n forEnumId: string,\n options: { user?: string },\n ): string | null {\n let common: ioBroker.StateCommon | undefined;\n if (obj && Object.prototype.hasOwnProperty.call(obj, 'common')) {\n common = (obj as ioBroker.StateObject).common;\n } else {\n common = obj as any as ioBroker.StateCommon;\n }\n let settings;\n if (common?.custom) {\n settings = common.custom[NAMESPACE];\n const user = options.user || 'admin';\n if (settings && settings[user]) {\n if (forEnumId) {\n if (settings[user].subURLs && settings[user].subURLs[forEnumId]) {\n return JSON.parse(JSON.stringify(settings[user].subURLs[forEnumId]));\n }\n } else if (settings[user].URLs) {\n return JSON.parse(JSON.stringify(settings[user].URLs));\n }\n }\n }\n return null;\n }\n\n /**\n * Reorder the array items in list between source and dest.\n */\n static reorder(list: Iterable<any> | ArrayLike<any>, source: number, dest: number): Iterable<any> | ArrayLike<any> {\n const result = Array.from(list);\n const [removed] = result.splice(source, 1);\n result.splice(dest, 0, removed);\n return result;\n }\n\n /**\n Get smart name settings for the given object.\n */\n static getSettings(\n obj: ioBroker.StateObject | ioBroker.StateCommon,\n options: {\n id?: string;\n user?: string;\n name?: ioBroker.StringOrTranslated;\n icon?: string;\n color?: string;\n language?: ioBroker.Languages;\n },\n defaultEnabling?: boolean,\n ): {\n name: string;\n enabled?: boolean;\n useCustom?: boolean;\n icon?: string;\n color?: string;\n } {\n let settings;\n const id = (obj as ioBroker.StateObject)?._id || options?.id;\n let common: ioBroker.StateCommon | undefined;\n if (obj && Object.prototype.hasOwnProperty.call(obj, 'common')) {\n common = (obj as ioBroker.StateObject).common;\n } else {\n common = obj as ioBroker.StateCommon;\n }\n if (common?.custom) {\n settings = common.custom;\n settings =\n settings[NAMESPACE] && settings[NAMESPACE][options.user || 'admin']\n ? JSON.parse(JSON.stringify(settings[NAMESPACE][options.user || 'admin']))\n : { enabled: true };\n } else {\n settings = { enabled: defaultEnabling === undefined ? true : defaultEnabling, useCustom: false };\n }\n\n if (!Object.prototype.hasOwnProperty.call(settings, 'enabled')) {\n settings.enabled = defaultEnabling === undefined ? true : defaultEnabling;\n }\n\n if (options) {\n if (!settings.name && options.name) {\n settings.name = options.name;\n }\n if (!settings.icon && options.icon) {\n settings.icon = options.icon;\n }\n if (!settings.color && options.color) {\n settings.color = options.color;\n }\n }\n\n if (common) {\n if (!settings.color && common.color) {\n settings.color = common.color;\n }\n if (!settings.icon && common.icon) {\n settings.icon = common.icon;\n }\n if (!settings.name && common.name) {\n settings.name = common.name;\n }\n }\n\n if (typeof settings.name === 'object') {\n settings.name = (options.language && settings.name[options.language]) || settings.name.en;\n\n settings.name = (settings.name || '').toString().replace(/_/g, ' ');\n\n if (settings.name === settings.name.toUpperCase()) {\n settings.name = settings.name[0] + settings.name.substring(1).toLowerCase();\n }\n }\n if (!settings.name && id) {\n const pos = id.lastIndexOf('.');\n settings.name = id.substring(pos + 1).replace(/[_.]/g, ' ');\n settings.name = (settings.name || '').toString().replace(/_/g, ' ');\n settings.name = Utils.CapitalWords(settings.name);\n }\n\n return settings;\n }\n\n /**\n Sets smartName settings for the given object.\n */\n static setSettings(\n obj: Partial<ioBroker.Object>,\n settings: Record<string, any>,\n options: { user?: string; language?: ioBroker.Languages },\n ): boolean {\n if (obj) {\n obj.common = obj.common || ({} as ioBroker.StateCommon);\n obj.common.custom = obj.common.custom || {};\n obj.common.custom[NAMESPACE] = obj.common.custom[NAMESPACE] || {};\n obj.common.custom[NAMESPACE][options.user || 'admin'] = settings;\n const s = obj.common.custom[NAMESPACE][options.user || 'admin'];\n if (s.useCommon) {\n if (s.color !== undefined) {\n obj.common.color = s.color;\n delete s.color;\n }\n if (s.icon !== undefined) {\n obj.common.icon = s.icon;\n delete s.icon;\n }\n if (s.name !== undefined) {\n if (typeof obj.common.name !== 'object' && options.language) {\n obj.common.name = { [options.language]: s.name } as ioBroker.StringOrTranslated;\n } else if (typeof obj.common.name === 'object' && options.language) {\n obj.common.name[options.language] = s.name;\n }\n delete s.name;\n }\n }\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Get the icon for the given settings.\n */\n static getIcon(\n settings: { icon?: string; name?: string; prefix?: string },\n style?: React.CSSProperties,\n ): React.JSX.Element | null {\n if (settings?.icon) {\n // If UTF-8 icon\n if (settings.icon.length <= 2) {\n return <span style={style || {}}>{settings.icon}</span>;\n }\n if (settings.icon.startsWith('data:image')) {\n return (\n <img\n alt={settings.name}\n src={settings.icon}\n style={style || {}}\n />\n );\n }\n // maybe later some changes for a second type\n return (\n <img\n alt={settings.name}\n src={(settings.prefix || '') + settings.icon}\n style={style}\n />\n );\n }\n return null;\n }\n\n /**\n * Get the icon for the given object.\n */\n static getObjectIcon(id: string | ioBroker.PartialObject, obj?: ioBroker.PartialObject): string | null {\n // If id is Object\n if (typeof id === 'object') {\n obj = id;\n id = obj?._id;\n }\n\n if (obj?.common?.icon) {\n let icon = obj.common.icon;\n // If UTF-8 icon\n if (typeof icon === 'string' && icon.length <= 2) {\n return icon;\n }\n if (icon.startsWith('data:image')) {\n return icon;\n }\n\n const parts = id.split('.');\n if (parts[0] === 'system') {\n icon = `adapter/${parts[2]}${icon.startsWith('/') ? '' : '/'}${icon}`;\n } else {\n icon = `adapter/${parts[0]}${icon.startsWith('/') ? '' : '/'}${icon}`;\n }\n\n if (window.location.pathname.match(/adapter\\/[^/]+\\/[^/]+\\.html/)) {\n icon = `../../${icon}`;\n } else if (window.location.pathname.match(/material\\/[.\\d]+/)) {\n icon = `../../${icon}`;\n } else if (window.location.pathname.match(/material\\//)) {\n icon = `../${icon}`;\n }\n return icon;\n }\n\n return null;\n }\n\n /**\n * Converts word1_word2 to word1Word2.\n */\n static splitCamelCase(text: string | null | undefined): string {\n // if (false && text !== text.toUpperCase()) {\n // const words = text.split(/\\s+/);\n // for (let i = 0; i < words.length; i++) {\n // const word = words[i];\n // if (word.toLowerCase() !== word && word.toUpperCase() !== word) {\n // let z = 0;\n // const ww = [];\n // let start = 0;\n // while (z < word.length) {\n // if (word[z].match(/[A-ZÜÄÖА-Я]/)) {\n // ww.push(word.substring(start, z));\n // start = z;\n // }\n // z++;\n // }\n // if (start !== z) {\n // ww.push(word.substring(start, z));\n // }\n // for (let k = 0; k < ww.length; k++) {\n // words.splice(i + k, 0, ww[k]);\n // }\n // i += ww.length;\n // }\n // }\n //\n // return words.map(w => {\n // w = w.trim();\n // if (w) {\n // return w[0].toUpperCase() + w.substring(1).toLowerCase();\n // }\n // return '';\n // }).join(' ');\n // }\n return text ? Utils.CapitalWords(text) : '';\n }\n\n /**\n * Check if the given color is bright.\n * https://stackoverflow.com/questions/35969656/how-can-i-generate-the-opposite-color-according-to-current-color\n */\n static isUseBright(color: string | null | undefined, defaultValue?: boolean): boolean {\n if (!color) {\n return defaultValue === undefined ? true : defaultValue;\n }\n color = color.toString();\n if (color.startsWith('#')) {\n color = color.slice(1);\n }\n let r;\n let g;\n let b;\n\n const rgb = color.match(/^rgba?[\\s+]?\\([\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?/i);\n if (rgb && rgb.length === 4) {\n r = parseInt(rgb[1], 10);\n g = parseInt(rgb[2], 10);\n b = parseInt(rgb[3], 10);\n } else {\n // convert 3-digit hex to 6-digits.\n if (color.length === 3) {\n color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2];\n }\n // remove alfa channel\n if (color.length === 8) {\n color = color.substring(0, 6);\n } else if (color.length !== 6) {\n return false;\n }\n\n r = parseInt(color.slice(0, 2), 16);\n g = parseInt(color.slice(2, 4), 16);\n b = parseInt(color.slice(4, 6), 16);\n }\n\n // http://stackoverflow.com/a/3943023/112731\n return r * 0.299 + g * 0.587 + b * 0.114 <= 186;\n }\n\n /**\n * Get the time string in the format 00:00.\n */\n static getTimeString(seconds: string | number): string {\n seconds = parseFloat(seconds as string);\n if (Number.isNaN(seconds)) {\n return '--:--';\n }\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60)\n .toString()\n .padStart(2, '0');\n const secs = (seconds % 60).toString().padStart(2, '0');\n if (hours) {\n return `${hours}:${minutes}:${secs}`;\n }\n\n return `${minutes}:${secs}`;\n }\n\n /**\n * Gets the wind direction with the given angle (degrees).\n */\n static getWindDirection(\n /** angle in degrees from 0° to 360° */\n angle: number,\n ): string {\n if (angle >= 0 && angle < 11.25) {\n return 'N';\n }\n if (angle >= 11.25 && angle < 33.75) {\n return 'NNE';\n }\n if (angle >= 33.75 && angle < 56.25) {\n return 'NE';\n }\n if (angle >= 56.25 && angle < 78.75) {\n return 'ENE';\n }\n if (angle >= 78.75 && angle < 101.25) {\n return 'E';\n }\n if (angle >= 101.25 && angle < 123.75) {\n return 'ESE';\n }\n if (angle >= 123.75 && angle < 146.25) {\n return 'SE';\n }\n if (angle >= 146.25 && angle < 168.75) {\n return 'SSE';\n }\n if (angle >= 168.75 && angle < 191.25) {\n return 'S';\n }\n if (angle >= 191.25 && angle < 213.75) {\n return 'SSW';\n }\n if (angle >= 213.75 && angle < 236.25) {\n return 'SW';\n }\n if (angle >= 236.25 && angle < 258.75) {\n return 'WSW';\n }\n if (angle >= 258.75 && angle < 281.25) {\n return 'W';\n }\n if (angle >= 281.25 && angle < 303.75) {\n return 'WNW';\n }\n if (angle >= 303.75 && angle < 326.25) {\n return 'NW';\n }\n if (angle >= 326.25 && angle < 348.75) {\n return 'NNW';\n }\n // if (angle >= 348.75) {\n return 'N';\n }\n\n /**\n * Pad the given number with a zero if it's not two digits long.\n */\n static padding(num: string | number): string {\n if (typeof num === 'string') {\n if (num.length < 2) {\n return `0${num}`;\n }\n return num;\n }\n if (num < 10) {\n return `0${num}`;\n }\n return num.toString();\n }\n\n /**\n * Sets the date format.\n */\n static setDataFormat(format: string): void {\n if (format) {\n Utils.dateFormat = format.toUpperCase().split(/[.-/]/);\n Utils.dateFormat.splice(Utils.dateFormat.indexOf('YYYY'), 1);\n }\n }\n\n /**\n * Converts the date to a string.\n */\n static date2string(now: string | number | Date): string {\n if (typeof now === 'string') {\n now = now.trim();\n if (!now) {\n return '';\n }\n // only letters\n if (now.match(/^[\\w\\s]+$/)) {\n // Day of the week\n return now;\n }\n const m = now.match(/(\\d{1,4})[-./](\\d{1,2})[-./](\\d{1,4})/);\n if (m) {\n const a = [parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10)];\n // We now have 3 numbers. Let's try to detect where is year, where is day and where is month\n const year = a.find(y => y > 31);\n if (year !== undefined) {\n a.splice(a.indexOf(year), 1);\n\n const day = a.find(mm => mm > 12);\n if (day) {\n a.splice(a.indexOf(day), 1);\n now = new Date(year, a[0] - 1, day);\n } else if (Utils.dateFormat[0][0] === 'M' && Utils.dateFormat[1][0] === 'D') {\n // MM DD\n now = new Date(year, a[0] - 1, a[1]);\n if (Math.abs(now.getTime() - Date.now()) > 3600000 * 24 * 10) {\n now = new Date(year, a[1] - 1, a[0]);\n }\n } else if (Utils.dateFormat[0][0] === 'D' && Utils.dateFormat[1][0] === 'M') {\n // DD MM\n now = new Date(year, a[1] - 1, a[0]);\n if (Math.abs(now.getTime() - Date.now()) > 3600000 * 24 * 10) {\n now = new Date(year, a[0] - 1, a[1]);\n }\n } else {\n now = new Date(now);\n }\n } else {\n now = new Date(now);\n }\n } else {\n now = new Date(now);\n }\n } else {\n now = new Date(now);\n }\n\n let date = I18n.t(`ra_dow_${days[now.getDay()]}`).replace('ra_dow_', '');\n date += `. ${now.getDate()} ${I18n.t(`ra_month_${months[now.getMonth()]}`).replace('ra_month_', '')}`;\n return date;\n }\n\n /**\n * Render a text as a link.\n */\n static renderTextWithA(text: string): React.JSX.Element[] | string {\n let m: RegExpMatchArray | null = text.match(/<a [^<]+<\\/a>|<br\\s?\\/?>|<b>[^<]+<\\/b>|<i>[^<]+<\\/i>/);\n if (m) {\n const result: React.JSX.Element[] = [];\n let key = 1;\n do {\n const start = text.substring(0, m.index);\n text = text.substring((m.index || 0) + m[0].length);\n start && result.push(<span key={`a${key++}`}>{start}</span>);\n\n if (m[0].startsWith('<b>')) {\n result.push(<b key={`a${key++}`}>{m[0].substring(3, m[0].length - 4)}</b>);\n } else if (m[0].startsWith('<i>')) {\n result.push(<i key={`a${key++}`}>{m[0].substring(3, m[0].length - 4)}</i>);\n } else if (m[0].startsWith('<br')) {\n result.push(<br key={`a${key++}`} />);\n } else {\n const href = m[0].match(/href=\"([^\"]+)\"/) || m[0].match(/href='([^']+)'/);\n const target = m[0].match(/target=\"([^\"]+)\"/) || m[0].match(/target='([^']+)'/);\n const rel = m[0].match(/rel=\"([^\"]+)\"/) || m[0].match(/rel='([^']+)'/);\n const title = m[0].match(/>([^<]*)</);\n\n result.push(\n // eslint-disable-next-line react/jsx-no-target-blank\n <a\n key={`a${key++}`}\n href={href ? href[1] : ''}\n target={target ? target[1] : '_blank'}\n rel={rel ? rel[1] : 'noreferrer'}\n style={{ color: 'inherit' }}\n >\n {title ? title[1] : ''}\n </a>,\n );\n }\n\n m = text ? text.match(/<a [^<]+<\\/a>|<br\\/?>|<b>[^<]+<\\/b>|<i>[^<]+<\\/i>/) : null;\n if (!m) {\n text && result.push(<span key={`a${key++}`}>{text}</span>);\n }\n } while (m);\n\n return result;\n }\n\n return text;\n }\n\n /**\n * Get the smart name of the given state.\n */\n static getSmartName(\n states: Record<string, ioBroker.StateObject> | ioBroker.StateObject | ioBroker.StateCommon,\n id: string,\n instanceId: string,\n noCommon?: boolean,\n ): SmartName | undefined {\n if (!id) {\n if (!noCommon) {\n if (!(states as ioBroker.StateObject).common) {\n return (states as ioBroker.StateCommon).smartName;\n }\n if (states && !(states as ioBroker.StateObject).common) {\n return (states as ioBroker.StateCommon).smartName;\n }\n return (states as ioBroker.StateObject).common.smartName;\n }\n if (states && !(states as ioBroker.StateObject).common) {\n return (states as ioBroker.StateCommon).smartName;\n }\n const obj = states as ioBroker.StateObject;\n return obj?.common?.custom && obj.common.custom[instanceId]\n ? obj.common.custom[instanceId].smartName\n : undefined;\n }\n if (!noCommon) {\n return (states as Record<string, ioBroker.StateObject>)[id].common.smartName;\n }\n const obj = (states as Record<string, ioBroker.StateObject>)[id];\n\n return obj?.common?.custom && obj.common.custom[instanceId]\n ? obj.common.custom[instanceId].smartName || null\n : null;\n }\n\n /**\n * Get the smart name from a state.\n */\n static getSmartNameFromObj(\n obj: ioBroker.StateObject | ioBroker.StateCommon,\n instanceId: string,\n noCommon?: boolean,\n ): SmartName | undefined {\n if (!noCommon) {\n if (!(obj as ioBroker.StateObject).common) {\n return (obj as ioBroker.StateCommon).smartName;\n }\n if (obj && !(obj as ioBroker.StateObject).common) {\n return (obj as ioBroker.StateCommon).smartName;\n }\n\n return (obj as ioBroker.StateObject).common.smartName;\n }\n if (obj && !(obj as ioBroker.StateObject).common) {\n return (obj as ioBroker.StateCommon).smartName;\n }\n\n const custom: Record<string, string> | undefined | null = (obj as ioBroker.StateObject)?.common?.custom?.[\n instanceId\n ];\n\n return custom ? custom.smartName : undefined;\n }\n\n /**\n * Enable smart name for a state.\n */\n static enableSmartName(obj: ioBroker.StateObject, instanceId: string, noCommon?: boolean): void {\n if (noCommon) {\n obj.common.custom = obj.common.custom || {};\n obj.common.custom[instanceId] = obj.common.custom[instanceId] || {};\n obj.common.custom[instanceId].smartName = {};\n } else {\n obj.common.smartName = {};\n }\n }\n\n /**\n * Completely remove smart name from a state.\n */\n static removeSmartName(obj: ioBroker.StateObject, instanceId: string, noCommon?: boolean): void {\n if (noCommon) {\n if (obj.common && obj.common.custom && obj.common.custom[instanceId]) {\n obj.common.custom[instanceId] = null;\n }\n } else {\n obj.common.smartName = null;\n }\n }\n\n /**\n * Update the smart name of a state.\n */\n static updateSmartName(\n obj: ioBroker.StateObject,\n newSmartName: ioBroker.StringOrTranslated,\n byON: string | null,\n smartType: string | null,\n instanceId: string,\n noCommon?: boolean,\n ): void {\n const language = I18n.getLanguage();\n\n // convert the old format\n if (typeof obj.common.smartName === 'string') {\n const nnn = obj.common.smartName;\n obj.common.smartName = {};\n obj.common.smartName[language] = nnn;\n }\n\n // convert the old settings\n if (obj.native && obj.native.byON) {\n delete obj.native.byON;\n let _smartName: SmartName = obj.common.smartName as SmartName;\n\n if (_smartName && typeof _smartName !== 'object') {\n _smartName = {\n en: _smartName,\n [language]: _smartName,\n };\n }\n obj.common.smartName = _smartName;\n }\n if (smartType !== undefined) {\n if (noCommon) {\n obj.common.custom = obj.common.custom || {};\n obj.common.custom[instanceId] = obj.common.custom[instanceId] || {};\n obj.common.custom[instanceId].smartName = obj.common.custom[instanceId].smartName || {};\n if (!smartType) {\n delete obj.common.custom[instanceId].smartName.smartType;\n } else {\n obj.common.custom[instanceId].smartName.smartType = smartType;\n }\n } else {\n obj.common.smartName = obj.common.smartName || {};\n if (!smartType) {\n // @ts-expect-error fixed in js-controller\n delete obj.common.smartName.smartType;\n } else {\n // @ts-expect-error fixed in js-controller\n obj.common.smartName.smartType = smartType;\n }\n }\n }\n\n if (byON !== undefined) {\n if (noCommon) {\n obj.common.custom = obj.common.custom || {};\n obj.common.custom[instanceId] = obj.common.custom[instanceId] || {};\n obj.common.custom[instanceId].smartName = obj.common.custom[instanceId].smartName || {};\n obj.common.custom[instanceId].smartName.byON = byON;\n } else {\n obj.common.smartName = obj.common.smartName || {};\n // @ts-expect-error fixed in js-controller\n obj.common.smartName.byON = byON;\n }\n }\n\n if (newSmartName !== undefined) {\n let smartName;\n if (noCommon) {\n obj.common.custom = obj.common.custom || {};\n obj.common.custom[instanceId] = obj.common.custom[instanceId] || {};\n obj.common.custom[instanceId].smartName = obj.common.custom[instanceId].smartName || {};\n smartName = obj.common.custom[instanceId].smartName;\n } else {\n obj.common.smartName = obj.common.smartName || {};\n smartName = obj.common.smartName;\n }\n smartName[language] = newSmartName;\n\n // If smart name deleted\n if (\n smartName &&\n (!smartName[language] ||\n (smartName[language] === obj.common.name &&\n (!obj.common.role || obj.common.role.includes('button'))))\n ) {\n delete smartName[language];\n let empty = true;\n // Check if the structure has any definitions\n for (const key in smartName) {\n if (Object.prototype.hasOwnProperty.call(smartName, key)) {\n empty = false;\n break;\n }\n }\n // If empty => delete smartName completely\n if (empty) {\n if (noCommon && obj.common.custom && obj.common.custom[instanceId]) {\n if (obj.common.custom[instanceId].smartName.byON === undefined) {\n delete obj.common.custom[instanceId];\n } else {\n delete obj.common.custom[instanceId].en;\n delete obj.common.custom[instanceId].de;\n delete obj.common.custom[instanceId].ru;\n delete obj.common.custom[instanceId].nl;\n delete obj.common.custom[instanceId].pl;\n delete obj.common.custom[instanceId].it;\n delete obj.common.custom[instanceId].fr;\n delete obj.common.custom[instanceId].pt;\n delete obj.common.custom[instanceId].es;\n delete obj.common.custom[instanceId].uk;\n delete obj.common.custom[instanceId]['zh-cn'];\n }\n // @ts-expect-error fixed in js-controller\n } else if (obj.common.smartName && (obj.common.smartName as SmartName).byON !== undefined) {\n const _smartName: { [lang in ioBroker.Languages]?: string } = obj.common.smartName as {\n [lang in ioBroker.Languages]?: string;\n };\n delete _smartName.en;\n delete _smartName.de;\n delete _smartName.ru;\n delete _smartName.nl;\n delete _smartName.pl;\n delete _smartName.it;\n delete _smartName.fr;\n delete _smartName.pt;\n delete _smartName.es;\n delete _smartName.uk;\n delete _smartName['zh-cn'];\n } else {\n obj.common.smartName = null;\n }\n }\n }\n }\n }\n\n /**\n * Disable the smart name of a state.\n */\n static disableSmartName(obj: ioBroker.StateObject, instanceId: string, noCommon?: boolean): void {\n if (noCommon) {\n obj.common.custom = obj.common.custom || {};\n obj.common.custom[instanceId] = obj.common.custom[instanceId] || {};\n obj.common.custom[instanceId].smartName = false;\n } else {\n obj.common.smartName = false;\n }\n }\n\n /**\n * Copy text to the clipboard.\n */\n static copyToClipboard(text: string, e?: Event): boolean {\n if (e) {\n e.stopPropagation();\n e.preventDefault();\n }\n return copy(text);\n }\n\n /**\n * Gets the extension of a file name.\n *\n * @param fileName the file name.\n * @returns The extension in lower case.\n */\n static getFileExtension(fileName: string): string | null {\n const pos = (fileName || '').lastIndexOf('.');\n if (pos !== -1) {\n return fileName.substring(pos + 1).toLowerCase();\n }\n return null;\n }\n\n /**\n * Format number of bytes as a string with B, KB, MB or GB.\n * The base for all calculations is 1024.\n *\n * @param bytes The number of bytes.\n * @returns The formatted string (e.g. '723.5 KB')\n */\n static formatBytes(bytes: number): string {\n if (Math.abs(bytes) < 1024) {\n return `${bytes} B`;\n }\n\n const units = ['KB', 'MB', 'GB'];\n // const units = ['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'];\n let u = -1;\n\n do {\n bytes /= 1024;\n ++u;\n } while (Math.abs(bytes) >= 1024 && u < units.length - 1);\n\n return `${bytes.toFixed(1)} ${units[u]}`;\n }\n\n /**\n * Invert the given color according to a theme type to get the inverted text color for background\n *\n * @param color Color in the format '#rrggbb' or '#rgb' (or without a hash)\n * @param themeType 'light' or 'dark'\n * @param invert If true, the dark theme has a light color in the control, or the dark theme has a light color in the control\n */\n static getInvertedColor(color: string, themeType: ThemeType, invert?: boolean): string | undefined {\n if (!color) {\n return undefined;\n }\n const invertedColor = Utils.invertColor(color, true);\n if (invertedColor === '#FFFFFF' && (themeType === 'dark' || (invert && themeType === 'light'))) {\n return '#DDD';\n }\n if (invertedColor === '#000000' && (themeType === 'light' || (invert && themeType === 'dark'))) {\n return '#222';\n }\n\n return undefined;\n }\n\n // Big thanks to: https://stackoverflow.com/questions/35969656/how-can-i-generate-the-opposite-color-according-to-current-color\n /**\n * Invert the given color\n *\n * @param hex Color in the format '#rrggbb' or '#rgb' (or without a hash)\n * @param bw Set to black or white.\n */\n static invertColor(hex: string, bw?: boolean): string {\n if (hex === undefined || hex === null || hex === '' || typeof hex !== 'string') {\n return '';\n }\n if (hex.startsWith('rgba')) {\n const m = hex.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*([.\\d]+)\\)/);\n if (m) {\n hex =\n parseInt(m[1], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0');\n }\n } else if (hex.startsWith('rgb')) {\n const m = hex.match(/rgb?\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (m) {\n hex =\n parseInt(m[1], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0');\n }\n } else if (hex.startsWith('#')) {\n hex = hex.slice(1);\n }\n // convert 3-digit hex to 6-digits.\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n let alfa = null;\n if (hex.length === 8) {\n alfa = hex.substring(6, 8);\n hex = hex.substring(0, 6);\n } else if (hex.length !== 6) {\n console.warn(`Cannot invert color: ${hex}`);\n return hex;\n }\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n\n if (bw) {\n // http://stackoverflow.com/a/3943023/112731\n return r * 0.299 + g * 0.587 + b * 0.114 > 186 ? `#000000${alfa || ''}` : `#FFFFFF${alfa || ''}`;\n }\n // invert color components\n const rs = (255 - r).toString(16);\n const gs = (255 - g).toString(16);\n const bd = (255 - b).toString(16);\n // pad each with zeros and return\n return `#${rs.padStart(2, '0')}${gs.padStart(2, '0')}${bd.padStart(2, '0')}${alfa || ''}`;\n }\n\n /**\n * Convert RGB to array [r, g, b]\n *\n * @param hex Color in the format '#rrggbb' or '#rgb' (or without hash) or rgb(r,g,b) or rgba(r,g,b,a)\n * @returns Array with 3 elements [r, g, b]\n */\n static color2rgb(hex: string): false | [number, number, number] | '' {\n if (hex === undefined || hex === null || hex === '' || typeof hex !== 'string') {\n return false;\n }\n if (hex.startsWith('rgba')) {\n const m = hex.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*([.\\d]+)\\)/);\n if (m) {\n hex =\n parseInt(m[1], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0');\n }\n } else if (hex.startsWith('rgb')) {\n const m = hex.match(/rgb?\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (m) {\n hex =\n parseInt(m[1], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0') +\n parseInt(m[2], 10).toString(16).padStart(2, '0');\n }\n } else if (hex.startsWith('#')) {\n hex = hex.slice(1);\n }\n // convert 3-digit hex to 6-digits.\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n if (hex.length !== 6 && hex.length !== 8) {\n console.warn(`Cannot invert color: ${hex}`);\n return false;\n }\n\n return [parseInt(hex.slice(0, 2), 16), parseInt(hex.slice(2, 4), 16), parseInt(hex.slice(4, 6), 16)];\n }\n\n // Big thanks to: https://github.com/antimatter15/rgb-lab\n /**\n * Convert RGB to LAB\n *\n * @param rgb color in format [r,g,b]\n * @returns lab color in format [l,a,b]\n */\n static rgb2lab(rgb: [number, number, number]): [number, number, number] {\n let r = rgb[0] / 255;\n let g = rgb[1] / 255;\n let b = rgb[2] / 255;\n\n r = r > 0.04045 ? ((r + 0.055) / 1.055) ** 2.4 : r / 12.92;\n g = g > 0.04045 ? ((g + 0.055) / 1.055) ** 2.4 : g / 12.92;\n b = b > 0.04045 ? ((b + 0.055) / 1.055) ** 2.4 : b / 12.92;\n\n let x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;\n let y = r * 0.2126 + g * 0.7152 + b * 0.0722; /* / 1.00000; */\n let z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;\n\n x = x > 0.008856 ? x ** 0.33333333 : 7.787 * x + 0.137931; // 16 / 116;\n y = y > 0.008856 ? y ** 0.33333333 : 7.787 * y + 0.137931; // 16 / 116;\n z = z > 0.008856 ? z ** 0.33333333 : 7.787 * z + 0.137931; // 16 / 116;\n\n return [116 * y - 16, 500 * (x - y), 200 * (y - z)];\n }\n\n /**\n * Calculate the distance between two colors in LAB color space in the range 0-100^2\n * If the distance is less than 1000, the colors are similar\n *\n * @param color1 Color in the format '#rrggbb' or '#rgb' (or without hash) or rgb(r,g,b) or rgba(r,g,b,a)\n * @param color2 Color in the format '#rrggbb' or '#rgb' (or without hash) or rgb(r,g,b) or rgba(r,g,b,a)\n * @returns distance in the range 0-100^2\n */\n static colorDistance(color1: string, color2: string): number {\n const rgb1 = Utils.color2rgb(color1);\n const rgb2 = Utils.color2rgb(color2);\n if (!rgb1 || !rgb2) {\n return 0;\n }\n\n const lab1 = Utils.rgb2lab(rgb1);\n const lab2 = Utils.rgb2lab(rgb2);\n const dltL = lab1[0] - lab2[0];\n const dltA = lab1[1] - lab2[1];\n const dltB = lab1[2] - lab2[2];\n const c1 = Math.sqrt(lab1[1] * lab1[1] + lab1[2] * lab1[2]);\n const c2 = Math.sqrt(lab2[1] * lab2[1] + lab2[2] * lab2[2]);\n const dltC = c1 - c2;\n let dltH = dltA * dltA + dltB * dltB - dltC * dltC;\n dltH = dltH < 0 ? 0 : Math.sqrt(dltH);\n const sc = 1.0 + 0.045 * c1;\n const sh = 1.0 + 0.015 * c1;\n const dltLKlsl = dltL;\n const dltCkcsc = dltC / sc;\n const dltHkhsh = dltH / sh;\n const i = dltLKlsl * dltLKlsl + dltCkcsc * dltCkcsc + dltHkhsh * dltHkhsh;\n return i < 0 ? 0 : i;\n }\n\n // https://github.com/lukeed/clsx/blob/master/src/index.js\n // License\n // MIT © Luke Edwards\n private static _toVal(mix: ClassValue): string {\n let y;\n let str = '';\n\n if (typeof mix === 'string' || typeof mix === 'number') {\n str += mix;\n } else if (typeof mix === 'object') {\n if (Array.isArray(mix)) {\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n y = Utils._toVal(mix[k]);\n if (y) {\n str && (str += ' ');\n str += y;\n }\n }\n }\n } else {\n for (const k in mix) {\n if (mix[k]) {\n str && (str += ' ');\n str += k;\n }\n }\n }\n }\n\n return str;\n }\n\n // https://github.com/lukeed/clsx/blob/master/src/index.js\n // License\n // MIT © Luke Edwards\n /**\n * Convert any object to a string with its values.\n */\n static clsx(...inputs: ClassValue[]): string {\n let i = 0;\n let tmp;\n let x;\n let str = '';\n while (i < inputs.length) {\n tmp = inputs[i++];\n if (tmp) {\n x = Utils._toVal(tmp);\n if (x) {\n str && (str += ' ');\n str += x;\n }\n }\n }\n return str;\n }\n\n /**\n * Get the current theme name (either from local storage or the browser settings).\n */\n static getThemeName(themeName?: ThemeName | null): ThemeName {\n if (\n (window as any).vendorPrefix &&\n (window as any).vendorPrefix !== '@@vendorPrefix@@' &&\n (window as any).vendorPrefix !== 'MV'\n ) {\n return (window as any).vendorPrefix;\n }\n\n themeName = ((window as any)._localStorage || window.localStorage).getItem('App.themeName');\n if (themeName) {\n return themeName;\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'colored';\n }\n\n /**\n * Get the type of theme.\n */\n static getThemeType(themeName?: ThemeName): ThemeType {\n if ((window as any).vendorPrefix && (window as any).vendorPrefix !== '@@vendorPrefix@@') {\n return 'light';\n }\n\n themeName = themeName || Utils.getThemeName();\n return themeName === 'dark' || themeName === 'blue' ? 'dark' : 'light';\n }\n\n /**\n * Set the theme name and theme type.\n */\n static setThemeName(themeName: ThemeName): void {\n const vendorPrefix = (window as any).vendorPrefix;\n if (vendorPrefix && vendorPrefix !== '@@vendorPrefix@@' && vendorPrefix !== 'MV') {\n return; // ignore\n }\n ((window as any)._localStorage || window.localStorage).setItem('App.themeName', themeName);\n ((window as any)._localStorage || window.localStorage).setItem(\n 'App.theme',\n themeName === 'dark' || themeName === 'blue' ? 'dark' : 'light',\n );\n }\n\n /**\n * Toggle the theme name between 'dark' and 'colored'.\n *\n * @returns the new theme name.\n */\n static toggleTheme(themeName?: ThemeName | null): ThemeName {\n if (\n (window as any).vendorPrefix &&\n (window as any).vendorPrefix !== '@@vendorPrefix@@' &&\n (window as any).vendorPrefix !== 'MV'\n ) {\n return (window as any).vendorPrefix as ThemeName;\n }\n themeName =\n themeName || ((window as any)._localStorage || window.localStorage).getItem('App.themeName') || 'light';\n\n // dark => blue => colored => light => dark\n const themes = Utils.getThemeNames();\n const pos = themeName ? themes.indexOf(themeName) : -1;\n let newTheme: ThemeName;\n if (pos !== -1) {\n newTheme = themes[(pos + 1) % themes.length];\n } else {\n newTheme = themes[0];\n }\n Utils.setThemeName(newTheme);\n\n return newTheme;\n }\n\n /**\n * Get the list of themes\n *\n * @returns list of possible themes\n */\n static getThemeNames(): ThemeName[] {\n if (\n (window as any).vendorPrefix &&\n (window as any).vendorPrefix !== '@@vendorPrefix@@' &&\n (window as any).vendorPrefix !== 'MV'\n ) {\n return [(window as any).vendorPrefix as ThemeName];\n }\n\n return ['light', 'dark'];\n }\n\n /**\n * Parse a query string into its parts.\n */\n static parseQuery(query: string): Record<string, string | number | boolean> {\n query = (query || '').toString().replace(/^\\?/, '');\n const result: Record<string, string | number | boolean> = {};\n query.split('&').forEach(part => {\n part = part.trim();\n if (part) {\n const parts = part.split('=');\n const attr = decodeURIComponent(parts[0]).trim();\n if (parts.length > 1) {\n const value = decodeURIComponent(parts[1]);\n if (value === 'true') {\n result[attr] = true;\n } else if (value === 'false') {\n result[attr] = false;\n } else {\n const f = parseFloat(value);\n if (f.toString() === value) {\n result[attr] = f;\n } else {\n result[attr] = value;\n }\n }\n } else {\n result[attr] = true;\n }\n }\n });\n return result;\n }\n\n /**\n * Returns parent ID.\n *\n * @returns parent ID or null if no parent\n */\n static getParentId(id: string): string | null {\n const p = (id || '').toString().split('.');\n if (p.length > 1) {\n p.pop();\n return p.join('.');\n }\n\n return null;\n }\n\n static formatDate(dateObj: Date, dateFormat: string): string {\n // format could be DD.MM.YYYY, YYYY.MM.DD or MM/DD/YYYY\n\n if (!dateObj) {\n return '';\n }\n\n let text;\n const mm = (dateObj.getMonth() + 1).toString().padStart(2, '0');\n const dd = dateObj.getDate().toString().padStart(2, '0');\n\n if (dateFormat === 'MM/DD/YYYY') {\n text = `${mm}/${dd}/${dateObj.getFullYear()}`;\n } else {\n text = `${dateObj.getFullYear()}-${mm}-${dd}`;\n }\n\n // time\n text += ` ${dateObj.getHours().toString().padStart(2, '0')}:${dateObj.getMinutes().toString().padStart(2, '0')}:${dateObj.getSeconds().toString().padStart(2, '0')}.${dateObj.getMilliseconds().toString().padStart(3, '0')}`;\n\n return text;\n }\n\n /**\n * Format seconds to string like 'h:mm:ss' or 'd.hh:mm:ss'\n */\n static formatTime(seconds: number): string {\n if (seconds) {\n seconds = Math.round(seconds);\n const d = Math.floor(seconds / (3600 * 24));\n const h = Math.floor((seconds % (3600 * 24)) / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = seconds % 60;\n if (d) {\n return `${d}.${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n }\n if (h) {\n return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n }\n\n return `0:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n }\n return '0:00:00';\n }\n\n static MDtext2link(text: string): string {\n const m = text.match(/\\d+\\.\\)\\s/);\n if (m) {\n text = text.replace(m[0], m[0].replace(/\\s/, '&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 = function () {\n resolve(this.result?.toString() || '');\n };\n reader.readAsDataURL(blob);\n });\n }\n\n /**\n * Detect a file extension by its content\n *\n * @returns The detected extension, like 'jpg'\n */\n static detectMimeType(\n /** Base64 encoded binary file */\n base64: string,\n ): string | null {\n const signature = Object.keys(SIGNATURES).find(s => base64.startsWith(s));\n return signature ? SIGNATURES[signature] : null;\n }\n\n /**\n * Check if configured repository is the stable repository\n */\n static isStableRepository(\n /** current configured repository or multi repository */\n activeRepo: string | string[],\n ): boolean {\n return !!(\n (typeof activeRepo === 'string' && activeRepo.toLowerCase().startsWith('stable')) ||\n (activeRepo && typeof activeRepo !== 'string' && activeRepo.find(r => r.toLowerCase().startsWith('stable')))\n );\n }\n\n /**\n * Check if a given string is an integer\n */\n static isStringInteger(str: string | number): boolean {\n if (typeof str === 'number') {\n return Math.round(str) === str;\n }\n return parseInt(str, 10).toString() === str;\n }\n\n /**\n * Check if the date is valid\n */\n static isValidDate(date: any): boolean {\n return date instanceof Date && !isNaN(date as any as number);\n }\n\n static getStyle(\n theme: IobTheme,\n ...args: (((_theme: IobTheme) => Record<string, any>) | undefined | Record<string, any>)[]\n ): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (let a = 0; a < args.length; a++) {\n if (typeof args[a] === 'function') {\n Object.assign(result, (args[a] as (_theme: IobTheme) => Record<string, any>)(theme));\n } else if (args[a] && typeof args[a] === 'object') {\n Object.keys(args[a] as Record<string, any>).forEach((attr: string) => {\n if (typeof (args[a] as Record<string, any>)[attr] === 'function') {\n result[attr] = (\n (args[a] as Record<string, any>)[attr] as (_theme: IobTheme) => Record<string, any>\n )(theme);\n } else if (typeof (args[a] as Record<string, any>)[attr] === 'object') {\n const obj = (args[a] as Record<string, any>)[attr];\n result[attr] = {};\n Object.keys(obj).forEach((attr1: string) => {\n if (typeof obj[attr1] === 'function') {\n result[attr][attr1] = obj(theme);\n } else if (obj[attr1] || obj[attr1] === 0) {\n result[attr][attr1] = obj[attr1];\n }\n });\n } else if ((args[a] as Record<string, any>)[attr] || (args[a] as Record<string, any>)[attr] === 0) {\n result[attr] = (args[a] as Record<string, any>)[attr];\n }\n });\n }\n }\n\n return result;\n }\n}\n","// please do not delete React, as without it other projects could not be compiled: ReferenceError: React is not defined\nimport React, { type JSX } from 'react';\n\nimport { Fab, Toolbar } from '@mui/material';\n\nimport { Save as IconSave, Close as IconClose } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\nimport type { IobTheme } from '../types';\n\nconst styles: Record<string, React.CSSProperties> = {\n buttonIcon: {\n marginRight: 8,\n },\n};\n\ninterface SaveCloseButtonsProps {\n /* Are the buttons without text */\n noTextOnButtons?: boolean;\n /* Theme object (from this.state.theme) */\n theme: IobTheme;\n /* bottom position 0 or 38 for iFrame */\n isIFrame?: boolean;\n /* is used in new React */\n newReact?: boolean;\n /* on Save handler */\n onSave: (close: boolean) => void;\n /* on Close handler */\n onClose: () => void;\n dense?: boolean;\n paddingLeft?: number;\n changed: boolean;\n error?: boolean;\n}\n\nexport class SaveCloseButtons extends React.Component<SaveCloseButtonsProps> {\n private readonly isIFrame: boolean;\n\n constructor(props: SaveCloseButtonsProps) {\n super(props);\n const newReact = props.newReact === undefined ? true : props.newReact;\n\n if (props.isIFrame !== undefined) {\n this.isIFrame = props.isIFrame;\n } else {\n try {\n this.isIFrame = !newReact && window.self !== window.top;\n } catch {\n this.isIFrame = !newReact;\n }\n }\n }\n\n render(): JSX.Element {\n const noTextOnButtons = this.props.noTextOnButtons;\n const buttonStyle: React.CSSProperties = {\n borderRadius: this.props.theme.saveToolbar.button.borderRadius || 3,\n height: this.props.theme.saveToolbar.button.height || 32,\n };\n\n const style: React.CSSProperties = {\n bottom: this.isIFrame ? 38 : 0,\n left: this.props.paddingLeft || 0,\n right: 0,\n position: 'absolute',\n background: this.props.theme.saveToolbar.background,\n };\n if (this.props.dense) {\n style.minHeight = 48;\n }\n\n if (this.props.error) {\n buttonStyle.border = '1px solid red';\n }\n\n return (\n <Toolbar\n // position=\"absolute\"\n style={style}\n >\n <Fab\n variant=\"extended\"\n aria-label=\"Save\"\n disabled={!this.props.changed || this.props.error}\n onClick={() => this.props.onSave(false)}\n style={buttonStyle}\n >\n <IconSave style={!noTextOnButtons ? styles.buttonIcon : undefined} />\n {!noTextOnButtons && I18n.t('ra_Save')}\n </Fab>\n <Fab\n variant=\"extended\"\n aria-label=\"Save and close\"\n disabled={!this.props.changed || this.props.error}\n onClick={() => this.props.onSave(true)}\n style={{ ...buttonStyle, ...{ marginLeft: 10 } }}\n >\n <IconSave style={!noTextOnButtons ? styles.buttonIcon : undefined} />\n {!noTextOnButtons ? I18n.t('ra_Save and close') : '+'}\n {noTextOnButtons && <IconClose />}\n </Fab>\n <div style={{ flexGrow: 1 }} />\n <Fab\n variant=\"extended\"\n aria-label=\"Close\"\n onClick={() => this.props.onClose()}\n style={buttonStyle}\n >\n <IconClose style={!noTextOnButtons ? styles.buttonIcon : undefined} />\n {!noTextOnButtons && I18n.t('ra_Close')}\n </Fab>\n </Toolbar>\n );\n }\n}\n","/**\n * Copyright 2019-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\n// please do not delete React, as without it other projects could not be compiled: ReferenceError: React is not defined\nimport React, { Component, type JSX } from 'react';\n\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n FormControlLabel,\n Checkbox,\n} from '@mui/material';\n\nimport { Check as IconCheck, Close as IconClose } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\n\nconst styles: Record<string, React.CSSProperties> = {\n suppress: {\n fontSize: 12,\n },\n suppressRoot: {\n // it is sx\n marginTop: '16px',\n },\n};\n\ninterface DialogConfirmProps {\n /** The dialog title; default: Are you sure? (translated) */\n title?: string;\n /** The dialog text */\n text?: string | React.JSX.Element | React.JSX.Element[];\n /** Close handler. */\n onClose?: (ok: boolean) => void;\n /** if the dialog must be fill sized */\n fullWidth?: boolean;\n /** optional icon */\n icon?: React.JSX.Element;\n /** optional ok button text */\n ok?: string;\n /** optional cancel button text */\n cancel?: string;\n /** optional interval in minutes for which the confirmation dialog will be suppressed if activated. */\n suppressQuestionMinutes?: number;\n /** optional text for the suppression checkbox */\n suppressText?: string;\n /** optional name of the dialog. Used only with suppressQuestionMinutes to store the user choice */\n dialogName?: string;\n}\n\ninterface DialogConfirmState {\n suppress: number | boolean;\n}\n\nexport class DialogConfirm extends Component<DialogConfirmProps, DialogConfirmState> {\n constructor(props: DialogConfirmProps) {\n super(props);\n\n if (!this.props.dialogName && this.props.suppressQuestionMinutes) {\n throw new Error('dialogName required if suppressQuestionMinutes used');\n }\n let suppress: number | boolean = false;\n\n if (this.props.suppressQuestionMinutes) {\n suppress =\n parseInt(((window as any)._localStorage || window.localStorage).getItem(this.props.dialogName), 10) ||\n 0;\n\n if (!suppress) {\n suppress = false;\n } else if (Date.now() > suppress) {\n ((window as any)._localStorage || window.localStorage).removeItem(this.props.dialogName);\n suppress = false;\n }\n }\n\n this.state = {\n suppress,\n };\n }\n\n handleOk(): void {\n if (this.state.suppress) {\n ((window as any)._localStorage || window.localStorage).setItem(\n this.props.dialogName,\n Date.now() + (this.props.suppressQuestionMinutes || 2) * 60000,\n );\n }\n if (this.props.onClose) {\n this.props.onClose(true);\n }\n }\n\n handleCancel(): void {\n if (this.props.onClose) {\n this.props.onClose(false);\n }\n }\n\n render(): JSX.Element | null {\n if (typeof this.state.suppress === 'number') {\n setTimeout(() => this.props.onClose && this.props.onClose(true), 100);\n return null;\n }\n\n return (\n <Dialog\n open={!0}\n maxWidth=\"md\"\n fullWidth={this.props.fullWidth !== undefined ? this.props.fullWidth : true}\n onClose={(event, reason) => {\n if (reason !== 'backdropClick' && reason !== 'escapeKeyDown') {\n this.handleCancel();\n }\n }}\n aria-labelledby=\"ar_confirmation_dialog_title\"\n aria-describedby=\"ar_confirmation_dialog_description\"\n >\n <DialogTitle id=\"ar_confirmation_dialog_title\">\n {this.props.title || I18n.t('ra_Are you sure?')}\n </DialogTitle>\n <DialogContent>\n <DialogContentText id=\"ar_confirmation_dialog_description\">\n {this.props.icon || null}\n {this.props.text}\n {this.props.suppressQuestionMinutes ? <br /> : null}\n {this.props.suppressQuestionMinutes ? (\n <FormControlLabel\n sx={{\n '& .FormControlLabel-label': styles.suppress,\n '&.FormControlLabel-root': styles.suppressRoot,\n }}\n control={\n <Checkbox\n id={`ar_dialog_confirm_suppress_${this.props.dialogName || ''}`}\n checked={!!this.state.suppress}\n onChange={() => this.setState({ suppress: !this.state.suppress })}\n />\n }\n label={\n this.props.suppressText ||\n I18n.t(\n 'ra_Suppress question for next %s minutes',\n (this.props.suppressQuestionMinutes || 2).toString(),\n )\n }\n />\n ) : null}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n id={`ar_dialog_confirm_ok_${this.props.dialogName || ''}`}\n variant=\"contained\"\n onClick={() => this.handleOk()}\n color=\"primary\"\n autoFocus\n startIcon={<IconCheck />}\n >\n {this.props.ok || I18n.t('ra_Ok')}\n </Button>\n <Button\n id={`ar_dialog_confirm_cancel_${this.props.dialogName || ''}`}\n variant=\"contained\"\n onClick={() => this.handleCancel()}\n color=\"grey\"\n startIcon={<IconClose />}\n >\n {this.props.cancel || I18n.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n","/**\n * Copyright 2018-2023 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n// please do not delete React, as without it other projects could not be compiled: ReferenceError: React is not defined\nimport React, { Component, type JSX } from 'react';\n\nimport { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material';\n\nimport { Check as IconCheck } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\n\ninterface DialogErrorProps {\n /* The dialog title; default: Error (translated) */\n title?: string;\n /* The dialog text */\n text: string | React.JSX.Element | React.JSX.Element[];\n /* Close handler. */\n onClose?: () => void;\n /* if the dialog must be fill sized */\n fullWidth?: boolean;\n}\n\nexport class DialogError extends Component<DialogErrorProps> {\n handleOk(): void {\n if (this.props.onClose) {\n this.props.onClose();\n }\n }\n\n render(): JSX.Element {\n return (\n <Dialog\n open={!0}\n maxWidth=\"sm\"\n fullWidth={this.props.fullWidth !== undefined ? this.props.fullWidth : true}\n onClose={() => this.handleOk()}\n aria-labelledby=\"alert-dialog-title\"\n aria-describedby=\"alert-dialog-description\"\n >\n <DialogTitle id=\"ar_alert_dialog_title\">{this.props.title || I18n.t('ra_Error')}</DialogTitle>\n <DialogContent>\n <DialogContentText id=\"ar_alert_dialog_description\">\n {this.props.text || I18n.t('ra_Unknown error!')}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n id=\"ar_dialog_error_ok\"\n variant=\"contained\"\n onClick={() => this.handleOk()}\n color=\"primary\"\n autoFocus\n startIcon={<IconCheck />}\n >\n {I18n.t('ra_Ok')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n","import langEn from './i18n/en.json';\nimport langDe from './i18n/de.json';\nimport langRu from './i18n/ru.json';\nimport langPt from './i18n/pt.json';\nimport langNl from './i18n/nl.json';\nimport langFr from './i18n/fr.json';\nimport langIt from './i18n/it.json';\nimport langEs from './i18n/es.json';\nimport langPl from './i18n/pl.json';\nimport langUk from './i18n/uk.json';\nimport langZhCn from './i18n/zh-cn.json';\n\nexport const dictionary: Record<ioBroker.Languages, Record<string, string>> = {\n en: langEn,\n de: langDe,\n ru: langRu,\n pt: langPt,\n nl: langNl,\n fr: langFr,\n it: langIt,\n es: langEs,\n pl: langPl,\n uk: langUk,\n 'zh-cn': langZhCn,\n};\n","/**\n * Copyright 2018-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport React, { type JSX } from 'react';\nimport { PROGRESS, Connection, type AdminConnection } from '@iobroker/socket-client';\nimport * as Sentry from '@sentry/browser';\n\nimport { Snackbar, IconButton } from '@mui/material';\n\nimport { Close as IconClose } from '@mui/icons-material';\n\nimport { printPrompt } from './Prompt';\nimport { Theme } from './Theme';\nimport { Loader } from './Components/Loader';\nimport { Router } from './Components/Router';\nimport { Utils } from './Components/Utils';\nimport { SaveCloseButtons } from './Components/SaveCloseButtons';\nimport { DialogConfirm } from './Dialogs/Confirm';\nimport { I18n } from './i18n';\nimport { DialogError } from './Dialogs/Error';\nimport type {\n GenericAppProps,\n GenericAppState,\n GenericAppSettings,\n ThemeName,\n ThemeType,\n IobTheme,\n Width,\n} from './types';\n\nimport { dictionary } from './dictionary';\n\ndeclare global {\n /** If config has been changed */\n // eslint-disable-next-line no-var\n var changed: boolean;\n\n interface Window {\n io: any;\n SocketClient: any;\n adapterName: undefined | string;\n socketUrl: undefined | string;\n oldAlert: any;\n changed: boolean;\n $iframeDialog: {\n close?: () => void;\n };\n }\n}\n\n// import './index.css';\nconst cssStyle = `\nhtml {\n height: 100%;\n}\n\nbody {\n margin: 0;\n padding: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n/* scrollbar */\n::-webkit-scrollbar-track {\n background-color: #ccc;\n border-radius: 5px;\n}\n\n::-webkit-scrollbar {\n width: 5px;\n height: 5px;\n background-color: #ccc;\n}\n\n::-webkit-scrollbar-thumb {\n background-color: #575757;\n border-radius: 5px;\n}\n\n#root {\n height: 100%;\n}\n\n.App {\n height: 100%;\n}\n\n@keyframes glow {\n from {\n background-color: initial;\n }\n to {\n background-color: #58c458;\n }\n}\n`;\n\nexport class GenericApp<\n TProps extends GenericAppProps = GenericAppProps,\n TState extends GenericAppState = GenericAppState,\n> extends Router<TProps, TState> {\n protected socket: AdminConnection;\n\n protected readonly instance: number;\n\n protected readonly adapterName: string;\n\n protected readonly instanceId: string;\n\n protected readonly newReact: boolean;\n\n protected encryptedFields: string[];\n\n protected readonly sentryDSN: string | undefined;\n\n private alertDialogRendered: boolean;\n\n private _secret: string | undefined;\n\n protected _systemConfig: ioBroker.SystemConfigCommon | undefined;\n\n // it is not readonly\n private savedNative: Record<string, any>;\n\n protected common: ioBroker.InstanceCommon | null = null;\n\n private sentryStarted: boolean = false;\n\n private sentryInited: boolean = false;\n\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(props: TProps, settings?: GenericAppSettings) {\n const ConnectionClass = (props.Connection ||\n settings?.Connection ||\n Connection) as unknown as typeof AdminConnection;\n // const ConnectionClass = props.Connection === 'admin' || settings.Connection = 'admin' ? AdminConnection : (props.Connection || settings.Connection || Connection);\n\n if (!window.document.getElementById('generic-app-iobroker-component')) {\n const style = window.document.createElement('style');\n style.setAttribute('id', 'generic-app-iobroker-component');\n style.innerHTML = cssStyle;\n window.document.head.appendChild(style);\n }\n\n // Remove `!Connection.isWeb() && window.adapterName !== 'material'` when iobroker.socket will support native ws\n if (!GenericApp.isWeb() && window.io && window.location.port === '3000') {\n try {\n const io = new window.SocketClient();\n delete window.io;\n window.io = io;\n } catch {\n // ignore\n }\n }\n\n super(props);\n\n printPrompt();\n\n const query = (window.location.search || '').replace(/^\\?/, '').replace(/#.*$/, '');\n const args: Record<string, string | boolean> = {};\n query\n .trim()\n .split('&')\n .filter(t => t.trim())\n .forEach(b => {\n const parts = b.split('=');\n args[parts[0]] = parts.length === 2 ? parts[1] : true;\n if (args[parts[0]] === 'true') {\n args[parts[0]] = true;\n } else if (args[parts[0]] === 'false') {\n args[parts[0]] = false;\n }\n });\n\n // extract instance from URL\n this.instance =\n settings?.instance ??\n props.instance ??\n (args.instance !== undefined\n ? parseInt(args.instance as string, 10) || 0\n : parseInt(window.location.search.slice(1), 10) || 0);\n // extract adapter name from URL\n const tmp = window.location.pathname.split('/');\n this.adapterName =\n settings?.adapterName || props.adapterName || window.adapterName || tmp[tmp.length - 2] || 'iot';\n this.instanceId = `system.adapter.${this.adapterName}.${this.instance}`;\n this.newReact = args.newReact === true; // it is admin5\n\n const location = Router.getLocation();\n location.tab =\n location.tab ||\n ((window as any)._localStorage || window.localStorage).getItem(`${this.adapterName}-adapter`) ||\n '';\n\n const themeInstance = this.createTheme();\n\n this.state = Object.assign(\n this.state || {}, // keep the existing state\n {\n selectedTab:\n ((window as any)._localStorage || window.localStorage).getItem(`${this.adapterName}-adapter`) || '',\n selectedTabNum: -1,\n native: {},\n errorText: '',\n changed: false,\n connected: false,\n loaded: false,\n isConfigurationError: '',\n expertMode: false,\n toast: '',\n theme: themeInstance,\n themeName: this.getThemeName(themeInstance),\n themeType: this.getThemeType(themeInstance),\n bottomButtons: (settings && settings.bottomButtons) === false ? false : props?.bottomButtons !== false,\n width: GenericApp.getWidth(),\n confirmClose: false,\n _alert: false,\n _alertType: 'info',\n _alertMessage: '',\n },\n ) as TState;\n\n // init translations\n const translations: Record<ioBroker.Languages, Record<string, string>> = dictionary;\n\n // merge together\n if (settings?.translations) {\n Object.keys(settings.translations).forEach(lang => {\n if (settings.translations) {\n translations[lang as ioBroker.Languages] = Object.assign(\n translations[lang as ioBroker.Languages],\n settings.translations[lang as ioBroker.Languages] || {},\n );\n }\n });\n } else if (props.translations) {\n Object.keys(props.translations).forEach(lang => {\n if (props.translations) {\n translations[lang as ioBroker.Languages] = Object.assign(\n translations[lang as ioBroker.Languages],\n props.translations[lang as ioBroker.Languages] || {},\n );\n }\n });\n }\n\n I18n.setTranslations(translations);\n\n this.savedNative = {}; // to detect if the config changed\n\n this.encryptedFields = props.encryptedFields || settings?.encryptedFields || [];\n\n this.sentryDSN = (settings && settings.sentryDSN) || props.sentryDSN;\n\n if (window.socketUrl) {\n if (window.socketUrl.startsWith(':')) {\n window.socketUrl = `${window.location.protocol}//${window.location.hostname}${window.socketUrl}`;\n } else if (!window.socketUrl.startsWith('http://') && !window.socketUrl.startsWith('https://')) {\n window.socketUrl = `${window.location.protocol}//${window.socketUrl}`;\n }\n }\n\n this.alertDialogRendered = false;\n\n window.oldAlert = window.alert;\n window.alert = message => {\n if (!this.alertDialogRendered) {\n window.oldAlert(message);\n return;\n }\n if (message && message.toString().toLowerCase().includes('error')) {\n console.error(message);\n this.showAlert(message.toString(), 'error');\n } else {\n console.log(message);\n this.showAlert(message.toString(), 'info');\n }\n };\n\n // @ts-expect-error either make props in ConnectionProps required or the constructor needs to accept than as they are (means adapt socket-client)\n this.socket = new ConnectionClass({\n ...(props?.socket || settings?.socket),\n name: this.adapterName,\n doNotLoadAllObjects: settings?.doNotLoadAllObjects,\n onProgress: (progress: PROGRESS) => {\n if (progress === PROGRESS.CONNECTING) {\n this.setState({ connected: false });\n } else if (progress === PROGRESS.READY) {\n this.setState({ connected: true });\n } else {\n this.setState({ connected: true });\n }\n },\n onReady: (/* objects, scripts */) => {\n I18n.setLanguage(this.socket.systemLang);\n\n // subscribe because of language and expert mode\n this.socket\n .subscribeObject('system.config', this.onSystemConfigChanged)\n .then(() => this.getSystemConfig())\n .then(obj => {\n this._secret =\n (typeof obj !== 'undefined' && obj.native && obj.native.secret) || 'Zgfr56gFe87jJOM';\n this._systemConfig = obj?.common || ({} as ioBroker.SystemConfigCommon);\n return this.socket.getObject(this.instanceId);\n })\n .then(async obj => {\n let waitPromise;\n const instanceObj: ioBroker.InstanceObject | null | undefined = obj as\n | ioBroker.InstanceObject\n | null\n | undefined;\n\n const sentryPluginEnabled = (\n await this.socket.getState(`${this.instanceId}.plugins.sentry.enabled`)\n )?.val;\n\n const sentryEnabled =\n sentryPluginEnabled !== false &&\n this._systemConfig?.diag !== 'none' &&\n instanceObj?.common &&\n instanceObj.common.name &&\n instanceObj.common.version &&\n // @ts-expect-error will be extended in js-controller TODO: (BF: 2024.05.30) this is redundant to state `${this.instanceId}.plugins.sentry.enabled`, remove this in future when admin sets the state correctly\n !instanceObj.common.disableDataReporting &&\n window.location.host !== 'localhost:3000';\n\n // activate sentry plugin\n if (!this.sentryStarted && this.sentryDSN && sentryEnabled) {\n this.sentryStarted = true;\n\n Sentry.init({\n dsn: this.sentryDSN,\n release: `iobroker.${instanceObj.common.name}@${instanceObj.common.version}`,\n integrations: [Sentry.dedupeIntegration()],\n });\n\n console.log('Sentry initialized');\n }\n\n // read UUID and init sentry with it.\n // for backward compatibility it will be processed separately from the above logic: some adapters could still have this.sentryDSN as undefined\n if (!this.sentryInited && sentryEnabled) {\n this.sentryInited = true;\n\n waitPromise = this.socket.getObject('system.meta.uuid').then(uuidObj => {\n if (uuidObj && uuidObj.native && uuidObj.native.uuid) {\n const scope = Sentry.getCurrentScope();\n scope.setUser({ id: uuidObj.native.uuid });\n }\n });\n }\n\n waitPromise = (waitPromise instanceof Promise) ? waitPromise : Promise.resolve();\n\n void waitPromise.then(() => {\n if (instanceObj) {\n this.common = instanceObj?.common;\n this.onPrepareLoad(instanceObj.native, instanceObj.encryptedNative); // decode all secrets\n this.savedNative = JSON.parse(JSON.stringify(instanceObj.native));\n this.setState(\n { native: instanceObj.native, loaded: true, expertMode: this.getExpertMode() },\n () => this.onConnectionReady && this.onConnectionReady(),\n );\n } else {\n console.warn('Cannot load instance settings');\n this.setState(\n {\n native: {},\n loaded: true,\n expertMode: this.getExpertMode(),\n },\n () => this.onConnectionReady && this.onConnectionReady(),\n );\n }\n });\n })\n .catch(e => window.alert(`Cannot settings: ${e}`));\n },\n onError: (err: string) => {\n console.error(err);\n this.showError(err);\n },\n });\n }\n\n /**\n * Checks if this connection is running in a web adapter and not in an admin.\n *\n * @returns True if running in a web adapter or in a socketio adapter.\n */\n static isWeb(): boolean {\n return window.socketUrl !== undefined;\n }\n\n showAlert(message: string, type?: 'info' | 'warning' | 'error' | 'success'): void {\n if (type !== 'error' && type !== 'warning' && type !== 'info' && type !== 'success') {\n type = 'info';\n }\n\n this.setState({\n _alert: true,\n _alertType: type,\n _alertMessage: message,\n });\n }\n\n renderAlertSnackbar(): JSX.Element {\n this.alertDialogRendered = true;\n\n return (\n <Snackbar\n style={\n this.state._alertType === 'error'\n ? { backgroundColor: '#f44336' }\n : this.state._alertType === 'success'\n ? { backgroundColor: '#4caf50' }\n : undefined\n }\n open={this.state._alert}\n autoHideDuration={6000}\n onClose={(_e, reason) => reason !== 'clickaway' && this.setState({ _alert: false })}\n message={this.state._alertMessage}\n />\n );\n }\n\n onSystemConfigChanged = (id: string, obj: ioBroker.AnyObject | null | undefined): void => {\n if (obj && id === 'system.config') {\n if (this.socket.systemLang !== (obj as ioBroker.SystemConfigObject)?.common.language) {\n this.socket.systemLang = (obj as ioBroker.SystemConfigObject)?.common.language || 'en';\n I18n.setLanguage(this.socket.systemLang);\n }\n\n if (this._systemConfig?.expertMode !== !!(obj as ioBroker.SystemConfigObject)?.common?.expertMode) {\n this._systemConfig =\n (obj as ioBroker.SystemConfigObject)?.common || ({} as ioBroker.SystemConfigCommon);\n this.setState({ expertMode: this.getExpertMode() });\n } else {\n this._systemConfig =\n (obj as ioBroker.SystemConfigObject)?.common || ({} as ioBroker.SystemConfigCommon);\n }\n }\n };\n\n /**\n * Called immediately after a component is mounted. Setting state here will trigger re-rendering.\n */\n componentDidMount(): void {\n window.addEventListener('resize', this.onResize, true);\n window.addEventListener('message', this.onReceiveMessage, false);\n super.componentDidMount();\n }\n\n /**\n * Called immediately before a component is destroyed.\n */\n componentWillUnmount(): void {\n window.removeEventListener('resize', this.onResize, true);\n window.removeEventListener('message', this.onReceiveMessage, false);\n super.componentWillUnmount();\n }\n\n onReceiveMessage = (message: { data: string } | null): void => {\n if (message?.data) {\n if (message.data === 'updateTheme') {\n const newThemeName = Utils.getThemeName();\n Utils.setThemeName(Utils.getThemeName());\n\n const newTheme = this.createTheme(newThemeName);\n\n this.setState(\n {\n theme: newTheme,\n themeName: this.getThemeName(newTheme),\n themeType: this.getThemeType(newTheme),\n },\n () => {\n this.props.onThemeChange && this.props.onThemeChange(newThemeName);\n this.onThemeChanged && this.onThemeChanged(newThemeName);\n },\n );\n } else if (message.data === 'updateExpertMode') {\n this.onToggleExpertMode && this.onToggleExpertMode(this.getExpertMode());\n } else if (message.data !== 'chartReady') {\n // if not \"echart ready\" message\n console.debug(\n `Received unknown message: \"${JSON.stringify(message.data)}\". May be it will be processed later`,\n );\n }\n }\n };\n\n private onResize = (): void => {\n this.resizeTimer && clearTimeout(this.resizeTimer);\n this.resizeTimer = setTimeout(() => {\n this.resizeTimer = null;\n this.setState({ width: GenericApp.getWidth() });\n }, 200);\n };\n\n /**\n * Gets the width depending on the window inner width.\n */\n static getWidth(): Width {\n /**\n * innerWidth |xs sm md lg xl\n * |-------|-------|-------|-------|------>\n * width | xs | sm | md | lg | xl\n */\n\n const SIZES: Record<Width, number> = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920,\n };\n const width = window.innerWidth;\n const keys = Object.keys(SIZES).reverse();\n const widthComputed = keys.find(key => width >= SIZES[key as Width]) as Width;\n\n return widthComputed || 'xs';\n }\n\n /**\n * Get a theme\n *\n * @param name Theme name\n */\n // eslint-disable-next-line class-methods-use-this\n createTheme(name?: ThemeName | null): IobTheme {\n return Theme(Utils.getThemeName(name));\n }\n\n /**\n * Get the theme name\n */\n // eslint-disable-next-line class-methods-use-this\n getThemeName(currentTheme: IobTheme): ThemeName {\n return currentTheme.name;\n }\n\n /**\n * Get the theme type\n */\n // eslint-disable-next-line class-methods-use-this\n getThemeType(currentTheme: IobTheme): ThemeType {\n return currentTheme.palette.mode;\n }\n\n // eslint-disable-next-line class-methods-use-this\n onThemeChanged(_newThemeName: string): void {}\n\n // eslint-disable-next-line class-methods-use-this\n onToggleExpertMode(_expertMode: boolean): void {}\n\n /**\n * Changes the current theme\n */\n toggleTheme(newThemeName?: ThemeName): void {\n const themeName = this.state.themeName;\n\n // dark => blue => colored => light => dark\n newThemeName =\n newThemeName ||\n (themeName === 'dark'\n ? 'light'\n : themeName === 'blue'\n ? 'light'\n : themeName === 'colored'\n ? 'light'\n : 'dark');\n\n if (newThemeName !== themeName) {\n Utils.setThemeName(newThemeName);\n\n const newTheme = this.createTheme(newThemeName);\n\n this.setState(\n {\n theme: newTheme,\n themeName: this.getThemeName(newTheme),\n themeType: this.getThemeType(newTheme),\n },\n () => {\n this.props.onThemeChange && this.props.onThemeChange(newThemeName || 'light');\n this.onThemeChanged && this.onThemeChanged(newThemeName || 'light');\n },\n );\n }\n }\n\n /**\n * Gets the system configuration.\n */\n getSystemConfig(): Promise<ioBroker.SystemConfigObject> {\n return this.socket.getSystemConfig();\n }\n\n /**\n * Get current expert mode\n */\n getExpertMode(): boolean {\n return window.sessionStorage.getItem('App.expertMode') === 'true' || !!this._systemConfig?.expertMode;\n }\n\n /**\n * Gets called when the socket.io connection is ready.\n * You can overload this function to execute own commands.\n */\n // eslint-disable-next-line class-methods-use-this\n onConnectionReady(): void {}\n\n /**\n * Encrypts a string.\n */\n encrypt(value: string): string {\n let result = '';\n if (this._secret) {\n for (let i = 0; i < value.length; i++) {\n result += String.fromCharCode(\n this._secret[i % this._secret.length].charCodeAt(0) ^ value.charCodeAt(i),\n );\n }\n }\n return result;\n }\n\n /**\n * Decrypts a string.\n */\n decrypt(value: string): string {\n let result = '';\n if (this._secret) {\n for (let i = 0; i < value.length; i++) {\n result += String.fromCharCode(\n this._secret[i % this._secret.length].charCodeAt(0) ^ value.charCodeAt(i),\n );\n }\n }\n return result;\n }\n\n /**\n * Gets called when the navigation hash changes.\n * You may override this if needed.\n */\n onHashChanged(): void {\n const location = Router.getLocation();\n if (location.tab !== this.state.selectedTab) {\n this.selectTab(location.tab);\n }\n }\n\n /**\n * Selects the given tab.\n */\n selectTab(tab: string, index?: number): void {\n ((window as any)._localStorage || window.localStorage).setItem(`${this.adapterName}-adapter`, tab);\n this.setState({ selectedTab: tab, selectedTabNum: index });\n }\n\n /**\n * Gets called before the settings are saved.\n * You may override this if needed.\n */\n onPrepareSave(settings: Record<string, any>): boolean {\n // here you can encode values\n this.encryptedFields &&\n this.encryptedFields.forEach(attr => {\n if (settings[attr]) {\n settings[attr] = this.encrypt(settings[attr]);\n }\n });\n\n return true;\n }\n\n /**\n * Gets called after the settings are loaded.\n * You may override this if needed.\n *\n * @param settings instance settings from native part\n * @param encryptedNative optional list of fields to be decrypted\n */\n onPrepareLoad(settings: Record<string, any>, encryptedNative?: string[]): void {\n // here you can encode values\n this.encryptedFields &&\n this.encryptedFields.forEach(attr => {\n if (settings[attr]) {\n settings[attr] = this.decrypt(settings[attr]);\n }\n });\n encryptedNative &&\n encryptedNative.forEach(attr => {\n this.encryptedFields = this.encryptedFields || [];\n !this.encryptedFields.includes(attr) && this.encryptedFields.push(attr);\n if (settings[attr]) {\n settings[attr] = this.decrypt(settings[attr]);\n }\n });\n }\n\n /**\n * Gets the extendable instances.\n */\n async getExtendableInstances(): Promise<ioBroker.InstanceObject[]> {\n try {\n const instances = await this.socket.getObjectViewSystem(\n 'instance',\n 'system.adapter.',\n 'system.adapter.\\u9999',\n );\n return Object.values(instances).filter(instance => !!instance?.common?.webExtendable);\n } catch {\n return [];\n }\n }\n\n /**\n * Gets the IP addresses of the given host.\n */\n async getIpAddresses(host: string): Promise<{ name: string; address: string; family: 'ipv4' | 'ipv6' }[]> {\n const ips = await this.socket.getHostByIp(host || this.common?.host || '');\n // translate names\n const ip4 = ips.find(ip => ip.address === '0.0.0.0');\n if (ip4) {\n ip4.name = `[IPv4] 0.0.0.0 - ${I18n.t('ra_Listen on all IPs')}`;\n }\n const ip6 = ips.find(ip => ip.address === '::');\n if (ip6) {\n ip6.name = `[IPv4] :: - ${I18n.t('ra_Listen on all IPs')}`;\n }\n return ips;\n }\n\n /**\n * Saves the settings to the server.\n *\n * @param isClose True if the user is closing the dialog.\n */\n onSave(isClose?: boolean): void {\n let oldObj: ioBroker.InstanceObject;\n if (this.state.isConfigurationError) {\n this.setState({ errorText: this.state.isConfigurationError });\n return;\n }\n\n this.socket\n .getObject(this.instanceId)\n .then(_oldObj => {\n oldObj = (_oldObj || {}) as ioBroker.InstanceObject;\n\n for (const a in this.state.native) {\n if (Object.prototype.hasOwnProperty.call(this.state.native, a)) {\n if (this.state.native[a] === null) {\n oldObj.native[a] = null;\n } else if (this.state.native[a] !== undefined) {\n oldObj.native[a] = JSON.parse(JSON.stringify(this.state.native[a]));\n } else {\n delete oldObj.native[a];\n }\n }\n }\n\n if (this.state.common) {\n for (const b in this.state.common) {\n if (this.state.common[b] === null) {\n (oldObj as Record<string, any>).common[b] = null;\n } else if (this.state.common[b] !== undefined) {\n (oldObj as Record<string, any>).common[b] = JSON.parse(\n JSON.stringify(this.state.common[b]),\n );\n } else {\n delete (oldObj as Record<string, any>).common[b];\n }\n }\n }\n\n if (this.onPrepareSave(oldObj.native) !== false) {\n return this.socket.setObject(this.instanceId, oldObj);\n }\n\n return Promise.reject(new Error('Invalid configuration'));\n })\n .then(() => {\n this.savedNative = oldObj.native;\n globalThis.changed = false;\n try {\n window.parent.postMessage('nochange', '*');\n } catch {\n // ignore\n }\n\n this.setState({ changed: false });\n isClose && GenericApp.onClose();\n })\n .catch(e => console.error(`Cannot save configuration: ${e}`));\n }\n\n /**\n * Renders the toast.\n */\n renderToast(): JSX.Element | null {\n if (!this.state.toast) {\n return null;\n }\n\n return (\n <Snackbar\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n open={!0}\n autoHideDuration={6000}\n onClose={() => this.setState({ toast: '' })}\n ContentProps={{ 'aria-describedby': 'message-id' }}\n message={<span id=\"message-id\">{this.state.toast}</span>}\n action={[\n <IconButton\n key=\"close\"\n aria-label=\"Close\"\n color=\"inherit\"\n className={this.props.classes?.close}\n onClick={() => this.setState({ toast: '' })}\n size=\"large\"\n >\n <IconClose />\n </IconButton>,\n ]}\n />\n );\n }\n\n /**\n * Closes the dialog.\n */\n static onClose(): void {\n if (typeof window.parent !== 'undefined' && window.parent) {\n try {\n if (window.parent.$iframeDialog && typeof window.parent.$iframeDialog.close === 'function') {\n window.parent.$iframeDialog.close();\n } else {\n window.parent.postMessage('close', '*');\n }\n } catch {\n window.parent.postMessage('close', '*');\n }\n }\n }\n\n /**\n * Renders the error dialog.\n */\n renderError(): React.JSX.Element | null {\n if (!this.state.errorText) {\n return null;\n }\n\n return (\n <DialogError\n text={this.state.errorText}\n onClose={() => this.setState({ errorText: '' })}\n />\n );\n }\n\n /**\n * Checks if the configuration has changed.\n *\n * @param native the new state\n */\n getIsChanged(native: Record<string, any>): boolean {\n native = native || this.state.native;\n const isChanged = JSON.stringify(native) !== JSON.stringify(this.savedNative);\n\n globalThis.changed = isChanged;\n\n return isChanged;\n }\n\n /**\n * Gets called when loading the configuration.\n *\n * @param newNative The new configuration object.\n */\n onLoadConfig(newNative: Record<string, any>): void {\n if (JSON.stringify(newNative) !== JSON.stringify(this.state.native)) {\n this.setState({ native: newNative, changed: this.getIsChanged(newNative) });\n }\n }\n\n /**\n * Sets the configuration error.\n */\n setConfigurationError(errorText: string): void {\n if (this.state.isConfigurationError !== errorText) {\n this.setState({ isConfigurationError: errorText });\n }\n }\n\n /**\n * Renders the save and close buttons.\n */\n renderSaveCloseButtons(): React.JSX.Element | null {\n if (!this.state.confirmClose && !this.state.bottomButtons) {\n return null;\n }\n\n return (\n <>\n {this.state.bottomButtons ? (\n <SaveCloseButtons\n theme={this.state.theme}\n newReact={this.newReact}\n noTextOnButtons={\n this.state.width === 'xs' || this.state.width === 'sm' || this.state.width === 'md'\n }\n changed={this.state.changed}\n onSave={isClose => this.onSave(isClose)}\n onClose={() => {\n if (this.state.changed) {\n this.setState({ confirmClose: true });\n } else {\n GenericApp.onClose();\n }\n }}\n />\n ) : null}\n {this.state.confirmClose ? (\n <DialogConfirm\n title={I18n.t('ra_Please confirm')}\n text={I18n.t('ra_Some data are not stored. Discard?')}\n ok={I18n.t('ra_Discard')}\n cancel={I18n.t('ra_Cancel')}\n onClose={isYes => this.setState({ confirmClose: false }, () => isYes && GenericApp.onClose())}\n />\n ) : null}\n </>\n );\n }\n\n private _updateNativeValue(obj: Record<string, any>, attrs: string | string[], value: any): boolean {\n if (typeof attrs !== 'object') {\n attrs = attrs.split('.');\n }\n const attr: string = attrs.shift() || '';\n if (!attrs.length) {\n if (value && typeof value === 'object') {\n if (JSON.stringify(obj[attr]) !== JSON.stringify(value)) {\n obj[attr] = value;\n return true;\n }\n return false;\n }\n if (obj[attr] !== value) {\n obj[attr] = value;\n return true;\n }\n\n return false;\n }\n\n obj[attr] = obj[attr] || {};\n if (typeof obj[attr] !== 'object') {\n throw new Error(`attribute ${attr} is no object, but ${typeof obj[attr]}`);\n }\n return this._updateNativeValue(obj[attr], attrs, value);\n }\n\n /**\n * Update the native value\n *\n * @param attr The attribute name with dots as delimiter.\n * @param value The new value.\n * @param cb Callback which will be called upon completion.\n */\n updateNativeValue(attr: string, value: any, cb?: () => void): void {\n const native = JSON.parse(JSON.stringify(this.state.native));\n if (this._updateNativeValue(native, attr, value)) {\n const changed = this.getIsChanged(native);\n\n if (changed !== this.state.changed) {\n try {\n window.parent.postMessage(changed ? 'change' : 'nochange', '*');\n } catch {\n // ignore\n }\n }\n\n this.setState({ native, changed }, cb);\n }\n }\n\n /**\n * Set the error text to be shown.\n */\n showError(text: string | React.JSX.Element): void {\n this.setState({ errorText: text });\n }\n\n /**\n * Sets the toast to be shown.\n *\n * @param toast Text to be shown.\n */\n showToast(toast: string | React.JSX.Element): void {\n this.setState({ toast });\n }\n\n /**\n * Renders helper dialogs\n */\n renderHelperDialogs(): React.JSX.Element {\n return (\n <>\n {this.renderError()}\n {this.renderToast()}\n {this.renderSaveCloseButtons()}\n {this.renderAlertSnackbar()}\n </>\n );\n }\n\n /**\n * Renders this component.\n */\n render(): React.JSX.Element {\n if (!this.state.loaded) {\n return <Loader themeType={this.state.themeType} />;\n }\n\n return (\n <div className=\"App\">\n {this.renderError()}\n {this.renderToast()}\n {this.renderSaveCloseButtons()}\n {this.renderAlertSnackbar()}\n </div>\n );\n }\n}\n","/**\n * Copyright 2018-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * Licensed under the Creative Commons Attribution-NonCommercial License, Version 4.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://creativecommons.org/licenses/by-nc/4.0/legalcode.txt\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { Component, type CSSProperties } from 'react';\nimport { ChromePicker, type RGBColor } from 'react-color';\n\nimport { TextField, Menu, IconButton, Button, Box } from '@mui/material';\n\nimport { Delete as IconDelete, Close as IconClose } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\n\nimport type { IobTheme } from '../types';\n\nconst styles: Record<string, any> = {\n color: {\n width: 36,\n height: 14,\n borderRadius: 2,\n },\n delButton: {\n marginTop: 16,\n },\n swatch: {\n mt: '16px',\n p: '5px',\n backgroundColor: 'background.paper',\n borderRadius: '1px',\n boxShadow: '0 0 0 1px rgba(0,0,0,.1)',\n display: 'inline-block',\n cursor: 'pointer',\n verticalAlign: 'middle',\n },\n swatchDisabled: {\n opacity: 0.5,\n cursor: 'default',\n },\n popover: {\n '& .MuiPaper-root': {\n textAlign: 'right',\n backgroundColor: '#00000000',\n boxShadow: 'none',\n },\n },\n popoverList: {\n padding: 0,\n },\n closeButton: (theme: IobTheme) => ({\n backgroundColor: `${theme.palette.background.paper} !important`,\n borderRadius: '0 0 25% 25%',\n '&:hover': {\n backgroundColor: `${theme.palette.secondary.main} !important`,\n },\n }),\n cover: {\n position: 'fixed',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n },\n textDense: {\n mt: 0,\n mb: 0,\n },\n picker: (theme: IobTheme) => ({\n background: `${theme.palette.background.paper} !important`,\n }),\n iconButton: {\n width: 16,\n height: 16,\n },\n button: {\n width: 32,\n height: 32,\n minWidth: 32,\n minHeight: 32,\n },\n};\n\ninterface ColorPickerProps {\n /** Set to true to disable the color picker. */\n disabled?: boolean;\n /** The currently selected color. */\n value?: string;\n /** @deprecated The currently selected color use value */\n color?: string;\n /** The color change callback. */\n onChange: (rgba: string) => void;\n /** Label of the color picker. */\n label?: string;\n /** @deprecated TLabel of the color picker use label */\n name?: string;\n /** Additional styling for this component. */\n style?: CSSProperties;\n /** The CSS class name. */\n className?: string;\n customPalette?: string[];\n noInputField?: boolean;\n barWidth?: number;\n sx?: Record<string, any>;\n theme?: IobTheme;\n}\n\ninterface ColorPickerState {\n displayColorPicker: boolean;\n color: string | RGBColor;\n anchorEl: HTMLDivElement | null;\n}\n\n/**\n * A color picker component.\n */\nexport class ColorPicker extends Component<ColorPickerProps, ColorPickerState> {\n /**\n * Constructor for the color picker.\n *\n * @param props The properties.\n */\n constructor(props: ColorPickerProps) {\n super(props);\n this.state = {\n displayColorPicker: false,\n color: this.props.value || this.props.color || '',\n anchorEl: null,\n };\n }\n\n private handleClick = (e: React.MouseEvent<HTMLDivElement>): void => {\n this.setState({\n displayColorPicker: !this.state.displayColorPicker,\n anchorEl: this.state.displayColorPicker ? null : e.currentTarget,\n });\n };\n\n private handleClose = (): void => {\n this.setState({ displayColorPicker: false, anchorEl: null });\n };\n\n /**\n * Convert the given color to hex ('#rrggbb') or rgba ('rgba(r,g,b,a)') format.\n *\n * @param color The color to convert.\n * @param isHex If true, the color will be converted to hex format.\n * @returns the hex or rgba representation of the given color.\n */\n static getColor(color: string | { rgb: RGBColor } | RGBColor, isHex?: boolean): string {\n if (color && typeof color === 'object') {\n const oColor = color as { rgb: RGBColor };\n if (oColor.rgb) {\n if (isHex) {\n return `#${oColor.rgb.r.toString(16).padStart(2, '0')}${oColor.rgb.g.toString(16).padStart(2, '0')}${oColor.rgb.b.toString(16).padStart(2, '0')}`;\n }\n return `rgba(${oColor.rgb.r},${oColor.rgb.g},${oColor.rgb.b},${oColor.rgb.a})`;\n }\n const rColor = color as RGBColor;\n if (isHex) {\n return `#${rColor.r.toString(16).padStart(2, '0')}${rColor.g.toString(16).padStart(2, '0')}${rColor.b.toString(16).padStart(2, '0')}`;\n }\n return `rgba(${rColor.r},${rColor.g},${rColor.b},${rColor.a})`;\n }\n if (typeof color === 'string') {\n return isHex ? ColorPicker.rgb2hex(color || '') : color || '';\n }\n return '';\n }\n\n /**\n * Convert rgb() or rgba() format to hex format #rrggbb.\n *\n * @param rgb The color in rgb() or rgba() format. if not in this format, the color will be returned as is.\n */\n static rgb2hex(rgb: string): string {\n const m = rgb.match(/^rgba?[\\s+]?\\([\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?/i);\n\n if (m) {\n const r = parseInt(m[1], 10).toString(16).padStart(2, '0');\n const g = parseInt(m[2], 10).toString(16).padStart(2, '0');\n const b = parseInt(m[3], 10).toString(16).padStart(2, '0');\n\n return m?.length === 4 ? `#${r}${g}${b}` : rgb;\n }\n return rgb;\n }\n\n private handleChange = (color: string | RGBColor): void => {\n this.setState({ color }, () => this.props.onChange && this.props.onChange(ColorPicker.getColor(color)));\n };\n\n /**\n * If the props are updated from outside, they should override the state\n *\n * @param _prevProps The previous properties.\n * @param prevState The previous state.\n */\n componentDidUpdate(_prevProps: ColorPickerProps, prevState: ColorPickerState): void {\n const color = ColorPicker.getColor(this.props.color || this.props.value || '');\n\n if (color !== prevState.color) {\n this.setState({ color });\n }\n }\n\n renderCustomPalette(): React.JSX.Element | null {\n if (!this.props.customPalette) {\n return null;\n }\n return (\n <div style={{ width: '100%', display: 'flex', flexWrap: 'wrap' }}>\n {this.props.customPalette.map(color => (\n <Button\n style={styles.button}\n key={color}\n onClick={() => {\n this.handleChange(color);\n setTimeout(() => this.handleClose(), 300);\n }}\n >\n <div style={{ ...styles.iconButton, background: color }} />\n </Button>\n ))}\n </div>\n );\n }\n\n render(): React.JSX.Element {\n const style = { ...(this.props.style || {}) };\n style.position = 'relative';\n const { color } = this.state;\n\n return (\n <Box\n component=\"div\"\n style={style}\n sx={this.props.sx || undefined}\n className={this.props.className || ''}\n >\n {this.props.noInputField ? null : (\n <TextField\n disabled={this.props.disabled}\n variant=\"standard\"\n id=\"ar_color_picker_name\"\n label={this.props.label || this.props.name}\n value={color || ''}\n margin=\"dense\"\n sx={{\n '&.MuiFormControl-root': styles.textDense,\n width: color ? 'calc(100% - 80px)' : 'calc(100% - 56px)',\n mr: color ? undefined : 1,\n }}\n onChange={e => this.handleChange(e.target.value)}\n />\n )}\n {!this.props.noInputField && color ? (\n <IconButton\n disabled={this.props.disabled}\n onClick={() => this.handleChange('')}\n size=\"small\"\n style={this.props.label || this.props.name ? styles.delButton : undefined}\n >\n <IconDelete />\n </IconButton>\n ) : null}\n <Box\n component=\"div\"\n onClick={e => !this.props.disabled && this.handleClick(e)}\n title={I18n.t('ra_Select color')}\n sx={{\n ...styles.swatch,\n ...(this.props.disabled ? styles.swatchDisabled : undefined),\n background: color ? undefined : 'transparent',\n border: color ? undefined : '1px dashed #ccc',\n boxSizing: 'border-box',\n marginTop: this.props.noInputField || !(this.props.label || this.props.name) ? 0 : undefined,\n }}\n >\n <div\n style={{\n ...styles.color,\n background: ColorPicker.getColor(color),\n width: this.props.noInputField ? this.props.barWidth || 16 : this.props.barWidth || 36,\n }}\n />\n </Box>\n {this.state.displayColorPicker && !this.props.disabled ? (\n <Menu\n sx={{\n ...styles.popover,\n '&. MuiMenu-list': styles.popoverList,\n }}\n anchorEl={this.state.anchorEl}\n open={!0}\n onClose={() => this.handleClose()}\n >\n <ChromePicker\n color={this.state.color || undefined}\n onChangeComplete={(_color: { rgb: RGBColor }) => this.handleChange(_color.rgb)}\n styles={{\n default: {\n picker: {\n backgroundColor: this.props.theme?.palette.background.paper || '#888',\n },\n },\n }}\n />\n {color && this.props.noInputField ? (\n <IconButton\n sx={styles.closeButton}\n onClick={() => this.handleChange('')}\n >\n <IconDelete />\n </IconButton>\n ) : null}\n <IconButton\n sx={styles.closeButton}\n onClick={() => this.handleClose()}\n >\n <IconClose />\n </IconButton>\n {this.renderCustomPalette()}\n </Menu>\n ) : null}\n </Box>\n );\n }\n}\n","import cronstrue from 'cronstrue';\nimport 'cronstrue/locales/fr';\nimport 'cronstrue/locales/es';\nimport 'cronstrue/locales/de';\nimport 'cronstrue/locales/it';\nimport 'cronstrue/locales/ru';\nimport 'cronstrue/locales/zh_CN';\nimport 'cronstrue/locales/uk';\nimport 'cronstrue/locales/pt_BR';\nimport 'cronstrue/locales/pl';\n\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) => ({\n position: 'relative',\n userSelect: 'none',\n cursor: 'pointer',\n height: TILE_HEIGHT,\n width: TILE_WIDTH,\n display: 'inline-block',\n textAlign: 'center',\n opacity: 0.1,\n transition: 'opacity 1s',\n margin: '4px',\n borderRadius: '4px',\n '&:hover': {\n background: theme.palette.secondary.light,\n color: Utils.invertColor(theme.palette.secondary.main, true),\n },\n }),\n itemNameFolderTile: {\n fontWeight: 'bold',\n },\n itemNameTile: {\n width: '100%',\n height: 32,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n fontSize: 12,\n textAlign: 'center',\n wordBreak: 'break-all',\n },\n itemFolderIconTile: (theme: IobTheme) => ({\n width: '100%',\n height: TILE_HEIGHT - 32 - 16 - 8, // name + size\n display: 'block',\n pl: 1,\n color: theme.palette.secondary.main || '#fbff7d',\n }),\n itemFolderIconBack: (theme: IobTheme) => ({\n position: 'absolute',\n top: 22,\n left: 18,\n zIndex: 1,\n color: theme.palette.mode === 'dark' ? '#FFF' : '#000',\n }),\n itemSizeTile: {\n width: '100%',\n height: 16,\n textAlign: 'center',\n fontSize: 10,\n },\n itemImageTile: {\n width: 'calc(100% - 8px)',\n height: TILE_HEIGHT - 32 - 16 - 8, // name + size\n margin: 4,\n display: 'block',\n textAlign: 'center',\n objectFit: 'contain',\n },\n itemIconTile: {\n width: '100%',\n height: TILE_HEIGHT - 32 - 16 - 8, // name + size\n display: 'block',\n objectFit: 'contain',\n },\n\n itemSelected: (theme: IobTheme) => ({\n background: theme.palette.primary.main,\n color: Utils.invertColor(theme.palette.primary.main, true),\n }),\n\n itemTable: (theme: IobTheme) => ({\n userSelect: 'none',\n cursor: 'pointer',\n height: ROW_HEIGHT,\n display: 'inline-flex',\n lineHeight: `${ROW_HEIGHT}px`,\n '&:hover': {\n background: theme.palette.secondary.light,\n color: Utils.invertColor(theme.palette.secondary.main, true),\n },\n }),\n itemNameTable: {\n display: 'inline-block',\n pl: '10px',\n fontSize: '1rem',\n verticalAlign: 'top',\n flexGrow: 1,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n '@media screen and (max-width: 500px)': {\n textAlign: 'end',\n direction: 'rtl',\n },\n },\n itemNameFolderTable: {\n fontWeight: 'bold',\n },\n itemSizeTable: {\n display: 'inline-block',\n width: 60,\n verticalAlign: 'top',\n textAlign: 'right',\n whiteSpace: 'nowrap',\n },\n itemAccessTable: {\n // display: 'inline-block',\n verticalAlign: 'top',\n width: 60,\n textAlign: 'right',\n paddingRight: 5,\n display: 'flex',\n justifyContent: 'center',\n },\n itemImageTable: {\n display: 'inline-block',\n width: 30,\n marginTop: 1,\n objectFit: 'contain',\n maxHeight: 30,\n },\n itemNoImageTable: {\n marginTop: 6,\n },\n itemIconTable: {\n display: 'inline-block',\n marginTop: 1,\n width: 30,\n height: 30,\n },\n itemFolderTable: {},\n itemFolderTemp: {\n opacity: 0.4,\n },\n itemFolderIconTable: (theme: IobTheme) => ({\n marginTop: '1px',\n marginLeft: '8px',\n display: 'inline-block',\n width: 30,\n height: 30,\n color: theme.palette.secondary.main || '#fbff7d',\n }),\n itemDownloadButtonTable: (theme: IobTheme) => ({\n display: 'inline-block',\n width: BUTTON_WIDTH,\n height: ROW_HEIGHT,\n minWidth: BUTTON_WIDTH,\n verticalAlign: 'middle',\n textAlign: 'center',\n padding: 0,\n borderRadius: `${BUTTON_WIDTH / 2}px`,\n '&:hover': {\n backgroundColor: theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.08)',\n },\n '& span': {\n pt: '9px',\n },\n '& svg': {\n width: 14,\n height: 14,\n fontSize: '1rem',\n mt: '-3px',\n verticalAlign: 'middle',\n color: theme.palette.mode === 'dark' ? '#EEE' : '#111',\n },\n }),\n itemDownloadEmptyTable: {\n display: 'inline-block',\n width: BUTTON_WIDTH,\n height: ROW_HEIGHT,\n minWidth: BUTTON_WIDTH,\n padding: 0,\n },\n itemAclButtonTable: {\n width: BUTTON_WIDTH,\n height: ROW_HEIGHT,\n minWidth: BUTTON_WIDTH,\n verticalAlign: 'top',\n padding: 0,\n fontSize: 12,\n display: 'flex',\n },\n itemDeleteButtonTable: {\n display: 'inline-block',\n width: BUTTON_WIDTH,\n height: ROW_HEIGHT,\n minWidth: BUTTON_WIDTH,\n verticalAlign: 'top',\n padding: 0,\n '& svg': {\n width: 18,\n height: 18,\n fontSize: '1.5rem',\n },\n },\n\n uploadDiv: {\n top: 0,\n zIndex: 1,\n bottom: 0,\n left: 0,\n right: 0,\n position: 'absolute',\n opacity: 0.9,\n textAlign: 'center',\n background: '#FFFFFF',\n },\n uploadDivDragging: {\n opacity: 1,\n },\n\n uploadCenterDiv: (theme: IobTheme) => ({\n m: '20px',\n border: '3px dashed grey',\n borderRadius: '30px',\n width: 'calc(100% - 40px)',\n height: 'calc(100% - 40px)',\n position: 'relative',\n color: theme.palette.mode === 'dark' ? '#222' : '#CCC',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }),\n uploadCenterIcon: {\n width: '25%',\n height: '25%',\n },\n uploadCenterText: {\n fontSize: 24,\n fontWeight: 'bold',\n },\n uploadCloseButton: {\n zIndex: 2,\n position: 'absolute',\n top: 30,\n right: 30,\n },\n uploadCenterTextAndIcon: {\n position: 'absolute',\n height: '30%',\n width: '100%',\n margin: 'auto',\n opacity: 0.3,\n },\n menuButtonExpertActive: {\n color: '#c00000',\n },\n menuButtonRestrictActive: {\n color: '#c05000',\n },\n pathDiv: (theme: IobTheme) => ({\n display: 'flex',\n width: 'calc(100% - 16px)',\n ml: 1,\n mr: 1,\n textOverflow: 'clip',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n backgroundColor: theme.palette.secondary.main,\n }),\n pathDivInput: {\n width: '100%',\n },\n pathDivBreadcrumbDir: (theme: IobTheme) => ({\n pl: '2px',\n pr: '2px',\n cursor: 'pointer',\n '&:hover': {\n background: theme.palette.primary.main,\n },\n }),\n pathDivBreadcrumbSelected: {\n // todo: add style\n },\n backgroundImageLight: {\n background: 'white',\n },\n backgroundImageDark: {\n background: 'black',\n },\n backgroundImageColored: {\n background: 'silver',\n },\n specialFolder: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#229b0f' : '#5dd300',\n }),\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\nconst USER_DATA = '0_userdata.0';\n\nfunction getParentDir(dir: string | null): string {\n const parts = (dir || '').split('/');\n if (parts.length) {\n parts.pop();\n }\n return parts.join('/');\n}\n\nfunction isFile(path: string): boolean {\n const ext = Utils.getFileExtension(path);\n return !!(ext?.toLowerCase().match(/[a-z]+/) && ext.length < 5);\n}\n\nconst TABLE = 'Table';\nconst TILE = 'Tile';\n\nexport interface FileBrowserProps {\n /** The key to identify this component. */\n key?: string;\n /** Additional styling for this component. */\n style?: React.CSSProperties;\n /** The CSS class name. */\n className?: string;\n /** Translation function. */\n t: Translate;\n /** The selected language. */\n lang: ioBroker.Languages;\n /** The socket connection. */\n socket: Connection;\n /** Shows if the component data ready. */\n ready?: boolean;\n /** Is expert mode enabled? (default: false) */\n expertMode?: boolean;\n /** Show the toolbar? (default: false) */\n showToolbar?: boolean;\n /** If defined, allow selecting only files from this folder and subfolders */\n limitPath?: string;\n /** Allow upload of new files? (default: false) */\n allowUpload?: boolean;\n /** Allow download of files? (default: false) */\n allowDownload?: boolean;\n /** Allow creation of new folders? (default: false) */\n allowCreateFolder?: boolean;\n /** Allow deleting files? (default: false) */\n allowDelete?: boolean;\n /** Allow viewing files? (default: false) */\n allowView?: boolean;\n /** Prefix (default: '.') */\n imagePrefix?: string;\n /** Show the expert button? */\n showExpertButton?: boolean;\n /** Type of view */\n viewType?: 'Table' | 'Tile';\n /** Show the buttons to switch the view from table to tile? (default: false) */\n showViewTypeButton?: boolean;\n /** The ID of the selected file. */\n selected?: string | string[];\n /** The file extensions to show, like ['png', 'svg', 'bmp', 'jpg', 'jpeg', 'gif']. */\n filterFiles?: string[];\n /** The file extension categories to show. */\n filterByType?: 'images' | 'code' | 'txt';\n /** Callback for file selection. */\n onSelect?: (id: string | string[], isDoubleClick?: boolean, isFolder?: boolean) => void;\n /** Theme name */\n themeName?: ThemeName;\n /** Theme type. */\n themeType?: ThemeType;\n /** Theme object. */\n theme: IobTheme;\n\n /** Padding in pixels for folder levels */\n levelPadding?: number;\n\n restrictToFolder?: string;\n\n modalEditOfAccessControl?: (obj: FileBrowserClass) => JSX.Element | null;\n\n allowNonRestricted?: boolean;\n\n showTypeSelector?: boolean;\n\n FileViewer?: React.FC<FileViewerProps>;\n}\n\nexport interface FolderOrFileItem {\n id: string;\n level: number;\n name: string;\n folder: boolean;\n temp?: boolean;\n\n size?: number | undefined;\n ext?: string | null;\n modified?: number;\n title?: ioBroker.StringOrTranslated;\n meta?: boolean;\n from?: string;\n ts?: number;\n color?: string;\n icon?: string;\n acl?: ioBroker.EvaluatedFileACL | MetaACL;\n}\n\nexport type Folders = Record<string, FolderOrFileItem[]>;\n\nfunction sortFolders(a: FolderOrFileItem, b: FolderOrFileItem): number {\n if (a.folder && b.folder) {\n return a.name > b.name ? 1 : a.name < b.name ? -1 : 0;\n }\n if (a.folder) {\n return -1;\n }\n if (b.folder) {\n return 1;\n }\n return a.name > b.name ? 1 : a.name < b.name ? -1 : 0;\n}\n\ninterface FileBrowserState {\n viewType: string;\n folders: Folders;\n filterEmpty: boolean;\n expanded: string[];\n currentDir: string;\n expertMode: boolean;\n addFolder: boolean;\n uploadFile: boolean | 'dragging';\n deleteItem: string;\n viewer: string;\n formatEditFile: string | null;\n path: string;\n selected: string;\n errorText: string;\n modalEditOfAccess: boolean;\n backgroundImage: string | null;\n queueLength: number;\n loadAllFolders: boolean;\n fileErrors: string[];\n filterByType: string;\n showTypesMenu: HTMLButtonElement | null;\n restrictToFolder: string;\n pathFocus: boolean;\n}\n\nexport class FileBrowserClass extends Component<FileBrowserProps, FileBrowserState> {\n private readonly imagePrefix: string;\n\n private readonly levelPadding: number;\n\n private mounted: boolean;\n\n private suppressDeleteConfirm: number;\n\n private browseList:\n | {\n processing?: boolean;\n resolve: null | ((files: ioBroker.ReadDirResult[]) => void);\n reject: null | ((e: any) => void);\n adapter: string | null;\n relPath: string | null;\n }[]\n | null;\n\n private browseListRunning: boolean;\n\n private initialReadFinished: boolean;\n\n private supportSubscribes: boolean | null;\n\n private _tempTimeout: Record<string, ReturnType<typeof setTimeout>>;\n\n private readonly limitToObjectID: string | null = null;\n\n private readonly limitToPath: string | null = null;\n\n private lastSelect: number | null = null;\n\n private setOpacityTimer: ReturnType<typeof setTimeout> | null = null;\n\n private cacheFoldersTimeout: ReturnType<typeof setTimeout> | null = null;\n\n private foldersLoading: boolean | null = null;\n\n private cacheFolders: Folders | null = null;\n\n private readonly localStorage: Storage;\n\n constructor(props: FileBrowserProps) {\n super(props);\n\n this.localStorage = (window as any)._localStorage || window.localStorage;\n const expandedStr = this.localStorage.getItem('files.expanded') || '[]';\n\n if (this.props.limitPath) {\n const parts = this.props.limitPath.split('/');\n this.limitToObjectID = parts[0];\n this.limitToPath = !parts.length ? null : parts.length === 1 && parts[0] === '' ? null : parts.join('/');\n if (this.limitToPath && this.limitToPath.endsWith('/')) {\n this.limitToPath.substring(0, this.limitToPath.length - 1);\n }\n }\n\n let expanded: string[];\n try {\n expanded = JSON.parse(expandedStr);\n if (this.limitToPath) {\n expanded = expanded.filter(\n id =>\n id.startsWith(`${this.limitToPath}/`) ||\n id === this.limitToPath ||\n this.limitToPath?.startsWith(`${id}/`),\n );\n }\n } catch {\n expanded = [];\n }\n\n let viewType;\n if (this.props.showViewTypeButton) {\n viewType = this.localStorage.getItem('files.viewType') || TABLE;\n } else {\n viewType = TABLE;\n }\n\n let selected = this.props.selected || this.localStorage.getItem('files.selected') || USER_DATA;\n\n let currentDir: string;\n\n if (props.restrictToFolder) {\n selected = props.restrictToFolder;\n currentDir = props.restrictToFolder;\n const parts = props.restrictToFolder.split('/');\n expanded = [];\n let path = '';\n for (let i = 0; i < parts.length; i++) {\n path += (path ? '/' : '') + parts[i];\n expanded.push(path);\n }\n } else {\n // TODO: Now we do not support multiple selection\n if (Array.isArray(selected)) {\n selected = selected[0];\n }\n\n if (isFile(selected)) {\n currentDir = getParentDir(selected);\n } else {\n currentDir = selected;\n }\n }\n const backgroundImage = this.localStorage.getItem('files.backgroundImage') || null;\n\n this.state = {\n viewType,\n folders: {},\n filterEmpty: this.localStorage.getItem('files.empty') !== 'false',\n expanded,\n currentDir,\n expertMode: !!props.expertMode,\n addFolder: false,\n uploadFile: false,\n deleteItem: '',\n // marked: [],\n viewer: '',\n formatEditFile: '',\n path: selected,\n selected,\n errorText: '',\n modalEditOfAccess: false,\n backgroundImage,\n queueLength: 0,\n loadAllFolders: false,\n // allFoldersLoaded: false,\n fileErrors: [],\n filterByType: props.filterByType || window.localStorage.getItem('files.filterByType') || '',\n showTypesMenu: null,\n restrictToFolder: props.restrictToFolder || '',\n pathFocus: false,\n };\n\n this.imagePrefix = this.props.imagePrefix || './files/';\n\n this.levelPadding = this.props.levelPadding || 20;\n this.mounted = true;\n this.suppressDeleteConfirm = 0;\n\n this.browseList = [];\n this.browseListRunning = false;\n this.initialReadFinished = false;\n this.supportSubscribes = null;\n this._tempTimeout = {};\n }\n\n static getDerivedStateFromProps(\n props: FileBrowserProps,\n state: FileBrowserState,\n ): Partial<FileBrowserState> | null {\n if (props.expertMode !== undefined && props.expertMode !== state.expertMode) {\n return { expertMode: props.expertMode, loadAllFolders: true };\n }\n\n return null;\n }\n\n async loadFolders(): Promise<void> {\n this.initialReadFinished = false;\n\n let folders = (await this.browseFolder('/')) as unknown as Folders;\n\n if (this.state.viewType === TABLE) {\n folders = (await this.browseFolders([...this.state.expanded], folders)) as unknown as Folders;\n } else if (\n this.state.currentDir &&\n this.state.currentDir !== '/' &&\n (!this.limitToObjectID || this.state.currentDir.startsWith(this.limitToObjectID))\n ) {\n folders = (await this.browseFolder(this.state.currentDir, folders)) as unknown as Folders;\n }\n\n this.setState({ folders }, () => {\n if (this.state.viewType === TABLE && !this.findItem(this.state.selected)) {\n const parts = this.state.selected.split('/');\n while (parts.length && !this.findItem(parts.join('/'))) {\n parts.pop();\n }\n let selected;\n if (parts.length) {\n selected = parts.join('/');\n } else {\n selected = USER_DATA;\n }\n this.setState({ selected, path: selected, pathFocus: false }, () => this.scrollToSelected());\n } else {\n this.scrollToSelected();\n }\n this.initialReadFinished = true;\n });\n }\n\n scrollToSelected(): void {\n if (this.mounted) {\n const el = document.getElementById(this.state.selected);\n el?.scrollIntoView();\n }\n }\n\n async componentDidMount(): Promise<void> {\n this.mounted = true;\n this.loadFolders().catch(error => console.error(`Cannot load folders: ${error}`));\n\n this.supportSubscribes = await this.props.socket.checkFeatureSupported('BINARY_STATE_EVENT');\n if (this.supportSubscribes) {\n await this.props.socket.subscribeFiles('*', '*', this.onFileChange);\n }\n }\n\n componentWillUnmount(): void {\n if (this.supportSubscribes) {\n this.props.socket.unsubscribeFiles('*', '*', this.onFileChange);\n }\n this.mounted = false;\n this.browseList = null;\n this.browseListRunning = false;\n Object.values(this._tempTimeout).forEach(timer => timer && clearTimeout(timer));\n this._tempTimeout = {};\n }\n\n browseFoldersCb(foldersList: string[], newFoldersNotNull: Folders, cb: (folders: Folders) => void): void {\n if (!foldersList?.length) {\n cb(newFoldersNotNull);\n } else {\n const folder = foldersList.shift();\n if (folder) {\n void this.browseFolder(folder, newFoldersNotNull)\n .catch((e: Error) => console.error(`Cannot read folder ${folder}: ${e.message}`))\n .then(() => {\n setTimeout(() => this.browseFoldersCb(foldersList, newFoldersNotNull, cb), 0);\n });\n } else {\n setTimeout(() => this.browseFoldersCb(foldersList, newFoldersNotNull, cb), 0);\n }\n }\n }\n\n browseFolders(foldersList: string[], _newFolders?: Folders | null): Promise<Folders> {\n let newFoldersNotNull: Folders;\n if (!_newFolders) {\n newFoldersNotNull = {};\n Object.keys(this.state.folders).forEach(folder => (newFoldersNotNull[folder] = this.state.folders[folder]));\n } else {\n newFoldersNotNull = _newFolders;\n }\n\n if (!foldersList?.length) {\n return Promise.resolve(newFoldersNotNull);\n }\n return new Promise(resolve => {\n this.browseFoldersCb(foldersList, newFoldersNotNull, resolve);\n });\n }\n\n readDirSerial(adapter: string, relPath: string): Promise<ioBroker.ReadDirResult[]> {\n return new Promise((resolve, reject) => {\n if (this.browseList) {\n // if component still mounted\n this.browseList.push({\n resolve: resolve as unknown as (files: ioBroker.ReadDirResult[]) => void,\n reject,\n adapter,\n relPath,\n });\n if (!this.browseListRunning) {\n this.processBrowseList();\n }\n }\n });\n }\n\n processBrowseList(level: number = 0): void {\n if (!this.browseListRunning && this.browseList && this.browseList.length) {\n this.browseListRunning = true;\n if (this.browseList.length > 10) {\n // not too often\n if (!(this.browseList.length % 10)) {\n this.setState({ queueLength: this.browseList.length });\n }\n } else {\n this.setState({ queueLength: this.browseList.length });\n }\n\n this.browseList[0].processing = true;\n this.props.socket\n .readDir(this.browseList[0].adapter, this.browseList[0].relPath)\n .then(files => {\n if (this.browseList) {\n // if component still mounted\n const item = this.browseList.shift();\n if (item) {\n const resolve = item.resolve;\n item.resolve = null;\n item.reject = null;\n item.adapter = null;\n item.relPath = null;\n if (resolve) {\n resolve(files);\n }\n this.browseListRunning = false;\n if (this.browseList.length) {\n if (level < 5) {\n this.processBrowseList(level + 1);\n } else {\n setTimeout(() => this.processBrowseList(0), 0);\n }\n } else {\n this.setState({ queueLength: 0 });\n }\n } else {\n this.setState({ queueLength: 0 });\n }\n }\n })\n .catch(e => {\n if (this.browseList) {\n // if component still mounted\n const item = this.browseList.shift();\n if (item) {\n const reject = item.reject;\n item.resolve = null;\n item.reject = null;\n item.adapter = null;\n item.relPath = null;\n if (reject) {\n reject(e);\n }\n this.browseListRunning = false;\n if (this.browseList.length) {\n if (level < 5) {\n this.processBrowseList(level + 1);\n } else {\n setTimeout(() => this.processBrowseList(0), 0);\n }\n } else {\n this.setState({ queueLength: 0 });\n }\n } else {\n this.setState({ queueLength: 0 });\n }\n }\n });\n }\n }\n\n async browseFolder(\n folderId: string,\n _newFolders?: Folders | null,\n _checkEmpty?: boolean,\n force?: boolean,\n ): Promise<Folders> {\n let newFoldersNotNull: Folders;\n if (!_newFolders) {\n newFoldersNotNull = {};\n Object.keys(this.state.folders).forEach(folder => {\n newFoldersNotNull[folder] = this.state.folders[folder];\n });\n } else {\n newFoldersNotNull = _newFolders;\n }\n\n if (newFoldersNotNull[folderId] && !force) {\n if (!_checkEmpty) {\n return new Promise((resolve, reject) => {\n Promise.all(\n newFoldersNotNull[folderId]\n .filter(item => item.folder)\n .map(item => this.browseFolder(item.id, newFoldersNotNull, true).catch(() => undefined)),\n )\n .then(() => resolve(newFoldersNotNull))\n .catch(error => reject(new Error(error)));\n });\n }\n\n return Promise.resolve(newFoldersNotNull);\n }\n\n // if root folder\n if (!folderId || folderId === '/') {\n try {\n let objs = (await this.props.socket.readMetaItems()) as MetaObject[];\n const _folders: FolderOrFileItem[] = [];\n let userData = null;\n\n if (this.state.restrictToFolder) {\n const adapter = this.state.restrictToFolder.split('/')[0];\n objs = objs.filter(obj => obj._id === adapter);\n } else if (!this.state.expertMode) {\n // load only adapter.admin and not other meta files like hm-rpc.0.devices.blablabla\n objs = objs.filter(obj => !obj._id.endsWith('.admin'));\n }\n\n const pos = objs.findIndex(obj => obj._id === 'system.meta.uuid');\n if (pos !== -1) {\n objs.splice(pos, 1);\n }\n\n objs.forEach(obj => {\n if (this.limitToObjectID && this.limitToObjectID !== obj._id) {\n return;\n }\n\n const item: FolderOrFileItem = {\n id: obj._id,\n name: obj._id,\n title: (obj.common && obj.common.name) || obj._id,\n meta: true,\n from: obj.from,\n ts: obj.ts,\n color: obj.common && obj.common.color,\n icon: obj.common && obj.common.icon,\n folder: true,\n acl: obj.acl,\n level: 0,\n };\n\n if (item.id === USER_DATA) {\n // user data must be first\n userData = item;\n } else {\n _folders.push(item);\n }\n });\n\n _folders.sort((a, b) => (a.id > b.id ? 1 : a.id < b.id ? -1 : 0));\n if (!this.limitToObjectID || this.limitToObjectID === USER_DATA) {\n if (userData) {\n _folders.unshift(userData);\n }\n }\n\n newFoldersNotNull[folderId || '/'] = _folders;\n\n if (!_checkEmpty) {\n return Promise.all(\n _folders\n .filter(item => item.folder)\n .map(item => this.browseFolder(item.id, newFoldersNotNull, true).catch(() => undefined)),\n ).then(() => newFoldersNotNull);\n }\n } catch (e: unknown) {\n const knownError = e as Error;\n if (this.initialReadFinished) {\n window.alert(`Cannot read meta items: ${knownError.message}`);\n }\n newFoldersNotNull[folderId || '/'] = [];\n }\n return newFoldersNotNull;\n }\n\n const parts = folderId.split('/');\n const level = parts.length;\n const adapter = parts.shift();\n const relPath = parts.join('/');\n\n // make all requests here serial\n let files: ioBroker.ReadDirResult[];\n try {\n files = await this.readDirSerial(adapter || '', relPath);\n } catch (error: unknown) {\n // work around: 0_userdata.0 is a special folder, that should exist event when other folders and itself do not exit, as the browser shows it anyway.\n if (error === 'Not exists' && adapter === '0_userdata.0') {\n files = [];\n } else {\n throw error;\n }\n }\n try {\n const _folders: FolderOrFileItem[] = [];\n\n files.forEach(file => {\n const item: FolderOrFileItem = {\n id: `${folderId}/${file.file}`,\n ext: Utils.getFileExtension(file.file),\n folder: file.isDir,\n name: file.file,\n size: file.stats?.size,\n modified: file.modifiedAt,\n acl: file.acl,\n level,\n };\n\n if (this.state.restrictToFolder) {\n if (\n item.folder &&\n (item.id.startsWith(`${this.state.restrictToFolder}/`) ||\n item.id === this.state.restrictToFolder ||\n this.state.restrictToFolder.startsWith(`${item.id}/`))\n ) {\n _folders.push(item);\n } else if (item.id.startsWith(`${this.state.restrictToFolder}/`)) {\n _folders.push(item);\n }\n } else if (this.limitToPath) {\n if (\n item.folder &&\n (item.id.startsWith(`${this.limitToPath}/`) ||\n item.id === this.limitToPath ||\n this.limitToPath.startsWith(`${item.id}/`))\n ) {\n _folders.push(item);\n } else if (item.id.startsWith(`${this.limitToPath}/`)) {\n _folders.push(item);\n }\n } else {\n _folders.push(item);\n }\n });\n\n _folders.sort(sortFolders);\n newFoldersNotNull[folderId] = _folders;\n\n if (!_checkEmpty) {\n return Promise.all(\n _folders\n .filter(item => item.folder)\n .map(item => this.browseFolder(item.id, newFoldersNotNull, true)),\n ).then(() => newFoldersNotNull);\n }\n } catch (e: unknown) {\n const knownError = e as Error;\n if (this.initialReadFinished) {\n window.alert(`Cannot read ${adapter}${relPath ? `/${relPath}` : ''}: ${knownError?.message}`);\n }\n newFoldersNotNull[folderId] = [];\n }\n\n return newFoldersNotNull;\n }\n\n toggleFolder(item: FolderOrFileItem, e: React.MouseEvent): void {\n e?.stopPropagation();\n const expanded = [...this.state.expanded];\n const pos = expanded.indexOf(item.id);\n if (pos === -1) {\n expanded.push(item.id);\n expanded.sort();\n\n this.localStorage.setItem('files.expanded', JSON.stringify(expanded));\n\n if (!item.temp) {\n this.browseFolder(item.id)\n .then(folders => this.setState({ expanded, folders }))\n .catch(err =>\n window.alert(\n err === NOT_FOUND\n ? this.props.t('ra_Cannot find \"%s\"', item.id)\n : this.props.t('ra_Cannot read \"%s\"', item.id),\n ),\n );\n } else {\n this.setState({ expanded });\n }\n } else {\n expanded.splice(pos, 1);\n this.localStorage.setItem('files.expanded', JSON.stringify(expanded));\n this.setState({ expanded });\n }\n }\n\n onFileChange = (id: string, fileName: string, size: number | null): void => {\n const key = `${id}/${fileName}`;\n const pos = key.lastIndexOf('/');\n const folder = key.substring(0, pos);\n console.log(`File changed ${key}[${size}]`);\n\n if (this.state.folders[folder]) {\n if (this._tempTimeout[folder]) {\n clearTimeout(this._tempTimeout[folder]);\n }\n\n this._tempTimeout[folder] = setTimeout(() => {\n delete this._tempTimeout[folder];\n\n this.browseFolder(folder, null, false, true)\n .then(folders => this.setState({ folders }))\n .catch(e => console.error(`Cannot read folder: ${e.message}`));\n }, 300);\n }\n };\n\n changeFolder(e: React.MouseEvent<HTMLDivElement>, folder?: string): void {\n e?.stopPropagation();\n\n this.lastSelect = Date.now();\n\n let _folder = folder || getParentDir(this.state.currentDir);\n\n if (_folder === '/') {\n _folder = '';\n }\n\n this.localStorage.setItem('files.currentDir', _folder);\n\n if (folder && e && (e.altKey || e.shiftKey || e.ctrlKey || e.metaKey)) {\n this.setState({ selected: _folder });\n return;\n }\n\n // If desired folder is not yet loaded\n if (_folder && !this.state.folders[_folder]) {\n this.browseFolder(_folder)\n .then(folders =>\n this.setState(\n {\n folders,\n path: _folder,\n currentDir: _folder,\n selected: _folder,\n pathFocus: false,\n },\n () => this.props.onSelect && this.props.onSelect(''),\n ),\n )\n .catch(_e => console.error(`Cannot read folder: ${_e.message}`));\n return;\n }\n\n this.setState(\n {\n currentDir: _folder,\n selected: _folder,\n path: _folder,\n pathFocus: false,\n },\n () => this.props.onSelect && this.props.onSelect(''),\n );\n }\n\n select(id: string, e?: React.MouseEvent<HTMLDivElement> | null, cb?: () => void): void {\n if (e) {\n e.stopPropagation();\n }\n this.lastSelect = Date.now();\n\n this.localStorage.setItem('files.selected', id);\n\n this.setState({ selected: id, path: id, pathFocus: false }, () => {\n if (this.props.onSelect) {\n const ext = Utils.getFileExtension(id);\n if (\n (!this.props.filterFiles || (ext && this.props.filterFiles.includes(ext))) &&\n (!this.state.filterByType ||\n (ext && (EXTENSIONS as Record<string, string[]>)[this.state.filterByType].includes(ext)))\n ) {\n this.props.onSelect(id, false, !!this.state.folders[id]);\n } else {\n this.props.onSelect('');\n }\n }\n if (cb) {\n cb();\n }\n });\n }\n\n getText(text?: ioBroker.StringOrTranslated | null): string | undefined {\n if (text) {\n if (typeof text === 'object') {\n return text[this.props.lang] || text.en || undefined;\n }\n return text;\n }\n return undefined;\n }\n\n renderFolder(item: FolderOrFileItem, expanded?: boolean): JSX.Element | null {\n if (\n this.state.viewType === TABLE &&\n this.state.filterEmpty &&\n (!this.state.folders[item.id] || !this.state.folders[item.id].length) &&\n item.id !== USER_DATA &&\n !item.temp\n ) {\n return null;\n }\n const IconEl = expanded ? IconOpen : IconClosed;\n const padding = this.state.viewType === TABLE ? item.level * this.levelPadding : 0;\n const isUserData = item.name === USER_DATA;\n const isSpecialData = isUserData || item.name === 'vis.0' || item.name === 'vis-2.0';\n\n const iconStyle = Utils.getStyle(\n this.props.theme,\n styles[`itemFolderIcon${this.state.viewType}`],\n isSpecialData && styles.specialFolder,\n );\n return (\n <Box\n component=\"div\"\n key={item.id}\n id={item.id}\n style={this.state.viewType === TABLE ? { marginLeft: padding, width: `calc(100% - ${padding}px` } : {}}\n onClick={e => (this.state.viewType === TABLE ? this.select(item.id, e) : this.changeFolder(e, item.id))}\n onDoubleClick={e => this.state.viewType === TABLE && this.toggleFolder(item, e)}\n title={this.getText(item.title)}\n className=\"browserItem\"\n sx={Utils.getStyle(\n this.props.theme,\n styles[`item${this.state.viewType}`],\n styles[`itemFolder${this.state.viewType}`],\n this.state.selected === item.id ? styles.itemSelected : {},\n item.temp ? styles.itemFolderTemp : {},\n )}\n >\n <IconEl\n style={iconStyle}\n onClick={\n this.state.viewType === TABLE ? (e: React.MouseEvent) => this.toggleFolder(item, e) : undefined\n }\n />\n\n <Box\n component=\"div\"\n sx={Utils.getStyle(\n this.props.theme,\n styles[`itemName${this.state.viewType}`],\n styles[`itemNameFolder${this.state.viewType}`],\n )}\n >\n {isUserData ? this.props.t('ra_User files') : item.name}\n </Box>\n\n <Box\n component=\"div\"\n style={styles[`itemSize${this.state.viewType}`]}\n sx={{ display: { md: 'inline-block', sm: 'none' } }}\n >\n {this.state.viewType === TABLE && this.state.folders[item.id]\n ? this.state.folders[item.id].length\n : ''}\n </Box>\n\n <Box\n component=\"div\"\n sx={{ display: { md: 'inline-block', sm: 'none' } }}\n >\n {this.state.viewType === TABLE && this.props.expertMode ? this.formatAcl(item.acl) : null}\n </Box>\n\n {this.state.viewType === TABLE && this.props.expertMode ? (\n <Box\n component=\"div\"\n sx={{ ...styles.itemDeleteButtonTable, display: { md: 'inline-block', sm: 'none' } }}\n />\n ) : null}\n\n {this.state.viewType === TABLE && this.props.allowDownload ? (\n <div style={styles[`itemDownloadEmpty${this.state.viewType}`]} />\n ) : null}\n\n {this.state.viewType === TABLE &&\n this.props.allowDelete &&\n this.state.folders[item.id] &&\n this.state.folders[item.id].length ? (\n <IconButton\n aria-label=\"delete\"\n onClick={e => {\n e.stopPropagation();\n if (this.suppressDeleteConfirm > Date.now()) {\n this.deleteItem(item.id);\n } else {\n this.setState({ deleteItem: item.id });\n }\n }}\n sx={styles[`itemDeleteButton${this.state.viewType}`]}\n size=\"large\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n ) : this.state.viewType === TABLE && this.props.allowDelete ? (\n <Box\n component=\"div\"\n sx={styles[`itemDeleteButton${this.state.viewType}`]}\n />\n ) : null}\n </Box>\n );\n }\n\n renderBackFolder(): JSX.Element {\n return (\n <Box\n component=\"div\"\n key={this.state.currentDir}\n id={this.state.currentDir}\n onClick={e => this.changeFolder(e)}\n title={this.props.t('ra_Back to %s', getParentDir(this.state.currentDir))}\n className=\"browserItem\"\n sx={Utils.getStyle(\n this.props.theme,\n styles[`item${this.state.viewType}`],\n styles[`itemFolder${this.state.viewType}`],\n )}\n >\n <IconClosed style={Utils.getStyle(this.props.theme, styles[`itemFolderIcon${this.state.viewType}`])} />\n <IconBack sx={styles.itemFolderIconBack} />\n\n <Box\n component=\"div\"\n sx={Utils.getStyle(\n this.props.theme,\n styles[`itemName${this.state.viewType}`],\n styles[`itemNameFolder${this.state.viewType}`],\n )}\n >\n ..\n </Box>\n </Box>\n );\n }\n\n formatSize(size: number | null | undefined): JSX.Element {\n return (\n <div style={styles[`itemSize${this.state.viewType}`]}>\n {size || size === 0 ? Utils.formatBytes(size) : ''}\n </div>\n );\n }\n\n formatAcl(acl: ioBroker.EvaluatedFileACL | MetaACL | undefined): JSX.Element {\n const access: number = acl ? (acl as ioBroker.EvaluatedFileACL).permissions || (acl as MetaACL).file : 0;\n let accessStr: string;\n if (access) {\n accessStr = access.toString(16).padStart(3, '0');\n } else {\n accessStr = '';\n }\n\n return (\n <div style={styles[`itemAccess${this.state.viewType}`]}>\n {this.props.modalEditOfAccessControl ? (\n <IconButton\n size=\"large\"\n onClick={() => this.setState({ modalEditOfAccess: true })}\n sx={styles[`itemAclButton${this.state.viewType}`]}\n >\n {accessStr || '---'}\n </IconButton>\n ) : (\n accessStr || '---'\n )}\n </div>\n );\n }\n\n getFileIcon(ext: string | null): JSX.Element {\n switch (ext) {\n case 'json':\n case 'json5':\n return <JsonIcon style={styles[`itemIcon${this.state.viewType}`]} />;\n\n case 'css':\n return <CssIcon style={styles[`itemIcon${this.state.viewType}`]} />;\n\n case 'js':\n case 'ts':\n return <JSIcon style={styles[`itemIcon${this.state.viewType}`]} />;\n\n case 'html':\n case 'md':\n return <HtmlIcon style={styles[`itemIcon${this.state.viewType}`]} />;\n\n case 'mp3':\n case 'ogg':\n case 'wav':\n case 'm4a':\n case 'mp4':\n case 'flac':\n return <MusicIcon style={styles[`itemIcon${this.state.viewType}`]} />;\n\n default:\n return <FileIcon style={styles[`itemIcon${this.state.viewType}`]} />;\n }\n }\n\n static getEditFile(ext: string | null): boolean {\n switch (ext) {\n case 'json':\n case 'json5':\n case 'js':\n case 'html':\n case 'txt':\n case 'css':\n case 'log':\n return true;\n default:\n return false;\n }\n }\n\n setStateBackgroundImage = (): void => {\n const array = ['light', 'dark', 'colored', 'delete'];\n this.setState(({ backgroundImage }) => {\n if (\n backgroundImage &&\n array.indexOf(backgroundImage) !== -1 &&\n array.length - 1 !== array.indexOf(backgroundImage)\n ) {\n this.localStorage.setItem('files.backgroundImage', array[array.indexOf(backgroundImage) + 1]);\n return { backgroundImage: array[array.indexOf(backgroundImage) + 1] };\n }\n this.localStorage.setItem('files.backgroundImage', array[0]);\n return { backgroundImage: array[0] };\n });\n };\n\n getStyleBackgroundImage = (): React.CSSProperties | null => {\n // ['light', 'dark', 'colored', 'delete']\n switch (this.state.backgroundImage) {\n case 'light':\n return styles.backgroundImageLight;\n case 'dark':\n return styles.backgroundImageDark;\n case 'colored':\n return styles.backgroundImageColored;\n case 'delete':\n return null;\n default:\n return null;\n }\n };\n\n renderFile(item: FolderOrFileItem): JSX.Element {\n const padding = this.state.viewType === TABLE ? item.level * this.levelPadding : 0;\n const ext = Utils.getFileExtension(item.name);\n\n return (\n <Box\n component=\"div\"\n key={item.id}\n id={item.id}\n onDoubleClick={e => {\n e.stopPropagation();\n if (!this.props.onSelect) {\n this.setState({ viewer: this.imagePrefix + item.id, formatEditFile: ext });\n } else if (\n (!this.props.filterFiles || (item.ext && this.props.filterFiles.includes(item.ext))) &&\n (!this.state.filterByType ||\n (item.ext &&\n (EXTENSIONS as Record<string, string[]>)[this.state.filterByType].includes(item.ext)))\n ) {\n this.props.onSelect(item.id, true, !!this.state.folders[item.id]);\n }\n }}\n onClick={e => this.select(item.id, e)}\n style={this.state.viewType === TABLE ? { marginLeft: padding, width: `calc(100% - ${padding}px)` } : {}}\n className=\"browserItem\"\n sx={Utils.getStyle(\n this.props.theme,\n styles[`item${this.state.viewType}`],\n styles[`itemFile${this.state.viewType}`],\n this.state.selected === item.id ? styles.itemSelected : undefined,\n )}\n >\n {ext && EXTENSIONS.images.includes(ext) ? (\n this.state.fileErrors.includes(item.id) ? (\n <IconNoIcon\n style={{\n ...styles[`itemImage${this.state.viewType}`],\n ...this.getStyleBackgroundImage(),\n ...styles[`itemNoImage${this.state.viewType}`],\n }}\n />\n ) : (\n <Icon\n onError={e => {\n (e.target as HTMLImageElement).onerror = null;\n const fileErrors = [...this.state.fileErrors];\n if (!fileErrors.includes(item.id)) {\n fileErrors.push(item.id);\n this.setState({ fileErrors });\n }\n }}\n style={{ ...styles[`itemImage${this.state.viewType}`], ...this.getStyleBackgroundImage() }}\n src={this.imagePrefix + item.id}\n alt={item.name}\n />\n )\n ) : (\n this.getFileIcon(ext)\n )}\n <Box\n component=\"div\"\n sx={styles[`itemName${this.state.viewType}`]}\n >\n {item.name}\n </Box>\n <Box\n component=\"div\"\n sx={{ display: { md: 'inline-block', sm: 'none' } }}\n >\n {this.formatSize(item.size)}\n </Box>\n <Box\n component=\"div\"\n sx={{ display: { md: 'inline-block', sm: 'none' } }}\n >\n {this.state.viewType === TABLE && this.props.expertMode ? this.formatAcl(item.acl) : null}\n </Box>\n <Box\n component=\"div\"\n sx={{ display: { md: 'inline-block', sm: 'none' } }}\n >\n {this.state.viewType === TABLE && this.props.expertMode && FileBrowserClass.getEditFile(ext) ? (\n <IconButton\n aria-label=\"edit\"\n onClick={e => {\n e.stopPropagation();\n if (!this.props.onSelect) {\n this.setState({ viewer: this.imagePrefix + item.id, formatEditFile: ext });\n } else if (\n (!this.props.filterFiles ||\n (item.ext && this.props.filterFiles.includes(item.ext))) &&\n (!this.state.filterByType ||\n (item.ext &&\n (EXTENSIONS as Record<string, string[]>)[this.state.filterByType].includes(\n item.ext,\n )))\n ) {\n this.props.onSelect(item.id, true, !!this.state.folders[item.id]);\n }\n }}\n sx={styles.itemDeleteButtonTable}\n size=\"large\"\n >\n <EditIcon fontSize=\"small\" />\n </IconButton>\n ) : (\n <Box\n component=\"div\"\n sx={styles[`itemDeleteButton${this.state.viewType}`]}\n />\n )}\n </Box>\n {this.state.viewType === TABLE && this.props.allowDownload ? (\n <Box\n component=\"a\"\n className=\"MuiButtonBase-root MuiIconButton-root MuiIconButton-sizeLarge\"\n sx={styles.itemDownloadButtonTable}\n tabIndex={0}\n download={item.id}\n href={this.imagePrefix + item.id}\n onClick={e => e.stopPropagation()}\n >\n <DownloadIcon />\n </Box>\n ) : null}\n\n {this.state.viewType === TABLE &&\n this.props.allowDelete &&\n item.id !== 'vis.0/' &&\n item.id !== 'vis-2.0/' &&\n item.id !== USER_DATA ? (\n <IconButton\n aria-label=\"delete\"\n onClick={e => {\n e.stopPropagation();\n if (this.suppressDeleteConfirm > Date.now()) {\n this.deleteItem(item.id);\n } else {\n this.setState({ deleteItem: item.id });\n }\n }}\n sx={styles[`itemDeleteButton${this.state.viewType}`]}\n size=\"large\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n ) : this.state.viewType === TABLE && this.props.allowDelete ? (\n <Box\n component=\"div\"\n sx={styles[`itemDeleteButton${this.state.viewType}`]}\n />\n ) : null}\n </Box>\n );\n }\n\n renderItems(folderId: string): JSX.Element | (JSX.Element | null)[] {\n if (this.state.folders && this.state.folders[folderId]) {\n // tile\n if (this.state.viewType === TILE) {\n const res: (JSX.Element | null)[] = [];\n if (folderId && folderId !== '/') {\n res.push(this.renderBackFolder());\n }\n this.state.folders[folderId].forEach(item => {\n if (item.folder) {\n res.push(this.renderFolder(item));\n } else if (\n (!this.props.filterFiles || (item.ext && this.props.filterFiles.includes(item.ext))) &&\n (!this.state.filterByType ||\n (item.ext &&\n (EXTENSIONS as Record<string, string[]>)[this.state.filterByType].includes(item.ext)))\n ) {\n res.push(this.renderFile(item));\n }\n });\n return res;\n }\n\n const totalResult: (JSX.Element | null)[] = [];\n this.state.folders[folderId].forEach(item => {\n if (item.folder) {\n const expanded = this.state.expanded.includes(item.id);\n\n const folders = this.renderFolder(item, expanded);\n if (Array.isArray(folders)) {\n folders.forEach(folder => totalResult.push(folder));\n } else {\n totalResult.push(folders);\n }\n if (this.state.folders[item.id] && expanded) {\n const items = this.renderItems(item.id);\n if (Array.isArray(items)) {\n items.forEach(_item => totalResult.push(_item));\n } else {\n totalResult.push(items);\n }\n }\n } else if (\n (!this.props.filterFiles || (item.ext && this.props.filterFiles.includes(item.ext))) &&\n (!this.state.filterByType ||\n (item.ext &&\n (EXTENSIONS as Record<string, string[]>)[this.state.filterByType].includes(item.ext)))\n ) {\n totalResult.push(this.renderFile(item));\n }\n });\n\n return totalResult;\n }\n\n return (\n <div style={{ position: 'relative' }}>\n <CircularProgress\n key={folderId}\n color=\"secondary\"\n size={24}\n />\n <div\n style={{\n position: 'absolute',\n zIndex: 2,\n top: 4,\n width: 24,\n textAlign: 'center',\n }}\n >\n {this.state.queueLength}\n </div>\n </div>\n );\n }\n\n renderToolbar(): JSX.Element {\n const IconType: React.FC<{ fontSize?: 'small' }> | null = this.props.showTypeSelector\n ? FILE_TYPE_ICONS[this.state.filterByType || 'all'] || FILE_TYPE_ICONS.all\n : null;\n\n const isInFolder = this.findFirstFolder(this.state.selected);\n\n return (\n <Toolbar\n key=\"toolbar\"\n variant=\"dense\"\n >\n {this.props.allowNonRestricted && this.props.restrictToFolder ? (\n <IconButton\n edge=\"start\"\n title={\n this.state.restrictToFolder\n ? this.props.t('ra_Show all folders')\n : this.props.t('ra_Restrict to folder')\n }\n style={{\n ...styles.menuButton,\n ...(this.state.restrictToFolder ? styles.menuButtonRestrictActive : undefined),\n }}\n aria-label=\"restricted to folder\"\n onClick={() =>\n this.setState({\n restrictToFolder:\n (this.state.restrictToFolder ? '' : this.props.restrictToFolder) || '',\n loadAllFolders: true,\n })\n }\n size=\"small\"\n >\n <RestrictedIcon fontSize=\"small\" />\n </IconButton>\n ) : null}\n {this.props.showExpertButton ? (\n <IconButton\n edge=\"start\"\n title={this.props.t('ra_Toggle expert mode')}\n style={{\n ...styles.menuButton,\n ...(this.state.expertMode ? styles.menuButtonExpertActive : undefined),\n }}\n aria-label=\"expert mode\"\n onClick={() => this.setState({ expertMode: !this.state.expertMode })}\n size=\"small\"\n >\n <IconExpert />\n </IconButton>\n ) : null}\n {this.props.showViewTypeButton ? (\n <IconButton\n edge=\"start\"\n title={this.props.t('ra_Toggle view mode')}\n style={styles.menuButton}\n aria-label=\"view mode\"\n onClick={() => {\n const viewType = this.state.viewType === TABLE ? TILE : TABLE;\n this.localStorage.setItem('files.viewType', viewType);\n let currentDir = this.state.selected;\n if (isFile(currentDir)) {\n currentDir = getParentDir(currentDir);\n }\n this.setState({ viewType, currentDir }, () => {\n if (this.state.viewType === TABLE) {\n this.scrollToSelected();\n }\n });\n }}\n size=\"small\"\n >\n {this.state.viewType !== TABLE ? <IconList fontSize=\"small\" /> : <IconTile fontSize=\"small\" />}\n </IconButton>\n ) : null}\n <IconButton\n edge=\"start\"\n title={this.props.t('ra_Hide empty folders')}\n style={styles.menuButton}\n color={this.state.filterEmpty ? 'secondary' : 'inherit'}\n aria-label=\"filter empty\"\n onClick={() => {\n this.localStorage.setItem('file.empty', this.state.filterEmpty ? 'false' : 'true');\n this.setState({ filterEmpty: !this.state.filterEmpty });\n }}\n size=\"small\"\n >\n <EmptyFilterIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n edge=\"start\"\n title={this.props.t('ra_Reload files')}\n style={styles.menuButton}\n color=\"inherit\"\n aria-label=\"reload files\"\n onClick={() => this.setState({ folders: {} }, () => this.loadFolders())}\n size=\"small\"\n >\n <RefreshIcon fontSize=\"small\" />\n </IconButton>\n {this.props.allowCreateFolder ? (\n <IconButton\n edge=\"start\"\n disabled={\n !this.state.selected ||\n !isInFolder ||\n (!!this.limitToPath &&\n !this.state.selected.startsWith(`${this.limitToPath}/`) &&\n this.limitToPath !== this.state.selected)\n }\n title={this.props.t('ra_Create folder')}\n style={styles.menuButton}\n color=\"inherit\"\n aria-label=\"add folder\"\n onClick={() => this.setState({ addFolder: true })}\n size=\"small\"\n >\n <AddFolderIcon fontSize=\"small\" />\n </IconButton>\n ) : null}\n {this.props.allowUpload ? (\n <IconButton\n edge=\"start\"\n disabled={\n !this.state.selected ||\n !isInFolder ||\n (!!this.limitToPath &&\n !this.state.selected.startsWith(`${this.limitToPath}/`) &&\n this.limitToPath !== this.state.selected)\n }\n title={this.props.t('ra_Upload file')}\n style={styles.menuButton}\n color=\"inherit\"\n aria-label=\"upload file\"\n onClick={() => this.setState({ uploadFile: true })}\n size=\"small\"\n >\n <UploadIcon fontSize=\"small\" />\n </IconButton>\n ) : null}\n {this.props.showTypeSelector && IconType ? (\n <Tooltip\n title={this.props.t('ra_Filter files')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"small\"\n onClick={e => this.setState({ showTypesMenu: e.target as HTMLButtonElement })}\n >\n <IconType fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n ) : null}\n {this.state.showTypesMenu ? (\n <Menu\n open={!0}\n anchorEl={this.state.showTypesMenu}\n onClose={() => this.setState({ showTypesMenu: null })}\n >\n {Object.keys(FILE_TYPE_ICONS).map(type => {\n const MyIcon: React.FC<{ fontSize?: 'small' }> = FILE_TYPE_ICONS[type];\n return (\n <MenuItem\n key={type}\n selected={this.state.filterByType === type}\n onClick={() => {\n if (type === 'all') {\n this.localStorage.removeItem('files.filterByType');\n this.setState({ filterByType: '', showTypesMenu: null });\n } else {\n this.localStorage.setItem('files.filterByType', type);\n this.setState({ filterByType: type, showTypesMenu: null });\n }\n }}\n >\n <ListItemIcon>\n <MyIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>{this.props.t(`ra_fileType_${type}`)}</ListItemText>\n </MenuItem>\n );\n })}\n </Menu>\n ) : null}\n <Tooltip\n title={this.props.t('ra_Background image')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n color=\"inherit\"\n edge=\"start\"\n style={styles.menuButton}\n onClick={this.setStateBackgroundImage}\n size=\"small\"\n >\n <Brightness5Icon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n {this.state.viewType !== TABLE && this.props.allowDelete ? (\n <Tooltip\n title={this.props.t('ra_Delete')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <span>\n <IconButton\n aria-label=\"delete\"\n disabled={\n !this.state.selected ||\n this.state.selected === 'vis.0/' ||\n this.state.selected === 'vis-2.0/' ||\n this.state.selected === USER_DATA\n }\n color=\"inherit\"\n edge=\"start\"\n style={styles.menuButton}\n onClick={e => {\n e.stopPropagation();\n if (this.suppressDeleteConfirm > Date.now()) {\n this.deleteItem(this.state.selected);\n } else {\n this.setState({ deleteItem: this.state.selected });\n }\n }}\n size=\"small\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n </span>\n </Tooltip>\n ) : null}\n </Toolbar>\n );\n }\n\n findItem(id: string, folders?: Folders | null): null | FolderOrFileItem {\n folders = folders || this.state.folders;\n if (!folders) {\n return null;\n }\n const parts = id.split('/');\n parts.pop();\n const parentFolder = parts.join('/') || '/';\n if (!folders[parentFolder]) {\n return null;\n }\n return folders[parentFolder].find(item => item.id === id) || null;\n }\n\n renderInputDialog(): JSX.Element | null {\n if (this.state.addFolder) {\n const parentFolder = this.findFirstFolder(this.state.selected);\n\n if (!parentFolder) {\n window.alert(this.props.t('ra_Invalid parent folder!'));\n return null;\n }\n\n return (\n <DialogTextInput\n key=\"inputDialog\"\n applyText={this.props.t('ra_Create')}\n cancelText={this.props.t('ra_Cancel')}\n titleText={this.props.t('ra_Create new folder in %s', this.state.selected)}\n promptText={this.props.t(\n 'ra_If no file will be created in the folder, it will disappear after the browser closed',\n )}\n labelText={this.props.t('ra_Folder name')}\n verify={(text: string) =>\n this.state.folders[parentFolder].find(item => item.name === text)\n ? ''\n : this.props.t('ra_Duplicate name')\n }\n onClose={(name: string | null) => {\n if (name) {\n const folders: Folders = {};\n Object.keys(this.state.folders).forEach(\n folder => (folders[folder] = this.state.folders[folder]),\n );\n const parent = this.findItem(parentFolder);\n const id = `${parentFolder}/${name}`;\n folders[parentFolder].push({\n id,\n level: (parent?.level || 0) + 1,\n name,\n folder: true,\n temp: true,\n });\n\n folders[parentFolder].sort(sortFolders);\n\n folders[id] = [];\n const expanded = [...this.state.expanded];\n if (!expanded.includes(parentFolder)) {\n expanded.push(parentFolder);\n expanded.sort();\n }\n this.localStorage.setItem('files.expanded', JSON.stringify(expanded));\n this.setState({ addFolder: false, folders, expanded }, () => this.select(id));\n } else {\n this.setState({ addFolder: false });\n }\n }}\n replace={(text: string) => text.replace(/[^-_\\w]/, '_')}\n />\n );\n }\n return null;\n }\n\n componentDidUpdate(/* prevProps , prevState, snapshot */): void {\n if (this.setOpacityTimer) {\n clearTimeout(this.setOpacityTimer);\n }\n this.setOpacityTimer = setTimeout(() => {\n this.setOpacityTimer = null;\n const items = window.document.getElementsByClassName('browserItem');\n for (let i = 0; i < items.length; i++) {\n (items[i] as HTMLElement).style.opacity = '1';\n }\n }, 100);\n }\n\n findFirstFolder(id: string): string | null {\n let parentFolder = id;\n const item = this.findItem(parentFolder);\n // find folder\n if (item && !item.folder) {\n const parts = parentFolder.split('/');\n parts.pop();\n parentFolder = '';\n while (parts.length) {\n const _item = this.findItem(parts.join('/'));\n if (_item?.folder) {\n parentFolder = parts.join('/');\n break;\n }\n parts.pop();\n }\n if (!parts.length) {\n return null;\n }\n }\n\n return parentFolder;\n }\n\n async uploadFile(fileName: string, data: string): Promise<void> {\n const parts: string[] = fileName.split('/');\n const adapterName = parts.shift();\n try {\n await this.props.socket.writeFile64(adapterName || '', parts.join('/'), data);\n } catch (e: unknown) {\n const knownError = e as Error;\n window.alert(`Cannot write file: ${knownError?.message}`);\n }\n }\n\n renderUpload(): JSX.Element[] | null {\n if (this.state.uploadFile) {\n return [\n <Fab\n key=\"close\"\n color=\"primary\"\n aria-label=\"close\"\n style={styles.uploadCloseButton}\n onClick={() => this.setState({ uploadFile: false })}\n >\n <CloseIcon />\n </Fab>,\n <Dropzone\n key=\"dropzone\"\n onDragEnter={() => this.setState({ uploadFile: 'dragging' })}\n onDragLeave={() => this.setState({ uploadFile: true })}\n onDrop={acceptedFiles => {\n let count = acceptedFiles.length;\n\n acceptedFiles.forEach(file => {\n const reader = new FileReader();\n\n reader.onabort = () => console.log('file reading was aborted');\n reader.onerror = () => console.log('file reading has failed');\n reader.onload = () => {\n const parentFolder = this.findFirstFolder(this.state.selected);\n\n if (!parentFolder) {\n window.alert(this.props.t('ra_Invalid parent folder!'));\n } else {\n const id = `${parentFolder}/${file.name}`;\n\n void this.uploadFile(id, reader.result as string).then(() => {\n if (!--count) {\n this.setState({ uploadFile: false }, () => {\n if (this.supportSubscribes) {\n // open current folder\n const expanded = [...this.state.expanded];\n if (!expanded.includes(parentFolder)) {\n expanded.push(parentFolder);\n expanded.sort();\n this.localStorage.setItem(\n 'files.expanded',\n JSON.stringify(expanded),\n );\n }\n this.setState({ expanded }, () => this.select(id));\n } else {\n setTimeout(\n () =>\n this.browseFolder(parentFolder, null, false, true).then(\n folders => {\n // open current folder\n const expanded = [...this.state.expanded];\n if (!expanded.includes(parentFolder)) {\n expanded.push(parentFolder);\n expanded.sort();\n this.localStorage.setItem(\n 'files.expanded',\n JSON.stringify(expanded),\n );\n }\n this.setState({ folders, expanded }, () =>\n this.select(id),\n );\n },\n ),\n 500,\n );\n }\n });\n }\n });\n }\n };\n\n reader.readAsArrayBuffer(file);\n });\n }}\n >\n {({ getRootProps, getInputProps }) => (\n <div\n style={{\n ...styles.uploadDiv,\n ...(this.state.uploadFile === 'dragging' ? styles.uploadDivDragging : undefined),\n }}\n {...getRootProps()}\n >\n <input {...getInputProps()} />\n <Box\n component=\"div\"\n sx={styles.uploadCenterDiv}\n >\n <div style={styles.uploadCenterTextAndIcon}>\n <UploadIcon style={styles.uploadCenterIcon} />\n <div style={styles.uploadCenterText}>\n {this.state.uploadFile === 'dragging'\n ? this.props.t('ra_Drop file here')\n : this.props.t(\n 'ra_Place your files here or click here to open the browse dialog',\n )}\n </div>\n </div>\n </Box>\n </div>\n )}\n </Dropzone>,\n ];\n }\n return null;\n }\n\n deleteRecursive(id: string): Promise<void> {\n const item = this.findItem(id);\n if (item?.folder) {\n return (\n this.state.folders[id]\n ? Promise.all(this.state.folders[id].map(_item => this.deleteRecursive(_item.id)))\n : Promise.resolve()\n ).then(() => {\n // If it is a folder of second level\n if (item.level >= 1) {\n const parts = id.split('/');\n const adapter = parts.shift();\n void this.props.socket.deleteFolder(adapter || '', parts.join('/')).then(() => {\n // remove this folder\n const folders = JSON.parse(JSON.stringify(this.state.folders));\n delete folders[item.id];\n // delete folder from parent item\n const parentId = getParentDir(item.id);\n const parentFolder = folders[parentId];\n if (parentFolder) {\n const pos = parentFolder.findIndex((f: FolderOrFileItem) => f.id === item.id);\n if (pos !== -1) {\n parentFolder.splice(pos, 1);\n }\n\n this.select(parentId, null, () => this.setState({ folders }));\n }\n });\n }\n });\n }\n\n const parts = id.split('/');\n const adapter = parts.shift();\n if (parts.length) {\n return this.props.socket\n .deleteFile(adapter || '', parts.join('/'))\n .catch(e => window.alert(`Cannot delete file: ${e}`));\n }\n return Promise.resolve();\n }\n\n deleteItem(deleteItem: string): void {\n deleteItem = deleteItem || this.state.deleteItem;\n\n this.setState({ deleteItem: '' }, () =>\n this.deleteRecursive(deleteItem).then(() => {\n const newState: Partial<FileBrowserState> = {};\n const pos = this.state.expanded.indexOf(deleteItem);\n if (pos !== -1) {\n const expanded = [...this.state.expanded];\n expanded.splice(pos, 1);\n this.localStorage.setItem('files.expanded', JSON.stringify(expanded));\n newState.expanded = expanded;\n }\n\n if (this.state.selected === deleteItem) {\n const parts = this.state.selected.split('/');\n parts.pop();\n newState.selected = parts.join('/');\n }\n\n if (!this.supportSubscribes) {\n const parentFolder = this.findFirstFolder(deleteItem);\n const folders: Folders = {};\n\n Object.keys(this.state.folders).forEach(name => {\n if (name !== parentFolder && !name.startsWith(`${parentFolder}/`)) {\n folders[name] = this.state.folders[name];\n }\n });\n\n newState.folders = folders;\n\n this.setState(newState as FileBrowserState, () =>\n setTimeout(() => {\n this.browseFolders([...this.state.expanded], folders)\n .then(_folders => this.setState({ folders: _folders }))\n .catch(e => console.error(e));\n }, 200),\n );\n } else {\n this.setState(newState as FileBrowserState);\n }\n }),\n );\n }\n\n renderDeleteDialog(): JSX.Element | null {\n if (this.state.deleteItem) {\n return (\n <Dialog\n key=\"deleteDialog\"\n open={!0}\n onClose={() => this.setState({ deleteItem: '' })}\n aria-labelledby=\"ar_dialog_file_delete_title\"\n >\n <DialogTitle id=\"ar_dialog_file_delete_title\">\n {this.props.t('ra_Confirm deletion of %s', this.state.deleteItem.split('/').pop())}\n </DialogTitle>\n <DialogContent>\n <DialogContentText>{this.props.t('ra_Are you sure?')}</DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n color=\"grey\"\n variant=\"contained\"\n onClick={() => {\n this.suppressDeleteConfirm = Date.now() + 60000 * 5;\n this.deleteItem('');\n }}\n >\n {this.props.t('ra_Delete (no confirm for 5 mins)')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => this.deleteItem('')}\n color=\"primary\"\n autoFocus\n >\n {this.props.t('ra_Delete')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({ deleteItem: '' })}\n color=\"grey\"\n >\n {this.props.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n return null;\n }\n\n renderViewDialog(): JSX.Element | null {\n const FileViewerComponent = this.props.FileViewer || FileViewer;\n\n return this.state.viewer ? (\n <FileViewerComponent\n supportSubscribes={this.supportSubscribes}\n key={this.state.viewer}\n href={this.state.viewer}\n formatEditFile={this.state.formatEditFile}\n themeType={this.props.themeType}\n setStateBackgroundImage={this.setStateBackgroundImage}\n getStyleBackgroundImage={this.getStyleBackgroundImage}\n t={this.props.t}\n socket={this.props.socket}\n onClose={() => this.setState({ viewer: '', formatEditFile: '' })}\n />\n ) : null;\n }\n\n renderError(): JSX.Element | null {\n if (this.state.errorText) {\n return (\n <DialogError\n key=\"errorDialog\"\n text={this.state.errorText}\n onClose={() => this.setState({ errorText: '' })}\n />\n );\n }\n return null;\n }\n\n // used in tabs/Files\n // eslint-disable-next-line react/no-unused-class-component-methods\n updateItemsAcl(info: FolderOrFileItem[]): void {\n this.cacheFolders = this.cacheFolders || JSON.parse(JSON.stringify(this.state.folders));\n let changed;\n\n info.forEach(it => {\n const item = this.findItem(it.id, this.cacheFolders);\n if (item && JSON.stringify(item.acl) !== JSON.stringify(it.acl)) {\n item.acl = it.acl;\n changed = true;\n }\n });\n if (changed) {\n if (this.cacheFoldersTimeout) {\n clearTimeout(this.cacheFoldersTimeout);\n }\n this.cacheFoldersTimeout = setTimeout(() => {\n this.cacheFoldersTimeout = null;\n const folders = this.cacheFolders || {};\n this.cacheFolders = null;\n this.setState({ folders });\n }, 200);\n }\n }\n\n changeToPath(): void {\n setTimeout(() => {\n if (this.state.path !== this.state.selected && (!this.lastSelect || Date.now() - this.lastSelect > 100)) {\n let folder = this.state.path;\n if (isFile(this.state.path)) {\n folder = getParentDir(this.state.path);\n }\n new Promise(resolve => {\n if (!this.state.folders[folder]) {\n this.browseFolder(folder)\n .then(folders => this.setState({ folders }, () => resolve(true)))\n .catch(err =>\n this.setState({\n errorText:\n err === NOT_FOUND\n ? this.props.t('ra_Cannot find \"%s\"', folder)\n : this.props.t('ra_Cannot read \"%s\"', folder),\n }),\n );\n } else {\n resolve(true);\n }\n })\n .then(\n result =>\n result &&\n this.setState({ selected: this.state.path, currentDir: folder, pathFocus: false }),\n )\n .catch(e => console.error(e));\n } else if (!this.lastSelect || Date.now() - this.lastSelect > 100) {\n this.setState({ pathFocus: false });\n }\n }, 100);\n }\n\n renderBreadcrumb(): JSX.Element {\n const parts = this.state.currentDir.startsWith('/')\n ? this.state.currentDir.split('/')\n : `/${this.state.currentDir}`.split('/');\n const p: string[] = [];\n return (\n <Breadcrumbs style={{ paddingLeft: 8 }}>\n {parts.map((part, i) => {\n if (part) {\n p.push(part);\n }\n const path = p.join('/');\n if (i < parts.length - 1) {\n return (\n <Box\n component=\"div\"\n key={`${this.state.selected}_${i}`}\n sx={styles.pathDivBreadcrumbDir}\n onClick={e => this.changeFolder(e, path || '/')}\n >\n {part || this.props.t('ra_Root')}\n </Box>\n );\n }\n\n return (\n <div\n style={styles.pathDivBreadcrumbSelected}\n key={`${this.state.selected}_${i}`}\n onClick={() => this.setState({ pathFocus: true })}\n >\n {part}\n </div>\n );\n })}\n </Breadcrumbs>\n );\n }\n\n renderPath(): JSX.Element {\n return (\n <Box\n component=\"div\"\n key=\"path\"\n sx={styles.pathDiv}\n >\n {this.state.pathFocus ? (\n <Input\n value={this.state.path}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n this.changeToPath();\n } else if (e.key === 'Escape') {\n this.setState({ pathFocus: false });\n }\n }}\n endAdornment={\n <IconButton\n size=\"small\"\n onClick={() => this.changeToPath()}\n >\n <EnterIcon />\n </IconButton>\n }\n onBlur={() => this.changeToPath()}\n onChange={e => this.setState({ path: e.target.value })}\n style={styles.pathDivInput}\n />\n ) : (\n this.renderBreadcrumb()\n )}\n </Box>\n );\n }\n\n render(): JSX.Element {\n if (!this.props.ready) {\n return <LinearProgress />;\n }\n\n if (this.state.loadAllFolders && !this.foldersLoading) {\n this.foldersLoading = true;\n setTimeout(() => {\n this.setState({ loadAllFolders: false, folders: {} }, () => {\n this.foldersLoading = false;\n this.loadFolders().catch(error => console.error(`Cannot load folders: ${error}`));\n });\n }, 300);\n }\n\n return (\n <div\n style={{ ...styles.root, ...this.props.style }}\n className={this.props.className}\n >\n {this.props.showToolbar ? this.renderToolbar() : null}\n {this.state.viewType === TILE ? this.renderPath() : null}\n <div\n style={{\n ...styles.filesDiv,\n ...styles[`filesDiv${this.state.viewType}`],\n }}\n onClick={e => {\n if (this.state.viewType !== TABLE) {\n if (this.state.selected !== (this.state.currentDir || '/')) {\n this.changeFolder(e, this.state.currentDir || '/');\n } else {\n e.stopPropagation();\n }\n }\n }}\n >\n {this.state.viewType === TABLE\n ? this.renderItems('/')\n : this.renderItems(this.state.currentDir || '/')}\n {this.state.viewType !== TABLE ? (\n <div style={styles.filesDivHint}>{this.props.t('ra_select_folder_hint')}</div>\n ) : null}\n </div>\n {this.props.allowUpload ? this.renderInputDialog() : null}\n {this.props.allowUpload ? this.renderUpload() : null}\n {this.props.allowDelete ? this.renderDeleteDialog() : null}\n {this.props.allowView ? this.renderViewDialog() : null}\n {this.state.modalEditOfAccess && this.props.modalEditOfAccessControl\n ? this.props.modalEditOfAccessControl(this)\n : null}\n {this.renderError()}\n </div>\n );\n }\n}\n\nexport const FileBrowser = withWidth()(FileBrowserClass);\n","import React 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 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 '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 === '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 = getElementFromSource(src) as HTMLElement;\n const inner = svg.innerHTML;\n const svgProps = serializeAttrs(svg.attributes);\n\n svg.remove();\n\n return (\n <svg\n className={this.props.className}\n style={this.state.color ? { color: this.state.color } : {}}\n {...svgProps}\n dangerouslySetInnerHTML={{ __html: inner }}\n />\n );\n } catch {\n // ignore\n }\n return null;\n }\n\n render(): JSX.Element | null {\n if (this.state.svg) {\n if (!this.state.created) {\n setTimeout(() => {\n this.svg = this.state.src ? this.getSvgFromData(this.state.src) : null;\n this.setState({ created: true });\n }, 50);\n }\n\n return this.svg;\n }\n if (this.state.src) {\n if (this.state.imgError || !this.state.src) {\n return <IconNoIcon className={this.props.className} />;\n }\n if (\n Image.REMOTE_SERVER &&\n !this.state.src.startsWith('http://') &&\n !this.state.src.startsWith('https://')\n ) {\n let src = (this.props.imagePrefix || '') + this.state.src;\n if (src.startsWith('./')) {\n src = Image.REMOTE_PREFIX + src.substring(2);\n } else if (!src.startsWith('/')) {\n src = Image.REMOTE_PREFIX + src;\n }\n return (\n <img\n className={this.props.className}\n src={`https://remote-files.iobroker.in${src}`}\n alt=\"\"\n onError={() =>\n this.props.showError ? this.setState({ imgError: true }) : this.setState({ src: '' })\n }\n />\n );\n }\n\n return (\n <img\n className={this.props.className}\n src={(this.props.imagePrefix || '') + this.state.src}\n alt=\"\"\n onError={() =>\n this.props.showError ? this.setState({ imgError: true }) : this.setState({ src: '' })\n }\n />\n );\n }\n\n return null;\n }\n}\n","import React from 'react';\nimport { Fab } from '@mui/material';\n\nimport {\n Help as IconHelp,\n VerticalAlignTop as IconUpload,\n VerticalAlignBottom as IconDownload,\n} from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\nimport { Icon } from './Icon';\n\ninterface LogoProps {\n /* Adapter common configuration from io-package.json */\n common: any;\n /* Adapter native data from io-package.json */\n native: any;\n /* Adapter instance number. */\n instance: number;\n /* on Load handler */\n onLoad?: (contents: any) => void;\n /* on Error handler */\n onError?: (error: string) => void;\n className?: string;\n style?: Record<string, any>;\n}\n\nexport class Logo extends React.Component<LogoProps> {\n static generateFile(fileName: string, obj: any): void {\n const el = window.document.createElement('a');\n el.setAttribute(\n 'href',\n `data:application/json;charset=utf-8,${encodeURIComponent(JSON.stringify(obj, null, 2))}`,\n );\n el.setAttribute('download', fileName);\n\n el.style.display = 'none';\n window.document.body.appendChild(el);\n\n el.click();\n\n window.document.body.removeChild(el);\n }\n\n handleFileSelect = (evt: Event): void => {\n const target = evt.target as HTMLInputElement;\n const files = target?.files;\n if (!files || !files.length) {\n console.error('No files found. Please report to developers');\n return;\n }\n const f = files[0];\n\n if (f) {\n const r = new window.FileReader();\n r.onload = () => {\n const contents: string = r.result?.toString() || '';\n try {\n const json = JSON.parse(contents);\n if (json.native && json.common) {\n if (json.common.name !== this.props.common.name) {\n this.props.onError && this.props.onError(I18n.t('ra_otherConfig', json.common.name));\n } else {\n this.props.onLoad && this.props.onLoad(json.native);\n }\n } else {\n this.props.onError && this.props.onError(I18n.t('ra_invalidConfig'));\n }\n } catch (err: any) {\n this.props.onError && this.props.onError(err?.toString());\n }\n };\n r.readAsText(f);\n } else {\n alert('Failed to open JSON File');\n }\n };\n\n download(): void {\n const result = {\n _id: `system.adapter.${this.props.common.name}.${this.props.instance}`,\n common: JSON.parse(JSON.stringify(this.props.common)),\n native: this.props.native,\n };\n // remove unimportant information\n if (result.common.news) {\n delete result.common.news;\n }\n if (result.common.titleLang) {\n delete result.common.titleLang;\n }\n if (result.common.desc) {\n delete result.common.desc;\n }\n\n // window.open('data:application/iobroker; content-disposition=attachment; filename=' + result._id + '.json,' + JSON.stringify(result, null, 2));\n Logo.generateFile(`${result._id}.json`, result);\n }\n\n upload(): void {\n const input = window.document.createElement('input');\n input.setAttribute('type', 'file');\n input.setAttribute('id', 'files');\n input.setAttribute('opacity', '0');\n input.addEventListener('change', this.handleFileSelect, false);\n input.click();\n }\n\n render(): React.JSX.Element {\n return (\n <div\n className={this.props.className}\n style={this.props.style}\n >\n {this.props.common.icon ? (\n <Icon\n src={this.props.common.icon}\n style={{\n padding: 8,\n width: 64,\n }}\n alt=\"logo\"\n />\n ) : null}\n {this.props.common.readme ? (\n <Fab\n size=\"small\"\n color=\"primary\"\n aria-label=\"Help\"\n style={{\n marginRight: 5,\n marginTop: 5,\n float: 'right',\n }}\n onClick={() => {\n const win = window.open(this.props.common.readme, '_blank');\n win?.focus();\n }}\n >\n <IconHelp />\n </Fab>\n ) : null}\n <Fab\n size=\"small\"\n color=\"primary\"\n aria-label=\"Load config\"\n style={{\n marginRight: 5,\n marginTop: 5,\n float: 'right',\n }}\n title={I18n.t('ra_Load configuration from file')}\n onClick={() => this.upload()}\n >\n <IconUpload />\n </Fab>\n <Fab\n size=\"small\"\n color=\"primary\"\n aria-label=\"Save config\"\n style={{\n marginRight: 5,\n marginTop: 5,\n float: 'right',\n }}\n title={I18n.t('ra_Save configuration to file')}\n onClick={() => this.download()}\n >\n <IconDownload />\n </Fab>\n </div>\n );\n }\n}\n","/**\n * Copyright 2018-2023 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport { copy } from './CopyToClipboard';\n\nexport class MDUtils {\n static text2link(text: string): string {\n const m = text.match(/\\d+\\.\\)\\s/);\n if (m) {\n text = text.replace(m[0], m[0].replace(/\\s/, '&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 { Router } from './Router';\nimport type { ThemeType, ThemeName, IobTheme, Translate } from '../types';\nimport { Connection } from '../Connection';\nimport { Icon } from './Icon';\nimport { withWidth } from './withWidth';\nimport { Utils } from './Utils'; // @iobroker/adapter-react-v5/Components/Utils\nimport { TabContainer } from './TabContainer';\nimport { TabContent } from './TabContent';\nimport { TabHeader } from './TabHeader';\n\ndeclare global {\n interface Window {\n sparkline: {\n sparkline: (el: HTMLDivElement, data: number[]) => JSX.Element;\n };\n }\n}\ndeclare module '@mui/material/Button' {\n interface ButtonPropsColorOverrides {\n grey: true;\n }\n}\n\nconst ICON_SIZE = 24;\nconst ROW_HEIGHT = 32;\nconst ITEM_LEVEL = 16;\nconst SMALL_BUTTON_SIZE = 20;\nconst COLOR_NAME_USERDATA = (themeType: ThemeType): string => (themeType === 'dark' ? '#62ff25' : '#37c400');\nconst COLOR_NAME_ALIAS = (themeType: ThemeType): string => (themeType === 'dark' ? '#ee56ff' : '#a204b4');\nconst COLOR_NAME_JAVASCRIPT = (themeType: ThemeType): string => (themeType === 'dark' ? '#fff46e' : '#b89101');\nconst COLOR_NAME_SYSTEM = (themeType: ThemeType): string => (themeType === 'dark' ? '#ff6d69' : '#ff6d69');\nconst COLOR_NAME_SYSTEM_ADAPTER = (themeType: ThemeType): string => (themeType === 'dark' ? '#5773ff' : '#5773ff');\nconst COLOR_NAME_ERROR_DARK = '#ff413c';\nconst COLOR_NAME_ERROR_LIGHT = '#86211f';\nconst COLOR_NAME_CONNECTED_DARK = '#57ff45';\nconst COLOR_NAME_CONNECTED_LIGHT = '#098c04';\nconst COLOR_NAME_DISCONNECTED_DARK = '#f3ad11';\nconst COLOR_NAME_DISCONNECTED_LIGHT = '#6c5008';\n\ntype ObjectEventType = 'new' | 'changed' | 'deleted';\n\ninterface ObjectEvent {\n id: string;\n obj?: ioBroker.Object;\n type: ObjectEventType;\n oldObj?: ioBroker.Object;\n}\n\ninterface ObjectsWorker {\n getObjects(update?: boolean): Promise<void | Record<string, ioBroker.Object>>;\n registerHandler(cb: (events: ObjectEvent[]) => void): void;\n unregisterHandler(cb: (events: ObjectEvent[]) => void, doNotUnsubscribe?: boolean): void;\n}\n\ninterface CustomAdminColumnStored {\n path: string;\n name: string;\n objTypes?: ioBroker.ObjectType[];\n width?: number;\n edit?: boolean;\n type?: ioBroker.CommonType;\n}\n\ninterface ContextMenuItem {\n /** hotkey */\n key?: string;\n visibility: boolean;\n icon: JSX.Element | string;\n label: string;\n onClick?: () => void;\n listItemIconStyle?: React.CSSProperties;\n style?: React.CSSProperties;\n subMenu?: {\n label: string;\n visibility: boolean;\n icon: JSX.Element;\n onClick: () => void;\n iconStyle?: React.CSSProperties;\n style?: React.CSSProperties;\n listItemIconStyle?: React.CSSProperties;\n }[];\n iconStyle?: React.CSSProperties;\n}\n\nexport interface TreeItemData {\n id: string;\n name: string;\n obj?: ioBroker.Object;\n /** Object ID in lower case for filtering */\n fID?: string;\n /** translated common.name in lower case for filtering */\n fName?: string;\n /** Link to parent item */\n parent?: TreeItem;\n level?: number;\n icon?: string | JSX.Element | null;\n /** If the item existing object or generated folder */\n generated?: boolean;\n title?: string;\n /** if the item has \"write\" button (value=true, ack=false) */\n button?: boolean;\n /** If the item has read and write and is boolean */\n switch?: boolean;\n /** if the item has custom settings in `common.custom` */\n hasCustoms?: boolean;\n /** If this item is visible */\n visible?: boolean;\n /** Is any of the children visible (not only directly children) */\n hasVisibleChildren?: boolean;\n /** Is any of the parents visible (not only directly parent) */\n hasVisibleParent?: boolean;\n /** Combination of `visible || hasVisibleChildren` */\n sumVisibility?: boolean;\n /** translated names of enumerations (functions) where this object is the member (or the parent), divided by comma */\n funcs?: string;\n /** is if the enums are from parent */\n pef?: boolean;\n /** translated names of enumerations (rooms) where this object is the member (or the parent), divided by comma */\n rooms?: string;\n /** is if the enums are from parent */\n per?: boolean;\n // language in what the rooms and functions where translated\n lang?: ioBroker.Languages;\n state?: {\n valTextRx?: JSX.Element[] | null;\n style?: React.CSSProperties;\n };\n aclTooltip?: null | JSX.Element;\n}\n\ninterface InputSelectItem {\n value: string;\n name: string;\n icon?: null | JSX.Element;\n}\n\ntype ioBrokerObjectForExport = ioBroker.Object & Partial<ioBroker.State>;\n\ninterface ObjectBrowserCustomFilter {\n type?: ioBroker.ObjectType | ioBroker.ObjectType[];\n common?: {\n type?: ioBroker.CommonType | ioBroker.CommonType[];\n role?: string | string[];\n // If \"_\" - no custom set\n // If \"_dataSources\" - only data sources (history, sql, influxdb, ...)\n // Else \"telegram.\" or something like this\n // `true` - If common.custom not empty\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n custom?: '_' | '_dataSources' | true | string | string[];\n };\n}\n\ninterface FormatValueOptions {\n state: ioBroker.State;\n obj: ioBroker.StateObject;\n texts: Record<string, string>;\n dateFormat: string;\n isFloatComma: boolean;\n full?: boolean;\n}\n\nexport interface TreeItem {\n id?: string;\n data: TreeItemData;\n children?: TreeItem[];\n}\n\ninterface TreeInfo {\n funcEnums: string[];\n roomEnums: string[];\n roles: string[];\n ids: string[];\n types: string[];\n objects: Record<string, ioBroker.Object>;\n customs: string[];\n enums: string[];\n hasSomeCustoms: boolean;\n // List of all aliases that shows to this state\n aliasesMap: { [stateId: string]: string[] };\n}\n\ninterface GetValueStyleOptions {\n state: ioBroker.State;\n isExpertMode?: boolean;\n isButton?: boolean;\n}\n\nconst styles: Record<string, any> = {\n toolbar: {\n minHeight: 38, // Theme.toolbar.height,\n // boxShadow: '0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12)'\n },\n toolbarButtons: {\n padding: 4,\n marginLeft: 4,\n },\n switchColumnAuto: {\n marginLeft: 16,\n },\n dialogColumns: {\n transition: 'opacity 1s',\n },\n dialogColumnsLabel: {\n fontSize: 12,\n paddingTop: 8,\n },\n columnCustom: {\n width: '100%',\n display: 'inline-block',\n },\n columnCustomEditable: {\n cursor: 'text',\n },\n columnCustom_center: {\n textAlign: 'center',\n },\n columnCustom_left: {\n textAlign: 'left',\n },\n columnCustom_right: {\n textAlign: 'right',\n },\n width100: {\n width: '100%',\n },\n transparent_10: {\n opacity: 0.1,\n },\n transparent_20: {\n opacity: 0.2,\n },\n transparent_30: {\n opacity: 0.3,\n },\n transparent_40: {\n opacity: 0.4,\n },\n transparent_50: {\n opacity: 0.5,\n },\n transparent_60: {\n opacity: 0.6,\n },\n transparent_70: {\n opacity: 0.7,\n },\n transparent_80: {\n opacity: 0.8,\n },\n transparent_90: {\n opacity: 0.9,\n },\n transparent_100: {\n opacity: 1,\n },\n headerRow: {\n paddingLeft: 8,\n height: 38,\n whiteSpace: 'nowrap',\n userSelect: 'none',\n },\n buttonClearFilter: {\n position: 'relative',\n float: 'right',\n padding: 0,\n },\n buttonClearFilterIcon: {\n zIndex: 2,\n position: 'absolute',\n top: 0,\n left: 0,\n color: '#FF0000',\n opacity: 0.7,\n },\n\n tableDiv: {\n paddingTop: 0,\n paddingLeft: 0,\n width: 'calc(100% - 8px)',\n height: 'calc(100% - 38px)',\n overflow: 'auto',\n },\n tableRow: (theme: IobTheme) => ({\n pl: 1,\n height: ROW_HEIGHT,\n lineHeight: `${ROW_HEIGHT}px`,\n verticalAlign: 'top',\n userSelect: 'none',\n position: 'relative',\n width: '100%',\n '&:hover': {\n background: `${\n theme.palette.mode === 'dark' ? theme.palette.primary.dark : theme.palette.primary.light\n } !important`,\n color: Utils.invertColor(theme.palette.primary.main, true),\n },\n whiteSpace: 'nowrap',\n flexWrap: 'nowrap',\n }),\n tableRowLines: (theme: IobTheme) => ({\n borderBottom: `1px solid ${theme.palette.mode === 'dark' ? '#8888882e' : '#8888882e'}`,\n '& > div': {\n borderRight: `1px solid ${theme.palette.mode === 'dark' ? '#8888882e' : '#8888882e'}`,\n },\n }),\n tableRowNoDragging: {\n cursor: 'pointer',\n },\n tableRowAlias: {\n height: ROW_HEIGHT + 10,\n },\n tableRowAliasReadWrite: {\n height: ROW_HEIGHT + 22,\n },\n tableRowFocused: (theme: IobTheme) => ({\n '&:after': {\n content: '\"\"',\n position: 'absolute',\n top: 1,\n left: 1,\n right: 1,\n bottom: 1,\n border: theme.palette.mode ? '1px dotted #000' : '1px dotted #FFF',\n },\n }),\n checkBox: {\n padding: 0,\n },\n cellId: {\n position: 'relative',\n fontSize: '1rem',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n // verticalAlign: 'top',\n // position: 'relative',\n '& .copyButton': {\n display: 'none',\n },\n '&:hover .copyButton': {\n display: 'block',\n },\n '& .iconOwn': {\n display: 'block',\n width: ROW_HEIGHT - 4,\n height: ROW_HEIGHT - 4,\n mt: '2px',\n float: 'right',\n },\n '&:hover .iconOwn': {\n display: 'none',\n },\n '& *': {\n width: 'initial',\n },\n },\n cellIdSpan: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n // display: 'inline-block',\n // verticalAlign: 'top',\n },\n // This style is used for simple div. Do not migrate it to \"secondary.main\"\n cellIdIconFolder: (theme: IobTheme) => ({\n marginRight: 8,\n width: ROW_HEIGHT - 4,\n height: ROW_HEIGHT - 4,\n cursor: 'pointer',\n color: theme.palette.secondary.main || '#fbff7d',\n verticalAlign: 'top',\n }),\n cellIdIconDocument: {\n verticalAlign: 'middle',\n marginLeft: (ROW_HEIGHT - SMALL_BUTTON_SIZE) / 2,\n marginRight: 8,\n width: SMALL_BUTTON_SIZE,\n height: SMALL_BUTTON_SIZE,\n },\n cellIdIconOwn: {},\n cellIdTooltip: {\n fontSize: 14,\n },\n cellIdTooltipLink: {\n color: '#7ec2fd',\n '&:hover': {\n color: '#7ec2fd',\n },\n '&:visited': {\n color: '#7ec2fd',\n },\n },\n cellCopyButton: {\n width: SMALL_BUTTON_SIZE,\n height: SMALL_BUTTON_SIZE,\n top: (ROW_HEIGHT - SMALL_BUTTON_SIZE) / 2,\n opacity: 0.8,\n position: 'absolute',\n right: 3,\n },\n cellCopyButtonInDetails: {\n width: SMALL_BUTTON_SIZE,\n height: SMALL_BUTTON_SIZE,\n top: (ROW_HEIGHT - SMALL_BUTTON_SIZE) / 2,\n opacity: 0.8,\n },\n cellEditButton: {\n width: SMALL_BUTTON_SIZE,\n height: SMALL_BUTTON_SIZE,\n color: 'white',\n position: 'absolute',\n top: (ROW_HEIGHT - SMALL_BUTTON_SIZE) / 2,\n right: SMALL_BUTTON_SIZE + 3,\n opacity: 0.7,\n '&:hover': {\n opacity: 1,\n },\n },\n cellName: {\n display: 'inline-block',\n verticalAlign: 'top',\n fontSize: 14,\n ml: '5px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n position: 'relative',\n '& .copyButton': {\n display: 'none',\n },\n '&:hover .copyButton': {\n display: 'block',\n },\n },\n cellNameWithDesc: {\n lineHeight: 'normal',\n },\n cellNameDivDiv: {},\n cellDescription: {\n fontSize: 10,\n opacity: 0.5,\n fontStyle: 'italic',\n },\n cellIdAlias: (theme: IobTheme) => ({\n fontStyle: 'italic',\n fontSize: 12,\n opacity: 0.7,\n '&:hover': {\n color: theme.palette.mode === 'dark' ? '#009900' : '#007700',\n },\n }),\n cellIdAliasReadWriteDiv: {\n height: 24,\n marginTop: -5,\n },\n cellIdAliasAlone: {\n lineHeight: 0,\n },\n cellIdAliasReadWrite: {\n lineHeight: '12px',\n },\n cellType: {\n display: 'inline-block',\n verticalAlign: 'top',\n '& .itemIcon': {\n verticalAlign: 'middle',\n width: ICON_SIZE,\n height: ICON_SIZE,\n display: 'inline-block',\n },\n '& .itemIconFolder': {\n marginLeft: 3,\n },\n },\n cellRole: {\n display: 'inline-block',\n verticalAlign: 'top',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n cellRoom: {\n display: 'inline-block',\n verticalAlign: 'top',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n cellEnumParent: {\n opacity: 0.4,\n },\n cellFunc: {\n display: 'inline-block',\n verticalAlign: 'top',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n cellValue: {\n display: 'inline-block',\n verticalAlign: 'top',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n cellValueButton: {\n marginTop: 5,\n },\n cellValueButtonFalse: {\n opacity: 0.3,\n },\n cellAdapter: {\n display: 'inline-block',\n verticalAlign: 'top',\n },\n cellValueTooltip: {\n fontSize: 12,\n },\n cellValueText: {\n width: '100%',\n height: ROW_HEIGHT,\n fontSize: 16,\n display: 'flex',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n position: 'relative',\n verticalAlign: 'top',\n '& .copyButton': {\n display: 'none',\n },\n '&:hover .copyButton': {\n display: 'block',\n },\n },\n cellValueFile: {\n color: '#2837b9',\n },\n cellValueTooltipTitle: {\n fontStyle: 'italic',\n width: 100,\n display: 'inline-block',\n },\n cellValueTooltipValue: {\n width: 120,\n display: 'inline-block',\n // overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n },\n cellValueTooltipImage: {\n width: 100,\n height: 'auto',\n },\n cellValueTooltipBoth: {\n width: 220,\n display: 'inline-block',\n whiteSpace: 'nowrap',\n },\n cellValueTooltipBox: {\n width: 250,\n overflow: 'hidden',\n pointerEvents: 'none',\n },\n tooltip: {\n pointerEvents: 'none',\n },\n cellValueTextUnit: {\n marginLeft: 4,\n opacity: 0.8,\n display: 'inline-block',\n },\n cellValueTextState: {\n opacity: 0.7,\n },\n cellValueTooltipCopy: {\n position: 'absolute',\n bottom: 3,\n right: 3,\n },\n cellValueTooltipEdit: {\n position: 'absolute',\n bottom: 3,\n right: 15,\n },\n cellButtons: {\n display: 'inline-block',\n verticalAlign: 'top',\n },\n cellButtonsButton: {\n display: 'inline-block',\n opacity: 0.5,\n width: SMALL_BUTTON_SIZE + 4,\n height: SMALL_BUTTON_SIZE + 4,\n '&:hover': {\n opacity: 1,\n },\n p: 0,\n mt: '-2px',\n },\n cellButtonsEmptyButton: {\n fontSize: 12,\n },\n cellButtonMinWidth: {\n minWidth: 40,\n },\n cellButtonsButtonAlone: {\n ml: `${SMALL_BUTTON_SIZE + 6}px`,\n pt: 0,\n mt: '-2px',\n },\n cellButtonsButtonWithCustoms: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? theme.palette.primary.main : theme.palette.secondary.main,\n }),\n cellButtonsButtonWithoutCustoms: {\n opacity: 0.2,\n },\n cellButtonsValueButton: (theme: IobTheme) => ({\n position: 'absolute',\n top: SMALL_BUTTON_SIZE / 2 - 2,\n opacity: 0.7,\n width: SMALL_BUTTON_SIZE - 2,\n height: SMALL_BUTTON_SIZE - 2,\n color: theme.palette.action.active,\n '&:hover': {\n opacity: 1,\n },\n }),\n cellButtonsValueButtonCopy: {\n right: 8,\n cursor: 'pointer',\n },\n cellButtonsValueButtonEdit: {\n right: SMALL_BUTTON_SIZE / 2 + 16,\n },\n cellDetailsLine: {\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n height: 32,\n fontSize: 16,\n },\n cellDetailsName: {\n fontWeight: 'bold',\n marginRight: 8,\n minWidth: 80,\n },\n\n filteredOut: {\n opacity: 0.5,\n },\n filteredParentOut: {\n opacity: 0.3,\n },\n filterInput: {\n mt: 0,\n mb: 0,\n },\n selectIcon: {\n width: 24,\n height: 24,\n marginRight: 4,\n },\n selectNone: {\n opacity: 0.5,\n },\n itemSelected: (theme: IobTheme) => ({\n background: `${theme.palette.primary.main} !important`,\n color: `${Utils.invertColor(theme.palette.primary.main, true)} !important`,\n }),\n header: {\n width: '100%',\n },\n headerCell: {\n display: 'inline-block',\n verticalAlign: 'top',\n },\n headerCellValue: {\n paddingTop: 4,\n // paddingLeft: 5,\n fontSize: 16,\n },\n headerCellInput: {\n width: 'calc(100% - 5px)',\n height: ROW_HEIGHT,\n pt: 0,\n '& .itemIcon': {\n verticalAlign: 'middle',\n width: ICON_SIZE,\n height: ICON_SIZE,\n display: 'inline-block',\n },\n },\n headerCellSelectItem: {\n '& .itemIcon': {\n width: ICON_SIZE,\n height: ICON_SIZE,\n mr: '5px',\n display: 'inline-block',\n },\n },\n visibleButtons: {\n color: '#2196f3',\n opacity: 0.7,\n },\n grow: {\n flexGrow: 1,\n },\n enumIconDiv: {\n marginRight: 8,\n width: 32,\n height: 32,\n borderRadius: 8,\n background: '#FFFFFF',\n },\n enumIcon: {\n marginTop: 4,\n marginLeft: 4,\n width: 24,\n height: 24,\n },\n enumDialog: {\n overflow: 'hidden',\n },\n enumList: {\n minWidth: 250,\n height: 'calc(100% - 50px)',\n overflow: 'auto',\n },\n enumButton: {\n float: 'right',\n },\n enumCheckbox: {\n minWidth: 0,\n },\n buttonDiv: {\n display: 'flex',\n height: '100%',\n alignItems: 'center',\n },\n aclText: {\n fontSize: 13,\n marginTop: 6,\n },\n rightsObject: {\n color: '#55ff55',\n paddingLeft: 3,\n },\n rightsState: {\n color: '#86b6ff',\n paddingLeft: 3,\n },\n textCenter: {\n padding: 12,\n textAlign: 'center',\n },\n tooltipAccessControl: {\n display: 'flex',\n flexDirection: 'column',\n },\n fontSizeTitle: {\n '@media screen and (max-width: 465px)': {\n '& *': {\n fontSize: 12,\n },\n },\n },\n draggable: {\n cursor: 'copy',\n },\n nonDraggable: {\n cursor: 'no-drop',\n },\n selectClearButton: {\n position: 'absolute',\n top: 0,\n right: 0,\n borderRadius: 5,\n backgroundColor: 'background.default',\n },\n iconDeviceConnected: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? COLOR_NAME_CONNECTED_DARK : COLOR_NAME_CONNECTED_LIGHT,\n opacity: 0.8,\n position: 'absolute',\n top: 4,\n right: 32,\n width: 20,\n }),\n iconDeviceDisconnected: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? COLOR_NAME_DISCONNECTED_DARK : COLOR_NAME_DISCONNECTED_LIGHT,\n opacity: 0.8,\n position: 'absolute',\n top: 4,\n right: 32,\n width: 20,\n }),\n iconDeviceError: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? COLOR_NAME_ERROR_DARK : COLOR_NAME_ERROR_LIGHT,\n opacity: 0.8,\n position: 'absolute',\n top: 4,\n right: 50,\n width: 20,\n }),\n resizeHandle: {\n display: 'block',\n position: 'absolute',\n cursor: 'col-resize',\n width: 7,\n top: 2,\n bottom: 2,\n zIndex: 1,\n },\n resizeHandleRight: {\n right: 3,\n borderRight: '2px dotted #888',\n '&:hover': {\n borderColor: '#ccc',\n borderRightStyle: 'solid',\n },\n '&.active': {\n borderColor: '#517ea5',\n borderRightStyle: 'solid',\n },\n },\n invertedBackground: (theme: IobTheme) => ({\n backgroundColor: theme.palette.mode === 'dark' ? '#9a9a9a' : '#565656',\n padding: '0 3px',\n borderRadius: '2px 0 0 2px',\n }),\n invertedBackgroundFlex: (theme: IobTheme) => ({\n backgroundColor: theme.palette.mode === 'dark' ? '#9a9a9a' : '#565656',\n borderRadius: '0 2px 2px 0',\n }),\n contextMenuEdit: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#ffee48' : '#cbb801',\n }),\n contextMenuEditValue: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#5dff45' : '#1cd301',\n }),\n contextMenuView: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#FFF' : '#000',\n }),\n contextMenuCustom: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#42eaff' : '#01bbc2',\n }),\n contextMenuACL: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#e079ff' : '#500070',\n }),\n contextMenuRoom: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#ff9a33' : '#642a00',\n }),\n contextMenuRole: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#ffdb43' : '#562d00',\n }),\n contextMenuDelete: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#ff4f4f' : '#cf0000',\n }),\n contextMenuKeys: {\n marginLeft: 8,\n opacity: 0.7,\n fontSize: 'smaller',\n },\n contextMenuWithSubMenu: {\n display: 'flex',\n },\n};\n\nfunction ButtonIcon(props?: { style?: React.CSSProperties }): JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 436 436\"\n style={props?.style}\n width=\"24\"\n height=\"24\"\n className=\"admin-button\"\n >\n <g fill=\"currentColor\">\n <path d=\"m195.23077,24.30769c-36,3 -67,12 -96,26c-49,24 -82,61 -93,104l-3,11l-1,50c0,46 0,49 2,59l5,20c21,58 84,103 165,116c16,3 53,4 70,2c60,-6 111,-28 147,-64c21,-21 36,-49 40,-74a866,866 0 0 0 1,-104c-3,-18 -6,-28 -13,-43c-26,-52 -87,-90 -162,-101c-16,-2 -48,-3 -63,-2l1,0zm60,23c36,5 70,18 95,35c31,20 51,47 59,77c2,7 2,11 2,25c1,15 0,18 -2,26c-19,69 -104,117 -200,114c-47,-2 -90,-15 -124,-38c-31,-20 -51,-47 -59,-77c-3,-11 -4,-32 -2,-43c8,-42 41,-78 91,-101a260,260 0 0 1 140,-19l0,1zm-221,222c21,26 57,49 95,62c81,27 174,14 239,-32c14,-10 31,-27 41,-41c2,-2 2,-2 2,7c-1,23 -16,50 -38,72c-78,74 -233,74 -311,-1a121,121 0 0 1 -39,-76l0,-6l3,4l8,11z\" />\n <path d=\"m201.23077,47.30769c-40,3 -79,19 -104,44c-55,55 -38,133 37,171c52,26 122,24 172,-5c30,-17 51,-42 58,-71c3,-11 3,-34 0,-45c-6,-23 -21,-44 -40,-60l-27,-16a184,184 0 0 0 -96,-18zm30,21c56,5 100,35 112,75c4,11 4,30 0,41c-8,25 -26,45 -54,59a166,166 0 0 1 -160,-8a98,98 0 0 1 -41,-53c-5,-18 -2,-39 8,-57c23,-39 79,-62 135,-57z\" />\n </g>\n </svg>\n );\n}\n\n/**\n * Function that walks through all keys of an object or array and applies a function to each key.\n */\nfunction walkThroughArray(object: any[], iteratee: (result: any[], value: any, key: number) => void): any[] {\n const copiedObject: any[] = [];\n for (let index = 0; index < object.length; index++) {\n iteratee(copiedObject, object[index], index);\n }\n return copiedObject;\n}\n\n/**\n * Function that walks through all keys of an object or array and applies a function to each key.\n */\nfunction walkThroughObject(\n object: Record<string, any>,\n iteratee: (result: Record<string, any>, value: any, key: string) => void,\n): Record<string, any> {\n const copiedObject: Record<string, any> = {};\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n iteratee(copiedObject, object[key], key);\n }\n }\n return copiedObject;\n}\n\n/**\n * Function to reduce an object primarily by a given list of keys\n */\nfunction filterObject(\n /** The objects which should be filtered */\n obj: Record<string, any> | any[],\n /** The keys which should be excluded */\n filterKeys: string[],\n /** Whether translations should be reduced to only the english value */\n excludeTranslations?: boolean,\n): Record<string, any> | any[] {\n if (Array.isArray(obj)) {\n return walkThroughArray(obj, (result: any[], value: any, key: number) => {\n if (value === undefined || value === null) {\n return;\n }\n // if the key is an object, run it through the inner function - omitFromObject\n const isObject = typeof value === 'object';\n if (excludeTranslations && isObject) {\n if (typeof value.en === 'string' && typeof value.de === 'string') {\n result[key] = value.en;\n return;\n }\n }\n result[key] = isObject ? filterObject(value, filterKeys, excludeTranslations) : value;\n });\n }\n\n return walkThroughObject(obj, (result: Record<string, any>, value: any, key: string) => {\n if (value === undefined || value === null) {\n return;\n }\n if (filterKeys.includes(key)) {\n return;\n }\n // if the key is an object, run it through the inner function - omitFromObject\n const isObject = typeof value === 'object';\n if (excludeTranslations && isObject) {\n if (typeof value.en === 'string' && typeof value.de === 'string') {\n result[key] = value.en;\n return;\n }\n }\n result[key] = isObject ? filterObject(value, filterKeys, excludeTranslations) : value;\n });\n}\n\n/**\n * Function to generate a json-file for an object and trigger download it\n */\nfunction generateFile(\n /** The desired filename */\n fileName: string,\n /** The objects which should be downloaded */\n obj: Record<string, ioBroker.Object>,\n /** Options to filter/reduce the output */\n options: {\n /** Whether the output should be beautified */\n beautify?: boolean;\n /** Whether \"system.repositories\" should be excluded */\n excludeSystemRepositories?: boolean;\n /** Whether translations should be reduced to only the english value */\n excludeTranslations?: boolean;\n },\n): void {\n const el = document.createElement('a');\n const filterKeys = [];\n if (options.excludeSystemRepositories) {\n filterKeys.push('system.repositories');\n }\n const filteredObject =\n filterKeys.length > 0 || options.excludeTranslations\n ? filterObject(obj, filterKeys, options.excludeTranslations)\n : obj;\n const data = options.beautify ? JSON.stringify(filteredObject, null, 2) : JSON.stringify(filteredObject);\n el.setAttribute('href', `data:application/json;charset=utf-8,${encodeURIComponent(data)}`);\n el.setAttribute('download', fileName);\n\n el.style.display = 'none';\n document.body.appendChild(el);\n\n el.click();\n\n document.body.removeChild(el);\n}\n\n// d=data, t=target, s=start, e=end, m=middle\nfunction binarySearch(list: string[], find: string, _start?: number, _end?: number): boolean {\n _start = _start || 0;\n if (_end === undefined) {\n _end = list.length - 1;\n if (!_end) {\n return list[0] === find;\n }\n }\n const middle = Math.floor((_start + _end) / 2);\n if (find === list[middle]) {\n return true;\n }\n if (_end - 1 === _start) {\n return list[_start] === find || list[_end] === find;\n }\n if (find > list[middle]) {\n return binarySearch(list, find, middle, _end);\n }\n if (find < list[middle]) {\n return binarySearch(list, find, _start, middle);\n }\n return false;\n}\n\nfunction getName(name: ioBroker.StringOrTranslated, lang: ioBroker.Languages): string {\n if (typeof name === 'object') {\n if (!name) {\n return '';\n }\n return (name[lang] || name.en || '').toString();\n }\n\n return name ? name.toString() : '';\n}\n\nexport function getSelectIdIconFromObjects(\n objects: Record<string, ioBroker.Object>,\n id: string,\n lang: ioBroker.Languages,\n imagePrefix?: string,\n): string | JSX.Element | null {\n // `admin` has prefix '.' and `web` has '../..'\n imagePrefix = imagePrefix || '.'; // http://localhost:8081';\n let src: string | JSX.Element = '';\n const _id_ = `system.adapter.${id}`;\n const aIcon = id && objects[_id_] && objects[_id_].common && objects[_id_].common.icon;\n if (aIcon) {\n // if not BASE64\n if (!aIcon.startsWith('data:image/')) {\n if (aIcon.includes('.')) {\n const name = objects[_id_].common.name;\n if (typeof name === 'object') {\n src = `${imagePrefix}/adapter/${name[lang] || name.en}/${aIcon}`;\n } else {\n src = `${imagePrefix}/adapter/${name}/${aIcon}`;\n }\n } else if (aIcon && aIcon.length < 3) {\n return aIcon; // utf-8\n } else {\n return null; // '<i class=\"material-icons iob-list-icon\">' + objects[_id_].common.icon + '</i>';\n }\n } else if (aIcon.startsWith('data:image/svg')) {\n src = (\n <SVG\n className=\"iconOwn\"\n src={aIcon}\n width={28}\n height={28}\n />\n );\n } else {\n src = aIcon;\n }\n } else {\n const common = objects[id] && objects[id].common;\n\n if (common) {\n const cIcon = common.icon;\n if (cIcon) {\n if (!cIcon.startsWith('data:image/')) {\n if (cIcon.includes('.')) {\n let instance;\n if (objects[id].type === 'instance' || objects[id].type === 'adapter') {\n if (typeof common.name === 'object') {\n src = `${imagePrefix}/adapter/${common.name[lang] || common.name.en}/${cIcon}`;\n } else {\n src = `${imagePrefix}/adapter/${common.name}/${cIcon}`;\n }\n } else if (id && id.startsWith('system.adapter.')) {\n instance = id.split('.', 3);\n if (cIcon[0] === '/') {\n instance[2] += cIcon;\n } else {\n instance[2] += `/${cIcon}`;\n }\n src = `${imagePrefix}/adapter/${instance[2]}`;\n } else {\n instance = id.split('.', 2);\n if (cIcon[0] === '/') {\n instance[0] += cIcon;\n } else {\n instance[0] += `/${cIcon}`;\n }\n src = `${imagePrefix}/adapter/${instance[0]}`;\n }\n } else if (aIcon && aIcon.length < 3) {\n return aIcon; // utf-8\n } else {\n return null;\n }\n } else if (cIcon.startsWith('data:image/svg')) {\n // if base 64 image\n src = (\n <SVG\n className=\"iconOwn\"\n src={cIcon}\n width={28}\n height={28}\n />\n );\n } else {\n src = cIcon;\n }\n }\n }\n }\n\n return src || null;\n}\n\nfunction applyFilter(\n item: TreeItem,\n filters: {\n id?: string;\n name?: string;\n type?: string;\n custom?: string;\n role?: string;\n room?: string;\n func?: string;\n expertMode?: boolean;\n },\n lang: ioBroker.Languages,\n objects: Record<string, ioBroker.Object>,\n context?: {\n id?: string;\n name?: string;\n type?: string;\n custom?: string;\n role?: string;\n room?: string[];\n func?: string[];\n },\n counter?: { count: number },\n customFilter?: ObjectBrowserCustomFilter,\n selectedTypes?: string[],\n _depth?: number,\n): boolean {\n _depth = _depth || 0;\n let filteredOut = false;\n if (!context) {\n context = {};\n if (filters.id) {\n context.id = filters.id.toLowerCase();\n }\n if (filters.name) {\n context.name = filters.name.toLowerCase();\n }\n if (filters.type) {\n context.type = filters.type.toLowerCase();\n }\n if (filters.custom) {\n context.custom = filters.custom.toLowerCase();\n }\n if (filters.role) {\n context.role = filters.role.toLowerCase();\n }\n if (filters.room) {\n context.room = (objects[filters.room] as ioBroker.EnumObject)?.common?.members || [];\n }\n if (filters.func) {\n context.func = (objects[filters.func] as ioBroker.EnumObject)?.common?.members || [];\n }\n }\n\n const data = item.data;\n\n if (data && data.id) {\n const common: ioBroker.StateCommon = data.obj?.common as ioBroker.StateCommon;\n\n if (customFilter) {\n if (customFilter.type) {\n if (typeof customFilter.type === 'string') {\n if (!data.obj || customFilter.type !== data.obj.type) {\n filteredOut = true;\n }\n } else if (Array.isArray(customFilter.type)) {\n if (!data.obj || !customFilter.type.includes(data.obj.type)) {\n filteredOut = true;\n }\n }\n }\n if (!filteredOut && customFilter.common?.type) {\n if (!common?.type) {\n filteredOut = true;\n } else if (typeof customFilter.common.type === 'string') {\n if (customFilter.common.type !== common.type) {\n filteredOut = true;\n }\n } else if (Array.isArray(customFilter.common.type)) {\n if (!customFilter.common.type.includes(common.type)) {\n filteredOut = true;\n }\n }\n }\n if (!filteredOut && customFilter.common?.role) {\n if (!common?.role) {\n filteredOut = true;\n } else if (typeof customFilter.common.role === 'string') {\n if (common.role.startsWith(customFilter.common.role)) {\n filteredOut = true;\n }\n } else if (Array.isArray(customFilter.common.role)) {\n if (!customFilter.common.role.find(role => common.role.startsWith(role))) {\n filteredOut = true;\n }\n }\n }\n\n if (!filteredOut && customFilter.common?.custom === '_' && common?.custom) {\n filteredOut = true;\n } else if (!filteredOut && customFilter.common?.custom && customFilter.common?.custom !== '_') {\n const filterOfCustom = customFilter.common.custom as string | string[] | boolean;\n if (!common?.custom) {\n filteredOut = true;\n } else if (filterOfCustom === '_dataSources') {\n // TODO: make it configurable\n if (\n !Object.keys(common.custom).find(\n id => id.startsWith('history.') || id.startsWith('sql.') || id.startsWith('influxdb.'),\n )\n ) {\n filteredOut = true;\n }\n } else if (Array.isArray(filterOfCustom)) {\n // here are ['influxdb.', 'telegram.']\n const customs = Object.keys(common.custom); // here are ['influxdb.0', 'telegram.2']\n if (filterOfCustom.find(cst => customs.find(id => id.startsWith(cst)))) {\n filteredOut = true;\n }\n } else if (\n filterOfCustom !== true &&\n !Object.keys(common.custom).find(id => id.startsWith(filterOfCustom as string))\n ) {\n filteredOut = true;\n }\n }\n }\n\n if (!filteredOut && !filters.expertMode) {\n filteredOut =\n data.id === 'system' ||\n data.id === 'enum' ||\n // (data.obj && data.obj.type === 'meta') ||\n data.id.startsWith('system.') ||\n data.id.startsWith('enum.') ||\n data.id.startsWith('_design/') ||\n data.id.endsWith('.admin') ||\n !!common?.expert;\n }\n if (!filteredOut && context.id) {\n if (data.fID === undefined) {\n data.fID = data.id.toLowerCase();\n }\n filteredOut = !data.fID.includes(context.id);\n }\n if (!filteredOut && context.name) {\n if (common) {\n if (data.fName === undefined) {\n data.fName = (common && getName(common.name, lang)) || '';\n data.fName = data.fName.toLowerCase();\n }\n filteredOut = !data.fName.includes(context.name);\n } else {\n filteredOut = true;\n }\n }\n if (!filteredOut && filters.role && common) {\n if (common) {\n filteredOut = !(common.role && common.role.startsWith(context.role));\n } else {\n filteredOut = true;\n }\n }\n if (!filteredOut && context.room) {\n filteredOut = !context.room.find(id => id === data.id || data.id.startsWith(`${id}.`));\n }\n if (!filteredOut && context.func) {\n filteredOut = !context.func.find(id => id === data.id || data.id.startsWith(`${id}.`));\n }\n if (!filteredOut && context.type) {\n filteredOut = !(data.obj && data.obj.type && data.obj.type === context.type);\n }\n if (!filteredOut && selectedTypes) {\n filteredOut = !(data.obj && data.obj.type && selectedTypes.includes(data.obj.type));\n }\n if (!filteredOut && context.custom) {\n if (common) {\n if (context.custom === '_') {\n filteredOut = !!common.custom;\n } else {\n filteredOut = !common.custom || !common.custom[context.custom];\n }\n } else {\n filteredOut = true;\n }\n }\n }\n\n data.visible = !filteredOut;\n\n data.hasVisibleChildren = false;\n if (item.children && _depth < 20) {\n item.children.forEach(_item => {\n const visible = applyFilter(\n _item,\n filters,\n lang,\n objects,\n context,\n counter,\n customFilter,\n selectedTypes,\n _depth + 1,\n );\n if (visible) {\n data.hasVisibleChildren = true;\n }\n });\n }\n\n // const visible = data.visible || data.hasVisibleChildren;\n data.sumVisibility = data.visible || data.hasVisibleChildren; // || data.hasVisibleParent;\n if (counter && data.sumVisibility) {\n counter.count++;\n }\n\n // show all children of visible object with opacity 0.5\n if (data.id && data.sumVisibility && item.children) {\n item.children.forEach(_item => (_item.data.hasVisibleParent = true));\n }\n\n return data.visible || data.hasVisibleChildren;\n}\n\nfunction getVisibleItems(\n item: TreeItem,\n type: ioBroker.ObjectType,\n objects: Record<string, ioBroker.Object>,\n _result?: string[],\n): string[] {\n _result = _result || [];\n const data = item.data;\n if (data.sumVisibility) {\n if (data.id && objects[data.id] && (!type || objects[data.id].type === type)) {\n _result.push(data.id);\n }\n item.children?.forEach(_item => getVisibleItems(_item, type, objects, _result));\n }\n\n return _result;\n}\n\nfunction getSystemIcon(\n objects: Record<string, ioBroker.Object>,\n id: string,\n level: number,\n themeType: ThemeType,\n lang: ioBroker.Languages,\n imagePrefix?: string,\n): string | JSX.Element | null {\n let icon;\n\n // system or design has special icons\n if (id === 'alias' || id === 'alias.0') {\n icon = (\n <IconLink\n className=\"iconOwn\"\n style={{ color: COLOR_NAME_ALIAS(themeType) }}\n />\n );\n } else if (id === '0_userdata' || id === '0_userdata.0') {\n icon = (\n <IconData\n className=\"iconOwn\"\n style={{ color: COLOR_NAME_USERDATA(themeType) }}\n />\n );\n } else if (id.startsWith('_design/') || id === 'system') {\n icon = (\n <IconSystem\n className=\"iconOwn\"\n style={{ color: COLOR_NAME_SYSTEM(themeType) }}\n />\n );\n } else if (id === 'system.adapter') {\n icon = (\n <IconSystem\n className=\"iconOwn\"\n style={{ color: COLOR_NAME_SYSTEM_ADAPTER(themeType) }}\n />\n );\n } else if (id === 'system.group') {\n icon = <IconGroup className=\"iconOwn\" />;\n } else if (id === 'system.user') {\n icon = <IconUser className=\"iconOwn\" />;\n } else if (id === 'system.host') {\n icon = <IconHost className=\"iconOwn\" />;\n } else if (id.endsWith('.connection') || id.endsWith('.connected')) {\n icon = <IconConnection className=\"iconOwn\" />;\n } else if (id.endsWith('.info')) {\n icon = <IconInfo className=\"iconOwn\" />;\n } else if (objects[id] && objects[id].type === 'meta') {\n icon = <IconMeta className=\"iconOwn\" />;\n } else if (level < 2) {\n // detect \"cloud.0\"\n if (objects[`system.adapter.${id}`]) {\n icon = getSelectIdIconFromObjects(objects, `system.adapter.${id}`, lang, imagePrefix);\n }\n }\n\n return icon || null;\n}\n\nfunction getObjectTooltip(data: TreeItemData, lang: ioBroker.Languages): string | null {\n if (data?.obj?.common?.desc) {\n return getName(data.obj.common.desc, lang) || null;\n }\n\n return null;\n}\n\nfunction getIdFieldTooltip(data: TreeItemData, lang: ioBroker.Languages): JSX.Element {\n const tooltip = getObjectTooltip(data, lang);\n if (tooltip?.startsWith('http')) {\n return (\n <Box\n component=\"a\"\n sx={styles.cellIdTooltipLink}\n href={tooltip}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {tooltip}\n </Box>\n );\n }\n return <span style={styles.cellIdTooltip}>{tooltip || data.id || ''}</span>;\n}\n\nfunction buildTree(\n objects: Record<string, ioBroker.Object>,\n options: {\n imagePrefix?: string;\n root?: string;\n lang: ioBroker.Languages;\n themeType: ThemeType;\n },\n): { root: TreeItem; info: TreeInfo } {\n const imagePrefix = options.imagePrefix || '.';\n\n let ids = Object.keys(objects);\n\n ids.sort((a, b) => {\n if (a === b) {\n return 0;\n }\n a = a.replace(/\\./g, '!!!');\n b = b.replace(/\\./g, '!!!');\n if (a > b) {\n return 1;\n }\n return -1;\n });\n\n if (options.root) {\n ids = ids.filter(id => id === options.root || id.startsWith(`${options.root}.`));\n }\n\n // find empty nodes and create names for it\n let currentPathArr: string[] = [];\n let currentPath = '';\n let currentPathLen = 0;\n const root: TreeItem = {\n data: {\n name: '',\n id: '',\n },\n children: [],\n };\n\n const info: TreeInfo = {\n funcEnums: [],\n roomEnums: [],\n roles: [],\n ids: [],\n types: [],\n objects,\n customs: ['_'],\n enums: [],\n hasSomeCustoms: false,\n aliasesMap: {},\n };\n\n let cRoot: TreeItem = root;\n\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n if (!id) {\n continue;\n }\n const obj = objects[id];\n const parts = id.split('.');\n\n if (obj.type && !info.types.includes(obj.type)) {\n info.types.push(obj.type);\n }\n\n if (obj) {\n const common = obj.common;\n const role = common && common.role;\n if (role && !info.roles.includes(role)) {\n info.roles.push(role);\n } else if (id.startsWith('enum.rooms.')) {\n info.roomEnums.push(id);\n info.enums.push(id);\n } else if (id.startsWith('enum.functions.')) {\n info.funcEnums.push(id);\n info.enums.push(id);\n } else if (obj.type === 'enum') {\n info.enums.push(id);\n } else if (obj.type === 'instance' && common && (common.supportCustoms || common.adminUI?.custom)) {\n info.hasSomeCustoms = true;\n info.customs.push(id.substring('system.adapter.'.length));\n }\n\n // Build a map of aliases\n if (id.startsWith('alias.') && obj.common.alias?.id) {\n if (typeof obj.common.alias.id === 'string') {\n const usedId = obj.common.alias.id;\n if (!info.aliasesMap[usedId]) {\n info.aliasesMap[usedId] = [id];\n } else if (!info.aliasesMap[usedId].includes(id)) {\n info.aliasesMap[usedId].push(id);\n }\n } else {\n const readId = obj.common.alias.id.read;\n if (readId) {\n if (!info.aliasesMap[readId]) {\n info.aliasesMap[readId] = [id];\n } else if (!info.aliasesMap[readId].includes(id)) {\n info.aliasesMap[readId].push(id);\n }\n }\n const writeId = obj.common.alias.id.write;\n if (writeId) {\n if (!info.aliasesMap[writeId]) {\n info.aliasesMap[writeId] = [id];\n } else if (!info.aliasesMap[writeId].includes(id)) {\n info.aliasesMap[writeId].push(id);\n }\n }\n }\n }\n }\n\n info.ids.push(id);\n\n let repeat;\n\n // if next level\n do {\n repeat = false;\n\n // If the current level is still OK, and we can add ID to children\n if (!currentPath || id.startsWith(`${currentPath}.`)) {\n // if more than one level added\n if (parts.length - currentPathLen > 1) {\n let curPath = currentPath;\n // generate missing levels\n for (let k = currentPathLen; k < parts.length - 1; k++) {\n curPath += (curPath ? '.' : '') + parts[k];\n // level does not exist\n if (!binarySearch(info.ids, curPath)) {\n const _cRoot: TreeItem = {\n data: {\n name: parts[k],\n parent: cRoot,\n id: curPath,\n obj: objects[curPath],\n level: k,\n icon: getSystemIcon(\n objects,\n curPath,\n k,\n options.themeType,\n options.lang,\n imagePrefix,\n ),\n generated: true,\n },\n };\n\n cRoot.children = cRoot.children || [];\n cRoot.children.push(_cRoot);\n cRoot = _cRoot;\n info.ids.push(curPath); // IDs will be added by alphabet\n } else if (cRoot.children) {\n cRoot = cRoot.children.find(item => item.data.name === parts[k]);\n }\n }\n }\n\n const _cRoot: TreeItem = {\n data: {\n name: parts[parts.length - 1],\n title: getName(obj?.common?.name, options.lang),\n obj,\n parent: cRoot,\n icon:\n getSelectIdIconFromObjects(objects, id, options.lang, imagePrefix) ||\n getSystemIcon(objects, id, 0, options.themeType, options.lang, imagePrefix),\n id,\n hasCustoms: !!(obj.common?.custom && Object.keys(obj.common.custom).length),\n level: parts.length - 1,\n generated: false,\n button:\n obj.type === 'state' &&\n !!obj.common?.role &&\n typeof obj.common.role === 'string' &&\n obj.common.role.startsWith('button') &&\n obj.common?.write !== false,\n switch:\n obj.type === 'state' &&\n obj.common?.type === 'boolean' &&\n obj.common?.write !== false &&\n obj.common?.read !== false,\n },\n };\n\n cRoot.children = cRoot.children || [];\n cRoot.children.push(_cRoot);\n cRoot = _cRoot;\n\n currentPathLen = parts.length;\n currentPathArr = parts;\n currentPath = id;\n } else {\n let u = 0;\n\n while (currentPathArr[u] === parts[u]) {\n u++;\n }\n\n if (u > 0) {\n let move = currentPathArr.length;\n currentPathArr = currentPathArr.splice(0, u);\n currentPathLen = u;\n currentPath = currentPathArr.join('.');\n while (move > u) {\n if (cRoot.data.parent) {\n cRoot = cRoot.data.parent;\n } else {\n console.error(`Parent is null for ${id} ${currentPath} ${currentPathArr.join('.')}`);\n }\n move--;\n }\n } else {\n cRoot = root;\n currentPathArr = [];\n currentPath = '';\n currentPathLen = 0;\n }\n repeat = true;\n }\n } while (repeat);\n }\n\n info.roomEnums.sort((a, b) => {\n const aName: string = getName(objects[a]?.common?.name, options.lang) || a.split('.').pop();\n const bName: string = getName(objects[b]?.common?.name, options.lang) || b.split('.').pop();\n if (aName > bName) {\n return 1;\n }\n if (aName < bName) {\n return -1;\n }\n return 0;\n });\n info.funcEnums.sort((a, b) => {\n const aName: string = getName(objects[a]?.common?.name, options.lang) || a.split('.').pop();\n const bName: string = getName(objects[b]?.common?.name, options.lang) || b.split('.').pop();\n if (aName > bName) {\n return 1;\n }\n if (aName < bName) {\n return -1;\n }\n return 0;\n });\n info.roles.sort();\n info.types.sort();\n\n return { info, root };\n}\n\nfunction findNode(root: TreeItem, id: string, _parts?: string[], _path?: string, _level?: number): TreeItem | null {\n if (root.data.id === id) {\n return root;\n }\n if (!_parts) {\n _parts = id.split('.');\n _level = 0;\n _path = _parts[_level];\n }\n if (!root.children && root.data.id !== id) {\n return null;\n }\n let found;\n if (root.children) {\n for (let i = 0; i < root.children.length; i++) {\n const _id = root.children[i].data.id;\n if (_id === _path) {\n found = root.children[i];\n break;\n } else if (_id > _path) {\n break;\n }\n }\n }\n if (found) {\n _level = _level || 0;\n return findNode(found, id, _parts, `${_path}.${_parts[_level + 1]}`, _level + 1);\n }\n\n return null;\n}\n\nfunction findRoomsForObject(\n info: TreeInfo,\n id: string,\n lang: ioBroker.Languages,\n rooms?: string[],\n): { rooms: string[]; per: boolean } {\n if (!id) {\n return { rooms: [], per: false };\n }\n rooms = rooms || [];\n for (const room of info.roomEnums) {\n const common = info.objects[room]?.common;\n\n if (!common) {\n continue;\n }\n\n const name = getName(common.name, lang);\n\n if (common.members?.includes(id) && !rooms.includes(name)) {\n rooms.push(name);\n }\n }\n\n let ownEnums;\n\n // Check parent\n const parts = id.split('.');\n parts.pop();\n id = parts.join('.');\n if (info.objects[id]) {\n ownEnums = rooms.length;\n findRoomsForObject(info, id, lang, rooms);\n }\n\n return { rooms, per: !ownEnums }; // per is if the enums are from parent\n}\n\nfunction findEnumsForObjectAsIds(\n info: TreeInfo,\n id: string,\n enumName: 'roomEnums' | 'funcEnums',\n funcs?: string[],\n): string[] {\n if (!id) {\n return [];\n }\n funcs = funcs || [];\n for (let i = 0; i < info[enumName].length; i++) {\n const common = info.objects[info[enumName][i]]?.common;\n if (common?.members?.includes(id) && !funcs.includes(info[enumName][i])) {\n funcs.push(info[enumName][i]);\n }\n }\n funcs.sort();\n\n return funcs;\n}\n\nfunction findFunctionsForObject(\n info: TreeInfo,\n id: string,\n lang: ioBroker.Languages,\n funcs?: string[],\n): { funcs: string[]; pef: boolean } {\n if (!id) {\n return { funcs: [], pef: false };\n }\n funcs = funcs || [];\n for (let i = 0; i < info.funcEnums.length; i++) {\n const common = info.objects[info.funcEnums[i]]?.common;\n\n if (!common) {\n continue;\n }\n\n const name = getName(common.name, lang);\n if (common.members?.includes(id) && !funcs.includes(name)) {\n funcs.push(name);\n }\n }\n\n let ownEnums;\n\n // Check parent\n const parts = id.split('.');\n parts.pop();\n id = parts.join('.');\n if (info.objects[id]) {\n ownEnums = funcs.length;\n findFunctionsForObject(info, id, lang, funcs);\n }\n\n return { funcs, pef: !ownEnums };\n}\n\n/*\nfunction quality2text(q) {\n if (!q) {\n return 'ok';\n }\n const custom = q & 0xFFFF0000;\n let text = '';\n if (q & 0x40) text += 'device';\n if (q & 0x80) text += 'sensor';\n if (q & 0x01) text += ' bad';\n if (q & 0x02) text += ' not connected';\n if (q & 0x04) text += ' error';\n\n return text + (custom ? '|0x' + (custom >> 16).toString(16).toUpperCase() : '') + ' [0x' + q.toString(16).toUpperCase() + ']';\n}\n*/\n\n/**\n * Format a state value for visualization\n */\nfunction formatValue(options: FormatValueOptions): {\n valText: {\n /** value as string */\n v: string;\n /** value unit */\n u?: string;\n /** value not replaced by `common.states` */\n s?: string;\n };\n valFull:\n | {\n /** label */\n t: string;\n /** value */\n v: string;\n /** no break */\n nbr?: boolean;\n }[]\n | undefined;\n fileViewer: 'image' | 'text' | 'json' | 'html' | 'pdf' | 'audio' | 'video' | undefined;\n} {\n const { dateFormat, state, isFloatComma, texts, obj } = options;\n const states = Utils.getStates(obj);\n const isCommon = obj.common;\n let fileViewer: 'image' | 'text' | 'json' | 'html' | 'pdf' | 'audio' | 'video' | undefined;\n\n let v: any =\n // @ts-expect-error deprecated from js-controller 6\n isCommon?.type === 'file'\n ? '[file]'\n : !state || state.val === null\n ? '(null)'\n : state.val === undefined\n ? '[undef]'\n : state.val;\n\n const type = typeof v;\n\n if (isCommon?.role && typeof isCommon.role === 'string' && isCommon.role.match(/^value\\.time|^date/)) {\n if (v && typeof v === 'string') {\n if (Utils.isStringInteger(v)) {\n // we assume a unix ts\n v = new Date(parseInt(v, 10)).toString();\n } else {\n // check if parsable by new date\n try {\n const parsedDate = new Date(v);\n\n if (Utils.isValidDate(parsedDate)) {\n v = parsedDate.toString();\n }\n } catch {\n // ignore\n }\n }\n } else {\n if (v > 946681200 && v < 946681200000) {\n // '2000-01-01T00:00:00' => 946681200000\n v *= 1_000; // maybe the time is in seconds (UNIX time)\n }\n // \"null\" and undefined could not be here. See `let v = (isCommon && isCommon.type === 'file') ....` above\n v = v ? new Date(v).toString() : v;\n }\n } else {\n if (type === 'number') {\n if (!Number.isInteger(v)) {\n v = Math.round(v * 100_000_000) / 100_000_000; // remove 4.00000000000000001\n if (isFloatComma) {\n v = v.toString().replace('.', ',');\n }\n }\n } else if (type === 'object') {\n v = JSON.stringify(v);\n } else if (type !== 'string') {\n v = v.toString();\n } else if (v.startsWith('data:image/')) {\n fileViewer = 'image';\n }\n\n if (typeof v !== 'string') {\n v = v.toString();\n }\n }\n\n const valText: {\n /** value as string */\n v: string;\n /** value unit */\n u?: string;\n /** value not replaced by `common.states` */\n s?: string;\n } = { v: v as string };\n\n // try to replace number with \"common.states\"\n if (states && states[v] !== undefined) {\n if (v !== states[v]) {\n valText.s = v;\n v = states[v];\n valText.v = v;\n }\n }\n\n if (isCommon?.unit) {\n valText.u = isCommon.unit;\n }\n let valFull:\n | {\n /** label */\n t: string;\n /** value */\n v: string;\n nbr?: boolean;\n }[]\n | undefined;\n if (options.full) {\n valFull = [{ t: texts.value, v }];\n\n if (state) {\n if (state.ack !== undefined && state.ack !== null) {\n valFull.push({ t: texts.ack, v: state.ack.toString() });\n }\n if (state.ts) {\n valFull.push({ t: texts.ts, v: state.ts ? Utils.formatDate(new Date(state.ts), dateFormat) : '' });\n }\n if (state.lc) {\n valFull.push({ t: texts.lc, v: state.lc ? Utils.formatDate(new Date(state.lc), dateFormat) : '' });\n }\n if (state.from) {\n let from = state.from.toString();\n if (from.startsWith('system.adapter.')) {\n from = from.substring(15);\n }\n valFull.push({ t: texts.from, v: from });\n }\n if (state.user) {\n let user = state.user.toString();\n if (user.startsWith('system.user.')) {\n user = user.substring(12);\n }\n valFull.push({ t: texts.user, v: user });\n }\n if (state.c) {\n valFull.push({ t: texts.c, v: state.c });\n }\n valFull.push({ t: texts.quality, v: Utils.quality2text(state.q || 0).join(', '), nbr: true });\n }\n }\n\n return {\n valText,\n valFull,\n fileViewer,\n };\n}\n\n/**\n * Get CSS style for given state value\n */\nfunction getValueStyle(options: GetValueStyleOptions): { color: string } {\n const { state /* , isExpertMode, isButton */ } = options;\n const color = state?.ack ? (state.q ? '#ffa500' : '') : '#ff2222c9';\n\n // do not show the color of the button in non-expert mode\n // if (!isExpertMode && isButton) {\n // color = '';\n // }\n\n return { color };\n}\n\nfunction prepareSparkData(values: ioBroker.GetHistoryResult, from: number): number[] {\n // set one point every hour\n let time = from;\n let i = 1;\n const v = [];\n\n while (i < values.length && time < from + 25 * 3600000) {\n // find the interval\n while (values[i - 1].ts < time && time <= values[i].ts && i < values.length) {\n i++;\n }\n if (i === 1 && values[i - 1].ts >= time) {\n // assume the value was always null\n v.push(0);\n } else if (i < values.length) {\n if (typeof values[i].val === 'boolean' || typeof values[i - 1].val === 'boolean') {\n v.push(values[i].val ? 1 : 0);\n } else {\n // remove nulls\n values[i - 1].val = values[i - 1].val || 0;\n values[i].val = values[i].val || 0;\n // interpolate\n const nm1: number = values[i - 1].val as number;\n const n: number = values[i].val as number;\n const val = nm1 + ((n - nm1) * (time - values[i - 1].ts)) / (values[i].ts - values[i - 1].ts);\n\n v.push(val);\n }\n }\n\n time += 3600000;\n }\n\n return v;\n}\n\nexport const ITEM_IMAGES: Record<string, JSX.Element> = {\n state: (\n <IconState\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n channel: (\n <IconChannel\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n device: (\n <IconDevice\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n adapter: (\n <IconAdapter\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n meta: (\n <IconMeta\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n instance: (\n <IconInstance\n className=\"itemIcon\"\n style={{ color: '#7da7ff', verticalAlign: 'middle' }}\n />\n ),\n enum: (\n <IconEnum\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n chart: (\n <IconChart\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n config: (\n <IconConfig\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n group: (\n <IconGroup\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n user: (\n <IconUser\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n host: (\n <IconHost\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n schedule: (\n <IconSchedule\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n script: (\n <IconScript\n className=\"itemIcon\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n folder: (\n <IconClosed\n className=\"itemIcon itemIconFolder\"\n style={{ verticalAlign: 'middle' }}\n />\n ),\n};\n\ninterface ScreenWidthOne {\n idWidth: string | number;\n widths: {\n room?: number;\n val?: number;\n name?: number;\n func?: number;\n buttons?: number;\n type?: number;\n role?: number;\n changedFrom?: number;\n qualityCode?: number;\n timestamp?: number;\n lastChange?: number;\n };\n fields: string[];\n}\n\ninterface ScreenWidth {\n xs: ScreenWidthOne;\n sm: ScreenWidthOne;\n md: ScreenWidthOne;\n lg: ScreenWidthOne;\n xl: ScreenWidthOne;\n}\n\nconst SCREEN_WIDTHS: ScreenWidth = {\n // extra-small: 0px\n xs: { idWidth: '100%', fields: [], widths: {} },\n // small: 600px\n sm: { idWidth: 300, fields: ['room', 'val'], widths: { room: 100, val: 200 } },\n // medium: 960px\n md: {\n idWidth: 300,\n fields: ['room', 'func', 'val', 'buttons'],\n widths: {\n name: 200,\n room: 150,\n func: 150,\n val: 120,\n buttons: 120,\n },\n },\n // large: 1280px\n lg: {\n idWidth: 300,\n fields: [\n 'name',\n 'type',\n 'role',\n 'room',\n 'func',\n 'val',\n 'buttons',\n 'changedFrom',\n 'qualityCode',\n 'timestamp',\n 'lastChange',\n ],\n widths: {\n name: 300,\n type: 80,\n role: 120,\n room: 180,\n func: 180,\n val: 140,\n buttons: 120,\n changedFrom: 120,\n qualityCode: 100,\n timestamp: 165,\n lastChange: 165,\n },\n },\n // /////////////\n // extra-large: 1920px\n xl: {\n idWidth: 550,\n fields: [\n 'name',\n 'type',\n 'role',\n 'room',\n 'func',\n 'val',\n 'buttons',\n 'changedFrom',\n 'qualityCode',\n 'timestamp',\n 'lastChange',\n ],\n widths: {\n name: 400,\n type: 80,\n role: 120,\n room: 180,\n func: 180,\n val: 140,\n buttons: 120,\n changedFrom: 120,\n qualityCode: 100,\n timestamp: 170,\n lastChange: 170,\n },\n },\n};\n\nlet objectsAlreadyLoaded = false;\n\nexport interface ObjectBrowserFilter {\n id?: string;\n name?: string;\n room?: string;\n func?: string;\n role?: string;\n type?: string;\n custom?: string;\n expertMode?: boolean;\n}\n\nconst DEFAULT_FILTER: ObjectBrowserFilter = {\n id: '',\n name: '',\n room: '',\n func: '',\n role: '',\n type: '',\n custom: '',\n expertMode: false,\n};\n\ninterface AdapterColumn {\n adapter: string;\n id: string;\n name: string;\n path: string[];\n pathText: string;\n edit?: boolean;\n type?: 'boolean' | 'string' | 'number';\n objTypes?: ioBroker.ObjectType[];\n align?: 'center' | 'left' | 'right';\n}\n\ninterface ObjectBrowserEditRoleProps {\n roles: string[];\n id: string;\n socket: Connection;\n onClose: (obj?: ioBroker.Object | null) => void;\n t: Translate;\n}\n\ninterface ObjectViewFileDialogProps {\n t: Translate;\n socket: Connection;\n obj: ioBroker.AnyObject;\n onClose: () => void;\n}\n\ninterface DragWrapperProps {\n item: TreeItem;\n className?: string;\n style?: React.CSSProperties;\n children: JSX.Element | null;\n}\n\ninterface ObjectCustomDialogProps {\n t: Translate;\n lang: ioBroker.Languages;\n expertMode?: boolean;\n objects: Record<string, ioBroker.Object>;\n socket: Connection;\n theme: IobTheme;\n themeName: ThemeName;\n themeType: ThemeType;\n customsInstances: string[];\n objectIDs: string[];\n onClose: () => void;\n reportChangedIds: (ids: string[]) => void;\n isFloatComma: boolean;\n allVisibleObjects: boolean;\n systemConfig: ioBroker.SystemConfigObject;\n}\n\ninterface ObjectBrowserValueProps {\n /** State type */\n type: 'states' | 'string' | 'number' | 'boolean' | 'json';\n /** State role */\n role: string;\n /** common.states */\n states: Record<string, string> | null;\n /** The state value */\n value: string | number | boolean | null;\n /** If expert mode is enabled */\n expertMode: boolean;\n onClose: (newValue?: {\n val: ioBroker.StateValue;\n ack: boolean;\n q: ioBroker.STATE_QUALITY[keyof ioBroker.STATE_QUALITY];\n expire: number | undefined;\n }) => void;\n /** Configured theme */\n themeType: ThemeType;\n theme: IobTheme;\n socket: Connection;\n defaultHistory: string;\n dateFormat: string;\n object: ioBroker.StateObject;\n isFloatComma: boolean;\n t: Translate;\n lang: ioBroker.Languages;\n width?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n}\n\ninterface ObjectBrowserEditObjectProps {\n socket: Connection;\n obj: ioBroker.AnyObject;\n roleArray: string[];\n expertMode: boolean;\n themeType: ThemeType;\n theme: IobTheme;\n aliasTab: boolean;\n onClose: (obj?: ioBroker.AnyObject) => void;\n dialogName?: string;\n objects: Record<string, ioBroker.AnyObject>;\n dateFormat: string;\n isFloatComma: boolean;\n onNewObject: (obj: ioBroker.AnyObject) => void;\n t: Translate;\n width?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n}\n\ninterface ObjectAliasEditorProps {\n t: Translate;\n socket: Connection;\n objects: Record<string, ioBroker.AnyObject>;\n onRedirect: (id: string, delay?: number) => void;\n obj: ioBroker.AnyObject;\n onClose: () => void;\n}\n\ninterface ObjectBrowserProps {\n /** where to store settings in localStorage */\n dialogName?: string;\n defaultFilters?: ObjectBrowserFilter;\n selected?: string | string[];\n onSelect?: (selected: string | string[], name: string, isDouble?: boolean) => void;\n onFilterChanged?: (newFilter: ObjectBrowserFilter) => void;\n socket: Connection;\n showExpertButton?: boolean;\n expertMode?: boolean;\n imagePrefix?: string;\n themeName: ThemeName;\n themeType: ThemeType;\n /** will be filled by withWidth */\n width?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n theme: IobTheme;\n t: Translate;\n lang: ioBroker.Languages;\n multiSelect?: boolean;\n notEditable?: boolean;\n foldersFirst?: boolean;\n disableColumnSelector?: boolean;\n isFloatComma?: boolean;\n dateFormat?: string;\n levelPadding?: number;\n\n // components\n objectCustomDialog?: React.FC<ObjectCustomDialogProps>;\n objectAddBoolean?: boolean; // optional toolbar button\n objectEditBoolean?: boolean; // optional toolbar button\n objectStatesView?: boolean; // optional toolbar button\n objectImportExport?: boolean; // optional toolbar button\n objectEditOfAccessControl?: boolean; // Access Control\n /** modal add object */\n modalNewObject?: (oBrowser: ObjectBrowserClass) => JSX.Element;\n /** modal Edit Of Access Control */\n modalEditOfAccessControl: (oBrowser: ObjectBrowserClass, data: TreeItemData) => JSX.Element;\n onObjectDelete?: (id: string, hasChildren: boolean, objectExists: boolean, childrenCount: number) => void;\n /**\n * Optional filter\n * `{common: {custom: true}}` - show only objects with some custom settings\n * `{common: {custom: 'sql.0'}}` - show only objects with sql.0 custom settings (only of the specific instance)\n * `{common: {custom: '_dataSources'}}` - show only objects of adapters `influxdb' or 'sql' or 'history'\n * `{common: {custom: 'adapterName.'}}` - show only objects of custom settings of specific adapter (all instances)\n * `{type: 'channel'}` - show only channels\n * `{type: ['channel', 'device']}` - show only channels and devices\n * `{common: {type: 'number'}` - show only states of type 'number\n * `{common: {type: ['number', 'string']}` - show only states of type 'number and string\n * `{common: {role: ['switch']}` - show only states with roles starting from switch\n * `{common: {role: ['switch', 'button']}` - show only states with roles starting from `switch` and `button`\n */\n customFilter: ObjectBrowserCustomFilter;\n objectBrowserValue?: React.FC<ObjectBrowserValueProps>;\n objectBrowserEditObject?: React.FC<ObjectBrowserEditObjectProps>;\n /** on edit alias */\n objectBrowserAliasEditor?: React.FC<ObjectAliasEditorProps>;\n /** on Edit role */\n objectBrowserEditRole?: React.FC<ObjectBrowserEditRoleProps>;\n /** on view file state */\n objectBrowserViewFile?: React.FC<ObjectViewFileDialogProps>;\n router?: typeof Router;\n types?: ioBroker.ObjectType[];\n /** Possible columns: ['name', 'type', 'role', 'room', 'func', 'val', 'buttons'] */\n columns?: string[];\n /** Shows only elements of this root */\n root?: string;\n\n /** cache of objects */\n objectsWorker?: ObjectsWorker;\n /**\n * function to filter out all unnecessary objects. It cannot be used together with \"types\"\n * Example for function: `obj => obj.common?.type === 'boolean'` to show only boolean states\n */\n filterFunc?: (obj: ioBroker.Object) => boolean;\n /** Used for enums dragging */\n DragWrapper?: React.FC<DragWrapperProps>;\n /** let DragWrapper know about objects to get the icons */\n setObjectsReference?: (objects: Record<string, ioBroker.Object>) => void;\n dragEnabled?: boolean;\n}\n\ninterface ObjectBrowserState {\n loaded: boolean;\n foldersFirst: boolean;\n selected: string[];\n focused: string;\n selectedNonObject: string;\n filter: ObjectBrowserFilter;\n filterKey: number;\n depth: number;\n expandAllVisible: boolean;\n expanded: string[];\n toast: string;\n scrollBarWidth: number;\n customDialog: null | string[];\n customDialogAll?: boolean;\n editObjectDialog: string;\n editObjectAlias: boolean; // open the edit object dialog on alias tab\n viewFileDialog: string;\n showAliasEditor: string;\n enumDialog: null | {\n item: TreeItem;\n type: 'room' | 'func';\n enumsOriginal: string;\n };\n enumDialogEnums?: null | string[];\n roleDialog: null | string;\n statesView: boolean;\n /** ['name', 'type', 'role', 'room', 'func', 'val', 'buttons'] */\n columns: string[] | null;\n columnsForAdmin: Record<string, CustomAdminColumnStored[]> | null;\n columnsSelectorShow: boolean;\n columnsAuto: boolean;\n columnsWidths: Record<string, number>;\n columnsDialogTransparent: number;\n columnsEditCustomDialog: null | {\n obj: ioBroker.Object;\n item: TreeItem;\n it: AdapterColumn;\n };\n customColumnDialogValueChanged: boolean;\n showExportDialog: false | number;\n showAllExportOptions: boolean;\n linesEnabled: boolean;\n showDescription: boolean;\n showContextMenu: {\n item: TreeItem;\n position: { left: number; top: number };\n subItem?: string;\n subAnchor?: HTMLLIElement;\n } | null;\n noStatesByExportImport: boolean;\n beautifyJsonExport: boolean;\n excludeSystemRepositoriesFromExport: boolean;\n excludeTranslations: boolean;\n updating?: boolean;\n modalNewObj?: null | { id: string; initialType?: ioBroker.ObjectType; initialStateType?: ioBroker.CommonType };\n error?: any;\n modalEditOfAccess?: boolean;\n modalEditOfAccessObjData?: TreeItemData;\n updateOpened?: boolean;\n tooltipInfo: null | { el: JSX.Element[]; id: string };\n /** Show the menu with aliases for state */\n aliasMenu: string;\n}\n\nexport class ObjectBrowserClass extends Component<ObjectBrowserProps, ObjectBrowserState> {\n // do not define the type as null to save the performance, so we must check it every time\n private info: TreeInfo = {\n funcEnums: [],\n roomEnums: [],\n roles: [],\n ids: [],\n types: [],\n objects: {},\n customs: [],\n enums: [],\n hasSomeCustoms: false,\n aliasesMap: {},\n };\n\n private localStorage: Storage = ((window as any)._localStorage as Storage) || window.localStorage;\n\n private lastAppliedFilter: string | null = null;\n\n private readonly tableRef: React.RefObject<HTMLDivElement>;\n\n private readonly filterRefs: Record<string, React.RefObject<HTMLSelectElement>>;\n\n private pausedSubscribes: boolean = false;\n\n private selectFirst: string;\n\n private root: TreeItem | null = null;\n\n private readonly states: Record<string, ioBroker.State> = {};\n\n private subscribes: string[] = [];\n\n private unsubscribeTimer: ReturnType<typeof setTimeout> | null = null;\n\n private statesUpdateTimer: ReturnType<typeof setTimeout> | null = null;\n\n private objectsUpdateTimer: ReturnType<typeof setTimeout> | null = null;\n\n private filterTimer: ReturnType<typeof setTimeout> | null = null;\n\n private readonly visibleCols: string[];\n\n private readonly texts: Record<string, string>;\n\n private readonly possibleCols: string[];\n\n private readonly imagePrefix: string;\n\n private adapterColumns: AdapterColumn[] = [];\n\n private styleTheme: string = '';\n\n private edit: {\n val: string | number | boolean | null;\n q: number;\n ack: boolean;\n id: string;\n } = {\n id: '',\n val: '',\n q: 0,\n ack: false,\n };\n\n private readonly levelPadding: number;\n\n private customWidth: boolean = false;\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n private resizerNextName: string | null = null;\n\n private resizerActiveName: string | null = null;\n\n private resizerCurrentWidths: Record<string, number> = {};\n\n private resizeLeft: boolean = false;\n\n private resizerOldWidth: number = 0;\n\n private resizerMin: number = 0;\n\n private resizerNextMin: number = 0;\n\n private resizerOldWidthNext: number = 0;\n\n private resizerPosition: number = 0;\n\n private resizerActiveDiv: HTMLDivElement | null = null;\n\n private resizerNextDiv: HTMLDivElement | null = null;\n\n private storedWidths: ScreenWidthOne | null = null;\n\n private systemConfig: ioBroker.SystemConfigObject;\n\n public objects: Record<string, ioBroker.Object>;\n\n private defaultHistory: string = '';\n\n private columnsVisibility: {\n id?: number | string;\n name?: number | string;\n nameHeader?: number | string;\n type?: number;\n role?: number;\n room?: number;\n func?: number;\n changedFrom?: number;\n qualityCode?: number;\n timestamp?: number;\n lastChange?: number;\n val?: number;\n buttons?: number;\n } = {};\n\n private changedIds: null | string[] = null;\n\n private contextMenu: null | { item: any; ts: number } = null;\n\n private recordStates: string[] = [];\n\n private styles: {\n cellIdIconFolder?: React.CSSProperties;\n cellIdIconDocument?: React.CSSProperties;\n iconDeviceError?: React.CSSProperties;\n iconDeviceConnected?: React.CSSProperties;\n iconDeviceDisconnected?: React.CSSProperties;\n cellButtonsButtonWithCustoms?: React.CSSProperties;\n invertedBackground?: React.CSSProperties;\n invertedBackgroundFlex?: React.CSSProperties;\n contextMenuEdit?: React.CSSProperties;\n contextMenuEditValue?: React.CSSProperties;\n contextMenuView?: React.CSSProperties;\n contextMenuCustom?: React.CSSProperties;\n contextMenuACL?: React.CSSProperties;\n contextMenuRoom?: React.CSSProperties;\n contextMenuRole?: React.CSSProperties;\n contextMenuDelete?: React.CSSProperties;\n filterInput?: React.CSSProperties;\n iconCopy?: React.CSSProperties;\n aliasReadWrite?: React.CSSProperties;\n aliasAlone?: React.CSSProperties;\n } = {};\n\n private customColumnDialog: null | {\n value: boolean | number | string;\n type: 'boolean' | 'number' | 'string';\n initValue: boolean | number | string;\n } = null;\n\n /** Namespaces which are allowed to be edited by non-expert users */\n static #NON_EXPERT_NAMESPACES = ['0_userdata.0.', 'alias.0.'];\n\n constructor(props: ObjectBrowserProps) {\n super(props);\n\n const lastSelectedItemStr: string =\n this.localStorage.getItem(`${props.dialogName || 'App'}.objectSelected`) || '';\n\n this.selectFirst = '';\n\n if (lastSelectedItemStr.startsWith('[')) {\n try {\n const lastSelectedItems = JSON.parse(lastSelectedItemStr) as string[];\n this.selectFirst = lastSelectedItems[0] || '';\n } catch {\n // ignore\n }\n } else {\n this.selectFirst = lastSelectedItemStr;\n }\n\n let expanded: string[];\n const expandedStr = this.localStorage.getItem(`${props.dialogName || 'App'}.objectExpanded`) || '[]';\n try {\n expanded = JSON.parse(expandedStr);\n } catch {\n expanded = [];\n }\n\n let filter: ObjectBrowserFilter;\n const filterStr: string = props.defaultFilters\n ? ''\n : this.localStorage.getItem(`${props.dialogName || 'App'}.objectFilter`) || '';\n if (filterStr) {\n try {\n filter = JSON.parse(filterStr);\n } catch {\n filter = { ...DEFAULT_FILTER };\n }\n } else if (props.defaultFilters && typeof props.defaultFilters === 'object') {\n filter = { ...props.defaultFilters };\n } else {\n filter = { ...DEFAULT_FILTER };\n }\n\n filter.expertMode =\n props.expertMode !== undefined\n ? props.expertMode\n : (((window as any)._sessionStorage as Storage) || window.sessionStorage).getItem('App.expertMode') ===\n 'true';\n this.tableRef = createRef();\n this.filterRefs = {};\n\n Object.keys(DEFAULT_FILTER).forEach(name => (this.filterRefs[name] = createRef()));\n\n this.visibleCols = props.columns || SCREEN_WIDTHS[props.width || 'lg'].fields;\n // remove type column if only one type must be selected\n if (props.types && props.types.length === 1) {\n const pos = this.visibleCols.indexOf('type');\n if (pos !== -1) {\n this.visibleCols.splice(pos, 1);\n }\n }\n\n this.possibleCols = SCREEN_WIDTHS.xl.fields;\n\n let customDialog = null;\n\n if (props.router) {\n const location = props.router.getLocation();\n if (location.id && location.dialog === 'customs') {\n customDialog = [location.id];\n this.pauseSubscribe(true);\n }\n }\n\n let selected: string[];\n if (!Array.isArray(props.selected)) {\n selected = [props.selected || ''];\n } else {\n selected = props.selected;\n }\n selected = selected.map(id => id.replace(/[\"']/g, '')).filter(id => id);\n\n this.selectFirst = selected.length && selected[0] ? selected[0] : this.selectFirst;\n\n const columnsStr = this.localStorage.getItem(`${props.dialogName || 'App'}.columns`);\n let columns: string[] | null;\n try {\n columns = columnsStr ? JSON.parse(columnsStr) : null;\n } catch {\n columns = null;\n }\n\n let columnsWidths = null; // this.localStorage.getItem(`${props.dialogName || 'App'}.columnsWidths`);\n try {\n columnsWidths = columnsWidths ? JSON.parse(columnsWidths) : {};\n } catch {\n columnsWidths = {};\n }\n\n this.imagePrefix = props.imagePrefix || '.';\n let foldersFirst: boolean;\n const foldersFirstStr = this.localStorage.getItem(`${props.dialogName || 'App'}.foldersFirst`);\n\n if (foldersFirstStr === 'false') {\n foldersFirst = false;\n } else if (foldersFirstStr === 'true') {\n foldersFirst = true;\n } else {\n foldersFirst = props.foldersFirst === undefined ? true : props.foldersFirst;\n }\n\n let statesView = false;\n try {\n statesView = this.props.objectStatesView\n ? JSON.parse(this.localStorage.getItem(`${props.dialogName || 'App'}.objectStatesView`) || '') || false\n : false;\n } catch {\n // ignore\n }\n\n this.state = {\n loaded: false,\n foldersFirst,\n selected,\n selectedNonObject: this.localStorage.getItem(`${props.dialogName || 'App'}.selectedNonObject`) || '',\n filter,\n filterKey: 0,\n focused: this.localStorage.getItem(`${props.dialogName || 'App'}.focused`) || '',\n depth: 0,\n expandAllVisible: false,\n expanded,\n toast: '',\n scrollBarWidth: 16,\n customDialog,\n editObjectDialog: '',\n editObjectAlias: false, // open the edit object dialog on alias tab\n viewFileDialog: '',\n showAliasEditor: '',\n enumDialog: null,\n roleDialog: null,\n statesView,\n columns,\n columnsForAdmin: null,\n columnsSelectorShow: false,\n columnsAuto: this.localStorage.getItem(`${props.dialogName || 'App'}.columnsAuto`) !== 'false',\n columnsWidths,\n columnsDialogTransparent: 100,\n columnsEditCustomDialog: null,\n customColumnDialogValueChanged: false,\n showExportDialog: false,\n showAllExportOptions: false,\n linesEnabled: this.localStorage.getItem(`${props.dialogName || 'App'}.lines`) === 'true',\n showDescription: this.localStorage.getItem(`${props.dialogName || 'App'}.desc`) !== 'false',\n showContextMenu: null,\n noStatesByExportImport: false,\n beautifyJsonExport: true,\n excludeSystemRepositoriesFromExport: true,\n excludeTranslations: false,\n tooltipInfo: null,\n aliasMenu: '',\n };\n\n this.texts = {\n name: props.t('ra_Name'),\n categories: props.t('ra_Categories'),\n value: props.t('ra_tooltip_value'),\n ack: props.t('ra_tooltip_ack'),\n ts: props.t('ra_tooltip_ts'),\n lc: props.t('ra_tooltip_lc'),\n from: props.t('ra_tooltip_from'),\n user: props.t('ra_tooltip_user'),\n c: props.t('ra_tooltip_comment'),\n quality: props.t('ra_tooltip_quality'),\n editObject: props.t('ra_tooltip_editObject'),\n deleteObject: props.t('ra_tooltip_deleteObject'),\n customConfig: props.t('ra_tooltip_customConfig'),\n copyState: props.t('ra_tooltip_copyState'),\n editState: props.t('ra_tooltip_editState'),\n close: props.t('ra_Close'),\n filter_id: props.t('ra_filter_id'),\n filter_name: props.t('ra_filter_name'),\n filter_type: props.t('ra_filter_type'),\n filter_role: props.t('ra_filter_role'),\n filter_room: props.t('ra_filter_room'),\n filter_func: props.t('ra_filter_func'),\n filter_custom: props.t('ra_filter_customs'), //\n filterCustomsWithout: props.t('ra_filter_customs_without'), //\n objectChangedByUser: props.t('ra_object_changed_by_user'), // Object last changed at\n objectChangedBy: props.t('ra_object_changed_by'), // Object changed by\n objectChangedFrom: props.t('ra_state_changed_from'), // Object changed from\n stateChangedBy: props.t('ra_state_changed_by'), // State changed by\n stateChangedFrom: props.t('ra_state_changed_from'), // State changed from\n ownerGroup: props.t('ra_Owner group'),\n ownerUser: props.t('ra_Owner user'),\n deviceError: props.t('ra_Error'),\n deviceDisconnected: props.t('ra_Disconnected'),\n deviceConnected: props.t('ra_Connected'),\n\n aclOwner_read_object: props.t('ra_aclOwner_read_object'),\n aclOwner_read_state: props.t('ra_aclOwner_read_state'),\n aclOwner_write_object: props.t('ra_aclOwner_write_object'),\n aclOwner_write_state: props.t('ra_aclOwner_write_state'),\n aclGroup_read_object: props.t('ra_aclGroup_read_object'),\n aclGroup_read_state: props.t('ra_aclGroup_read_state'),\n aclGroup_write_object: props.t('ra_aclGroup_write_object'),\n aclGroup_write_state: props.t('ra_aclGroup_write_state'),\n aclEveryone_read_object: props.t('ra_aclEveryone_read_object'),\n aclEveryone_read_state: props.t('ra_aclEveryone_read_state'),\n aclEveryone_write_object: props.t('ra_aclEveryone_write_object'),\n aclEveryone_write_state: props.t('ra_aclEveryone_write_state'),\n\n create: props.t('ra_Create'),\n createBooleanState: props.t('ra_create_boolean_state'),\n createNumberState: props.t('ra_create_number_state'),\n createStringState: props.t('ra_create_string_state'),\n createState: props.t('ra_create_state'),\n createChannel: props.t('ra_create_channel'),\n createDevice: props.t('ra_create_device'),\n createFolder: props.t('ra_Create folder'),\n };\n\n this.levelPadding = props.levelPadding || ITEM_LEVEL;\n\n const resizerCurrentWidthsStr = this.localStorage.getItem(`${this.props.dialogName || 'App'}.table`);\n if (resizerCurrentWidthsStr) {\n try {\n const resizerCurrentWidths = JSON.parse(resizerCurrentWidthsStr);\n const width = this.props.width || 'lg';\n this.storedWidths = JSON.parse(JSON.stringify(SCREEN_WIDTHS[width]));\n Object.keys(resizerCurrentWidths).forEach(id => {\n if (id === 'id') {\n SCREEN_WIDTHS[width].idWidth = resizerCurrentWidths.id;\n } else if (id === 'nameHeader') {\n SCREEN_WIDTHS[width].widths.name = resizerCurrentWidths[id];\n } else if ((SCREEN_WIDTHS[width].widths as Record<string, number>)[id] !== undefined) {\n (SCREEN_WIDTHS[width].widths as Record<string, number>)[id] = resizerCurrentWidths[id];\n }\n });\n\n this.customWidth = true;\n } catch {\n // ignore\n }\n }\n\n this.calculateColumnsVisibility();\n }\n\n async loadAllObjects(update?: boolean): Promise<void> {\n const props = this.props;\n\n try {\n await new Promise<void>(resolve => {\n this.setState({ updating: true }, () => resolve());\n });\n\n const objects =\n (this.props.objectsWorker\n ? await this.props.objectsWorker.getObjects(update)\n : await props.socket.getObjects(update, true)) || {};\n if (props.types && Connection.isWeb()) {\n for (let i = 0; i < props.types.length; i++) {\n // admin has ALL objects\n // web has only state, channel, device, enum, and system.config\n if (\n props.types[i] === 'state' ||\n props.types[i] === 'channel' ||\n props.types[i] === 'device' ||\n props.types[i] === 'enum'\n ) {\n continue;\n }\n const moreObjects = await props.socket.getObjectViewSystem(props.types[i]);\n Object.assign(objects || {}, moreObjects as Record<string, ioBroker.Object>);\n }\n }\n\n this.systemConfig =\n this.systemConfig ||\n (objects?.['system.config'] as ioBroker.SystemConfigObject) ||\n (await props.socket.getObject('system.config'));\n\n this.systemConfig.common = this.systemConfig.common || ({} as ioBroker.SystemConfigCommon);\n this.systemConfig.common.defaultNewAcl = this.systemConfig.common.defaultNewAcl || {\n object: 0,\n state: 0,\n file: 0,\n owner: 'system.user.admin',\n ownerGroup: 'system.group.administrator',\n };\n this.systemConfig.common.defaultNewAcl.owner =\n this.systemConfig.common.defaultNewAcl.owner || 'system.user.admin';\n this.systemConfig.common.defaultNewAcl.ownerGroup =\n this.systemConfig.common.defaultNewAcl.ownerGroup || 'system.group.administrator';\n if (typeof this.systemConfig.common.defaultNewAcl.state !== 'number') {\n // TODO: may be convert here from string\n this.systemConfig.common.defaultNewAcl.state = 0x664;\n }\n if (typeof this.systemConfig.common.defaultNewAcl.object !== 'number') {\n // TODO: may be convert here from string\n this.systemConfig.common.defaultNewAcl.state = 0x664;\n }\n\n if (typeof props.filterFunc === 'function') {\n this.objects = {};\n const filterFunc: (obj: ioBroker.Object) => boolean = props.filterFunc;\n\n Object.keys(objects).forEach(id => {\n try {\n if (filterFunc(objects[id])) {\n this.objects[id] = objects[id];\n } else {\n const type = objects[id] && objects[id].type;\n // include \"folder\" types too for icons and names of nodes\n if (\n type &&\n (type === 'channel' ||\n type === 'device' ||\n type === 'folder' ||\n type === 'adapter' ||\n type === 'instance')\n ) {\n this.objects[id] = objects[id];\n }\n }\n } catch (e) {\n console.log(`Error by filtering of \"${id}\": ${e}`);\n }\n });\n } else if (props.types) {\n this.objects = {};\n const propsTypes = props.types;\n\n Object.keys(objects).forEach(id => {\n const type = objects[id] && objects[id].type;\n // include \"folder\" types too\n if (\n type &&\n (type === 'channel' ||\n type === 'device' ||\n type === 'enum' ||\n type === 'folder' ||\n type === 'adapter' ||\n type === 'instance' ||\n propsTypes.includes(type))\n ) {\n this.objects[id] = objects[id];\n }\n });\n } else {\n this.objects = objects;\n }\n\n if (props.setObjectsReference) {\n props.setObjectsReference(this.objects);\n }\n\n // read default history\n this.defaultHistory = this.systemConfig.common.defaultHistory;\n if (this.defaultHistory) {\n props.socket\n .getState(`system.adapter.${this.defaultHistory}.alive`)\n .then(state => {\n if (!state || !state.val) {\n this.defaultHistory = '';\n }\n })\n .catch(e => window.alert(`Cannot get state: ${e}`));\n }\n\n const columnsForAdmin = await this.getAdditionalColumns();\n this.calculateColumnsVisibility(null, null, columnsForAdmin);\n\n const { info, root } = buildTree(this.objects, {\n imagePrefix: this.props.imagePrefix,\n root: this.props.root,\n lang: this.props.lang,\n themeType: this.props.themeType,\n });\n this.root = root;\n this.info = info;\n\n // Show first selected item\n const node =\n this.state.selected && this.state.selected.length && findNode(this.root, this.state.selected[0]);\n\n this.lastAppliedFilter = null;\n\n // If the selected ID is not visible, reset filter\n if (\n node &&\n !applyFilter(\n node,\n this.state.filter,\n this.props.lang,\n this.objects,\n undefined,\n undefined,\n props.customFilter,\n props.types,\n )\n ) {\n // reset filter\n this.setState({ filter: { ...DEFAULT_FILTER }, columnsForAdmin }, () => {\n this.setState({ loaded: true, updating: false }, () =>\n this.expandAllSelected(() => this.onAfterSelect()),\n );\n });\n } else {\n this.setState({ loaded: true, updating: false, columnsForAdmin }, () =>\n this.expandAllSelected(() => this.onAfterSelect()),\n );\n }\n } catch (e1) {\n this.showError(e1);\n }\n }\n\n /**\n * Check if it is a non-expert id\n */\n static isNonExpertId(\n /** id to test */\n id: string,\n ): boolean {\n return !!ObjectBrowserClass.#NON_EXPERT_NAMESPACES.find(saveNamespace => id.startsWith(saveNamespace));\n }\n\n private expandAllSelected(cb?: () => void): void {\n const expanded = [...this.state.expanded];\n let changed = false;\n this.state.selected.forEach(id => {\n const parts = id.split('.');\n const path = [];\n for (let i = 0; i < parts.length - 1; i++) {\n path.push(parts[i]);\n if (!expanded.includes(path.join('.'))) {\n expanded.push(path.join('.'));\n changed = true;\n }\n }\n });\n if (changed) {\n expanded.sort();\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n this.setState({ expanded }, cb);\n } else if (cb) {\n cb();\n }\n }\n\n /**\n * @param isDouble is double click\n */\n private onAfterSelect(isDouble?: boolean): void {\n if (this.state.selected?.length && this.state.selected[0]) {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectSelected`, this.state.selected[0]);\n\n // remove a task to select the pre-selected item if now we want to see another object\n if (this.selectFirst && this.selectFirst !== this.state.selected[0]) {\n this.selectFirst = '';\n }\n\n if (this.state.selected.length === 1 && this.objects[this.state.selected[0]]) {\n const name = Utils.getObjectName(this.objects, this.state.selected[0], null, {\n language: this.props.lang,\n });\n if (this.props.onSelect) {\n this.props.onSelect(this.state.selected, name, isDouble);\n }\n }\n } else {\n this.localStorage.removeItem(`${this.props.dialogName || 'App'}.objectSelected`);\n\n if (this.state.selected.length) {\n this.setState({ selected: [] }, () => this.props.onSelect && this.props.onSelect([], ''));\n } else if (this.props.onSelect) {\n this.props.onSelect([], '');\n }\n }\n }\n\n private static getDerivedStateFromProps(\n props: ObjectBrowserProps,\n state: ObjectBrowserState,\n ): Partial<ObjectBrowserState> | null {\n const newState: Partial<ObjectBrowserState> = {};\n let changed = false;\n if (props.expertMode !== undefined && props.expertMode !== state.filter.expertMode) {\n changed = true;\n newState.filter = { ...state.filter };\n newState.filter.expertMode = props.expertMode;\n }\n return changed ? newState : null;\n }\n\n /**\n * Called when component is mounted.\n */\n async componentDidMount(): Promise<void> {\n await this.loadAllObjects(!objectsAlreadyLoaded);\n if (this.props.objectsWorker) {\n this.props.objectsWorker.registerHandler(this.onObjectChangeFromWorker);\n } else {\n await this.props.socket.subscribeObject('*', this.onObjectChange);\n }\n\n objectsAlreadyLoaded = true;\n\n window.addEventListener('contextmenu', this.onContextMenu, true);\n }\n\n /**\n * Called when component is unmounted.\n */\n componentWillUnmount(): void {\n if (this.filterTimer) {\n clearTimeout(this.filterTimer);\n this.filterTimer = null;\n }\n window.removeEventListener('contextmenu', this.onContextMenu, true);\n\n if (this.props.objectsWorker) {\n this.props.objectsWorker.unregisterHandler(this.onObjectChangeFromWorker, true);\n } else {\n void this.props.socket\n .unsubscribeObject('*', this.onObjectChange)\n .catch(e => console.error(`Cannot unsubscribe *: ${e}`));\n }\n\n // remove all subscribes\n this.subscribes.forEach(pattern => {\n console.log(`- unsubscribe ${pattern}`);\n this.props.socket.unsubscribeState(pattern, this.onStateChange);\n });\n\n this.subscribes = [];\n this.objects = {};\n }\n\n /**\n * Show the deletion dialog for a given object\n */\n showDeleteDialog(options: { id: string; obj: ioBroker.Object; item: TreeItem }): void {\n const { id, obj, item } = options;\n\n // calculate the number of children\n const keys = Object.keys(this.objects);\n keys.sort();\n let count = 0;\n const start = `${id}.`;\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].startsWith(start)) {\n count++;\n } else if (keys[i] > start) {\n break;\n }\n }\n\n if (this.props.onObjectDelete) {\n this.props.onObjectDelete(id, !!item.children?.length, !obj.common?.dontDelete, count + 1);\n }\n }\n\n /**\n * Context menu handler.\n */\n onContextMenu = (e: MouseEvent): void => {\n // console.log(`CONTEXT MENU: ${this.contextMenu ? Date.now() - this.contextMenu.ts : 'false'}`);\n if (this.contextMenu && Date.now() - this.contextMenu.ts < 2000) {\n e.preventDefault();\n this.setState({\n showContextMenu: {\n item: this.contextMenu.item,\n position: { left: e.clientX + 2, top: e.clientY - 6 },\n },\n });\n } else if (this.state.showContextMenu) {\n e.preventDefault();\n this.setState({ showContextMenu: null });\n }\n this.contextMenu = null;\n };\n\n /**\n * Called when component is mounted.\n */\n refreshComponent(): void {\n // remove all subscribes\n this.subscribes.forEach(pattern => {\n console.log(`- unsubscribe ${pattern}`);\n this.props.socket.unsubscribeState(pattern, this.onStateChange);\n });\n\n this.subscribes = [];\n\n this.loadAllObjects(true)\n .then(() => console.log('updated!'))\n .catch(e => this.showError(e));\n }\n\n /**\n * Renders the error dialog.\n */\n renderErrorDialog(): JSX.Element | null {\n return this.state.error ? (\n <Dialog\n open={!0}\n maxWidth=\"sm\"\n fullWidth\n onClose={() => this.setState({ error: '' })}\n aria-labelledby=\"error-dialog-title\"\n aria-describedby=\"error-dialog-description\"\n >\n <DialogTitle id=\"alert-dialog-title\">{this.props.t('ra_Error')}</DialogTitle>\n <DialogContent>\n <DialogContentText id=\"alert-dialog-description\">{this.state.error}</DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({ error: '' })}\n color=\"primary\"\n autoFocus\n startIcon={<IconCheck />}\n >\n {this.props.t('ra_Ok')}\n </Button>\n </DialogActions>\n </Dialog>\n ) : null;\n }\n\n /**\n * Show the error dialog.\n */\n showError(error: any): void {\n this.setState({\n error:\n typeof error === 'object'\n ? error && typeof error.toString === 'function'\n ? error.toString()\n : JSON.stringify(error)\n : error,\n });\n }\n\n /**\n * Called when an item is selected/deselected.\n */\n onSelect(toggleItem: string, isDouble?: boolean, cb?: () => void): void {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.focused`, toggleItem);\n\n if (!this.props.multiSelect) {\n if (\n this.objects[toggleItem] &&\n (!this.props.types || this.props.types.includes(this.objects[toggleItem].type))\n ) {\n this.localStorage.removeItem(`${this.props.dialogName || 'App'}.selectedNonObject`);\n if (this.state.selected[0] !== toggleItem) {\n this.setState({ selected: [toggleItem], selectedNonObject: '', focused: toggleItem }, () => {\n this.onAfterSelect(isDouble);\n if (cb) {\n cb();\n }\n });\n } else if (isDouble && this.props.onSelect) {\n this.onAfterSelect(isDouble);\n }\n } else {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.selectedNonObject`, toggleItem);\n this.setState({ selected: [], selectedNonObject: toggleItem, focused: toggleItem }, () => {\n this.onAfterSelect();\n if (cb) {\n cb();\n }\n });\n }\n } else if (\n this.objects[toggleItem] &&\n (!this.props.types || this.props.types.includes(this.objects[toggleItem].type))\n ) {\n this.localStorage.removeItem(`${this.props.dialogName || 'App'}.selectedNonObject`);\n\n const selected = [...this.state.selected];\n const pos = selected.indexOf(toggleItem);\n if (pos === -1) {\n selected.push(toggleItem);\n selected.sort();\n } else if (!isDouble) {\n selected.splice(pos, 1);\n }\n\n this.setState({ selected, selectedNonObject: '', focused: toggleItem }, () => {\n this.onAfterSelect(isDouble);\n if (cb) {\n cb();\n }\n });\n }\n }\n\n private _renderDefinedList(isLast: boolean): JSX.Element[] {\n const cols = [...this.possibleCols];\n cols.unshift('id');\n if (this.props.columns && !this.props.columns.includes('buttons')) {\n const pos = cols.indexOf('buttons');\n if (pos !== -1) {\n cols.splice(pos, 1);\n }\n }\n return cols\n .filter(\n id => (isLast && (id === 'val' || id === 'buttons')) || (!isLast && id !== 'val' && id !== 'buttons'),\n )\n .map(id => (\n <ListItemButton\n onClick={() => {\n if (!this.state.columnsAuto && id !== 'id') {\n const columns = [...(this.state.columns || [])];\n const pos = columns.indexOf(id);\n if (pos === -1) {\n columns.push(id);\n columns.sort();\n } else {\n columns.splice(pos, 1);\n }\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.columns`,\n JSON.stringify(columns),\n );\n this.calculateColumnsVisibility(null, columns);\n this.setState({ columns });\n }\n }}\n key={id}\n >\n <Checkbox\n edge=\"start\"\n disabled={id === 'id' || this.state.columnsAuto}\n checked={\n id === 'id' ||\n !!(this.state.columnsAuto\n ? this.visibleCols.includes(id)\n : this.state.columns?.includes(id))\n }\n disableRipple\n />\n <ListItemText primary={this.texts[`filter_${id}`] || this.props.t(`ra_${id}`)} />\n {/*\n <ListItemSecondaryAction>\n <FormControl\n variant=\"standard\"\n style={{ ...styles.columnsDialogInputWidth, marginTop: 0, marginBottom: 0 }}\n margin=\"dense\"\n >\n <Input\n classes={{ underline: 'no-underline' }}\n placeholder={this.props.t('ra_Width')}\n value={this.state.columnsWidths[id] || ''}\n onChange={e => {\n const columnsWidths = JSON.parse(JSON.stringify(this.state.columnsWidths));\n columnsWidths[id] = e.target.value;\n this.localStorage.setItem((this.props.dialogName || 'App') + '.columnsWidths', JSON.stringify(columnsWidths));\n this.calculateColumnsVisibility(null, null, null, columnsWidths);\n this.setState({ columnsWidths });\n }}\n autoComplete=\"off\"\n />\n </FormControl>\n </ListItemSecondaryAction>\n */}\n </ListItemButton>\n ));\n }\n\n /**\n * Renders the columns' selector.\n */\n renderColumnsSelectorDialog(): JSX.Element | null {\n if (!this.state.columnsSelectorShow) {\n return null;\n }\n return (\n <Dialog\n onClose={() => this.setState({ columnsSelectorShow: false })}\n open={!0}\n sx={{\n '& .MuiPaper-root': Utils.getStyle(\n this.props.theme,\n styles.dialogColumns,\n styles[`transparent_${this.state.columnsDialogTransparent}`],\n ),\n }}\n >\n <DialogTitle sx={styles.fontSizeTitle}>{this.props.t('ra_Configure')}</DialogTitle>\n <DialogContent sx={styles.fontSizeTitle}>\n <FormControlLabel\n style={styles.switchColumnAuto}\n control={\n <Switch\n checked={this.state.foldersFirst}\n onChange={() => {\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.foldersFirst`,\n this.state.foldersFirst ? 'false' : 'true',\n );\n this.setState({ foldersFirst: !this.state.foldersFirst });\n }}\n />\n }\n label={this.props.t('ra_Folders always first')}\n />\n <FormControlLabel\n style={styles.switchColumnAuto}\n control={\n <Switch\n checked={this.state.linesEnabled}\n onChange={() => {\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.lines`,\n this.state.linesEnabled ? 'false' : 'true',\n );\n this.setState({ linesEnabled: !this.state.linesEnabled });\n }}\n />\n }\n label={this.props.t('ra_Show lines between rows')}\n />\n <FormControlLabel\n style={styles.switchColumnAuto}\n control={\n <Switch\n checked={this.state.columnsAuto}\n onChange={() => {\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.columnsAuto`,\n this.state.columnsAuto ? 'false' : 'true',\n );\n if (!this.state.columnsAuto) {\n this.calculateColumnsVisibility(true);\n this.setState({ columnsAuto: true });\n } else if (!this.state.columns) {\n this.calculateColumnsVisibility(false, [...this.visibleCols]);\n this.setState({ columnsAuto: false, columns: [...this.visibleCols] });\n } else {\n this.calculateColumnsVisibility(false);\n this.setState({ columnsAuto: false });\n }\n }}\n />\n }\n label={this.props.t('ra_Auto (no custom columns)')}\n />\n {/*\n <Typography classes={{ root: styles.dialogColumnsLabel }}>{this.props.t('ra_Transparent dialog')}</Typography>\n <Slider classes={{ root: styles.width100 }} value={this.state.columnsDialogTransparent} min={20} max={100} step={10} onChange={(event, newValue) =>\n this.setState({ columnsDialogTransparent: newValue })\n } />\n */}\n <List>\n {this._renderDefinedList(false)}\n\n {this.state.columnsForAdmin &&\n Object.keys(this.state.columnsForAdmin)\n .sort()\n .map(\n adapter =>\n this.state.columnsForAdmin &&\n this.state.columnsForAdmin[adapter].map(column => (\n <ListItemButton\n onClick={() => {\n if (!this.state.columnsAuto) {\n const columns = [...(this.state.columns || [])];\n const id = `_${adapter}_${column.path}`;\n const pos = columns.indexOf(id);\n if (pos === -1) {\n columns.push(id);\n columns.sort();\n } else {\n columns.splice(pos, 1);\n }\n this.calculateColumnsVisibility(null, columns);\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.columns`,\n JSON.stringify(columns),\n );\n this.setState({ columns });\n }\n }}\n key={`${adapter}_${column.name}`}\n >\n <ListItemIcon>\n <Checkbox\n disabled={this.state.columnsAuto}\n edge=\"start\"\n checked={\n !this.state.columnsAuto &&\n this.state.columns?.includes(`_${adapter}_${column.path}`)\n }\n disableRipple\n />\n </ListItemIcon>\n <ListItemText primary={`${column.name} (${adapter})`} />\n {/*\n <ListItemSecondaryAction>\n <FormControl\n variant=\"standard\"\n style={{ ...styles.columnsDialogInputWidth, marginTop: 0, marginBottom: 0 }}\n margin=\"dense\"\n >\n <Input\n classes={{ underline: 'no-underline' }}\n placeholder={this.props.t('ra_Width')}\n value={this.state.columnsWidths['_' + adapter + '_' + column.path] || ''}\n onChange={e => {\n const columnsWidths = JSON.parse(JSON.stringify(this.state.columnsWidths));\n columnsWidths['_' + adapter + '_' + column.path] = e.target.value;\n this.localStorage.setItem((this.props.dialogName || 'App') + '.columnsWidths', JSON.stringify(columnsWidths));\n this.calculateColumnsVisibility(null, null, null, columnsWidths);\n this.setState({ columnsWidths });\n }}\n autoComplete=\"off\"\n />\n </FormControl>\n </ListItemSecondaryAction>\n */}\n </ListItemButton>\n )),\n )}\n {this._renderDefinedList(true)}\n </List>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({ columnsSelectorShow: false })}\n color=\"primary\"\n startIcon={<IconClose />}\n >\n {this.texts.close}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n private async getAdditionalColumns(): Promise<Record<string, CustomAdminColumnStored[]> | null> {\n try {\n const instances = await this.props.socket.getAdapters();\n\n let columnsForAdmin: Record<string, CustomAdminColumnStored[]> | null = null;\n // find all additional columns\n instances.forEach(obj => (columnsForAdmin = this.parseObjectForAdmins(columnsForAdmin, obj)));\n\n return columnsForAdmin;\n } catch (err) {\n // window.alert('Cannot get adapters: ' + e);\n // Object browser in Web has no additional columns\n console.error(`Cannot get adapters: ${err}`);\n return null;\n }\n }\n\n private checkUnsubscribes(): void {\n // Remove unused subscriptions\n for (let i = this.subscribes.length - 1; i >= 0; i--) {\n if (!this.recordStates.includes(this.subscribes[i])) {\n this.unsubscribe(this.subscribes[i]);\n }\n }\n this.recordStates = [];\n }\n\n /**\n * Find an item.\n */\n findItem(id: string, _parts?: string[], _root?: TreeItem | null, _partyId?: string): TreeItem | null {\n _parts = _parts || id.split('.');\n _root = _root || this.root;\n if (!_root || !_parts.length) {\n return null;\n }\n\n _partyId = (_partyId ? `${_partyId}.` : '') + _parts.shift();\n\n if (_root.children) {\n const item = _root.children.find(i => i.data.id === _partyId);\n if (item) {\n if (item.data.id === id) {\n return item;\n }\n if (_parts.length) {\n return this.findItem(id, _parts, item, _partyId);\n }\n } else {\n return null;\n }\n }\n\n return null;\n }\n\n /**\n * Called when a state changes.\n */\n onStateChange = (id: string, state?: ioBroker.State | null): void => {\n console.log(`> stateChange ${id}`);\n if (this.states[id]) {\n const item = this.findItem(id);\n if (item?.data.state) {\n item.data.state = undefined;\n }\n }\n if (state) {\n this.states[id] = state;\n } else {\n delete this.states[id];\n }\n\n if (!this.pausedSubscribes) {\n if (!this.statesUpdateTimer) {\n this.statesUpdateTimer = setTimeout(() => {\n this.statesUpdateTimer = null;\n this.forceUpdate();\n }, 300);\n }\n } else if (this.statesUpdateTimer) {\n clearTimeout(this.statesUpdateTimer);\n this.statesUpdateTimer = null;\n }\n };\n\n private parseObjectForAdmins(\n columnsForAdmin: Record<string, CustomAdminColumnStored[]> | null,\n obj: ioBroker.AdapterObject,\n ): Record<string, CustomAdminColumnStored[]> | null {\n if (obj.common && obj.common.adminColumns && obj.common.name) {\n const columns: string | (string | ioBroker.CustomAdminColumn)[] = obj.common.adminColumns;\n let aColumns: (string | ioBroker.CustomAdminColumn)[] | undefined;\n if (columns && typeof columns !== 'object') {\n aColumns = [columns];\n } else if (columns) {\n aColumns = columns as (string | ioBroker.CustomAdminColumn)[];\n }\n let cColumns: CustomAdminColumnStored[] | null;\n if (columns) {\n cColumns = aColumns\n .map((_item: string | ioBroker.CustomAdminColumn) => {\n if (typeof _item !== 'object') {\n return { path: _item, name: _item.split('.').pop() };\n }\n const item: ioBroker.CustomAdminColumn = _item;\n // string => array\n if (item.objTypes && typeof item.objTypes !== 'object') {\n item.objTypes = [item.objTypes];\n } else if (!item.objTypes) {\n item.objTypes = undefined;\n }\n\n if (!item.name && item.path) {\n return {\n path: item.path,\n name: item.path.split('.').pop(),\n width: item.width,\n edit: !!item.edit,\n type: item.type,\n objTypes: item.objTypes,\n } as CustomAdminColumnStored;\n }\n if (!item.path) {\n console.warn(`Admin columns for ${obj._id} ignored, because path not found`);\n return null;\n }\n return {\n path: item.path,\n name: getName(item.name || '', this.props.lang),\n width: item.width,\n edit: !!item.edit,\n type: item.type,\n objTypes: item.objTypes,\n } as CustomAdminColumnStored;\n })\n .filter((item: CustomAdminColumnStored) => item);\n } else {\n cColumns = null;\n }\n\n if (cColumns && cColumns.length) {\n columnsForAdmin = columnsForAdmin || {};\n columnsForAdmin[obj.common.name] = cColumns.sort((a, b) =>\n a.path > b.path ? -1 : a.path < b.path ? 1 : 0,\n );\n }\n } else if (obj.common && obj.common.name && columnsForAdmin && columnsForAdmin[obj.common.name]) {\n delete columnsForAdmin[obj.common.name];\n }\n return columnsForAdmin;\n }\n\n onObjectChangeFromWorker = (events: ObjectEvent[]): void => {\n if (Array.isArray(events)) {\n let newState: { columnsForAdmin: Record<string, CustomAdminColumnStored[] | null> | null } | null = null;\n events.forEach(event => {\n const { newInnerState, filtered } = this.processOnObjectChangeElement(event.id, event.obj);\n if (filtered) {\n return;\n }\n if (newInnerState && newState) {\n Object.assign(newState, newInnerState);\n } else {\n newState = newInnerState;\n }\n });\n\n if (newState) {\n this.setState(newState);\n }\n this.afterObjectUpdated();\n }\n };\n\n onObjectChange = (id: string, obj?: ioBroker.Object | null): void => {\n const { newInnerState, filtered } = this.processOnObjectChangeElement(id, obj);\n if (filtered) {\n return;\n }\n\n if (newInnerState) {\n this.setState(newInnerState);\n }\n this.afterObjectUpdated();\n };\n\n afterObjectUpdated(): void {\n if (!this.objectsUpdateTimer && this.objects) {\n this.objectsUpdateTimer = setTimeout(() => {\n this.objectsUpdateTimer = null;\n const { info, root } = buildTree(this.objects, {\n imagePrefix: this.props.imagePrefix,\n root: this.props.root,\n lang: this.props.lang,\n themeType: this.props.themeType,\n });\n this.root = root;\n this.info = info;\n this.lastAppliedFilter = null; // apply filter anew\n\n if (!this.pausedSubscribes) {\n this.forceUpdate();\n }\n // else it will be re-rendered when the dialog will be closed\n }, 500);\n }\n }\n\n // This function is called when the user changes the alias of an object.\n // It updates the aliasMap and returns true if the aliasMap has changed.\n updateAliases(aliasId: string): void {\n if (!this.objects || !this.info?.aliasesMap || !aliasId?.startsWith('alias.')) {\n return;\n }\n // Rebuild aliases map\n const aliasesIds = Object.keys(this.objects).filter(id => id.startsWith('alias.0'));\n\n this.info.aliasesMap = {};\n\n for (const id of aliasesIds) {\n const obj = this.objects[id];\n if (obj?.common?.alias?.id) {\n if (typeof obj.common.alias.id === 'string') {\n const usedId = obj.common.alias.id;\n if (!this.info.aliasesMap[usedId]) {\n this.info.aliasesMap[usedId] = [id];\n } else if (!this.info.aliasesMap[usedId].includes(id)) {\n this.info.aliasesMap[usedId].push(id);\n }\n } else {\n const readId = obj.common.alias.id.read;\n if (readId) {\n if (!this.info.aliasesMap[readId]) {\n this.info.aliasesMap[readId] = [id];\n } else if (!this.info.aliasesMap[readId].includes(id)) {\n this.info.aliasesMap[readId].push(id);\n }\n }\n const writeId = obj.common.alias.id.write;\n if (writeId) {\n if (!this.info.aliasesMap[writeId]) {\n this.info.aliasesMap[writeId] = [id];\n } else if (!this.info.aliasesMap[writeId].includes(id)) {\n this.info.aliasesMap[writeId].push(id);\n }\n }\n }\n }\n }\n }\n\n /**\n * Processes a single element in regard to certain filters, columns for admin and updates object dict\n *\n * @param id The id of the object\n * @param obj The object itself\n * @returns Returns an object containing the new state (if any) and whether the object was filtered.\n */\n processOnObjectChangeElement(\n id: string,\n obj?: ioBroker.Object | null,\n ): {\n filtered: boolean;\n newInnerState: null | { columnsForAdmin: Record<string, CustomAdminColumnStored[]> | null };\n } {\n console.log(`> objectChange ${id}`);\n const type = obj?.type;\n\n // If the object is filtered out, we don't need to update the React state\n if (\n obj &&\n typeof this.props.filterFunc === 'function' &&\n !this.props.filterFunc(obj) &&\n type !== 'channel' &&\n type !== 'device' &&\n type !== 'folder' &&\n type !== 'adapter' &&\n type !== 'instance'\n ) {\n return { newInnerState: null, filtered: true };\n }\n\n let newInnerState = null;\n if (id.startsWith('system.adapter.') && obj?.type === 'adapter') {\n const columnsForAdmin: Record<string, CustomAdminColumnStored[]> | null = JSON.parse(\n JSON.stringify(this.state.columnsForAdmin),\n );\n\n this.parseObjectForAdmins(columnsForAdmin, obj as ioBroker.AdapterObject);\n\n if (JSON.stringify(this.state.columnsForAdmin) !== JSON.stringify(columnsForAdmin)) {\n newInnerState = { columnsForAdmin };\n }\n }\n\n this.objects = this.objects || {};\n\n if (obj) {\n this.objects[id] = obj;\n } else if (this.objects[id]) {\n delete this.objects[id];\n }\n\n this.updateAliases(id);\n\n return { newInnerState, filtered: false };\n }\n\n private subscribe(id: string): void {\n if (!this.subscribes.includes(id)) {\n this.subscribes.push(id);\n console.log(`+ subscribe ${id}`);\n if (!this.pausedSubscribes) {\n this.props.socket\n .subscribeState(id, this.onStateChange)\n .catch(e => console.error(`Cannot subscribe on state ${id}: ${e}`));\n }\n }\n }\n\n private unsubscribe(id: string): void {\n const pos = this.subscribes.indexOf(id);\n if (pos !== -1) {\n this.subscribes.splice(pos, 1);\n if (this.states[id]) {\n delete this.states[id];\n }\n console.log(`- unsubscribe ${id}`);\n this.props.socket.unsubscribeState(id, this.onStateChange);\n\n if (this.pausedSubscribes) {\n console.warn('Unsubscribe during pause?');\n }\n }\n }\n\n private pauseSubscribe(isPause: boolean): void {\n if (!this.pausedSubscribes && isPause) {\n this.pausedSubscribes = true;\n this.subscribes.forEach(id => this.props.socket.unsubscribeState(id, this.onStateChange));\n } else if (this.pausedSubscribes && !isPause) {\n this.pausedSubscribes = false;\n this.subscribes.forEach(id => this.props.socket.subscribeState(id, this.onStateChange));\n }\n }\n\n private onFilter(name?: string, value?: string | boolean): void {\n this.filterTimer = null;\n const filter: ObjectBrowserFilter = { ...this.state.filter };\n\n Object.keys(this.filterRefs).forEach(_name => {\n if (this.filterRefs[_name] && this.filterRefs[_name].current) {\n const filterRef: HTMLSelectElement = this.filterRefs[_name].current;\n for (let i = 0; i < filterRef.children.length; i++) {\n if (filterRef.children[i].tagName === 'INPUT') {\n (filter as Record<string, string>)[_name] = (filterRef.children[i] as HTMLInputElement).value;\n break;\n }\n }\n }\n });\n\n if (name) {\n (filter as Record<string, string | boolean | undefined>)[name] = value;\n if (name === 'expertMode') {\n (((window as any)._sessionStorage as Storage) || window.sessionStorage).setItem(\n 'App.expertMode',\n value ? 'true' : 'false',\n );\n }\n }\n\n if (JSON.stringify(this.state.filter) !== JSON.stringify(filter)) {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectFilter`, JSON.stringify(filter));\n this.setState({ filter }, () => this.props.onFilterChanged && this.props.onFilterChanged(filter));\n }\n }\n\n clearFilter(): void {\n const filter: ObjectBrowserFilter = { ...this.state.filter };\n\n Object.keys(this.filterRefs).forEach(name => {\n if (this.filterRefs[name] && this.filterRefs[name].current) {\n const filterRef: HTMLSelectElement = this.filterRefs[name].current;\n for (let i = 0; i < filterRef.childNodes.length; i++) {\n const item = filterRef.childNodes[i];\n if ((item as HTMLInputElement).tagName === 'INPUT') {\n (filter as Record<string, string>)[name] = '';\n (item as HTMLInputElement).value = '';\n break;\n }\n }\n }\n });\n\n if (JSON.stringify(this.state.filter) !== JSON.stringify(filter)) {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectFilter`, JSON.stringify(filter));\n this.setState(\n { filter, filterKey: this.state.filterKey + 1 },\n () => this.props.onFilterChanged && this.props.onFilterChanged(filter),\n );\n }\n }\n\n isFilterEmpty(): boolean {\n const someNotEmpty = Object.keys(this.state.filter).find(\n attr => attr !== 'expertMode' && (this.state.filter as Record<string, string>)[attr],\n );\n return !someNotEmpty;\n }\n\n private getFilterInput(filterName: string): JSX.Element {\n return (\n <FormControl\n sx={this.styles.filterInput}\n key={`${filterName}_${this.state.filterKey}`}\n // style={{ marginTop: 0, marginBottom: 0 }}\n margin=\"dense\"\n >\n <Input\n ref={this.filterRefs[filterName]}\n classes={{ underline: 'no-underline' }}\n id={filterName}\n placeholder={this.texts[`filter_${filterName}`]}\n defaultValue={(this.state.filter as Record<string, string>)[filterName] || ''}\n onChange={() => {\n if (this.filterTimer) {\n clearTimeout(this.filterTimer);\n }\n this.filterTimer = setTimeout(() => this.onFilter(), 400);\n }}\n autoComplete=\"off\"\n />\n {(this.filterRefs[filterName]?.current?.firstChild as HTMLInputElement)?.value ? (\n <div\n style={{\n position: 'absolute',\n right: 0,\n }}\n >\n <IconButton\n size=\"small\"\n onClick={() => {\n (this.filterRefs[filterName].current?.firstChild as HTMLInputElement).value = '';\n this.onFilter(filterName, '');\n }}\n >\n <IconClose />\n </IconButton>\n </div>\n ) : null}\n </FormControl>\n );\n }\n\n private getFilterSelect(name: string, values?: (string | InputSelectItem)[]): JSX.Element {\n const hasIcons = !!values?.find(item => (item as InputSelectItem).icon);\n\n return (\n <div style={{ position: 'relative' }}>\n <Select\n variant=\"standard\"\n key={`${name}_${this.state.filterKey}`}\n ref={this.filterRefs[name]}\n sx={styles.headerCellInput}\n className=\"no-underline\"\n onChange={() => {\n if (this.filterTimer) {\n clearTimeout(this.filterTimer);\n }\n this.filterTimer = setTimeout(() => this.onFilter(), 400);\n }}\n defaultValue={(this.state.filter as Record<string, string>)[name] || ''}\n inputProps={{ name, id: name }}\n displayEmpty\n >\n <MenuItem\n key=\"empty\"\n value=\"\"\n >\n <span style={styles.selectNone}>{this.texts[`filter_${name}`]}</span>\n </MenuItem>\n {values?.map(item => {\n let id: string;\n let _name: string;\n let icon: null | JSX.Element | undefined;\n if (typeof item === 'object') {\n id = item.value;\n _name = item.name;\n icon = item.icon;\n } else {\n id = item;\n _name = item;\n }\n return (\n <MenuItem\n sx={styles.headerCellSelectItem}\n key={id}\n value={id}\n >\n {icon || (hasIcons ? <div className=\"itemIcon\" /> : null)}\n {_name}\n </MenuItem>\n );\n })}\n </Select>\n {(this.filterRefs[name]?.current?.childNodes[1] as HTMLInputElement)?.value ? (\n <Box\n component=\"div\"\n sx={styles.selectClearButton}\n >\n <IconButton\n size=\"small\"\n onClick={() => {\n const newFilter: ObjectBrowserFilter = { ...this.state.filter };\n (newFilter as Record<string, string>)[name] = '';\n (this.filterRefs[name].current?.childNodes[1] as HTMLInputElement).value = '';\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.objectFilter`,\n JSON.stringify(newFilter),\n );\n this.setState(\n { filter: newFilter, filterKey: this.state.filterKey + 1 },\n () => this.props.onFilterChanged && this.props.onFilterChanged(newFilter),\n );\n }}\n >\n <IconClose />\n </IconButton>\n </Box>\n ) : null}\n </div>\n );\n }\n\n private getFilterSelectRole(): JSX.Element {\n return this.getFilterSelect('role', this.info.roles);\n }\n\n private getFilterSelectRoom(): JSX.Element {\n const rooms: InputSelectItem[] = this.info.roomEnums.map(\n id =>\n ({\n name: getName(this.objects[id]?.common?.name, this.props.lang) || id.split('.').pop(),\n value: id,\n icon: (\n <Icon\n src={this.objects[id]?.common?.icon || ''}\n style={styles.selectIcon}\n />\n ),\n }) as InputSelectItem,\n );\n\n return this.getFilterSelect('room', rooms);\n }\n\n private getFilterSelectFunction(): JSX.Element {\n const func: InputSelectItem[] = this.info.funcEnums.map(\n id =>\n ({\n name: getName(this.objects[id]?.common?.name, this.props.lang) || id.split('.').pop(),\n value: id,\n icon: (\n <Icon\n src={this.objects[id]?.common?.icon || ''}\n style={styles.selectIcon}\n />\n ),\n }) as InputSelectItem,\n );\n\n return this.getFilterSelect('func', func);\n }\n\n private getFilterSelectType(): JSX.Element {\n const types = this.info.types.map(type => ({\n name: type,\n value: type,\n icon: ITEM_IMAGES[type] || null,\n }));\n\n return this.getFilterSelect('type', types);\n }\n\n private getFilterSelectCustoms(): JSX.Element | null {\n if (this.info.customs.length > 1) {\n const customs = this.info.customs.map(id => ({\n name: id === '_' ? this.texts.filterCustomsWithout : id,\n value: id,\n icon:\n id === '_' ? null : (\n <Icon\n src={getSelectIdIconFromObjects(this.objects, id, this.props.lang, this.imagePrefix) || ''}\n style={styles.selectIcon}\n />\n ),\n }));\n return this.getFilterSelect('custom', customs);\n }\n return null;\n }\n\n private onExpandAll(root?: TreeItem, expanded?: string[]): void {\n const _root: TreeItem | null = root || this.root;\n expanded = expanded || [];\n\n _root?.children?.forEach((item: TreeItem) => {\n if (item.data.sumVisibility) {\n expanded.push(item.data.id);\n this.onExpandAll(item, expanded);\n }\n });\n\n if (_root === this.root) {\n expanded.sort();\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n\n this.setState({ expanded });\n }\n }\n\n private onCollapseAll(): void {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify([]));\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectSelected`, '[]');\n this.setState({ expanded: [], depth: 0, selected: [] }, () => this.onAfterSelect());\n }\n\n private expandDepth(root: TreeItem, depth: number, expanded: string[]): void {\n root = root || this.root;\n if (depth > 0) {\n root.children?.forEach(item => {\n if (item.data.sumVisibility) {\n if (!binarySearch(expanded, item.data.id)) {\n expanded.push(item.data.id);\n expanded.sort();\n }\n if (depth - 1 > 0) {\n this.expandDepth(item, depth - 1, expanded);\n }\n }\n });\n }\n }\n\n private static collapseDepth(depth: number, expanded: string[]): string[] {\n return expanded.filter(id => id.split('.').length <= depth);\n }\n\n private onExpandVisible(): void {\n if (this.state.depth < 9) {\n const depth = this.state.depth + 1;\n const expanded = [...this.state.expanded];\n if (this.root) {\n this.expandDepth(this.root, depth, expanded);\n }\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n this.setState({ depth, expanded });\n }\n }\n\n private onStatesViewVisible(): void {\n const statesView = !this.state.statesView;\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectStatesView`, JSON.stringify(statesView));\n this.setState({ statesView });\n }\n\n private onCollapseVisible(): void {\n if (this.state.depth > 0) {\n const depth = this.state.depth - 1;\n const expanded = ObjectBrowserClass.collapseDepth(depth, this.state.expanded);\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n this.setState({ depth, expanded });\n }\n }\n\n private getEnumsForId = (id: string): ioBroker.EnumObject[] | undefined => {\n const result: ioBroker.EnumObject[] = [];\n this.info.enums.forEach(_id => {\n if (this.objects[_id]?.common?.members?.includes(id)) {\n const enumItem: ioBroker.EnumObject = {\n _id: this.objects[_id]._id,\n common: JSON.parse(JSON.stringify(this.objects[_id].common)) as ioBroker.EnumCommon,\n native: this.objects[_id].native,\n type: 'enum',\n } as ioBroker.EnumObject;\n if (enumItem.common) {\n delete enumItem.common.members;\n delete enumItem.common.custom;\n // @ts-expect-error deprecated attribute\n delete enumItem.common.mobile;\n }\n result.push(enumItem);\n }\n });\n\n return result.length ? result : undefined;\n };\n\n private _createAllEnums = async (enums: (string | ioBroker.EnumObject)[], objId: string): Promise<void> => {\n for (let e = 0; e < enums.length; e++) {\n const item: string | ioBroker.EnumObject = enums[e];\n let id: string;\n let newObj: ioBroker.EnumObject | undefined;\n\n // some admin version delivered enums as string\n if (typeof item === 'object') {\n newObj = item;\n id = newObj._id;\n } else {\n id = item;\n }\n\n let oldObj: ioBroker.EnumObject | undefined = this.objects[id] as ioBroker.EnumObject | undefined;\n // if enum does not exist\n if (!oldObj) {\n // create a new one\n oldObj =\n newObj ||\n ({\n _id: id,\n common: {\n name: id.split('.').pop(),\n members: [],\n },\n native: {},\n type: 'enum',\n } as ioBroker.EnumObject);\n\n oldObj.common = oldObj.common || ({} as ioBroker.EnumCommon);\n oldObj.common.members = [objId];\n oldObj.type = 'enum';\n\n await this.props.socket.setObject(id, oldObj);\n } else if (!oldObj.common?.members?.includes(objId)) {\n oldObj.common = oldObj.common || ({} as ioBroker.EnumCommon);\n oldObj.type = 'enum';\n oldObj.common.members = oldObj.common.members || [];\n // add the missing object\n oldObj.common.members.push(objId);\n oldObj.common.members.sort();\n await this.props.socket.setObject(id, oldObj);\n }\n }\n };\n\n private async loadObjects(objs: Record<string, ioBrokerObjectForExport>): Promise<void> {\n if (objs) {\n for (const id in objs) {\n if (!Object.prototype.hasOwnProperty.call(objs, id) || !objs[id]) {\n continue;\n }\n const obj = objs[id];\n let enums = null;\n let val;\n let ack;\n if (obj && obj.common && obj.common.enums) {\n enums = obj.common.enums;\n delete obj.common.enums;\n } else {\n enums = null;\n }\n\n if (obj.val || obj.val === 0) {\n val = obj.val;\n delete obj.val;\n }\n if (obj.ack !== undefined) {\n ack = obj.ack;\n delete obj.ack;\n }\n try {\n await this.props.socket.setObject(id, obj);\n if (enums) {\n await this._createAllEnums(enums, obj._id);\n }\n if (obj.type === 'state') {\n if (val !== undefined && val !== null) {\n try {\n await this.props.socket.setState(obj._id, val, ack !== undefined ? ack : true);\n } catch (e) {\n window.alert(`Cannot set state \"${obj._id} with ${val}\": ${e}`);\n }\n } else {\n try {\n const state = await this.props.socket.getState(obj._id);\n if (!state || state.val === null) {\n try {\n await this.props.socket.setState(\n obj._id,\n !obj.common || obj.common.def === undefined ? null : obj.common.def,\n true,\n );\n } catch (e) {\n window.alert(`Cannot set state \"${obj._id}\": ${e}`);\n }\n }\n } catch (e) {\n window.alert(`Cannot read state \"${obj._id}\": ${e}`);\n }\n }\n }\n } catch (error) {\n window.alert(error);\n }\n }\n }\n }\n\n _getSelectedIdsForExport(): string[] {\n if (this.state.selected.length || this.state.selectedNonObject) {\n const result = [];\n const keys = Object.keys(this.objects);\n keys.sort();\n const id = this.state.selected[0] || this.state.selectedNonObject;\n const idDot = `${id}.`;\n const idLen = idDot.length;\n for (let k = 0; k < keys.length; k++) {\n const key = keys[k];\n if (id === key || key.startsWith(idDot)) {\n result.push(key);\n }\n if (key.substring(0, idLen) > idDot) {\n break;\n }\n }\n\n return result;\n }\n return [];\n }\n\n /**\n * Exports the selected objects based on the given options and triggers file generation\n */\n private async _exportObjects(\n /** Options to filter/reduce the output */\n options: {\n /** Whether all objects should be exported or only the selected ones */\n isAll?: boolean;\n /** Whether the output should be beautified */\n beautify?: boolean;\n /** Whether \"system.repositories\" should be excluded */\n excludeSystemRepositories?: boolean;\n /** Whether translations should be reduced to only the english value */\n excludeTranslations?: boolean;\n /** Whether the values of the states should be not included */\n noStatesByExportImport?: boolean;\n },\n ): Promise<void> {\n if (options.isAll) {\n generateFile('allObjects.json', this.objects, options);\n return;\n }\n if (!(this.state.selected.length || this.state.selectedNonObject)) {\n window.alert(this.props.t('ra_Save of objects-tree is not possible'));\n return;\n }\n const result: Record<string, ioBrokerObjectForExport> = {};\n const id = this.state.selected[0] || this.state.selectedNonObject;\n const ids = this._getSelectedIdsForExport();\n\n for (const key of ids) {\n result[key] = JSON.parse(JSON.stringify(this.objects[key])) as ioBrokerObjectForExport;\n // read states values\n if (result[key]?.type === 'state' && !options.noStatesByExportImport) {\n const state = await this.props.socket.getState(key);\n if (state) {\n result[key].val = state.val;\n result[key].ack = state.ack;\n }\n }\n // add enum information\n if (result[key].common) {\n const enums = this.getEnumsForId(key);\n if (enums) {\n result[key].common.enums = enums;\n }\n }\n }\n\n generateFile(`${id}.json`, result, options);\n }\n\n renderExportDialog(): JSX.Element | null {\n if (this.state.showExportDialog === false) {\n return null;\n }\n return (\n <Dialog\n open={!0}\n maxWidth=\"lg\"\n >\n <DialogTitle>{this.props.t('ra_Select type of export')}</DialogTitle>\n <DialogContent>\n <DialogContentText>\n {this.state.filter.expertMode || this.state.showAllExportOptions ? (\n <>\n {this.props.t('ra_You can export all objects or just the selected branch.')}\n <br />\n {this.props.t('ra_Selected %s object(s)', this.state.showExportDialog)}\n <br />\n <FormControlLabel\n control={\n <Checkbox\n checked={this.state.noStatesByExportImport}\n onChange={e => this.setState({ noStatesByExportImport: e.target.checked })}\n />\n }\n label={this.props.t('ra_Do not export values of states')}\n />\n <br />\n {this.props.t('These options can reduce the size of the export file:')}\n <FormControlLabel\n control={\n <Checkbox\n checked={this.state.beautifyJsonExport}\n onChange={e => this.setState({ beautifyJsonExport: e.target.checked })}\n />\n }\n label={this.props.t('Beautify JSON output')}\n />\n <br />\n <FormControlLabel\n control={\n <Checkbox\n checked={this.state.excludeSystemRepositoriesFromExport}\n onChange={e =>\n this.setState({ excludeSystemRepositoriesFromExport: e.target.checked })\n }\n />\n }\n label={this.props.t('Exclude system repositories from export JSON')}\n />\n <FormControlLabel\n control={\n <Checkbox\n checked={this.state.excludeTranslations}\n onChange={e => this.setState({ excludeTranslations: e.target.checked })}\n />\n }\n label={this.props.t('Exclude translations (except english) from export JSON')}\n />\n </>\n ) : null}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n {this.state.filter.expertMode || this.state.showAllExportOptions ? (\n <Button\n color=\"grey\"\n variant=\"outlined\"\n onClick={() =>\n this.setState({ showExportDialog: false, showAllExportOptions: false }, () =>\n this._exportObjects({\n isAll: true,\n noStatesByExportImport: this.state.noStatesByExportImport,\n beautify: this.state.beautifyJsonExport,\n excludeSystemRepositories: this.state.excludeSystemRepositoriesFromExport,\n excludeTranslations: this.state.excludeTranslations,\n }),\n )\n }\n >\n <span style={{ marginRight: 8 }}>{this.props.t('ra_All objects')}</span>(\n {Object.keys(this.objects).length})\n </Button>\n ) : (\n <Button\n color=\"grey\"\n variant=\"outlined\"\n startIcon={<IconExpert />}\n onClick={() => this.setState({ showAllExportOptions: true })}\n >\n {this.props.t('ra_Advanced options')}\n </Button>\n )}\n <Button\n color=\"primary\"\n variant=\"contained\"\n autoFocus\n onClick={() =>\n this.setState({ showExportDialog: false, showAllExportOptions: false }, () =>\n this._exportObjects({\n isAll: false,\n noStatesByExportImport: this.state.noStatesByExportImport,\n beautify: this.state.beautifyJsonExport,\n excludeSystemRepositories: this.state.excludeSystemRepositoriesFromExport,\n excludeTranslations: this.state.excludeTranslations,\n }),\n )\n }\n >\n <span style={{ marginRight: 8 }}>{this.props.t('ra_Only selected')}</span>(\n {this.state.showExportDialog})\n </Button>\n <Button\n color=\"grey\"\n variant=\"contained\"\n onClick={() => this.setState({ showExportDialog: false, showAllExportOptions: false })}\n startIcon={<IconClose />}\n >\n {this.props.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n private handleJsonUpload(evt: Event): void {\n const target = evt.target as HTMLInputElement;\n const f = target.files?.length && target.files[0];\n if (f) {\n const r = new FileReader();\n r.onload = async e => {\n const contents = e.target?.result;\n try {\n const json = JSON.parse(contents as string);\n const len = Object.keys(json).length;\n const id = json._id;\n // it could be a single object or many objects\n if (id === undefined && len) {\n // many objects\n await this.loadObjects(json as Record<string, ioBrokerObjectForExport>);\n window.alert(this.props.t('ra_%s object(s) processed', len));\n } else {\n // it is only one object in form\n // {\n // \"_id\": \"xxx\",\n // \"common\": \"yyy\",\n // \"native\": \"zzz\"\n // \"val\": JSON.stringify(value)\n // \"ack\": true\n // }\n if (!id) {\n return window.alert(this.props.t('ra_Invalid structure'));\n }\n try {\n let enums;\n let val;\n let ack;\n if (json.common.enums) {\n enums = json.common.enums;\n delete json.common.enums;\n }\n if (json.val) {\n val = json.val;\n delete json.val;\n }\n if (json.ack !== undefined) {\n ack = json.ack;\n delete json.ack;\n }\n await this.props.socket.setObject(json._id, json);\n\n if (json.type === 'state') {\n if (val !== undefined && val !== null) {\n await this.props.socket.setState(json._id, val, ack === undefined ? true : ack);\n } else {\n const state = await this.props.socket.getState(json._id);\n if (!state || state.val === null || state.val === undefined) {\n await this.props.socket.setState(\n json._id,\n json.common.def === undefined ? null : json.common.def,\n true,\n );\n }\n }\n }\n if (enums) {\n await this._createAllEnums(enums, json._id);\n }\n\n window.alert(this.props.t('ra_%s was imported', json._id));\n } catch (err) {\n window.alert(err);\n }\n }\n } catch (err) {\n window.alert(err);\n }\n return null;\n };\n r.readAsText(f);\n } else {\n window.alert(this.props.t('ra_Failed to open JSON File'));\n }\n }\n\n toolTipObjectCreating = (): JSX.Element[] | string => {\n const { t } = this.props;\n\n let value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={2}>{t('ra_Folder → State')}</div>,\n <div key={3}>{t('ra_Folder → Channel → State')}</div>,\n <div key={4}>{t('ra_Folder → Device → Channel → State')}</div>,\n <div key={5}>{t('ra_Device → Channel → State')}</div>,\n <div key={6}>{t('ra_Channel → State')}</div>,\n <div\n key={7}\n style={{ height: 10 }}\n />,\n <div key={8}>{t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}</div>,\n <div key={9}>\n {t(\n 'ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").',\n )}\n </div>,\n ];\n\n if (this.state.selected.length || this.state.selectedNonObject) {\n const id = this.state.selected[0] || this.state.selectedNonObject;\n if (id.split('.').length < 2 || (this.objects[id] && this.objects[id]?.type === 'state')) {\n // show default tooltip\n } else if (this.state.filter.expertMode) {\n switch (this.objects[id]?.type) {\n case 'device':\n value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={5}>{t('ra_Device → Channel → State')}</div>,\n <div\n key={7}\n style={{ height: 10 }}\n />,\n <div key={8}>\n {t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}\n </div>,\n <div key={9}>\n {t(\n 'ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").',\n )}\n </div>,\n ];\n break;\n case 'folder':\n value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={2}>{t('ra_Folder → State')}</div>,\n <div key={3}>{t('ra_Folder → Channel → State')}</div>,\n <div key={4}>{t('ra_Folder → Device → Channel → State')}</div>,\n <div\n key={7}\n style={{ height: 10 }}\n />,\n <div key={8}>\n {t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}\n </div>,\n <div key={9}>\n {t(\n 'ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").',\n )}\n </div>,\n ];\n break;\n case 'channel':\n value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={1}>{t('ra_Channel → State')}</div>,\n <div\n key={7}\n style={{ height: 10 }}\n />,\n <div key={8}>\n {t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}\n </div>,\n <div key={9}>\n {t(\n 'ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").',\n )}\n </div>,\n ];\n break;\n default:\n break;\n }\n } else if (id.startsWith('alias.0') || id.startsWith('0_userdata')) {\n value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={2}>{t('ra_Folder → State')}</div>,\n <div key={3}>{t('ra_Folder → Channel → State')}</div>,\n <div key={4}>{t('ra_Folder → Device → Channel → State')}</div>,\n <div key={5}>{t('ra_Device → Channel → State')}</div>,\n <div key={6}>{t('ra_Channel → State')}</div>,\n <div\n key={7}\n style={{ height: 10 }}\n />,\n <div key={7}>\n {t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}\n </div>,\n <div key={8}>\n {t(\n 'ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").',\n )}\n </div>,\n ];\n }\n }\n\n return value.length ? value : t('ra_Add new child object to selected parent');\n };\n\n /**\n * Renders the toolbar.\n */\n getToolbar(): JSX.Element {\n let allowObjectCreation = false;\n if (this.state.selected.length || this.state.selectedNonObject) {\n const id = this.state.selected[0] || this.state.selectedNonObject;\n\n if (id.split('.').length < 2 || (this.objects[id] && this.objects[id].type === 'state')) {\n allowObjectCreation = false;\n } else if (this.state.filter.expertMode) {\n allowObjectCreation = true;\n } else if (id.startsWith('alias.0') || id.startsWith('0_userdata')) {\n allowObjectCreation = true;\n }\n }\n\n return (\n <div\n style={{\n display: 'flex',\n width: '100%',\n alignItems: 'center',\n overflowX: 'auto',\n }}\n >\n <div\n style={{\n display: 'flex',\n width: '100%',\n alignItems: 'center',\n }}\n >\n <Tooltip\n title={this.props.t('ra_Refresh tree')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div>\n <IconButton\n onClick={() => this.refreshComponent()}\n disabled={this.state.updating}\n size=\"large\"\n >\n <RefreshIcon />\n </IconButton>\n </div>\n </Tooltip>\n {this.props.showExpertButton && !this.props.expertMode && (\n <Tooltip\n title={this.props.t('ra_expertMode')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n key=\"expertMode\"\n color={this.state.filter.expertMode ? 'secondary' : 'default'}\n onClick={() => this.onFilter('expertMode', !this.state.filter.expertMode)}\n size=\"large\"\n >\n <IconExpert />\n </IconButton>\n </Tooltip>\n )}\n {!this.props.disableColumnSelector && this.props.width !== 'xs' && (\n <Tooltip\n title={this.props.t('ra_Configure')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n key=\"columnSelector\"\n color={this.state.columnsAuto ? 'primary' : 'default'}\n onClick={() => this.setState({ columnsSelectorShow: true })}\n size=\"large\"\n >\n <IconColumns />\n </IconButton>\n </Tooltip>\n )}\n {this.props.width !== 'xs' && this.state.expandAllVisible && (\n <Tooltip\n title={this.props.t('ra_Expand all nodes')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n key=\"expandAll\"\n onClick={() => this.onExpandAll()}\n size=\"large\"\n >\n <IconOpen />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip\n title={this.props.t('ra_Collapse all nodes')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n key=\"collapseAll\"\n onClick={() => this.onCollapseAll()}\n size=\"large\"\n >\n <IconClosed />\n </IconButton>\n </Tooltip>\n {this.props.width !== 'xs' && (\n <Tooltip\n title={this.props.t('ra_Expand one step node')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n key=\"expandVisible\"\n color=\"primary\"\n onClick={() => this.onExpandVisible()}\n size=\"large\"\n >\n <Badge\n badgeContent={this.state.depth}\n color=\"secondary\"\n sx={(theme: Theme) => ({\n badge: {\n right: 3,\n top: 3,\n border: `2px solid ${theme.palette.background.paper}`,\n padding: '0 4px',\n },\n })}\n >\n <IconOpen />\n </Badge>\n </IconButton>\n </Tooltip>\n )}\n {this.props.width !== 'xs' && (\n <Tooltip\n title={this.props.t('ra_Collapse one step node')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n key=\"collapseVisible\"\n color=\"primary\"\n onClick={() => this.onCollapseVisible()}\n size=\"large\"\n >\n <Badge\n sx={(theme: Theme) => ({\n badge: {\n right: 3,\n top: 3,\n border: `2px solid ${theme.palette.background.paper}`,\n padding: '0 4px',\n },\n })}\n badgeContent={this.state.depth}\n color=\"secondary\"\n >\n <IconClosed />\n </Badge>\n </IconButton>\n </Tooltip>\n )}\n {this.props.objectStatesView && (\n <Tooltip\n title={this.props.t('ra_Toggle the states view')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n onClick={() => this.onStatesViewVisible()}\n size=\"large\"\n >\n <LooksOneIcon color={this.state.statesView ? 'primary' : 'inherit'} />\n </IconButton>\n </Tooltip>\n )}\n\n <Tooltip\n title={this.props.t('ra_Show/Hide object descriptions')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n onClick={() => {\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.desc`,\n this.state.showDescription ? 'false' : 'true',\n );\n this.setState({ showDescription: !this.state.showDescription });\n }}\n size=\"large\"\n >\n <TextFieldsIcon color={this.state.showDescription ? 'primary' : 'inherit'} />\n </IconButton>\n </Tooltip>\n\n {this.props.objectAddBoolean ? (\n <Tooltip\n title={this.toolTipObjectCreating()}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div>\n <IconButton\n disabled={!allowObjectCreation}\n onClick={() =>\n this.setState({\n modalNewObj: {\n id: this.state.selected[0] || this.state.selectedNonObject,\n },\n })\n }\n size=\"large\"\n >\n <AddIcon />\n </IconButton>\n </div>\n </Tooltip>\n ) : null}\n\n {this.props.objectImportExport && (\n <Tooltip\n title={this.props.t('ra_Add objects tree from JSON file')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n onClick={() => {\n const input = document.createElement('input');\n input.setAttribute('type', 'file');\n input.setAttribute('id', 'files');\n input.setAttribute('opacity', '0');\n input.addEventListener('change', (e: Event) => this.handleJsonUpload(e), false);\n input.click();\n }}\n size=\"large\"\n >\n <PublishIcon />\n </IconButton>\n </Tooltip>\n )}\n {this.props.objectImportExport &&\n (!!this.state.selected.length || this.state.selectedNonObject) && (\n <Tooltip\n title={this.props.t('ra_Save objects tree as JSON file')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n onClick={() =>\n this.setState({ showExportDialog: this._getSelectedIdsForExport().length })\n }\n size=\"large\"\n >\n <PublishIcon style={{ transform: 'rotate(180deg)' }} />\n </IconButton>\n </Tooltip>\n )}\n </div>\n {!!this.props.objectBrowserEditObject && this.props.width !== 'xs' && (\n <div style={{ display: 'flex', whiteSpace: 'nowrap' }}>\n {`${this.props.t('ra_Objects')}: ${Object.keys(this.info.objects).length}, ${this.props.t(\n 'ra_States',\n )}: ${\n Object.keys(this.info.objects).filter(el => this.info.objects[el].type === 'state').length\n }`}\n </div>\n )}\n {this.props.objectEditBoolean && (\n <Tooltip\n title={this.props.t('ra_Edit custom config')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n onClick={() => {\n // get all visible states\n const ids = this.root ? getVisibleItems(this.root, 'state', this.objects) : [];\n\n if (ids.length) {\n this.pauseSubscribe(true);\n\n if (ids.length === 1) {\n this.localStorage.setItem(\n `${this.props.dialogName || 'App'}.objectSelected`,\n this.state.selected[0],\n );\n this.props.router?.doNavigate(null, 'custom', this.state.selected[0]);\n }\n this.setState({ customDialog: ids, customDialogAll: true });\n } else {\n this.setState({ toast: this.props.t('ra_please select object') });\n }\n }}\n size=\"large\"\n >\n <BuildIcon />\n </IconButton>\n </Tooltip>\n )}\n </div>\n );\n }\n\n private toggleExpanded(id: string): void {\n const expanded = JSON.parse(JSON.stringify(this.state.expanded));\n const pos = expanded.indexOf(id);\n if (pos === -1) {\n expanded.push(id);\n expanded.sort();\n } else {\n expanded.splice(pos, 1);\n }\n\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n\n this.setState({ expanded });\n }\n\n private onCopy(e: React.MouseEvent, text: string | undefined): void {\n e.stopPropagation();\n e.preventDefault();\n if (text) {\n Utils.copyToClipboard(text);\n if (text.length < 50) {\n this.setState({ toast: this.props.t('ra_Copied %s', text) });\n } else {\n this.setState({ toast: this.props.t('ra_Copied') });\n }\n }\n }\n\n renderTooltipAccessControl = (acl: ioBroker.StateACL): null | JSX.Element => {\n // acl ={object,state,owner,ownerGroup}\n if (!acl) {\n return null;\n }\n const check = [\n {\n value: '0x400',\n valueNum: 0x400,\n title: 'read',\n group: 'Owner',\n },\n {\n value: '0x200',\n valueNum: 0x200,\n title: 'write',\n group: 'Owner',\n },\n {\n value: '0x40',\n valueNum: 0x40,\n title: 'read',\n group: 'Group',\n },\n {\n value: '0x20',\n valueNum: 0x20,\n title: 'write',\n group: 'Group',\n },\n {\n value: '0x4',\n valueNum: 0x4,\n title: 'read',\n group: 'Everyone',\n },\n {\n value: '0x2',\n valueNum: 0x2,\n title: 'write',\n group: 'Everyone',\n },\n ];\n const arrayTooltipText = [];\n const funcRenderStateObject = (value: 'object' | 'state'): void => {\n const rights: number = acl[value];\n check.forEach((el, i) => {\n if (rights & el.valueNum) {\n arrayTooltipText.push(\n <span key={value + i}>\n {this.texts[`acl${el.group}_${el.title}_${value}`]},\n <span style={value === 'object' ? styles.rightsObject : styles.rightsState}>\n {el.value}\n </span>\n </span>,\n );\n }\n });\n };\n\n arrayTooltipText.push(\n <span key=\"group\">\n {`${this.texts.ownerGroup}: ${(acl.ownerGroup || '').replace('system.group.', '')}`}\n </span>,\n );\n arrayTooltipText.push(\n <span key=\"owner\">{`${this.texts.ownerUser}: ${(acl.owner || '').replace('system.user.', '')}`}</span>,\n );\n funcRenderStateObject('object');\n if (acl.state) {\n funcRenderStateObject('state');\n }\n\n return arrayTooltipText.length ? (\n <span style={styles.tooltipAccessControl}>{arrayTooltipText.map(el => el)}</span>\n ) : null;\n };\n\n renderColumnButtons(id: string, item: TreeItem): (JSX.Element | null)[] | JSX.Element | null {\n if (!item.data.obj) {\n return this.props.onObjectDelete || this.props.objectEditOfAccessControl ? (\n <div style={styles.buttonDiv}>\n {this.state.filter.expertMode && this.props.objectEditOfAccessControl ? (\n <IconButton\n sx={{\n ...styles.cellButtonsButton,\n ...styles.cellButtonsEmptyButton,\n ...styles.cellButtonMinWidth,\n }}\n onClick={() =>\n this.setState({ modalEditOfAccess: true, modalEditOfAccessObjData: item.data })\n }\n size=\"large\"\n >\n <div style={{ height: 15 }}>---</div>\n </IconButton>\n ) : null}\n {this.props.onObjectDelete && item.children && item.children.length ? (\n <IconButton\n sx={{\n ...styles.cellButtonsButton,\n ...styles.cellButtonsButtonAlone,\n }}\n size=\"small\"\n aria-label=\"delete\"\n title={this.texts.deleteObject}\n onClick={() => {\n // calculate the number of children\n const keys = Object.keys(this.objects);\n keys.sort();\n let count = 0;\n const start = `${id}.`;\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].startsWith(start)) {\n count++;\n } else if (keys[i] > start) {\n break;\n }\n }\n\n if (this.props.onObjectDelete) {\n this.props.onObjectDelete(id, !!item.children?.length, false, count + 1);\n }\n }}\n >\n <IconDelete style={styles.cellButtonsButtonIcon} />\n </IconButton>\n ) : null}\n </div>\n ) : null;\n }\n\n item.data.aclTooltip =\n item.data.aclTooltip || this.renderTooltipAccessControl(item.data.obj.acl as ioBroker.StateACL);\n\n const acl = item.data.obj.acl\n ? item.data.obj.type === 'state'\n ? item.data.obj.acl.state\n : item.data.obj.acl.object\n : 0;\n const aclSystemConfig =\n item.data.obj.acl &&\n (item.data.obj.type === 'state'\n ? this.systemConfig.common.defaultNewAcl.state\n : this.systemConfig.common.defaultNewAcl.object);\n\n const showEdit = this.state.filter.expertMode || ObjectBrowserClass.isNonExpertId(item.data.id);\n\n return [\n this.state.filter.expertMode && this.props.objectEditOfAccessControl ? (\n <Tooltip\n key=\"acl\"\n title={item.data.aclTooltip}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n sx={{\n ...styles.cellButtonsButton,\n ...styles.cellButtonMinWidth,\n opacity: 1,\n }}\n onClick={() => this.setState({ modalEditOfAccess: true, modalEditOfAccessObjData: item.data })}\n size=\"large\"\n >\n <div style={styles.aclText}>\n {Number.isNaN(Number(acl))\n ? Number(aclSystemConfig).toString(16)\n : Number(acl).toString(16)}\n </div>\n </IconButton>\n </Tooltip>\n ) : (\n <div\n key=\"aclEmpty\"\n style={styles.cellButtonMinWidth}\n />\n ),\n\n showEdit ? (\n <IconButton\n key=\"edit\"\n sx={{\n marginRight: '2px',\n ...styles.cellButtonsButton,\n }}\n size=\"small\"\n aria-label=\"edit\"\n title={this.texts.editObject}\n onClick={() => {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectSelected`, id);\n this.setState({ editObjectDialog: id, editObjectAlias: false });\n }}\n >\n <IconEdit style={styles.cellButtonsButtonIcon} />\n </IconButton>\n ) : (\n <Box\n component=\"div\"\n key=\"editDisabled\"\n sx={styles.cellButtonsButton}\n />\n ),\n\n this.props.onObjectDelete && (item.children?.length || !item.data.obj.common?.dontDelete) ? (\n <IconButton\n key=\"delete\"\n sx={styles.cellButtonsButton}\n size=\"small\"\n aria-label=\"delete\"\n onClick={() => {\n const keys = Object.keys(this.objects);\n keys.sort();\n let count = 0;\n const start = `${id}.`;\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].startsWith(start)) {\n count++;\n } else if (keys[i] > start) {\n break;\n }\n }\n if (this.props.onObjectDelete) {\n this.props.onObjectDelete(\n id,\n !!item.children?.length,\n !item.data.obj?.common?.dontDelete,\n count,\n );\n }\n }}\n title={this.texts.deleteObject}\n >\n <IconDelete style={styles.cellButtonsButtonIcon} />\n </IconButton>\n ) : null,\n\n this.props.objectCustomDialog &&\n this.info.hasSomeCustoms &&\n item.data.obj.type === 'state' &&\n // @ts-expect-error deprecated from js-controller 6\n item.data.obj.common?.type !== 'file' ? (\n <IconButton\n sx={{\n ...styles.cellButtonsButton,\n ...(item.data.hasCustoms\n ? this.styles.cellButtonsButtonWithCustoms\n : styles.cellButtonsButtonWithoutCustoms),\n }}\n key=\"custom\"\n size=\"small\"\n aria-label=\"config\"\n title={this.texts.customConfig}\n onClick={() => {\n this.localStorage.setItem(`${this.props.dialogName || 'App'}.objectSelected`, id);\n\n this.pauseSubscribe(true);\n this.props.router?.doNavigate(null, 'customs', id);\n this.setState({ customDialog: [id], customDialogAll: false });\n }}\n >\n <IconConfig style={styles.cellButtonsButtonIcon} />\n </IconButton>\n ) : null,\n ];\n }\n\n private readHistory(id: string): void {\n /* interface GetHistoryOptions {\n instance?: string;\n start?: number;\n end?: number;\n step?: number;\n count?: number;\n from?: boolean;\n ack?: boolean;\n q?: boolean;\n addID?: boolean;\n limit?: number;\n ignoreNull?: boolean;\n sessionId?: any;\n aggregate?: 'minmax' | 'min' | 'max' | 'average' | 'total' | 'count' | 'none';\n } */\n if (\n window.sparkline &&\n this.defaultHistory &&\n this.objects[id]?.common?.custom &&\n this.objects[id].common.custom[this.defaultHistory]\n ) {\n const now = new Date();\n now.setHours(now.getHours() - 24);\n now.setMinutes(0);\n now.setSeconds(0);\n now.setMilliseconds(0);\n const nowMs = now.getTime();\n\n this.props.socket\n .getHistory(id, {\n instance: this.defaultHistory,\n start: nowMs,\n end: Date.now(),\n step: 3600000,\n from: false,\n ack: false,\n q: false,\n addID: false,\n aggregate: 'minmax',\n })\n .then(values => {\n const sparks: HTMLDivElement[] = window.document.getElementsByClassName(\n 'sparkline',\n ) as any as HTMLDivElement[];\n\n for (let s = 0; s < sparks.length; s++) {\n if (sparks[s].dataset.id === id) {\n const v = prepareSparkData(values, nowMs);\n\n window.sparkline.sparkline(sparks[s], v);\n break;\n }\n }\n })\n .catch(e => console.warn(`Cannot read history: ${e}`));\n }\n }\n\n private getTooltipInfo(id: string, cb?: () => void): void {\n const obj = this.objects[id];\n const state = this.states[id];\n\n const { valFull, fileViewer } = formatValue({\n state,\n obj: obj as ioBroker.StateObject,\n texts: this.texts,\n dateFormat: this.props.dateFormat || this.systemConfig.common.dateFormat,\n isFloatComma:\n this.props.isFloatComma === undefined ? this.systemConfig.common.isFloatComma : this.props.isFloatComma,\n full: true,\n });\n const valFullRx: JSX.Element[] = [];\n\n valFull?.forEach(_item => {\n if (_item.t === this.texts.quality && state.q) {\n valFullRx.push(\n <div\n style={styles.cellValueTooltipBoth}\n key={_item.t}\n >\n {_item.t}\n :&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: this.info.aliasesMap[item.data.id]\n ? this.props.t('ra_Edit alias')\n : this.props.t('ra_Create alias'),\n onClick: () => {\n if (obj?.common?.alias) {\n this.setState({ showContextMenu: null, editObjectDialog: item.data.id, editObjectAlias: true });\n } else {\n this.setState({ showContextMenu: null, showAliasEditor: item.data.id });\n }\n },\n },\n CREATE: {\n key: '+',\n visibility:\n (item.data.id.startsWith('0_userdata.0') || item.data.id.startsWith('javascript.')) &&\n (createStateVisible || createChannelVisible || createDeviceVisible || createFolderVisible),\n icon: (\n <AddIcon\n fontSize=\"small\"\n style={this.styles.cellButtonsButtonWithCustoms}\n />\n ),\n style: styles.contextMenuWithSubMenu,\n label: this.texts.create,\n subMenu: [\n {\n label: this.texts.createBooleanState,\n visibility: createStateVisible,\n icon: <IconState fontSize=\"small\" />,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'state', 'boolean'),\n },\n {\n label: this.texts.createNumberState,\n visibility: createStateVisible,\n icon: <IconState fontSize=\"small\" />,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'state', 'number'),\n },\n {\n label: this.texts.createStringState,\n visibility: createStateVisible,\n icon: <IconState fontSize=\"small\" />,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'state', 'string'),\n },\n {\n label: this.texts.createState,\n visibility: createStateVisible,\n icon: <IconState fontSize=\"small\" />,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'state'),\n },\n {\n label: this.texts.createChannel,\n visibility: createChannelVisible,\n icon: <IconChannel fontSize=\"small\" />,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'channel'),\n },\n {\n label: this.texts.createDevice,\n visibility: createDeviceVisible,\n icon: <IconDevice fontSize=\"small\" />,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'device'),\n },\n {\n label: this.texts.createFolder,\n icon: <IconFolder fontSize=\"small\" />,\n visibility: createFolderVisible,\n onClick: () => this.showAddDataPointDialog(item.data.id, 'folder'),\n },\n ],\n },\n DELETE: {\n key: 'Delete',\n visibility: !!(\n this.props.onObjectDelete &&\n (item.children?.length || (obj && !obj.common?.dontDelete))\n ),\n icon: (\n <IconDelete\n fontSize=\"small\"\n style={this.styles.contextMenuDelete}\n />\n ),\n style: this.styles.contextMenuDelete,\n label: this.texts.deleteObject,\n onClick: () =>\n this.setState({ showContextMenu: null }, () =>\n this.showDeleteDialog({\n id,\n obj: obj || ({} as ioBroker.Object),\n item,\n }),\n ),\n },\n };\n\n Object.keys(ITEMS).forEach(key => {\n if (ITEMS[key].visibility) {\n if (ITEMS[key].subMenu) {\n items.push(\n <MenuItem\n key={key}\n href=\"\"\n onClick={(e: React.MouseEvent<HTMLAnchorElement>) =>\n this.state.showContextMenu &&\n this.setState({\n showContextMenu: {\n item: this.state.showContextMenu.item,\n position: this.state.showContextMenu.position,\n subItem: key,\n subAnchor: e.target as HTMLLIElement,\n },\n })\n }\n style={ITEMS[key].style}\n >\n <ListItemIcon style={{ ...ITEMS[key].iconStyle, ...ITEMS[key].listItemIconStyle }}>\n {ITEMS[key].icon}\n </ListItemIcon>\n <ListItemText>\n {ITEMS[key].label}\n ...\n </ListItemText>\n <div style={{ ...styles.contextMenuKeys, opacity: 1 }}>\n <ArrowRightIcon />\n </div>\n </MenuItem>,\n );\n\n if (this.state.showContextMenu?.subItem === key) {\n items.push(\n <Menu\n key=\"subContextMenu\"\n open={!0}\n anchorEl={this.state.showContextMenu.subAnchor}\n onClose={() => {\n if (this.state.showContextMenu) {\n this.setState({\n showContextMenu: {\n item: this.state.showContextMenu.item,\n position: this.state.showContextMenu.position,\n },\n });\n }\n this.contextMenu = null;\n }}\n >\n {ITEMS[key].subMenu?.map(subItem =>\n subItem.visibility ? (\n <MenuItem\n key={subItem.label}\n onClick={subItem.onClick}\n style={subItem.style}\n >\n <ListItemIcon\n style={{\n ...subItem.iconStyle,\n ...(subItem.listItemIconStyle || undefined),\n }}\n >\n {subItem.icon}\n </ListItemIcon>\n <ListItemText>{subItem.label}</ListItemText>\n </MenuItem>\n ) : null,\n )}\n </Menu>,\n );\n }\n } else {\n items.push(\n <MenuItem\n key={key}\n onClick={ITEMS[key].onClick}\n sx={ITEMS[key].style}\n >\n <ListItemIcon style={{ ...ITEMS[key].iconStyle, ...ITEMS[key].listItemIconStyle }}>\n {ITEMS[key].icon}\n </ListItemIcon>\n <ListItemText>{ITEMS[key].label}</ListItemText>\n {ITEMS[key].key ? (\n <div style={styles.contextMenuKeys}>\n {`Alt+${ITEMS[key].key === 'Delete' ? this.props.t('ra_Del') : ITEMS[key].key}`}\n </div>\n ) : null}\n </MenuItem>,\n );\n }\n }\n });\n\n if (!items.length) {\n setTimeout(() => this.setState({ showContextMenu: null }), 100);\n return null;\n }\n\n return (\n <Menu\n key=\"contextMenu\"\n open={!0}\n onKeyUp={e => {\n e.preventDefault();\n if (e.altKey) {\n Object.keys(ITEMS).forEach(key => {\n if (e.key === ITEMS[key].key && ITEMS[key].onClick) {\n ITEMS[key].onClick();\n }\n });\n }\n }}\n anchorReference=\"anchorPosition\"\n anchorPosition={this.state.showContextMenu.position}\n onClose={() => {\n this.setState({ showContextMenu: null });\n this.contextMenu = null;\n }}\n >\n {items}\n </Menu>\n );\n }\n\n private renderEditValueDialog(): JSX.Element | null {\n if (!this.state.updateOpened || !this.props.objectBrowserValue) {\n return null;\n }\n\n if (!this.edit.id) {\n console.error(`Invalid ID for edit: ${JSON.stringify(this.edit)}`);\n return null;\n }\n\n if (!this.objects[this.edit.id]) {\n console.error(`Something went wrong. Possibly the object ${this.edit.id} was deleted.`);\n return null;\n }\n\n const type = this.objects[this.edit.id].common?.type\n ? this.objects[this.edit.id].common.type\n : typeof this.edit.val;\n\n const role = this.objects[this.edit.id].common.role;\n\n const ObjectBrowserValue = this.props.objectBrowserValue;\n\n return (\n <ObjectBrowserValue\n t={this.props.t}\n lang={this.props.lang}\n type={type}\n role={role || ''}\n states={Utils.getStates(this.objects[this.edit.id] as ioBroker.StateObject)}\n themeType={this.props.themeType}\n theme={this.props.theme}\n expertMode={!!this.state.filter.expertMode}\n value={this.edit.val}\n socket={this.props.socket}\n object={this.objects[this.edit.id] as ioBroker.StateObject}\n defaultHistory={this.defaultHistory}\n dateFormat={this.props.dateFormat || this.systemConfig.common.dateFormat}\n isFloatComma={\n this.props.isFloatComma === undefined\n ? this.systemConfig.common.isFloatComma\n : this.props.isFloatComma\n }\n onClose={(res?: {\n val: ioBroker.StateValue;\n ack: boolean;\n q: ioBroker.STATE_QUALITY[keyof ioBroker.STATE_QUALITY];\n expire: number | undefined;\n }) => {\n this.setState({ updateOpened: false });\n if (res) {\n this.onUpdate(res);\n }\n }}\n width={this.props.width}\n />\n );\n }\n\n /**\n * The rendering method of this component.\n */\n render(): JSX.Element {\n this.recordStates = [];\n if (this.unsubscribeTimer) {\n clearTimeout(this.unsubscribeTimer);\n }\n\n if (this.styleTheme !== this.props.themeType) {\n this.styles = {\n cellIdIconFolder: Utils.getStyle(this.props.theme, styles.cellIdIconFolder),\n cellIdIconDocument: Utils.getStyle(this.props.theme, styles.cellIdIconDocument),\n iconDeviceError: Utils.getStyle(this.props.theme, styles.iconDeviceError),\n iconDeviceConnected: Utils.getStyle(this.props.theme, styles.iconDeviceConnected),\n iconDeviceDisconnected: Utils.getStyle(this.props.theme, styles.iconDeviceDisconnected),\n cellButtonsButtonWithCustoms: Utils.getStyle(this.props.theme, styles.cellButtonsButtonWithCustoms),\n invertedBackground: Utils.getStyle(this.props.theme, styles.invertedBackground),\n invertedBackgroundFlex: Utils.getStyle(this.props.theme, styles.invertedBackgroundFlex),\n contextMenuEdit: Utils.getStyle(this.props.theme, styles.contextMenuEdit),\n contextMenuEditValue: Utils.getStyle(this.props.theme, styles.contextMenuEditValue),\n contextMenuView: Utils.getStyle(this.props.theme, styles.contextMenuView),\n contextMenuCustom: Utils.getStyle(this.props.theme, styles.contextMenuCustom),\n contextMenuACL: Utils.getStyle(this.props.theme, styles.contextMenuACL),\n contextMenuRoom: Utils.getStyle(this.props.theme, styles.contextMenuRoom),\n contextMenuRole: Utils.getStyle(this.props.theme, styles.contextMenuRole),\n contextMenuDelete: Utils.getStyle(this.props.theme, styles.contextMenuDelete),\n filterInput: Utils.getStyle(this.props.theme, styles.headerCellInput, styles.filterInput),\n iconCopy: Utils.getStyle(\n this.props.theme,\n styles.cellButtonsValueButton,\n styles.cellButtonsValueButtonCopy,\n ),\n aliasReadWrite: Utils.getStyle(this.props.theme, styles.cellIdAlias, styles.cellIdAliasReadWrite),\n aliasAlone: Utils.getStyle(this.props.theme, styles.cellIdAlias, styles.cellIdAliasAlone),\n };\n this.styleTheme = this.props.themeType;\n }\n\n // apply filter if changed\n const jsonFilter = JSON.stringify(this.state.filter);\n\n if (this.lastAppliedFilter !== jsonFilter && this.objects && this.root) {\n const counter = { count: 0 };\n\n applyFilter(\n this.root,\n this.state.filter,\n this.props.lang,\n this.objects,\n undefined,\n counter,\n this.props.customFilter,\n this.props.types,\n );\n\n if (counter.count < 500 && !this.state.expandAllVisible) {\n setTimeout(() => this.setState({ expandAllVisible: true }));\n } else if (counter.count >= 500 && this.state.expandAllVisible) {\n setTimeout(() => this.setState({ expandAllVisible: false }));\n }\n\n this.lastAppliedFilter = jsonFilter;\n }\n\n this.unsubscribeTimer = setTimeout(() => {\n this.unsubscribeTimer = null;\n this.checkUnsubscribes();\n }, 200);\n\n if (!this.state.loaded) {\n return <CircularProgress key={`${this.props.dialogName}_c`} />;\n }\n const items = this.root ? this.renderItem(this.root, undefined) : null;\n\n return (\n <TabContainer key={this.props.dialogName}>\n <style>\n {`\n@keyframes newValueAnimation-light {\n 0% {\n color: #00f900;\n }\n 80% {\n color: #008000;\n }\n 100% {\n color: #000;\n }\n}\n@keyframes newValueAnimation-dark {\n 0% {\n color: #00f900;\n }\n 80% {\n color: #008000;\n }\n 100% {\n color: #fff;\n }\n}\n.newValueBrowser-dark {\n animation: newValueAnimation-dark 2s ease-in-out;\n}\n.newValueBrowser-light {\n animation: newValueAnimation-light 2s ease-in-out;\n}\n`}\n </style>\n <TabHeader>{this.getToolbar()}</TabHeader>\n <TabContent>\n {this.renderHeader()}\n <div\n style={styles.tableDiv}\n ref={this.tableRef}\n onKeyDown={event => this.navigateKeyPress(event)}\n >\n {items}\n </div>\n </TabContent>\n {this.renderContextMenu()}\n {this.renderAliasMenu()}\n {this.renderToast()}\n {this.renderColumnsEditCustomDialog()}\n {this.renderColumnsSelectorDialog()}\n {this.renderCustomDialog()}\n {this.renderEditValueDialog()}\n {this.renderEditObjectDialog()}\n {this.renderViewObjectFileDialog()}\n {this.renderAliasEditorDialog()}\n {this.renderEditRoleDialog()}\n {this.renderEnumDialog()}\n {this.renderErrorDialog()}\n {this.renderExportDialog()}\n {this.state.modalNewObj && this.props.modalNewObject && this.props.modalNewObject(this)}\n {this.state.modalEditOfAccess &&\n this.state.modalEditOfAccessObjData &&\n this.props.modalEditOfAccessControl &&\n this.props.modalEditOfAccessControl(this, this.state.modalEditOfAccessObjData)}\n </TabContainer>\n );\n }\n}\n\nexport const ObjectBrowser = withWidth()(ObjectBrowserClass);\n","import React, { Component, type JSX } from 'react';\n\nimport {\n Input,\n Radio,\n FormControlLabel,\n FormGroup,\n Checkbox,\n MenuItem,\n Select,\n TextField,\n Box,\n type Theme,\n} from '@mui/material';\n\nimport { I18n } from '../i18n';\nimport type { IobTheme } from '../types';\nimport { Utils } from './Utils';\n\nconst styles: Record<string, any> = {\n hr: {\n border: 0,\n borderTop: '1px solid gray',\n },\n scrollWindow: {\n width: '100%',\n overflow: 'auto',\n height: 'calc(100% - 22px)',\n },\n rowDiv: {\n width: '100%',\n },\n modeDiv: {\n width: 200,\n display: 'inline-block',\n verticalAlign: 'top',\n },\n settingsDiv: {\n display: 'inline-block',\n verticalAlign: 'top',\n },\n inputTime: {\n width: 90,\n marginTop: 0,\n marginLeft: 5,\n },\n inputDate: {\n width: 140,\n marginTop: 0,\n marginLeft: 5,\n },\n inputEvery: {\n width: 40,\n marginLeft: 5,\n marginRight: 5,\n },\n inputRadio: {\n padding: '4px 12px',\n verticalAlign: 'top',\n },\n inputGroup: {\n maxWidth: 400,\n display: 'inline-block',\n },\n inputGroupElement: {\n width: 120,\n },\n inputDateDay: {\n width: 60,\n },\n inputDateDayCheck: {\n padding: 4,\n },\n inputSmallCheck: {\n padding: 0,\n },\n rowOnce: {},\n rowDays: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#ddeaff' : '#4b5057',\n }),\n rowDows: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#DDFFDD' : '#52646c',\n }),\n rowDates: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#DDDDFF' : '#747a86',\n }),\n rowWeeks: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#DDDDFF' : '#717680',\n }),\n rowMonths: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#DDFFFF' : '#1f5557',\n }),\n rowMonthsDates: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#EEFFFF' : '#3c5737',\n maxWidth: 600,\n }),\n rowYears: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#fbffdd' : '#574b33',\n }),\n rowDaysDows: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#EEEAFF' : '#573544',\n pl: '10px',\n pb: '10px',\n }),\n rowDowsDows: (theme: IobTheme) => ({\n background: theme.palette.mode !== 'dark' ? '#EEFFEE' : '#3d4c54',\n pl: '10px',\n pb: '10px',\n }),\n};\n\nconst WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\nconst PERIODS = {\n minutes: 'minutes',\n hours: 'hours',\n};\nconst ASTRO = [\n 'sunrise',\n 'sunriseEnd',\n 'goldenHourEnd',\n 'solarNoon',\n 'goldenHour',\n 'sunsetStart',\n 'sunset',\n 'dusk',\n 'nauticalDusk',\n 'night',\n 'nightEnd',\n 'nauticalDawn',\n 'dawn',\n 'nadir',\n];\n\nfunction padding(num: number): string {\n if (num < 10) {\n return `0${num}`;\n }\n return `${num}`;\n}\n\ninterface ScheduleConfig {\n time: {\n exactTime: boolean;\n start: string;\n end: string;\n mode: string;\n interval: number;\n };\n period: {\n once: string;\n days: number;\n dows: string;\n dates: string;\n weeks: number;\n months: string | number;\n years: number;\n yearMonth: number;\n yearDate: number;\n };\n valid: {\n from: string;\n to?: string;\n };\n}\n\n// interface TextTimeProps {\n// inputRef: React.RefObject<HTMLInputElement>;\n// placeholder?: string;\n// }\n\n// function TextTime(props: TextTimeProps) {\n// const { inputRef, ...other } = props;\n//\n// return <MaskedInput\n// {...other}\n// ref={inputRef}\n// mask={[/[0-2]/, /[0-9]/, ':', /[0-5]/, /[0-9]/]}\n// placeholderChar={props.placeholder || '00:00'}\n// showMask\n// />;\n// }\n\n// function TextDate(props: TextTimeProps) {\n// const { inputRef, ...other } = props;\n//\n// return <MaskedInput\n// {...other}\n// ref={inputRef}\n// mask={[/[0-3]/, /[0-9]/, '.', /[0-1]/, /[0-9]/, '.', '2', '0', /[0-9]/, /[0-9]/]}\n// placeholderChar={props.placeholder || '01.01.2020'}\n// showMask\n// />;\n// }\n\nconst DEFAULT: ScheduleConfig = {\n time: {\n exactTime: false,\n\n start: '00:00',\n end: '23:59',\n\n mode: 'hours',\n interval: 1,\n },\n period: {\n once: '',\n days: 1,\n dows: '',\n dates: '',\n weeks: 0,\n months: '',\n\n years: 0,\n yearMonth: 0,\n yearDate: 0,\n },\n valid: {\n from: '',\n to: '',\n },\n};\n\nfunction string2USdate(date: string): string {\n const parts = date.split('.');\n if (parts.length === 3) {\n return `${parts[2]}-${parts[1]}-${parts[0]}`;\n }\n return '';\n}\n\ninterface ScheduleProps {\n schedule: string | ScheduleConfig;\n onChange: (schedule: string, desc?: string) => void;\n theme: IobTheme;\n}\n\ninterface ScheduleState {\n schedule: ScheduleConfig;\n desc: string;\n}\n\nexport class Schedule extends Component<ScheduleProps, ScheduleState> {\n private readonly refFrom: React.RefObject<HTMLInputElement>;\n\n private readonly refTo: React.RefObject<HTMLInputElement>;\n\n private readonly refOnce: React.RefObject<HTMLInputElement>;\n\n private timerOnce: ReturnType<typeof setTimeout> | null = null;\n\n private timerFrom: ReturnType<typeof setTimeout> | null = null;\n\n private timerTo: ReturnType<typeof setTimeout> | null = null;\n\n constructor(props: ScheduleProps) {\n super(props);\n let schedule: ScheduleConfig | undefined;\n if (this.props.schedule && typeof this.props.schedule === 'string' && this.props.schedule[0] === '{') {\n try {\n schedule = JSON.parse(this.props.schedule);\n } catch {\n // ignore\n }\n } else if (typeof this.props.schedule === 'object') {\n schedule = this.props.schedule;\n }\n\n if (!schedule || !Object.keys(schedule).length) {\n setTimeout(() => this.onChange(this.state.schedule, true), 200);\n schedule = DEFAULT;\n }\n schedule = { ...DEFAULT, ...schedule };\n schedule.valid.from = schedule.valid.from || Schedule.now2string();\n\n this.refFrom = React.createRef();\n this.refTo = React.createRef();\n this.refOnce = React.createRef();\n\n this.state = {\n schedule,\n desc: Schedule.state2text(schedule),\n };\n\n if (JSON.stringify(schedule) !== this.props.schedule) {\n setTimeout(() => this.props.onChange && this.props.onChange(JSON.stringify(schedule)), 100);\n }\n }\n\n onChange(schedule: ScheduleConfig, force?: boolean): void {\n const isDiff = JSON.stringify(schedule) !== JSON.stringify(this.state.schedule);\n if (force || isDiff) {\n isDiff && this.setState({ schedule, desc: Schedule.state2text(schedule) });\n const copy = JSON.parse(JSON.stringify(schedule));\n if (copy.period.once) {\n const once = copy.period.once;\n delete copy.period;\n copy.period = { once };\n delete copy.valid;\n } else if (copy.period.days) {\n const days = copy.period.days;\n const daysOfWeek = copy.period.dows;\n delete copy.period;\n copy.period = { days };\n if (daysOfWeek && daysOfWeek !== '[]') {\n copy.period.dows = daysOfWeek;\n }\n } else if (copy.period.weeks) {\n const weeks = copy.period.weeks;\n const daysOfWeek = copy.period.dows;\n delete copy.period;\n copy.period = { weeks };\n if (daysOfWeek && daysOfWeek !== '[]') {\n copy.period.dows = daysOfWeek;\n }\n } else if (copy.period.months) {\n const months = copy.period.months;\n const dates = copy.period.dates;\n delete copy.period;\n copy.period = { months };\n if (dates && dates !== '[]') {\n copy.period.dates = dates;\n }\n } else if (copy.period.years) {\n const years = copy.period.years;\n const yearMonth = copy.period.yearMonth;\n const yearDate = copy.period.yearDate;\n delete copy.period;\n copy.period = { years, yearDate };\n if (yearMonth) {\n copy.period.yearMonth = yearMonth;\n }\n }\n\n if (copy.time.exactTime) {\n delete copy.time.end;\n delete copy.time.mode;\n delete copy.time.interval;\n } else {\n delete copy.time.exactTime;\n }\n if (copy.valid) {\n if (!copy.valid.to) {\n delete copy.valid.to;\n }\n if (\n copy.period.days === 1 ||\n copy.period.weeks === 1 ||\n copy.period.months === 1 ||\n copy.period.years === 1\n ) {\n const from = Schedule.string2date(copy.valid.from);\n const today = new Date();\n today.setHours(0);\n today.setMinutes(0);\n today.setSeconds(0);\n today.setMilliseconds(0);\n if (from <= today) {\n delete copy.valid.from;\n }\n }\n if (!copy.valid.from && !copy.valid.to) {\n delete copy.valid;\n }\n }\n\n this.props.onChange && this.props.onChange(JSON.stringify(copy), Schedule.state2text(schedule));\n }\n }\n\n static state2text(schedule: string | ScheduleConfig): string {\n if (typeof schedule === 'string') {\n try {\n schedule = JSON.parse(schedule) as ScheduleConfig;\n } catch {\n return '';\n }\n }\n\n const desc = [];\n const validFrom = Schedule.string2date(schedule.valid.from);\n if (schedule.period.once) {\n // once\n const once = Schedule.string2date(schedule.period.once);\n const now = new Date();\n now.setMilliseconds(0);\n now.setSeconds(0);\n now.setMinutes(0);\n now.setHours(0);\n\n //\n if (once < now) {\n // will be not executed anymore, because start is in the past\n return I18n.t('sch_desc_onceInPast');\n }\n // only once\n desc.push(I18n.t('sch_desc_once_on', schedule.period.once));\n } else if (schedule.period.days) {\n if (schedule.period.days === 1) {\n if (schedule.period.dows) {\n const daysOfWeek = JSON.parse(schedule.period.dows);\n if (daysOfWeek.length === 2 && daysOfWeek[0] === 0 && daysOfWeek[1] === 6) {\n // on weekends\n desc.push(I18n.t('sch_desc_onWeekends'));\n } else if (\n daysOfWeek.length === 5 &&\n daysOfWeek[0] === 1 &&\n daysOfWeek[1] === 2 &&\n daysOfWeek[2] === 3 &&\n daysOfWeek[3] === 4 &&\n daysOfWeek[4] === 5\n ) {\n // on workdays\n desc.push(I18n.t('sch_desc_onWorkdays'));\n } else {\n const tDows = daysOfWeek.map((day: number) => I18n.t(WEEKDAYS[day]));\n if (tDows.length === 1) {\n // on Monday\n desc.push(I18n.t('sch_desc_onWeekday', tDows[0]));\n } else if (tDows.length === 7) {\n // on every day\n desc.push(I18n.t('sch_desc_everyDay'));\n } else {\n const last = tDows.pop();\n // on Monday and Sunday\n desc.push(I18n.t('sch_desc_onWeekdays', tDows.join(', '), last));\n }\n }\n } else {\n desc.push(I18n.t('sch_desc_everyDay'));\n }\n } else {\n desc.push(I18n.t('sch_desc_everyNDay', schedule.period.days.toString()));\n }\n } else if (schedule.period.weeks) {\n if (schedule.period.weeks === 1) {\n desc.push(I18n.t('sch_desc_everyWeek'));\n } else {\n desc.push(I18n.t('sch_desc_everyNWeeks', schedule.period.weeks.toString()));\n }\n\n if (schedule.period.dows) {\n const daysOfWeek = JSON.parse(schedule.period.dows);\n if (daysOfWeek.length === 2 && daysOfWeek[0] === 0 && daysOfWeek[1] === 6) {\n // on weekends\n desc.push(I18n.t('sch_desc_onWeekends'));\n } else if (\n daysOfWeek.length === 5 &&\n daysOfWeek[0] === 1 &&\n daysOfWeek[1] === 2 &&\n daysOfWeek[2] === 3 &&\n daysOfWeek[3] === 4 &&\n daysOfWeek[4] === 5\n ) {\n // on workdays\n desc.push(I18n.t('sch_desc_onWorkdays'));\n } else {\n const tDows = daysOfWeek.map((day: number) => I18n.t(WEEKDAYS[day]));\n if (tDows.length === 1) {\n // on Monday\n desc.push(I18n.t('sch_desc_onWeekday', tDows[0]));\n } else if (tDows.length === 7) {\n // on every day\n desc.push(I18n.t('sch_desc_everyDay'));\n } else {\n const last = tDows.pop();\n // on Monday and Sunday\n desc.push(I18n.t('sch_desc_onWeekdays', tDows.join(', '), last));\n }\n }\n } else {\n return I18n.t('sch_desc_never');\n }\n } else if (schedule.period.months) {\n if (schedule.period.dates) {\n const dates = JSON.parse(schedule.period.dates);\n if (dates.length === 1) {\n // in 1 of month\n desc.push(I18n.t('sch_desc_onDate', dates[0]));\n } else if (dates.length === 31) {\n desc.push(I18n.t('sch_desc_onEveryDate'));\n } else if (!dates.length) {\n return I18n.t('sch_desc_never');\n } else {\n const last = dates.pop();\n // in 1 and 4 of month\n desc.push(I18n.t('sch_desc_onDates', dates.join(', '), last));\n }\n } else {\n desc.push(I18n.t('sch_desc_onEveryDate'));\n }\n\n if (schedule.period.months === 1) {\n desc.push(I18n.t('sch_desc_everyMonth'));\n } else if (typeof schedule.period.months === 'number') {\n desc.push(I18n.t('sch_desc_everyNMonths', schedule.period.months.toString()));\n } else {\n const months = JSON.parse(schedule.period.months);\n const tMonths = months.map((month: number) => I18n.t(MONTHS[month - 1]));\n if (!tMonths.length) {\n // in January\n return I18n.t('sch_desc_never');\n }\n if (tMonths.length === 1) {\n // in January\n desc.push(I18n.t('sch_desc_onMonth', tMonths[0]));\n } else if (tMonths.length === 12) {\n // every month\n desc.push(I18n.t('sch_desc_everyMonth'));\n } else {\n const last = tMonths.pop();\n // in January and May\n desc.push(I18n.t('sch_desc_onMonths', tMonths.join(', '), last));\n }\n }\n } else if (schedule.period.years) {\n if (schedule.period.years === 1) {\n desc.push(I18n.t('sch_desc_everyYear'));\n } else {\n desc.push(I18n.t('sch_desc_everyNYears', schedule.period.years.toString()));\n }\n desc.push(\n I18n.t(\n 'sch_desc_onDate',\n schedule.period.yearDate.toString(),\n schedule.period.yearMonth\n ? I18n.t(MONTHS[schedule.period.yearMonth - 1])\n : I18n.t('sch_desc_everyMonth'),\n ),\n );\n }\n\n // time\n if (schedule.time.exactTime) {\n if (ASTRO.includes(schedule.time.start)) {\n // at sunset\n desc.push(I18n.t('sch_desc_atTime', I18n.t(`sch_astro_${schedule.time.start}`)));\n } else {\n // at HH:MM\n desc.push(I18n.t('sch_desc_atTime', schedule.time.start));\n }\n } else {\n if (schedule.time.mode === PERIODS.minutes) {\n if (schedule.time.interval === 1) {\n // every minute\n desc.push(I18n.t('sch_desc_everyMinute'));\n } else {\n // every N minute\n desc.push(I18n.t('sch_desc_everyNMinutes', schedule.time.interval.toString()));\n }\n } else if (schedule.time.interval === 1) {\n // every minute\n desc.push(I18n.t('sch_desc_everyHour'));\n } else {\n // every N minute\n desc.push(I18n.t('sch_desc_everyNHours', schedule.time.interval.toString()));\n }\n\n const start =\n ASTRO.indexOf(schedule.time.start) !== -1\n ? I18n.t(`sch_astro_${schedule.time.start}`)\n : schedule.time.start;\n const end =\n ASTRO.indexOf(schedule.time.end) !== -1 ? I18n.t(`sch_astro_${schedule.time.end}`) : schedule.time.end;\n if (start !== '00:00' || (end !== '24:00' && end !== '23:59')) {\n // from HH:mm to HH:mm\n desc.push(I18n.t('sch_desc_intervalFromTo', start, end));\n }\n }\n\n if (!schedule.period.once) {\n // valid\n if (validFrom.getTime() > Date.now() && schedule.valid.to) {\n // from XXX to XXXX\n desc.push(I18n.t('sch_desc_validFromTo', schedule.valid.from, schedule.valid.to));\n } else if (validFrom.getTime() > Date.now()) {\n // from XXXX\n desc.push(I18n.t('sch_desc_validFrom', schedule.valid.from));\n } else if (schedule.valid.to) {\n // till XXXX\n desc.push(I18n.t('sch_desc_validTo', schedule.valid.to));\n }\n }\n return desc.join(' ');\n }\n\n getTimePeriodElements(): JSX.Element {\n const schedule = this.state.schedule;\n let wholeDay = false;\n let day = false;\n let night = false;\n let fromTo = true;\n if (schedule.time.start === '00:00' && schedule.time.end === '24:00') {\n wholeDay = true;\n fromTo = false;\n } else if (schedule.time.start === 'sunrise') {\n day = true;\n fromTo = false;\n } else if (schedule.time.start === 'sunset') {\n night = true;\n fromTo = false;\n }\n\n return (\n <div\n key=\"timePeriod\"\n style={styles.rowDiv}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!schedule.time.exactTime}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.exactTime = false;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_intervalTime')}\n />\n </div>\n <div style={styles.settingsDiv}>\n <div style={styles.settingsDiv}>\n {!schedule.time.exactTime && (\n <div>\n <div>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!fromTo}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = '00:00';\n _schedule.time.end = '23:59';\n this.onChange(_schedule);\n }}\n />\n }\n label={!fromTo ? I18n.t('sch_fromTo') : ''}\n />\n {fromTo && [\n <TextField\n variant=\"standard\"\n style={{ ...styles.inputTime, marginRight: 10 }}\n key=\"exactTimeFrom\"\n type=\"time\"\n sx={(theme: Theme) => ({\n '& input[type=\"time\"]::-webkit-calendar-picker-indicator': {\n filter: theme.palette.mode === 'dark' ? 'invert(80%)' : undefined,\n },\n })}\n value={this.state.schedule.time.start}\n // InputProps={{inputComponent: TextTime}}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = e.target.value;\n this.onChange(_schedule);\n }}\n slotProps={{\n inputLabel: { shrink: true },\n }}\n label={I18n.t('sch_from')}\n margin=\"normal\"\n />,\n <TextField\n variant=\"standard\"\n style={styles.inputTime}\n key=\"exactTimeTo\"\n type=\"time\"\n sx={(theme: Theme) => ({\n '& input[type=\"time\"]::-webkit-calendar-picker-indicator': {\n filter: theme.palette.mode === 'dark' ? 'invert(80%)' : undefined,\n },\n })}\n value={this.state.schedule.time.end}\n // InputProps={{inputComponent: TextTime}}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.end = e.target.value;\n this.onChange(_schedule);\n }}\n slotProps={{\n inputLabel: { shrink: true },\n }}\n label={I18n.t('sch_to')}\n margin=\"normal\"\n />,\n ]}\n </div>\n </div>\n )}\n\n {!schedule.time.exactTime && (\n <div>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!wholeDay}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = '00:00';\n _schedule.time.end = '24:00';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_wholeDay')}\n />\n </div>\n )}\n\n {!schedule.time.exactTime && (\n <div>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!day}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = 'sunrise';\n _schedule.time.end = 'sunset';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_astroDay')}\n />\n </div>\n )}\n\n {!schedule.time.exactTime && (\n <div>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!night}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = 'sunset';\n _schedule.time.end = 'sunrise';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_astroNight')}\n />\n </div>\n )}\n </div>\n {!schedule.time.exactTime && this.getPeriodSettingsMinutes(fromTo)}\n </div>\n </div>\n );\n }\n\n getTimeExactElements(): JSX.Element {\n const isAstro = ASTRO.includes(this.state.schedule.time.start);\n\n return (\n <div\n key=\"timeExact\"\n style={styles.rowDiv}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!this.state.schedule.time.exactTime}\n onClick={() => {\n const schedule = JSON.parse(JSON.stringify(this.state.schedule));\n schedule.time.exactTime = true;\n this.onChange(schedule);\n }}\n />\n }\n label={I18n.t('sch_exactTime')}\n />\n </div>\n {this.state.schedule.time.exactTime && (\n <Select\n variant=\"standard\"\n value={isAstro ? this.state.schedule.time.start : '00:00'}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = e.target.value;\n this.onChange(_schedule);\n }}\n >\n <MenuItem\n key=\"specific\"\n value=\"00:00\"\n >\n {I18n.t('sch_specificTime')}\n </MenuItem>\n {ASTRO.map(event => (\n <MenuItem\n key={event}\n value={event}\n >\n {I18n.t(`sch_astro_${event}`)}\n </MenuItem>\n ))}\n </Select>\n )}\n {this.state.schedule.time.exactTime && !isAstro && (\n <div style={styles.settingsDiv}>\n <TextField\n variant=\"standard\"\n style={styles.inputTime}\n key=\"exactTimeValue\"\n value={this.state.schedule.time.start}\n type=\"time\"\n sx={(theme: Theme) => ({\n '& input[type=\"time\"]::-webkit-calendar-picker-indicator': {\n filter: theme.palette.mode === 'dark' ? 'invert(80%)' : undefined,\n },\n })}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = e.target.value;\n this.onChange(_schedule);\n }}\n slotProps={{\n inputLabel: { shrink: true },\n }}\n margin=\"normal\"\n />\n </div>\n )}\n </div>\n );\n }\n\n static getDivider(): JSX.Element {\n return <hr style={styles.hr} />;\n }\n\n getPeriodModes(): JSX.Element[] {\n const schedule = this.state.schedule;\n const isOnce =\n !schedule.period.dows &&\n !schedule.period.months &&\n !schedule.period.dates &&\n !schedule.period.years &&\n !schedule.period.days &&\n !schedule.period.weeks;\n\n if (isOnce && !schedule.period.once) {\n schedule.period.once = Schedule.now2string(true);\n }\n\n return [\n // ----- once ---\n <div\n key=\"once\"\n style={{ ...styles.rowDiv, ...styles.rowOnce }}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!isOnce}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.once = _schedule.period.once || Schedule.now2string(true);\n _schedule.period.dows = '';\n _schedule.period.months = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodOnce')}\n />\n </div>\n {isOnce && (\n <div style={styles.settingsDiv}>\n <TextField\n variant=\"standard\"\n style={styles.inputDate}\n type=\"date\"\n ref={this.refOnce}\n key=\"exactDateAt\"\n defaultValue={string2USdate(schedule.period.once)}\n // InputProps={{inputComponent: TextTime}}\n onChange={e => {\n this.timerOnce && clearTimeout(this.timerOnce);\n this.timerOnce = null;\n\n if (this.refOnce.current) {\n this.refOnce.current.style.background = '#ff000030';\n }\n this.timerOnce = setTimeout(\n value => {\n this.timerOnce = null;\n if (this.refOnce.current) {\n this.refOnce.current.style.background = '';\n }\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const date = Schedule.string2date(value);\n if (date.toString() !== 'Invalid Date') {\n _schedule.period.once = `${padding(date.getDate())}.${padding(date.getMonth() + 1)}.${date.getFullYear()}`;\n this.onChange(_schedule);\n }\n },\n 1500,\n e.target.value,\n );\n }}\n slotProps={{\n inputLabel: { shrink: true },\n }}\n label={I18n.t('sch_at')}\n margin=\"normal\"\n />\n </div>\n )}\n </div>,\n\n // ----- days ---\n <Box\n component=\"div\"\n key=\"days\"\n sx={Utils.getStyle(this.props.theme, styles.rowDiv, styles.rowDays)}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!schedule.period.days}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = 1;\n _schedule.period.dows = '';\n _schedule.period.months = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodDaily')}\n />\n </div>\n <div style={styles.settingsDiv}>\n {this.getPeriodSettingsDaily()}\n {schedule.period.days ? this.getPeriodSettingsWeekdays() : null}\n </div>\n </Box>,\n\n // ----- days of weeks ---\n /*\n !schedule.period.days && (\n <div key=\"dows\" style={styles.rowDiv + ' ' + styles.rowDows}>\n <div style={styles.modeDiv}>\n <FormControlLabel control={<Radio style={styles.inputRadio} checked={!!schedule.period.dows} onClick={() => {\n const schedule = JSON.parse(JSON.stringify(this.state.schedule));\n schedule.period.dows = schedule.period.dows ? '' : '[0,1,2,3,4,5,6]';\n this.onChange(schedule);\n }}/>}\n label={I18n.t('sch_periodWeekdays')} />\n </div>\n <div style={styles.settingsDiv}>\n {this.getPeriodSettingsWeekdays()}\n </div>\n </div>,\n */\n // ----- weeks ---\n <Box\n component=\"div\"\n key=\"weeks\"\n sx={Utils.getStyle(this.props.theme, styles.rowDiv, styles.rowDows)}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!schedule.period.weeks}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = schedule.period.weeks ? 0 : 1;\n _schedule.period.dows = schedule.period.dows || '[0]';\n _schedule.period.months = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodWeekly')}\n />\n </div>\n <Box\n component=\"div\"\n style={styles.settingsDiv}\n >\n <div style={styles.settingsDiv}>{this.getPeriodSettingsWeekly()}</div>\n <Box\n component=\"div\"\n sx={Utils.getStyle(this.props.theme, styles.settingsDiv, styles.rowDowsDows)}\n >\n {this.state.schedule.period.weeks ? this.getPeriodSettingsWeekdays() : null}\n </Box>\n </Box>\n </Box>,\n\n // ----- months ---\n <Box\n component=\"div\"\n key=\"months\"\n sx={Utils.getStyle(this.props.theme, styles.rowDiv, styles.rowMonths)}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!schedule.period.months}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = 1;\n _schedule.period.dows = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodMonthly')}\n />\n </div>\n <div style={styles.settingsDiv}>\n {this.getPeriodSettingsMonthly()}\n {schedule.period.months ? (\n <Box>\n <Box\n component=\"div\"\n sx={Utils.getStyle(this.props.theme, styles.settingsDiv, styles.rowMonthsDates)}\n >\n <FormControlLabel\n control={\n <Checkbox\n style={styles.inputRadio}\n checked={!!schedule.period.dates}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = _schedule.period.months || 1;\n const dates = [];\n for (let i = 1; i <= 31; i++) {\n dates.push(i);\n }\n _schedule.period.dates =\n _schedule.period.dates || JSON.stringify(dates);\n _schedule.period.dows = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodDates')}\n />\n </Box>\n <Box\n component=\"div\"\n sx={Utils.getStyle(this.props.theme, styles.settingsDiv, styles.rowMonthsDates)}\n >\n {this.getPeriodSettingsDates()}\n </Box>\n </Box>\n ) : null}\n </div>\n </Box>,\n\n // ----- years ---\n <Box\n component=\"div\"\n key=\"years\"\n sx={Utils.getStyle(this.props.theme, styles.rowDiv, styles.rowYears)}\n >\n <div style={styles.modeDiv}>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!schedule.period.years}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = 1;\n _schedule.period.yearDate = 1;\n _schedule.period.yearMonth = 1;\n _schedule.period.dows = '';\n _schedule.period.months = 0;\n _schedule.period.dates = '';\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodYearly')}\n />\n </div>\n <div style={styles.settingsDiv}>\n <div style={styles.settingsDiv}>{this.getPeriodSettingsYearly()}</div>\n {!!schedule.period.years && (\n <div style={styles.settingsDiv}>\n <span>{I18n.t('sch_on')}</span>\n <Input\n key=\"input\"\n value={this.state.schedule.period.yearDate}\n style={styles.inputEvery}\n type=\"number\"\n inputProps={{ min: 1, max: 31 }}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.yearDate = parseInt(e.target.value, 10);\n if (_schedule.period.yearDate < 1) {\n _schedule.period.yearDate = 31;\n }\n if (_schedule.period.yearDate > 31) {\n _schedule.period.yearDate = 1;\n }\n this.onChange(_schedule);\n }}\n />\n <Select\n variant=\"standard\"\n value={schedule.period.yearMonth}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.yearMonth = e.target.value;\n this.onChange(_schedule);\n }}\n >\n <MenuItem\n key=\"every\"\n value={0}\n >\n {I18n.t('sch_yearEveryMonth')}\n </MenuItem>\n {MONTHS.map((month, i) => (\n <MenuItem\n key={month}\n value={i + 1}\n >\n {I18n.t(month)}\n </MenuItem>\n ))}\n </Select>\n </div>\n )}\n </div>\n </Box>,\n ];\n }\n\n getPeriodSettingsMinutes(fromTo: boolean): JSX.Element {\n return (\n <div style={{ display: 'inline-block', marginTop: fromTo ? 15 : 'inherit' }}>\n <label style={{ marginLeft: 4, marginRight: 4 }}>{I18n.t('sch_every')}</label>\n <Input\n value={this.state.schedule.time.interval}\n style={{\n ...styles.inputEvery,\n verticalAlign: 'bottom',\n }}\n type=\"number\"\n inputProps={{ min: 1 }}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.interval = parseInt(e.target.value, 10);\n this.onChange(_schedule);\n }}\n />\n <Select\n variant=\"standard\"\n value={this.state.schedule.time.mode}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.mode = e.target.value;\n this.onChange(_schedule);\n }}\n >\n <MenuItem value={PERIODS.minutes}>{I18n.t('sch_periodMinutes')}</MenuItem>\n <MenuItem value={PERIODS.hours}>{I18n.t('sch_periodHours')}</MenuItem>\n </Select>\n </div>\n );\n }\n\n getPeriodSettingsWeekdays(): JSX.Element[] {\n // || this.state.schedule.period.dows === '[1, 2, 3, 4, 5]' || this.state.schedule.period.dows === '[0, 6]'\n const schedule = this.state.schedule;\n const isSpecific =\n schedule.period.dows && schedule.period.dows !== '[1, 2, 3, 4, 5]' && schedule.period.dows !== '[0, 6]';\n return [\n <div key=\"workdays\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.dows === '[1, 2, 3, 4, 5]'}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dows = '[1, 2, 3, 4, 5]';\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodWorkdays')}\n />\n </div>,\n\n <div key=\"weekend\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.dows === '[0, 6]'}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dows = '[0, 6]';\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodWeekend')}\n />\n </div>,\n\n <div\n key=\"specific\"\n style={{ verticalAlign: 'top' }}\n >\n <FormControlLabel\n style={{ verticalAlign: 'top' }}\n control={\n <Radio\n style={styles.inputRadio}\n checked={!!isSpecific}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dows = '[0, 1, 2, 3, 4, 5, 6]';\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodWeekdays')}\n />\n {isSpecific && (schedule.period.days === 1 || schedule.period.weeks) && (\n <FormGroup\n row\n style={{ ...styles.inputGroup, width: 150 }}\n >\n {[1, 2, 3, 4, 5, 6, 0].map(i => (\n <FormControlLabel\n key={`specific_${i}`}\n style={styles.inputGroupElement}\n control={\n <Checkbox\n style={styles.inputSmallCheck}\n checked={schedule.period.dows.includes(i.toString())}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n let daysOfWeek: number[];\n try {\n daysOfWeek = JSON.parse(_schedule.period.dows);\n } catch {\n daysOfWeek = [];\n }\n if (e.target.checked && !daysOfWeek.includes(i)) {\n daysOfWeek.push(i);\n } else if (!e.target.checked && daysOfWeek.includes(i)) {\n daysOfWeek.splice(daysOfWeek.indexOf(i), 1);\n }\n daysOfWeek.sort((a: number, b: number) => a - b);\n _schedule.period.dows = JSON.stringify(daysOfWeek);\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t(WEEKDAYS[i])}\n />\n ))}\n </FormGroup>\n )}\n </div>,\n ];\n }\n\n getPeriodSettingsDaily(): JSX.Element[] | null {\n if (!this.state.schedule.period.days) {\n return null;\n }\n const schedule = this.state.schedule;\n return [\n <div key=\"every_day\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.days === 1 && !schedule.period.dows}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = 1;\n _schedule.period.dows = '';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEveryDay')}\n />\n </div>,\n <div key=\"everyN_day\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.days > 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = 2;\n _schedule.period.dows = '';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEvery')}\n />\n {schedule.period.days > 1 && [\n <Input\n key=\"input\"\n value={this.state.schedule.period.days}\n style={styles.inputEvery}\n type=\"number\"\n inputProps={{ min: 2 }}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = parseInt(e.target.value, 10);\n _schedule.period.dows = '';\n this.onChange(_schedule);\n }}\n />,\n <span\n key=\"span\"\n style={{ paddingRight: 10 }}\n >\n {I18n.t('sch_periodDay')}\n </span>,\n ]}\n </div>,\n ];\n }\n\n getPeriodSettingsWeekly(): JSX.Element[] | null {\n if (!this.state.schedule.period.weeks) {\n return null;\n }\n const schedule = this.state.schedule;\n return [\n <div\n key=\"radios\"\n style={{ display: 'inline-block', verticalAlign: 'top' }}\n >\n <div>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.weeks === 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = 1;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEveryWeek')}\n />\n </div>\n <div>\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.weeks > 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = 2;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEvery')}\n />\n {schedule.period.weeks > 1 && [\n <Input\n key=\"input\"\n value={this.state.schedule.period.weeks}\n style={styles.inputEvery}\n type=\"number\"\n inputProps={{ min: 2 }}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = parseInt(e.target.value, 10);\n this.onChange(_schedule);\n }}\n />,\n <span key=\"text\">{I18n.t('sch_periodWeek')}</span>,\n ]}\n </div>\n </div>,\n ];\n }\n\n getPeriodSettingsDates(): JSX.Element | null {\n if (!this.state.schedule.period.dates) {\n return null;\n }\n const schedule = this.state.schedule;\n\n const dates = [];\n for (let i = 1; i <= 31; i++) {\n dates.push(i);\n }\n\n const parsedDates = JSON.parse(schedule.period.dates);\n\n return (\n <FormGroup\n row\n style={{ ...styles.inputGroup, maxWidth: 620 }}\n >\n <FormControlLabel\n style={styles.inputDateDay}\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={parsedDates.length === 31}\n onChange={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const _dates = [];\n for (let i = 1; i <= 31; i++) {\n _dates.push(i);\n }\n _schedule.period.dates = JSON.stringify(_dates);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_all')}\n />\n <FormControlLabel\n style={styles.inputDateDay}\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={!parsedDates.length}\n onChange={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dates = '[]';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_no_one')}\n />\n {parsedDates.length !== 31 && !!parsedDates.length && (\n <FormControlLabel\n style={styles.inputDateDay}\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={false}\n onChange={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const result = [];\n const _parsedDates = JSON.parse(_schedule.period.dates);\n for (let i = 1; i <= 31; i++) {\n if (!_parsedDates.includes(i)) {\n result.push(i);\n }\n }\n result.sort((a, b) => a - b);\n _schedule.period.dates = JSON.stringify(result);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_invert')}\n />\n )}\n <div />\n {dates.map(i => (\n <FormControlLabel\n key={`date_${i}`}\n style={\n !i\n ? {\n ...styles.inputDateDay,\n opacity: 0,\n cursor: 'default',\n userSelect: 'none',\n pointerEvents: 'none',\n }\n : styles.inputDateDay\n }\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={JSON.parse(schedule.period.dates).includes(i)}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n let _dates;\n try {\n _dates = JSON.parse(_schedule.period.dates);\n } catch {\n _dates = [];\n }\n if (e.target.checked && !_dates.includes(i)) {\n _dates.push(i);\n } else if (!e.target.checked && _dates.includes(i)) {\n _dates.splice(_dates.indexOf(i), 1);\n }\n _dates.sort((a: number, b: number) => a - b);\n _schedule.period.dates = JSON.stringify(_dates);\n this.onChange(_schedule);\n }}\n />\n }\n label={\n i < 10\n ? [\n <span\n key=\"0\"\n style={{ opacity: 0 }}\n >\n 0\n </span>,\n <span key=\"num\">{i}</span>,\n ]\n : i\n }\n />\n ))}\n </FormGroup>\n );\n }\n\n getPeriodSettingsMonthly(): JSX.Element[] | null {\n if (!this.state.schedule.period.months) {\n return null;\n }\n const schedule = this.state.schedule;\n const parsedMonths = typeof schedule.period.months === 'string' ? JSON.parse(schedule.period.months) : [];\n\n return [\n <div key=\"every\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={typeof schedule.period.months === 'number' && schedule.period.months === 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = 1;\n this.onChange(schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEveryMonth')}\n />\n </div>,\n <div key=\"everyN\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={typeof schedule.period.months === 'number' && schedule.period.months > 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = 2;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEvery')}\n />\n {typeof schedule.period.months === 'number' &&\n schedule.period.months > 1 && [\n <Input\n key=\"input\"\n value={schedule.period.months}\n style={styles.inputEvery}\n type=\"number\"\n inputProps={{ min: 2 }}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = parseInt(e.target.value, 10);\n if (_schedule.period.months < 1) {\n _schedule.period.months = 1;\n }\n this.onChange(_schedule);\n }}\n />,\n <span key=\"text\">{I18n.t('sch_periodMonth')}</span>,\n ]}\n </div>,\n <div\n key=\"specific\"\n style={{ verticalAlign: 'top' }}\n >\n <FormControlLabel\n style={{ verticalAlign: 'top' }}\n control={\n <Radio\n style={styles.inputRadio}\n checked={typeof schedule.period.months === 'string'}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = '[1,2,3,4,5,6,7,8,9,10,11,12]';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodSpecificMonths')}\n />\n {typeof schedule.period.months === 'string' && (\n <FormGroup\n row\n style={styles.inputGroup}\n >\n <FormControlLabel\n style={styles.inputDateDay}\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={parsedMonths.length === 12}\n onChange={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const months = [];\n for (let i = 1; i <= 12; i++) {\n months.push(i);\n }\n _schedule.period.months = JSON.stringify(months);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_all')}\n />\n <FormControlLabel\n style={styles.inputDateDay}\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={!parsedMonths.length}\n onChange={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = '[]';\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_no_one')}\n />\n {parsedMonths.length !== 12 && !!parsedMonths.length && (\n <FormControlLabel\n style={styles.inputDateDay}\n control={\n <Checkbox\n style={styles.inputDateDayCheck}\n checked={false}\n onChange={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const result = [];\n const _parsedMonths = JSON.parse(_schedule.period.months);\n for (let i = 1; i <= 12; i++) {\n if (!_parsedMonths.includes(i)) {\n result.push(i);\n }\n }\n result.sort((a, b) => a - b);\n _schedule.period.months = JSON.stringify(result);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_invert')}\n />\n )}\n <div />\n {MONTHS.map((month, i) => (\n <FormControlLabel\n key={`month_${i}`}\n style={styles.inputGroupElement}\n control={\n <Checkbox\n style={styles.inputSmallCheck}\n checked={\n typeof schedule.period.months === 'string'\n ? JSON.parse(schedule.period.months).includes(i + 1)\n : schedule.period.months === i\n }\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n let months;\n try {\n months = JSON.parse(_schedule.period.months);\n } catch {\n months = [];\n }\n if (e.target.checked && !months.includes(i + 1)) {\n months.push(i + 1);\n } else if (!e.target.checked && months.includes(i + 1)) {\n months.splice(months.indexOf(i + 1), 1);\n }\n months.sort((a: number, b: number) => a - b);\n _schedule.period.months = JSON.stringify(months);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t(month)}\n />\n ))}\n </FormGroup>\n )}\n </div>,\n ];\n }\n\n getPeriodSettingsYearly(): JSX.Element[] | null {\n if (!this.state.schedule.period.years) {\n return null;\n }\n const schedule = this.state.schedule;\n return [\n <div key=\"year\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.years === 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = 1;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEveryYear')}\n />\n </div>,\n <div key=\"every\">\n <FormControlLabel\n control={\n <Radio\n style={styles.inputRadio}\n checked={schedule.period.years > 1}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = 2;\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_periodEvery')}\n />\n {schedule.period.years > 1 && [\n <Input\n key=\"input\"\n value={this.state.schedule.period.years}\n style={styles.inputEvery}\n type=\"number\"\n inputProps={{ min: 2 }}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = parseInt(e.target.value, 10);\n if (_schedule.period.years < 1) {\n _schedule.period.years = 1;\n }\n this.onChange(_schedule);\n }}\n />,\n <span key=\"text\">{I18n.t('sch_periodYear')}</span>,\n ]}\n </div>,\n ];\n }\n\n static now2string(isEnd?: boolean): string {\n const d = new Date();\n d.setHours(0);\n d.setMinutes(0);\n d.setSeconds(0);\n d.setMilliseconds(0);\n if (isEnd) {\n d.setDate(d.getDate() + 2);\n d.setMilliseconds(d.getMilliseconds() - 1);\n }\n\n return `${padding(d.getDate())}.${padding(d.getMonth() + 1)}.${padding(d.getFullYear())}`;\n }\n\n static string2date(str: string): Date {\n let parts = str.split('.'); // 31.12.2019\n if (parts.length === 1) {\n parts = str.split('-'); // 2018-12-31\n return new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10));\n }\n return new Date(parseInt(parts[2], 10), parseInt(parts[1], 10) - 1, parseInt(parts[0], 10));\n }\n\n getValidSettings(): JSX.Element {\n const schedule = this.state.schedule;\n // ----- from ---\n return (\n <div style={styles.rowDiv}>\n <div style={{ ...styles.modeDiv, verticalAlign: 'middle' }}>\n <span style={{ fontWeight: 'bold', paddingRight: 10 }}>{I18n.t('sch_valid')}</span>\n <span>{I18n.t('sch_validFrom')}</span>\n </div>\n <div style={styles.settingsDiv}>\n <TextField\n variant=\"standard\"\n style={{ ...styles.inputDate, marginRight: 10 }}\n key=\"exactTimeFrom\"\n inputRef={this.refFrom}\n defaultValue={string2USdate(schedule.valid.from)}\n type=\"date\"\n // inputComponent={TextDate}\n onChange={e => {\n this.timerFrom && clearTimeout(this.timerFrom);\n\n if (this.refFrom.current) {\n this.refFrom.current.style.background = '#ff000030';\n }\n\n this.timerFrom = setTimeout(\n value => {\n this.timerFrom = null;\n if (this.refFrom.current) {\n this.refFrom.current.style.background = '';\n }\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const date = Schedule.string2date(value);\n if (date.toString() !== 'Invalid Date') {\n _schedule.valid.from = `${padding(date.getDate())}.${padding(date.getMonth() + 1)}.${date.getFullYear()}`;\n this.onChange(_schedule);\n }\n },\n 1500,\n e.target.value,\n );\n }}\n slotProps={{\n inputLabel: { shrink: true },\n }}\n margin=\"normal\"\n />\n <FormControlLabel\n control={\n <Checkbox\n style={styles.inputRadio}\n checked={!!schedule.valid.to}\n onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.valid.to = _schedule.valid.to ? '' : Schedule.now2string(true);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t('sch_validTo')}\n />\n {!!schedule.valid.to && (\n <TextField\n variant=\"standard\"\n inputRef={this.refTo}\n style={{ ...styles.inputDate, marginRight: 10 }}\n key=\"exactTimeFrom\"\n type=\"date\"\n defaultValue={string2USdate(schedule.valid.to)}\n // inputComponent={TextDate}\n onChange={e => {\n this.timerTo && clearTimeout(this.timerTo);\n\n if (this.refTo.current) {\n this.refTo.current.style.background = '#ff000030';\n }\n this.timerTo = setTimeout(\n value => {\n this.timerTo = null;\n if (this.refTo.current) {\n this.refTo.current.style.background = '';\n }\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const date = Schedule.string2date(value);\n if (date.toString() !== 'Invalid Date') {\n _schedule.valid.to = `${padding(date.getDate())}.${padding(date.getMonth() + 1)}.${date.getFullYear()}`;\n this.onChange(_schedule);\n }\n },\n 1500,\n e.target.value,\n );\n }}\n slotProps={{\n inputLabel: { shrink: true },\n }}\n margin=\"normal\"\n />\n )}\n </div>\n </div>\n );\n }\n\n render(): JSX.Element {\n return (\n <div style={{ height: 'calc(100% - 48px)', width: '100%', overflow: 'hidden' }}>\n <div>{this.state.desc}</div>\n <div style={styles.scrollWindow}>\n <h5>{I18n.t('sch_time')}</h5>\n {this.getTimePeriodElements()}\n {this.getTimeExactElements()}\n {Schedule.getDivider()}\n <h5>{I18n.t('sch_period')}</h5>\n {this.getPeriodModes()}\n {!this.state.schedule.period.once && Schedule.getDivider()}\n {!this.state.schedule.period.once && this.getValidSettings()}\n </div>\n </div>\n );\n }\n}\n","import React, { Component } from 'react';\n\nimport { FormControl, InputLabel, MenuItem, Select } from '@mui/material';\nimport type { InputProps } from '@mui/material/Input';\n\nimport type { ThemeType, Translate } from '../types';\n\nimport { Icon } from './Icon';\nimport { Utils } from './Utils';\nimport { I18n } from '../i18n';\n\nconst styles: Record<string, React.CSSProperties> = {\n different: {\n opacity: 0.5,\n },\n icon: {\n width: 16,\n height: 16,\n marginRight: 8,\n },\n};\n\ninterface SelectWithIconProps {\n t: Translate;\n lang: ioBroker.Languages;\n themeType: ThemeType;\n value?: string;\n onChange: (id: string) => void;\n disabled?: boolean;\n list?: ioBroker.Object[] | Record<string, ioBroker.Object>; // one of \"list\"(Array) or \"options\"(object) is required\n options?: Record<string, any>; // one of \"list\"(Array) or \"options\"(object) is required\n different?: string | boolean;\n label?: string;\n fullWidth?: boolean;\n className?: string;\n style?: React.CSSProperties;\n removePrefix?: string;\n allowNone?: boolean;\n inputProps?: InputProps['inputProps'];\n dense?: boolean;\n}\n\ninterface TextWithIconItem {\n name: string;\n value: string;\n icon?: string;\n color?: string;\n}\n\ninterface SelectWithIconState {\n list: TextWithIconItem[];\n}\n\nexport class SelectWithIcon extends Component<SelectWithIconProps, SelectWithIconState> {\n private readonly wordDifferent: string | undefined;\n\n private timeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(props: SelectWithIconProps) {\n super(props);\n\n if (props.different) {\n this.wordDifferent = props.t('ra___different__');\n }\n\n let list: TextWithIconItem[];\n if (Array.isArray(props.list || props.options)) {\n list = ((props.list || props.options) as ioBroker.Object[]).map(obj => ({\n name: Utils.getObjectNameFromObj(obj, props.lang)\n .replace('system.group.', '')\n .replace('system.user.', '')\n .replace('enum.rooms.', '')\n .replace('enum.functions.', ''),\n value: obj._id,\n icon: obj.common?.icon,\n color: obj.common?.color,\n }));\n } else {\n list = Object.values((props.list || props.options) as Record<string, ioBroker.Object>).map(obj => ({\n name: Utils.getObjectNameFromObj(obj, props.lang)\n .replace('system.group.', '')\n .replace('system.user.', '')\n .replace('enum.rooms.', '')\n .replace('enum.functions.', ''),\n value: obj._id,\n icon: obj.common?.icon,\n color: obj.common?.color,\n }));\n }\n\n if (props.different && props.value === props.different) {\n list.unshift({ value: props.different, name: this.wordDifferent || '' });\n }\n\n if (props.allowNone) {\n list.unshift({ value: '', name: I18n.t('ra_none') });\n }\n\n this.state = {\n list,\n };\n }\n\n render(): React.JSX.Element {\n if (this.props.allowNone && !this.state.list.find(obj => obj.value === '')) {\n this.timeout =\n this.timeout ||\n setTimeout(() => {\n this.timeout = null;\n const list = JSON.parse(JSON.stringify(this.state.list));\n list.unshift({ value: '', name: I18n.t('ra_none') });\n this.setState({ list });\n }, 100);\n } else if (!this.props.allowNone && this.state.list.find(obj => obj.value === '')) {\n this.timeout =\n this.timeout ||\n setTimeout(() => {\n this.timeout = null;\n const list = JSON.parse(JSON.stringify(this.state.list));\n const i = this.state.list.findIndex(obj => obj.value === '');\n list.splice(i, 1);\n this.setState({ list });\n }, 100);\n }\n\n const item = this.state.list.find(\n it =>\n it.value === this.props.value ||\n (this.props.removePrefix && it.value.replace(this.props.removePrefix, '') === this.props.value),\n );\n\n const style =\n this.props.value === this.props.different\n ? {}\n : {\n color: item?.color || undefined,\n backgroundColor: Utils.getInvertedColor(item?.color || '', this.props.themeType),\n };\n\n if (this.props.dense && this.props.style) {\n Object.assign(style, this.props.style);\n }\n\n const select = (\n <Select\n variant=\"standard\"\n disabled={this.props.disabled}\n value={this.props.value}\n slotProps={{\n input: this.props.inputProps,\n }}\n renderValue={\n (/* value */) => (\n <span>\n {item?.icon ? (\n <Icon\n src={item?.icon}\n style={styles.icon}\n />\n ) : null}\n {item?.name}\n </span>\n )\n }\n sx={{\n '&.MuiSelect-root': this.props.value === this.props.different ? styles.different : {},\n }}\n classes={{\n root: this.props.dense ? this.props.className : '',\n }}\n style={style}\n onChange={el => {\n if (this.props.different && el.target.value !== this.props.different) {\n let pos = null;\n for (let i = 0; i < this.state.list.length; i++) {\n if (this.state.list[i].value === this.props.different) {\n pos = i;\n break;\n }\n }\n if (pos !== null) {\n const list: TextWithIconItem[] = Utils.clone(this.state.list) as TextWithIconItem[];\n list.splice(pos, 1);\n this.setState({ list }, () => this.props.onChange(el.target.value));\n return;\n }\n }\n\n this.props.onChange(\n this.props.removePrefix\n ? el.target.value.replace(this.props.removePrefix, '')\n : el.target.value,\n );\n }}\n >\n {this.state.list.map(el => (\n <MenuItem\n style={\n this.props.different && el.value === this.props.different\n ? styles.different\n : {\n color: el.color || undefined,\n backgroundColor: Utils.getInvertedColor(el.color || '', this.props.themeType),\n }\n }\n key={el.value}\n value={el.value}\n >\n {el.icon ? (\n <Icon\n src={el.icon}\n style={styles.icon}\n />\n ) : null}\n {el.name}\n </MenuItem>\n ))}\n </Select>\n );\n\n if (this.props.dense) {\n return select;\n }\n\n return (\n <FormControl\n variant=\"standard\"\n fullWidth={!!this.props.fullWidth}\n style={this.props.style}\n className={this.props.className}\n >\n <InputLabel>{this.props.label}</InputLabel>\n {select}\n </FormControl>\n );\n }\n}\n","/**\n * Copyright 2022-2024, Denis Haev <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport React, { Component } from 'react';\n\nimport { Table, Skeleton } from '@mui/material';\n\ninterface TableResizeProps {\n name?: string;\n ready?: boolean;\n stickyHeader?: boolean;\n size?: 'small' | 'medium';\n className?: string;\n sx?: Record<string, any>;\n style?: React.CSSProperties;\n initialWidths?: (number | 'auto')[];\n minWidths?: number[];\n dblTitle?: string;\n children?: React.ReactNode;\n}\n\nexport class TableResize extends Component<TableResizeProps> {\n private readonly resizerRefTable: React.RefObject<HTMLTableElement>;\n\n private resizerActiveIndex: number | null;\n\n private resizerActiveDiv: HTMLDivElement | null;\n\n private resizerCurrentWidths: (number | 'auto')[];\n\n private widthFilled: boolean = false;\n\n private installTimeout: ReturnType<typeof setTimeout> | null = null;\n\n private resizerMin: number = 0;\n\n private resizerMinNext: number = 0;\n\n private resizerPosition: number = 0;\n\n private resizerOldWidth: number = 0;\n\n private resizerOldWidthNext: number = 0;\n\n constructor(props: TableResizeProps) {\n super(props);\n this.resizerRefTable = React.createRef();\n this.resizerActiveIndex = null;\n this.resizerActiveDiv = null;\n this.resizerCurrentWidths = [];\n }\n\n componentDidMount(): void {\n this.resizerInstall();\n }\n\n componentWillUnmount(): void {\n this.resizerUninstall();\n }\n\n resizerInstall(): void {\n if (this.resizerRefTable.current && !(this.resizerRefTable.current as any)._installed) {\n (this.resizerRefTable.current as any)._installed = true;\n const ths = this.resizerRefTable.current.querySelectorAll('th');\n\n const widthsStored = ((window as any)._localStorage || window.localStorage).getItem(\n `App.${this.props.name || 'history'}.table`,\n );\n this.widthFilled = false;\n\n if (widthsStored) {\n try {\n this.resizerCurrentWidths = JSON.parse(widthsStored);\n this.widthFilled = true;\n } catch {\n // ignore\n }\n }\n if (this.widthFilled) {\n if (this.resizerCurrentWidths.length !== ths.length) {\n this.resizerCurrentWidths = [];\n this.widthFilled = false;\n } else {\n const tableWidth = this.resizerRefTable.current.offsetWidth;\n let storedWidth: number | null = 0;\n for (let w = 0; w < this.resizerCurrentWidths.length; w++) {\n if (window.isFinite(this.resizerCurrentWidths[w] as number)) {\n storedWidth += this.resizerCurrentWidths[w] as number;\n } else {\n storedWidth = null;\n break;\n }\n }\n if (storedWidth !== null && Math.abs(storedWidth - tableWidth) > 20) {\n this.resizerCurrentWidths = [];\n this.widthFilled = false;\n }\n }\n }\n\n for (let i = 0; i < ths.length; i++) {\n !this.widthFilled && this.resizerCurrentWidths.push(ths[i].offsetWidth);\n\n // last column does need a handle\n if (i < ths.length - 1) {\n const div = window.document.createElement('div');\n div.dataset.index = i.toString();\n div.onmousedown = this.resizerMouseDown;\n div.ondblclick = this.resizerReset;\n div.title = this.props.dblTitle || 'Double click to reset table layout';\n div.className = 'resize-handle';\n ths[i].appendChild(div);\n }\n }\n if (this.widthFilled) {\n this.resizerApplyWidths();\n }\n } else {\n this.installTimeout = setTimeout(() => {\n this.installTimeout = null;\n this.resizerInstall();\n }, 100);\n }\n }\n\n resizerReset = (): void => {\n for (let c = 0; c < this.resizerCurrentWidths.length; c++) {\n this.resizerCurrentWidths[c] = (this.props.initialWidths || [])[c] || 'auto';\n }\n\n ((window as any)._localStorage || window.localStorage).setItem(\n `App.${this.props.name || 'history'}.table`,\n JSON.stringify(this.resizerCurrentWidths),\n );\n this.resizerApplyWidths();\n };\n\n resizerUninstall(): void {\n this.installTimeout && clearTimeout(this.installTimeout);\n this.installTimeout = null;\n\n // resizer\n if (this.resizerRefTable.current && (this.resizerRefTable.current as any)._installed) {\n (this.resizerRefTable.current as any)._installed = false;\n const ths = this.resizerRefTable.current.querySelectorAll('th');\n for (let i = 0; i < ths.length; i++) {\n const div: HTMLDivElement | null = ths[i].querySelector('.resize-handle');\n if (div) {\n div.onmousedown = null;\n div.remove();\n }\n }\n }\n }\n\n resizerApplyWidths(): string | undefined {\n const gridTemplateColumns: string[] = [];\n if (this.resizerCurrentWidths.length) {\n for (let c = 0; c < this.resizerCurrentWidths.length; c++) {\n if (this.resizerCurrentWidths[c]) {\n gridTemplateColumns.push(\n this.resizerCurrentWidths[c] !== 'auto' ? `${this.resizerCurrentWidths[c]}px` : 'auto',\n );\n } else if (this.props.initialWidths && this.props.initialWidths[c]) {\n gridTemplateColumns.push(\n this.props.initialWidths[c] !== 'auto' ? `${this.props.initialWidths[c]}px` : 'auto',\n );\n } else {\n gridTemplateColumns.push('auto');\n }\n }\n } else if (this.props.initialWidths) {\n for (let c = 0; c < this.props.initialWidths.length; c++) {\n if (this.props.initialWidths[c]) {\n gridTemplateColumns.push(\n this.props.initialWidths[c] !== 'auto' ? `${this.props.initialWidths[c]}px` : 'auto',\n );\n } else {\n gridTemplateColumns.push('auto');\n }\n }\n }\n\n if (this.resizerRefTable.current && gridTemplateColumns.length) {\n this.resizerRefTable.current.style.gridTemplateColumns = gridTemplateColumns.join(' ');\n }\n\n return gridTemplateColumns.length ? gridTemplateColumns.join(' ') : undefined;\n }\n\n resizerMouseMove = (e: MouseEvent): void => {\n if (this.resizerActiveDiv && this.resizerActiveIndex !== null) {\n const width = this.resizerOldWidth + e.clientX - this.resizerPosition;\n const widthNext = this.resizerOldWidthNext - e.clientX + this.resizerPosition;\n if (\n (!this.resizerMin || width > this.resizerMin) &&\n (!this.resizerMinNext || widthNext > this.resizerMinNext)\n ) {\n this.resizerCurrentWidths[this.resizerActiveIndex] = width;\n this.resizerCurrentWidths[this.resizerActiveIndex + 1] = widthNext;\n this.resizerApplyWidths();\n }\n }\n };\n\n resizerMouseUp = (): void => {\n ((window as any)._localStorage || window.localStorage).setItem(\n `App.${this.props.name || 'history'}.table`,\n JSON.stringify(this.resizerCurrentWidths),\n );\n\n this.resizerActiveIndex = null;\n this.resizerActiveDiv = null;\n window.removeEventListener('mousemove', this.resizerMouseMove);\n window.removeEventListener('mouseup', this.resizerMouseUp);\n };\n\n resizerMouseDown = (e: MouseEvent): void => {\n if (this.resizerActiveIndex === null || this.resizerActiveIndex === undefined) {\n console.log(`Mouse down ${(e.target as HTMLDivElement)?.dataset.index}`);\n this.resizerActiveIndex = parseInt((e.target as HTMLDivElement)?.dataset.index || '0', 10);\n this.resizerActiveDiv = e.target as HTMLDivElement;\n this.resizerMin = this.props.minWidths ? this.props.minWidths[this.resizerActiveIndex] : 0;\n this.resizerMinNext = this.props.minWidths ? this.props.minWidths[this.resizerActiveIndex + 1] : 0;\n this.resizerPosition = e.clientX;\n let ths;\n if (this.resizerCurrentWidths[this.resizerActiveIndex] === 'auto') {\n ths = this.resizerRefTable.current?.querySelectorAll('th');\n if (ths) {\n this.resizerCurrentWidths[this.resizerActiveIndex] = ths[this.resizerActiveIndex].offsetWidth;\n }\n }\n if (this.resizerCurrentWidths[this.resizerActiveIndex + 1] === 'auto') {\n ths = ths || this.resizerRefTable.current?.querySelectorAll('th');\n if (ths) {\n this.resizerCurrentWidths[this.resizerActiveIndex + 1] =\n ths[this.resizerActiveIndex + 1].offsetWidth;\n }\n }\n\n this.resizerOldWidth = this.resizerCurrentWidths[this.resizerActiveIndex] as number;\n this.resizerOldWidthNext = this.resizerCurrentWidths[this.resizerActiveIndex + 1] as number;\n\n window.addEventListener('mousemove', this.resizerMouseMove);\n window.addEventListener('mouseup', this.resizerMouseUp);\n }\n };\n\n render(): React.JSX.Element {\n if (this.props.ready === false) {\n return <Skeleton />;\n }\n\n const style = { gridTemplateColumns: this.resizerApplyWidths() };\n\n return (\n <Table\n stickyHeader={this.props.stickyHeader}\n size={this.props.size || 'small'}\n className={this.props.className}\n sx={this.props.sx}\n ref={this.resizerRefTable}\n style={{ ...(this.props.style || undefined), ...style }}\n >\n {this.props.children}\n </Table>\n );\n }\n}\n","import React from 'react';\n\nimport { Icon } from './Icon';\nimport { Utils } from './Utils';\nimport type { ThemeType } from '../types';\n\nconst styles: Record<string, React.CSSProperties> = {\n div: {\n borderRadius: 3,\n padding: '0 3px',\n lineHeight: '20px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n },\n icon: {\n width: 16,\n height: 16,\n marginRight: 8,\n verticalAlign: 'middle',\n },\n text: {\n display: 'inline-block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n};\n\ninterface TextWithIconProps {\n lang: ioBroker.Languages;\n themeType?: ThemeType;\n value: string | Record<string, any>;\n list?: ioBroker.Object[] | Record<string, ioBroker.Object>;\n options?: Record<string, any>;\n className?: string;\n style?: React.CSSProperties;\n title?: string;\n removePrefix?: string;\n moreClasses?: {\n root?: string;\n icon?: string;\n text?: string;\n };\n icon?: string;\n color?: string;\n}\n\ninterface TextWithIconItem {\n name: string;\n value: string;\n icon?: string;\n color?: string;\n}\n\nexport function TextWithIcon(props: TextWithIconProps): React.JSX.Element {\n const value = props.value;\n let item: TextWithIconItem;\n const prefix = props.removePrefix || '';\n\n if (typeof value === 'string') {\n const list = props.list || props.options;\n if (list) {\n // if a list is array, then it is list of ioBroker.Object\n if (Array.isArray(list)) {\n const _item: ioBroker.Object = list.find((obj: ioBroker.Object) => obj._id === prefix + value);\n if (_item) {\n item = {\n name: Utils.getObjectNameFromObj(_item, props.lang).replace('system.group.', ''),\n value: _item._id,\n icon: props.icon || _item.common?.icon,\n color: props.color || _item.common?.color,\n };\n } else {\n item = {\n name: value,\n value: prefix + value,\n };\n }\n } else if (list[prefix + value]) {\n // List is object with key-value pairs: {'enum.rooms.1': {common: {name: 'Room 1'}}}\n const obj: ioBroker.Object = list[prefix + value];\n item = {\n name: Utils.getObjectNameFromObj(obj, props.lang).replace('system.group.', ''),\n value: obj._id,\n icon: props.icon || obj.common?.icon,\n color: props.color || obj.common?.color,\n };\n } else {\n // value is a string, ignore list\n item = {\n name: value,\n value: prefix + value,\n icon: props.icon,\n color: props.color,\n };\n }\n } else {\n item = {\n name: value,\n value: prefix + value,\n icon: props.icon,\n color: props.color,\n };\n }\n } else if (!value || typeof value !== 'object') {\n item = {\n name: '',\n value: '',\n icon: props.icon,\n color: props.color,\n };\n } else {\n // Item is an ioBroker.Object\n const obj: ioBroker.Object = value as ioBroker.Object;\n item = {\n name: Utils.getObjectNameFromObj(obj, props.lang)\n .replace('system.group.', '')\n .replace('system.user.', '')\n .replace('enum.rooms.', '')\n .replace('enum.functions.', ''),\n value: obj._id,\n icon: props.icon || obj.common?.icon,\n color: props.color || obj.common?.color,\n };\n }\n\n const style = item?.color\n ? {\n border: `1px solid ${Utils.invertColor(item?.color)}`,\n color: Utils.getInvertedColor(item?.color, props.themeType || 'light', true) || undefined,\n backgroundColor: item?.color,\n }\n : {};\n\n return (\n <div\n style={{ ...(props.style || undefined), ...styles.div, ...(style || undefined) }}\n className={Utils.clsx(props.className, props.moreClasses?.root)}\n title={props.title || item.value}\n >\n {item?.icon ? (\n <Icon\n src={item?.icon}\n className={props.moreClasses?.icon}\n style={styles.icon}\n />\n ) : null}\n <div\n style={styles.text}\n className={props.moreClasses?.text}\n >\n {item?.name}\n </div>\n </div>\n );\n};\n","import React, { type JSX } from 'react';\n\nimport { IconButton, Tooltip } from '@mui/material';\n\nimport {\n Brightness4 as Brightness4Icon,\n Brightness5 as Brightness5Icon,\n Brightness6 as Brightness6Icon,\n Brightness7 as Brightness7Icon,\n} from '@mui/icons-material';\n\ninterface ToggleThemeMenuProps {\n themeName: 'dark' | 'blue' | 'colored' | 'light';\n toggleTheme: () => void;\n t: (key: string) => string;\n className?: string;\n style?: React.CSSProperties;\n size?: 'small' | 'medium' | 'large';\n}\n\nexport function ToggleThemeMenu({\n themeName,\n toggleTheme,\n t,\n className,\n style,\n size,\n}: ToggleThemeMenuProps): JSX.Element {\n return (\n <div\n className={className || undefined}\n style={style || undefined}\n >\n <Tooltip\n title={t('ra_Change color theme')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <IconButton\n onClick={() => toggleTheme()}\n size={size || 'medium'}\n >\n {themeName === 'dark' && <Brightness4Icon className={className} />}\n {themeName === 'blue' && <Brightness5Icon className={className} />}\n {themeName === 'colored' && <Brightness6Icon className={className} />}\n {themeName !== 'dark' && themeName !== 'blue' && themeName !== 'colored' && (\n <Brightness7Icon className={className} />\n )}\n </IconButton>\n </Tooltip>\n </div>\n );\n}\n","/**\n * Copyright 2018-2023 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n// please do not delete React, as without it other projects could not be compiled: ReferenceError: React is not defined\nimport React, { Component, type JSX } from 'react';\n\nimport { Button, DialogTitle, DialogContent, DialogActions, Dialog } from '@mui/material';\n\nimport { Cancel as IconCancel, Check as IconOk } from '@mui/icons-material';\n\nimport type { Connection } from '../Connection';\n\nimport { I18n } from '../i18n';\nimport { ObjectBrowser, type ObjectBrowserFilter } from '../Components/ObjectBrowser';\nimport type { ObjectBrowserColumn, ObjectBrowserCustomFilter, ObjectBrowserType } from '../Components/types';\nimport type { IobTheme } from '../types';\n\nexport interface SelectIDFilters {\n id?: string;\n name?: string;\n room?: string;\n func?: string;\n role?: string;\n type?: string;\n custom?: string;\n}\n\ninterface DialogSelectIDProps {\n /** The internal name of the dialog; default: \"default\". Used to store settings in local storage */\n dialogName?: string;\n /** The dialog title; default: Please select object ID... (translated) */\n title?: string;\n /** Set to true to allow the selection of multiple IDs. */\n multiSelect?: boolean;\n /** Show folders before any leaves. */\n foldersFirst?: boolean;\n /** Path prefix for images (default: '.') */\n imagePrefix?: string;\n /** @deprecated same as imagePrefix */\n prefix?: string;\n /** Show the expert button */\n showExpertButton?: boolean;\n /** Force expert mode */\n expertMode?: boolean;\n /** optional ['name', 'type', 'role', 'room', 'func', 'val', 'buttons'] */\n columns?: ObjectBrowserColumn[];\n /** Object types to show; default: 'state' only */\n types?: ObjectBrowserType | ObjectBrowserType[];\n /** The language. */\n lang?: ioBroker.Languages;\n /** The socket connection. */\n socket: Connection;\n /** Can't objects be edited? (default: true) */\n notEditable?: boolean;\n /** Theme name. */\n themeName?: string;\n /** Theme type: dark or light */\n themeType?: string;\n /** The theme object */\n theme: IobTheme;\n /** The date format for the date columns */\n dateFormat?: string;\n /** Is use comma or point for displaying of float numbers */\n isFloatComma?: boolean;\n /** Custom filter. */\n customFilter?: ObjectBrowserCustomFilter;\n /** The selected IDs. */\n selected?: string | string[];\n /** The ok button text; default: OK (translated) */\n ok?: string;\n /** The cancel button text; default: Cancel (translated) */\n cancel?: string;\n /** Close handler that is always called when the dialog is closed. */\n onClose: () => void;\n /** Handler that is called when the user presses OK. */\n onOk: (selected: string | string[] | undefined, name: string) => void;\n /**\n * Function to filter out all unnecessary objects. Can be string or function.\n * It cannot be used together with \"types\".\n * Example for function: `obj => obj.common?.type === 'boolean'` to show only boolean states\n * In case of string, it must look like `obj.common && obj.common.type === 'boolean'`\n */\n filterFunc?: string | ((obj: ioBroker.Object) => boolean);\n /** predefined filter fields, like {\"id\":\"\",\"name\":\"\",\"room\":\"\",\"func\":\"\",\"role\":\"level\",\"type\":\"\",\"custom\":\"\"} */\n filters?: SelectIDFilters;\n /** Show elements only of this root ID */\n root?: string;\n}\n\ninterface DialogSelectIDState {\n selected: string[];\n name: string;\n}\n\nexport class DialogSelectID extends Component<DialogSelectIDProps, DialogSelectIDState> {\n private readonly dialogName: string;\n\n private filters: ObjectBrowserFilter;\n\n private readonly filterFunc?: (obj: ioBroker.Object) => boolean;\n\n constructor(props: DialogSelectIDProps) {\n super(props);\n this.dialogName = this.props.dialogName || 'default';\n this.dialogName = `SelectID.${this.dialogName}`;\n\n const filters: string = ((window as any)._localStorage || window.localStorage).getItem(this.dialogName) || '{}';\n\n try {\n this.filters = JSON.parse(filters);\n } catch {\n this.filters = {};\n }\n\n if (props.filters) {\n this.filters = { ...this.filters, ...(props.filters || {}) };\n }\n\n let selected = this.props.selected || [];\n if (!Array.isArray(selected)) {\n selected = [selected];\n }\n selected = selected.filter(id => id);\n\n if (props.filterFunc) {\n if (typeof props.filterFunc === 'string') {\n try {\n this.filterFunc = new Function('obj', props.filterFunc) as (obj: ioBroker.Object) => boolean;\n } catch {\n console.error(`Cannot parse filter function: \"obj => ${props.filterFunc}\"`);\n this.filterFunc = undefined;\n }\n } else {\n this.filterFunc = props.filterFunc;\n }\n }\n\n this.state = {\n selected,\n name: '',\n };\n }\n\n handleCancel(): void {\n this.props.onClose();\n }\n\n handleOk(): void {\n this.props.onOk(this.props.multiSelect ? this.state.selected : this.state.selected[0] || '', this.state.name);\n this.props.onClose();\n }\n\n render(): JSX.Element {\n let title;\n if (this.state.name || this.state.selected.length) {\n if (this.state.selected.length === 1) {\n title = [\n <span key=\"selected\">\n {I18n.t('ra_Selected')}\n &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';\nconst TIMEOUT_FOR_ADMIN4 = 1300;\n\nexport const ERRORS = {\n PERMISSION_ERROR,\n NOT_CONNECTED,\n};\n\nexport type BinaryStateChangeHandler = (id: string, base64: string | null) => void;\n\nfunction fixAdminUI(obj: ioBroker.AdapterObject): ioBroker.AdapterObject {\n // @ts-expect-error it is deprecated, but still could appear\n if (obj?.common && !obj.common.adminUI) {\n if (obj.common.noConfig) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.config = 'none';\n // @ts-expect-error it is deprecated, but still could appear\n } else if (obj.common.jsonConfig) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.config = 'json';\n } else if (obj.common.materialize) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.config = 'materialize';\n } else {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.config = 'html';\n }\n\n // @ts-expect-error it is deprecated, but still could appear\n if (obj.common.jsonCustom) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.custom = 'json';\n } else if (obj.common.supportCustoms) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.custom = 'json';\n }\n\n if (obj.common.materializeTab && obj.common.adminTab) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.tab = 'materialize';\n } else if (obj.common.adminTab) {\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI = obj.common.adminUI || {};\n // @ts-expect-error it is deprecated, but still could appear\n obj.common.adminUI.tab = 'html';\n }\n\n // @ts-expect-error it is deprecated, but still could appear\n if (obj.common.adminUI) {\n console.debug(\n // @ts-expect-error it is deprecated, but still could appear\n `Please add to \"${obj._id.replace(/\\.\\d+$/, '')}\" common.adminUI=${JSON.stringify(obj.common.adminUI)}`,\n );\n }\n }\n return obj;\n}\n\n/** Converts ioB pattern into regex */\nexport function pattern2RegEx(pattern: string): string {\n pattern = (pattern || '').toString();\n\n const startsWithWildcard = pattern[0] === '*';\n const endsWithWildcard = pattern[pattern.length - 1] === '*';\n\n pattern = pattern.replace(/[-/\\\\^$+?.()|[\\]{}]/g, '\\\\$&').replace(/\\*/g, '.*');\n\n return (startsWithWildcard ? '' : '^') + pattern + (endsWithWildcard ? '' : '$');\n}\n\ninterface ConnectionProps {\n /** The socket name. */\n name?: string;\n /** State IDs to always automatically subscribe to. */\n autoSubscribes?: string[];\n /** Automatically subscribe to logging. */\n autoSubscribeLog?: boolean;\n /** The protocol to use for the socket.io connection. */\n protocol: string;\n /** The host name to use for the socket.io connection. */\n host: string;\n /** The port to use for the socket.io connection. */\n port?: string | number;\n /** The socket.io connection timeout. */\n ioTimeout?: number;\n /** The socket.io command timeout. */\n cmdTimeout?: number;\n /** Flag to indicate if all objects should be loaded or not. Default true (not loaded) */\n doNotLoadAllObjects?: boolean;\n /** Flag to indicate if AccessControlList for current user will be loaded or not. Default true (not loaded) */\n doNotLoadACL?: boolean;\n /** Progress callback. */\n onProgress?: (progress: number) => void;\n /** Ready callback. */\n onReady?: (objects: Record<string, ioBroker.Object>) => void;\n /** Log callback. */\n onLog?: (text: string) => void;\n /** Error callback. */\n onError?: (error: any) => void;\n /** Object change callback. */\n onObjectChange?: ioBroker.ObjectChangeHandler;\n /** Gets called when the system language is determined */\n onLanguage?: (lang: ioBroker.Languages) => void;\n /** Forces the use of the Compact Methods, wich only exists in admin 5 UI. */\n admin5only?: boolean;\n /** The device UUID with which the communication must be established */\n uuid?: string;\n /** Authentication token (used only in cloud) */\n token?: string;\n}\n\nexport interface ConnectOptions {\n path?: string;\n query?: string;\n name?: string;\n timeout?: number;\n uuid?: string;\n}\n\nexport interface SocketClient {\n connect(url?: string, options?: ConnectOptions): void;\n close(): void;\n destroy(): void;\n\n readonly connected: boolean;\n\n on(event: string, callback: (...args: any) => void): void;\n off(event: string, callback: (...args: any) => void): void;\n emit(event: string, ...args: any): boolean;\n}\n\ninterface RenameGroupObject extends ioBroker.GroupObject {\n newId?: ioBroker.ObjectIDs.Group;\n}\n\ninterface Promises {\n installedCompact?: {\n [host: string]: Promise<Record<string, ioBroker.AdapterObject>> | null;\n } | null;\n installed?: {\n [host: string]: Promise<Record<string, ioBroker.AdapterObject>> | null;\n } | null;\n systemConfig?: Promise<ioBroker.SystemConfigObject> | null;\n hosts?: Promise<ioBroker.HostObject[]> | null;\n users?: Promise<ioBroker.UserObject[]> | null;\n compactAdapters?: Promise<Record<string, ioBroker.AdapterObject>> | null;\n repoCompact?: Promise<any> | null;\n version?: Promise<{ version: string; serverName: string }> | null;\n groups?: Promise<ioBroker.GroupObject[]> | null;\n repo?: Promise<Record<string, ioBroker.AdapterObject>> | null;\n cert?: Promise<{ name: string; type: 'public' | 'private' | 'chained' | '' }[]> | null;\n webName?: Promise<string> | null;\n compactInstances?: Promise<Record<string, ioBroker.InstanceObject>> | null;\n getCompactSystemRepositories?: Promise<CompactSystemRepository> | null;\n systemConfigPromise?: Promise<ioBroker.SystemConfigObject> | null;\n hostsCompact?: Promise<ioBroker.HostObject[]> | null;\n uuid?: Promise<string | undefined>;\n [feature: `supportedFeatures_${string}`]: Promise<boolean> | null;\n [type: `instances_${string}`]: Promise<any> | null;\n [_enum: `enums_${string}`]: Promise<any> | null;\n [adapter: `adapter_${string}`]: Promise<any> | null;\n [host: `IPs_${string}`]: Promise<string[]> | null;\n [host: `hostInfo_${string}`]: Promise<HostInfo> | null;\n [host: `hostInfoShort_${string}`]: Promise<HostInfo> | null;\n [host: `rIPs_${string}`]: Promise<{ name: string; address: string; family: 'ipv4' | 'ipv6' }[]> | null;\n currentInstance?: Promise<string> | null;\n}\n\nexport class LegacyConnection {\n // Do not define it as null, else we must check for null everywhere\n private _socket: SocketClient;\n\n private _authTimer: ReturnType<typeof setTimeout> | null | undefined;\n\n private systemLang: ioBroker.Languages = 'en';\n\n private readonly _waitForFirstConnection: Promise<void>;\n\n private _waitForFirstConnectionResolve: (() => void) | null = null;\n\n private _promises: Promises = {};\n\n private readonly _instanceSubscriptions: Record<\n string,\n {\n messageType: string;\n callback: (data: Record<string, any>, sourceInstance: string, messageType: string) => void;\n }[]\n >;\n\n private props: ConnectionProps;\n\n private doNotLoadAllObjects: boolean;\n\n private readonly doNotLoadACL: boolean;\n\n private states: Record<string, ioBroker.State> = {};\n\n private objects: Record<string, ioBroker.Object> | null = null;\n\n private scriptLoadCounter: number | undefined;\n\n private acl: Record<string, any> | null = null;\n\n private firstConnect: boolean = true;\n\n private readonly waitForRestart: boolean = false;\n\n private connected: boolean = false;\n\n private readonly statesSubscribes: Record<\n string,\n { reg: RegExp; cbs: (ioBroker.StateChangeHandler | BinaryStateChangeHandler)[] }\n > = {};\n\n private readonly objectsSubscribes: Record<\n string,\n {\n reg: RegExp;\n cbs: ((id: string, obj: ioBroker.Object | null | undefined, oldObj?: ioBroker.Object | null) => void)[];\n }\n > = {};\n\n private readonly filesSubscribes: Record<\n string,\n { regId: RegExp; cbs: ioBroker.FileChangeHandler[]; regFilePattern: RegExp }\n > = {};\n\n private onConnectionHandlers: ((connected: boolean) => void)[] = [];\n\n private onLogHandlers: ((message: string) => void)[] = [];\n\n private readonly onProgress: (progress: number) => void;\n\n private readonly onError: (\n err:\n | string\n | {\n message: string;\n operation: string;\n type: string;\n id: string;\n },\n ) => void;\n\n private loaded: boolean = false;\n\n private loadTimer: ReturnType<typeof setTimeout> | null = null;\n\n private loadCounter: number = 0;\n\n private admin5only: boolean;\n\n private ignoreState: string = '';\n\n private readonly simStates: Record<string, ioBroker.State> = {};\n\n private autoSubscribes: string[];\n\n private readonly autoSubscribeLog: boolean;\n\n private subscribed: boolean | undefined;\n\n public isSecure: boolean | undefined;\n\n private onCmdStdoutHandler: ((id: string, text: string) => void) | undefined;\n\n private onCmdStderrHandler: ((id: string, text: string) => void) | undefined;\n\n private onCmdExitHandler: ((id: string, exitCode: number) => void) | undefined;\n\n public systemConfig: ioBroker.SystemConfigObject | null = null;\n\n constructor(props: ConnectionProps) {\n props = props || { protocol: window.location.protocol, host: window.location.hostname };\n this.props = props;\n\n this.autoSubscribes = this.props.autoSubscribes || [];\n this.autoSubscribeLog = this.props.autoSubscribeLog || false;\n\n this.props.protocol = this.props.protocol || window.location.protocol;\n this.props.host = this.props.host || window.location.hostname;\n this.props.port =\n this.props.port ||\n (window.location.port === '3000' ? (LegacyConnection.isWeb() ? 8082 : 8081) : window.location.port);\n this.props.ioTimeout = Math.max(this.props.ioTimeout || 20000, 20000);\n this.props.cmdTimeout = Math.max(this.props.cmdTimeout || 5000, 5000);\n this._instanceSubscriptions = {};\n\n // breaking change. Do not load all objects by default is true\n this.doNotLoadAllObjects = this.props.doNotLoadAllObjects === undefined ? true : this.props.doNotLoadAllObjects;\n this.doNotLoadACL = this.props.doNotLoadACL === undefined ? true : this.props.doNotLoadACL;\n\n this.states = {};\n this._waitForFirstConnection = new Promise(resolve => {\n this._waitForFirstConnectionResolve = resolve;\n });\n this.onProgress = this.props.onProgress || (() => {});\n this.onError =\n this.props.onError ||\n ((\n err:\n | string\n | {\n message: string;\n operation: string;\n type: string;\n id: string;\n },\n ) => console.error(err));\n this.admin5only = this.props.admin5only || false;\n\n this.startSocket();\n }\n\n /**\n * Checks if this connection is running in a web adapter and not in an admin.\n *\n * @returns True if running in a web adapter or in a socketio adapter.\n */\n static isWeb(): boolean {\n const adapterName: string | undefined = window.adapterName;\n return (\n adapterName === 'material' ||\n adapterName === 'vis' ||\n adapterName?.startsWith('vis-') ||\n adapterName === 'echarts-show' ||\n window.socketUrl !== undefined\n );\n }\n\n /**\n * Starts the socket.io connection.\n */\n startSocket(): void {\n // if socket io is not yet loaded\n if (typeof window.io === 'undefined' && typeof window.iob === 'undefined') {\n // if in index.html the onLoad function not defined\n if (typeof window.registerSocketOnLoad !== 'function') {\n // poll if loaded\n this.scriptLoadCounter = this.scriptLoadCounter || 0;\n this.scriptLoadCounter++;\n\n if (this.scriptLoadCounter < 30) {\n // wait till the script loaded\n setTimeout(() => this.startSocket(), 100);\n return;\n }\n window.alert('Cannot load socket.io.js!');\n } else {\n // register on load\n window.registerSocketOnLoad(() => this.startSocket());\n }\n return;\n }\n if (this._socket) {\n // socket was initialized, do not repeat\n return;\n }\n\n let host = this.props.host;\n let port = this.props.port;\n let protocol = this.props.protocol.replace(':', '');\n let path = window.location.pathname;\n\n if (window.location.hostname === 'iobroker.net' || window.location.hostname === 'iobroker.pro') {\n path = '';\n } else {\n // if web adapter, socket io could be on another port or even host\n if (window.socketUrl) {\n const parsed = new URL((window as any).socketUrl as string);\n host = parsed.hostname;\n port = parsed.port;\n protocol = parsed.protocol.replace(':', '');\n }\n // get a current path\n const pos = path.lastIndexOf('/');\n if (pos !== -1) {\n path = path.substring(0, pos + 1);\n }\n\n if (LegacyConnection.isWeb()) {\n // remove one level, like echarts, vis, .... We have here: '/echarts/'\n const parts = path.split('/');\n if (parts.length > 2) {\n parts.pop();\n // if it is a version, like in material, so remove it too\n if (parts[parts.length - 1].match(/\\d+\\.\\d+\\.\\d+/)) {\n parts.pop();\n }\n parts.pop();\n path = parts.join('/');\n if (!path.endsWith('/')) {\n path += '/';\n }\n }\n }\n }\n\n const url = port ? `${protocol}://${host}:${port}${path}` : `${protocol}://${host}${path}`;\n\n this._socket = (window.io || window.iob).connect(url, {\n path: path.endsWith('/') ? `${path}socket.io` : `${path}/socket.io`,\n query: 'ws=true',\n name: this.props.name,\n timeout: this.props.ioTimeout,\n uuid: this.props.uuid,\n });\n\n this._socket.on('connect', (noTimeout: boolean | undefined) => {\n // If the user is not admin, it takes some time to install the handlers, because all rights must be checked\n if (noTimeout !== true) {\n setTimeout(\n () =>\n this.getVersion().then(info => {\n const [major, minor, patch] = info.version.split('.');\n const v = parseInt(major, 10) * 10000 + parseInt(minor, 10) * 100 + parseInt(patch, 10);\n if (v < 40102) {\n this._authTimer = null;\n // possible this is an old version of admin\n this.onPreConnect(false, false);\n } else {\n this._socket.emit('authenticate', (isOk: boolean, isSecure: boolean) =>\n this.onPreConnect(isOk, isSecure),\n );\n }\n }),\n 500,\n );\n } else {\n // iobroker websocket waits, till all handlers are installed\n this._socket.emit('authenticate', (isOk: boolean, isSecure: boolean) =>\n this.onPreConnect(isOk, isSecure),\n );\n }\n });\n\n this._socket.on('reconnect', () => {\n this.onProgress(PROGRESS.READY);\n this.connected = true;\n\n if (this.waitForRestart) {\n window.location.reload();\n } else {\n this._subscribe(true);\n this.onConnectionHandlers.forEach(cb => cb(true));\n }\n });\n\n this._socket.on('disconnect', () => {\n this.connected = false;\n this.subscribed = false;\n this.onProgress(PROGRESS.CONNECTING);\n this.onConnectionHandlers.forEach(cb => cb(false));\n });\n\n this._socket.on('reauthenticate', () => LegacyConnection.authenticate());\n\n this._socket.on('log', message => {\n this.props.onLog && this.props.onLog(message);\n this.onLogHandlers.forEach(cb => cb(message));\n });\n\n this._socket.on('error', (err: string | null) => {\n let _err = err || '';\n if (typeof _err.toString !== 'function') {\n _err = JSON.stringify(_err);\n console.error(`Received strange error: ${_err}`);\n }\n _err = _err.toString();\n if (_err.includes('User not authorized')) {\n LegacyConnection.authenticate();\n } else {\n window.alert(`Socket Error: ${err}`);\n }\n });\n\n this._socket.on('connect_error', (err: string) => console.error(`Connect error: ${err}`));\n\n this._socket.on('permissionError', (err: { operation: string; type: string; id?: string }) =>\n this.onError({\n message: 'no permission',\n operation: err.operation,\n type: err.type,\n id: err.id || '',\n }),\n );\n\n this._socket.on('objectChange', (id: string, obj: ioBroker.Object | null) =>\n setTimeout(() => this.objectChange(id, obj), 0),\n );\n\n this._socket.on('stateChange', (id: string, state) => setTimeout(() => this.stateChange(id, state), 0));\n\n this._socket.on('im', (messageType: string, from: string, data) =>\n setTimeout(() => this.instanceMessage(messageType, from, data), 0),\n );\n\n this._socket.on('fileChange', (id: string, fileName: string, size: number | null) =>\n setTimeout(() => this.fileChange(id, fileName, size), 0),\n );\n\n this._socket.on(\n 'cmdStdout',\n (id: string, text: string) => this.onCmdStdoutHandler && this.onCmdStdoutHandler(id, text),\n );\n\n this._socket.on(\n 'cmdStderr',\n (id: string, text: string) => this.onCmdStderrHandler && this.onCmdStderrHandler(id, text),\n );\n\n this._socket.on(\n 'cmdExit',\n (id: string, exitCode: number) => this.onCmdExitHandler && this.onCmdExitHandler(id, exitCode),\n );\n }\n\n /**\n * Called internally.\n */\n private onPreConnect(_isOk: boolean, isSecure: boolean): void {\n if (this._authTimer) {\n clearTimeout(this._authTimer);\n this._authTimer = null;\n }\n\n this.connected = true;\n this.isSecure = isSecure;\n\n if (this.waitForRestart) {\n window.location.reload();\n } else {\n if (this.firstConnect) {\n // retry strategy\n this.loadTimer = setTimeout(() => {\n this.loadTimer = null;\n this.loadCounter++;\n if (this.loadCounter < 10) {\n void this.onConnect().catch(e => this.onError(e));\n }\n }, 1000);\n\n if (!this.loaded) {\n void this.onConnect().catch(e => this.onError(e));\n }\n } else {\n this.onProgress(PROGRESS.READY);\n }\n\n this._subscribe(true);\n this.onConnectionHandlers.forEach(cb => cb(true));\n }\n\n if (this._waitForFirstConnectionResolve) {\n this._waitForFirstConnectionResolve();\n this._waitForFirstConnectionResolve = null;\n }\n }\n\n /**\n * Checks if running in ioBroker cloud\n */\n static isCloud(): boolean {\n if (window.location.hostname.includes('amazonaws.com') || window.location.hostname.includes('iobroker.in')) {\n return true;\n }\n if (typeof window.socketUrl === 'undefined') {\n return false;\n }\n return window.socketUrl.includes('iobroker.in') || window.socketUrl.includes('amazonaws');\n }\n\n /**\n * Checks if the socket is connected.\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Checks if the socket is connected.\n * Promise resolves if once connected.\n */\n waitForFirstConnection(): Promise<void> {\n return this._waitForFirstConnection;\n }\n\n /**\n * Called internally.\n */\n private async _getUserPermissions(): Promise<Record<string, any> | null> {\n if (this.doNotLoadACL) {\n return null;\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('getUserPermissions', (err: string | null, acl: Record<string, any> | null) =>\n err ? reject(new Error(err)) : resolve(acl),\n );\n });\n }\n\n /**\n * Called internally.\n */\n private async onConnect(): Promise<void> {\n let acl: Record<string, any> | null | undefined;\n try {\n acl = await this._getUserPermissions();\n } catch (e) {\n const knownError = e as Error;\n this.onError(`Cannot read user permissions: ${knownError.message}`);\n return;\n }\n if (!this.doNotLoadACL) {\n if (this.loaded) {\n return;\n }\n this.loaded = true;\n this.loadTimer && clearTimeout(this.loadTimer);\n this.loadTimer = null;\n\n this.onProgress(PROGRESS.CONNECTED);\n this.firstConnect = false;\n\n this.acl = acl;\n }\n\n // Read system configuration\n let data: ioBroker.SystemConfigObject | null;\n try {\n if (this.admin5only && !window.vendorPrefix) {\n data = await this.getCompactSystemConfig();\n } else {\n data = await this.getSystemConfig();\n }\n if (this.doNotLoadACL) {\n if (this.loaded) {\n return;\n }\n this.loaded = true;\n this.loadTimer && clearTimeout(this.loadTimer);\n this.loadTimer = null;\n\n this.onProgress(PROGRESS.CONNECTED);\n this.firstConnect = false;\n }\n\n this.systemConfig = data;\n if (this.systemConfig && this.systemConfig.common) {\n this.systemLang = this.systemConfig.common.language;\n } else {\n // @ts-expect-error userLanguage is not standard\n this.systemLang = window.navigator.userLanguage || window.navigator.language;\n\n if (/^(en|de|ru|pt|nl|fr|it|es|pl|uk)-?/.test(this.systemLang)) {\n this.systemLang = this.systemLang.substr(0, 2) as ioBroker.Languages;\n } else if (!/^(en|de|ru|pt|nl|fr|it|es|pl|uk|zh-cn)$/.test(this.systemLang)) {\n this.systemLang = 'en';\n }\n }\n\n this.props.onLanguage && this.props.onLanguage(this.systemLang);\n\n if (!this.doNotLoadAllObjects) {\n await this.getObjects();\n this.onProgress(PROGRESS.READY);\n this.props.onReady && this.objects && this.props.onReady(this.objects);\n } else {\n this.objects = this.admin5only ? {} : { 'system.config': data };\n this.onProgress(PROGRESS.READY);\n this.props.onReady && this.props.onReady(this.objects);\n }\n } catch (e) {\n this.onError(`Cannot read system config: ${e}`);\n }\n }\n\n /**\n * Called internally.\n */\n private static authenticate(): void {\n if (window.location.search.includes('&href=')) {\n window.location.href = `${window.location.protocol}//${window.location.host}${window.location.pathname}${window.location.search}${window.location.hash}`;\n } else {\n window.location.href = `${window.location.protocol}//${window.location.host}${window.location.pathname}?login&href=${window.location.search}${window.location.hash}`;\n }\n }\n\n /**\n * Subscribe to changes of the given state.\n *\n * @param id The ioBroker state ID or array of states\n * @param binary Set to true if the given state is binary and requires Base64 decoding\n * @param cb The callback\n */\n subscribeState(\n id: string | string[],\n binary: boolean | ioBroker.StateChangeHandler | BinaryStateChangeHandler,\n cb?: ioBroker.StateChangeHandler | BinaryStateChangeHandler,\n ): void {\n if (typeof binary === 'function') {\n cb = binary;\n binary = false;\n }\n\n let ids: string[];\n if (!Array.isArray(id)) {\n ids = [id];\n } else {\n ids = id;\n }\n if (!cb) {\n console.error('No callback found for subscribeState');\n return;\n }\n const toSubscribe = [];\n for (let i = 0; i < ids.length; i++) {\n const _id = ids[i];\n if (!this.statesSubscribes[_id]) {\n let reg = _id\n .replace(/\\./g, '\\\\.')\n .replace(/\\*/g, '.*')\n .replace(/\\(/g, '\\\\(')\n .replace(/\\)/g, '\\\\)')\n .replace(/\\+/g, '\\\\+')\n .replace(/\\[/g, '\\\\[');\n\n if (!reg.includes('*')) {\n reg += '$';\n }\n this.statesSubscribes[_id] = { reg: new RegExp(reg), cbs: [cb] };\n if (_id !== this.ignoreState) {\n toSubscribe.push(_id);\n }\n } else {\n !this.statesSubscribes[_id].cbs.includes(cb) && this.statesSubscribes[_id].cbs.push(cb);\n }\n }\n\n if (!this.connected) {\n return;\n }\n\n if (toSubscribe.length) {\n // no answer from server required\n this._socket.emit('subscribe', toSubscribe);\n }\n\n if (binary) {\n for (let i = 0; i < ids.length; i++) {\n this.getBinaryState(ids[i])\n .then((base64: string) => cb && (cb as BinaryStateChangeHandler)(ids[i], base64))\n .catch(e => console.error(`Cannot getBinaryState \"${ids[i]}\": ${JSON.stringify(e)}`));\n }\n } else {\n this._socket.emit(\n LegacyConnection.isWeb() ? 'getStates' : 'getForeignStates',\n id,\n (err: string | null, states: Record<string, ioBroker.State>) => {\n err && console.error(`Cannot getForeignStates \"${id}\": ${JSON.stringify(err)}`);\n states && Object.keys(states).forEach(_id => (cb as ioBroker.StateChangeHandler)(_id, states[_id]));\n },\n );\n }\n }\n\n /**\n * Subscribe to changes of the given state.\n */\n subscribeStateAsync(\n /** The ioBroker state ID or array of states */\n id: string | string[],\n /** The callback. */\n cb: ioBroker.StateChangeHandler,\n ): Promise<void> {\n let ids: string[];\n if (!Array.isArray(id)) {\n ids = [id];\n } else {\n ids = id;\n }\n const toSubscribe = [];\n for (let i = 0; i < ids.length; i++) {\n const _id = ids[i];\n if (!this.statesSubscribes[_id]) {\n let reg = _id\n .replace(/\\./g, '\\\\.')\n .replace(/\\*/g, '.*')\n .replace(/\\(/g, '\\\\(')\n .replace(/\\)/g, '\\\\)')\n .replace(/\\+/g, '\\\\+')\n .replace(/\\[/g, '\\\\[');\n\n if (!reg.includes('*')) {\n reg += '$';\n }\n this.statesSubscribes[_id] = { reg: new RegExp(reg), cbs: [] };\n this.statesSubscribes[_id].cbs.push(cb);\n if (_id !== this.ignoreState) {\n // no answer from server required\n toSubscribe.push(_id);\n }\n } else {\n !this.statesSubscribes[_id].cbs.includes(cb) && this.statesSubscribes[_id].cbs.push(cb);\n }\n }\n\n if (toSubscribe.length && this.connected) {\n // no answer from server required\n this._socket.emit('subscribe', toSubscribe);\n }\n\n return new Promise((resolve, reject) => {\n if (typeof cb === 'function' && this.connected) {\n this._socket.emit(\n LegacyConnection.isWeb() ? 'getStates' : 'getForeignStates',\n id,\n (err: string | null, states: Record<string, ioBroker.State>) => {\n err && console.error(`Cannot getForeignStates \"${id}\": ${JSON.stringify(err)}`);\n states && Object.keys(states).forEach(_id => cb(_id, states[_id]));\n states\n ? resolve()\n : reject(new Error(`Cannot getForeignStates \"${id}\": ${JSON.stringify(err)}`));\n },\n );\n } else {\n this.connected ? reject(new Error('callback is not a function')) : reject(new Error('not connected'));\n }\n });\n }\n\n /**\n * Unsubscribes all or the given callback from changes of the given state.\n */\n unsubscribeState(\n /** The ioBroker state ID or array of states */\n id: string | string[],\n /** The callback. */\n cb?: ioBroker.StateChangeHandler | BinaryStateChangeHandler,\n ): void {\n let ids: string[];\n if (!Array.isArray(id)) {\n ids = [id];\n } else {\n ids = id;\n }\n const toUnsubscribe = [];\n for (let i = 0; i < ids.length; i++) {\n const _id = ids[i];\n\n if (this.statesSubscribes[_id]) {\n if (cb) {\n const pos = this.statesSubscribes[_id].cbs.indexOf(cb);\n pos !== -1 && this.statesSubscribes[_id].cbs.splice(pos, 1);\n } else {\n this.statesSubscribes[_id].cbs = [];\n }\n\n if (!this.statesSubscribes[_id].cbs || !this.statesSubscribes[_id].cbs.length) {\n delete this.statesSubscribes[_id];\n if (_id !== this.ignoreState) {\n toUnsubscribe.push(_id);\n }\n }\n }\n }\n\n if (toUnsubscribe.length && this.connected) {\n // no answer from server required\n this._socket.emit('unsubscribe', toUnsubscribe);\n }\n }\n\n /**\n * Subscribe to changes of the given object.\n *\n * @param id The ioBroker object ID or array of objects\n * @param cb The callback\n */\n subscribeObject(id: string | string[], cb: ioBroker.ObjectChangeHandler): Promise<void> {\n let ids: string[];\n if (!Array.isArray(id)) {\n ids = [id];\n } else {\n ids = id;\n }\n const toSubscribe = [];\n for (let i = 0; i < ids.length; i++) {\n const _id = ids[i];\n if (!this.objectsSubscribes[_id]) {\n let reg = _id.replace(/\\./g, '\\\\.').replace(/\\*/g, '.*');\n if (!reg.includes('*')) {\n reg += '$';\n }\n this.objectsSubscribes[_id] = { reg: new RegExp(reg), cbs: [cb] };\n toSubscribe.push(_id);\n } else {\n !this.objectsSubscribes[_id].cbs.includes(cb) && this.objectsSubscribes[_id].cbs.push(cb);\n }\n }\n if (this.connected && toSubscribe.length) {\n this._socket.emit('subscribeObjects', toSubscribe);\n }\n\n return Promise.resolve();\n }\n\n /**\n * Unsubscribes all or the given callback from changes of the given object.\n *\n * @param id The ioBroker object ID or array of objects\n * @param cb The callback\n */\n unsubscribeObject(id: string | string[], cb?: ioBroker.ObjectChangeHandler): Promise<void> {\n let ids: string[];\n if (!Array.isArray(id)) {\n ids = [id];\n } else {\n ids = id;\n }\n const toUnsubscribe = [];\n for (let i = 0; i < ids.length; i++) {\n const _id = ids[i];\n if (this.objectsSubscribes[_id]) {\n if (cb) {\n const pos = this.objectsSubscribes[_id].cbs.indexOf(cb);\n pos !== -1 && this.objectsSubscribes[_id].cbs.splice(pos, 1);\n } else {\n this.objectsSubscribes[_id].cbs = [];\n }\n\n if (this.connected && (!this.objectsSubscribes[_id].cbs || !this.objectsSubscribes[_id].cbs.length)) {\n delete this.objectsSubscribes[_id];\n toUnsubscribe.push(_id);\n }\n }\n }\n\n if (this.connected && toUnsubscribe.length) {\n this._socket.emit('unsubscribeObjects', toUnsubscribe);\n }\n\n return Promise.resolve();\n }\n\n /**\n * Called internally.\n */\n private fileChange(id: string, fileName: string, size: number | null): void {\n for (const sub of Object.values(this.filesSubscribes)) {\n if (sub.regId.test(id) && sub.regFilePattern.test(fileName)) {\n for (const cb of sub.cbs) {\n try {\n cb(id, fileName, size);\n } catch (e) {\n console.error(`Error by callback of fileChange: ${e}`);\n }\n }\n }\n }\n }\n\n /**\n * Subscribe to changes of the files.\n *\n * @param id The ioBroker state ID for meta-object. Could be a pattern\n * @param filePattern Pattern or file name, like 'main/*' or 'main/visViews.json`\n * @param cb The callback.\n */\n async subscribeFiles(\n /** The ioBroker state ID for meta-object. Could be a pattern */\n id: string,\n /** Pattern or file name, like 'main/*' or 'main/visViews.json` */\n filePattern: string | string[],\n /** The callback. */\n cb: ioBroker.FileChangeHandler,\n ): Promise<void> {\n if (typeof cb !== 'function') {\n throw new Error('The state change handler must be a function!');\n }\n let filePatterns;\n if (Array.isArray(filePattern)) {\n filePatterns = filePattern;\n } else {\n filePatterns = [filePattern];\n }\n const toSubscribe = [];\n for (let f = 0; f < filePatterns.length; f++) {\n const pattern = filePatterns[f];\n const key = `${id}$%$${pattern}`;\n\n if (!this.filesSubscribes[key]) {\n this.filesSubscribes[key] = {\n regId: new RegExp(pattern2RegEx(id)),\n regFilePattern: new RegExp(pattern2RegEx(pattern)),\n cbs: [cb],\n };\n\n toSubscribe.push(pattern);\n } else {\n !this.filesSubscribes[key].cbs.includes(cb) && this.filesSubscribes[key].cbs.push(cb);\n }\n }\n if (this.connected && toSubscribe.length) {\n this._socket.emit('subscribeFiles', id, toSubscribe);\n }\n return Promise.resolve();\n }\n\n /**\n * Unsubscribes the given callback from changes of files.\n *\n * @param id The ioBroker state ID.\n * @param filePattern Pattern or file name, like 'main/*' or 'main/visViews.json`\n * @param cb The callback.\n */\n unsubscribeFiles(id: string, filePattern: string, cb?: ioBroker.FileChangeHandler): void {\n let filePatterns: string[];\n if (Array.isArray(filePattern)) {\n filePatterns = filePattern;\n } else {\n filePatterns = [filePattern];\n }\n const toUnsubscribe = [];\n for (let f = 0; f < filePatterns.length; f++) {\n const pattern = filePatterns[f];\n const key = `${id}$%$${pattern}`;\n if (this.filesSubscribes[key]) {\n const sub = this.filesSubscribes[key];\n if (cb) {\n const pos = sub.cbs.indexOf(cb);\n pos !== -1 && sub.cbs.splice(pos, 1);\n } else {\n sub.cbs = [];\n }\n\n if (!sub.cbs || !sub.cbs.length) {\n delete this.filesSubscribes[key];\n this.connected && toUnsubscribe.push(pattern);\n }\n }\n }\n\n if (this.connected && toUnsubscribe.length) {\n this._socket.emit('unsubscribeFiles', id, toUnsubscribe);\n }\n }\n\n /**\n * Called internally.\n */\n private objectChange(id: string, obj: ioBroker.Object | null): void {\n // update main.objects cache\n if (!this.objects) {\n return;\n }\n\n let oldObj: Partial<ioBroker.Object> | null;\n\n let changed = false;\n if (obj) {\n if (this.objects[id]) {\n // @ts-expect-error fix later\n oldObj = { _id: id, type: this.objects[id].type };\n }\n\n if (!this.objects[id] || JSON.stringify(this.objects[id]) !== JSON.stringify(obj)) {\n this.objects[id] = obj;\n changed = true;\n }\n } else if (this.objects[id]) {\n // @ts-expect-error fix later\n oldObj = { _id: id, type: this.objects[id].type };\n delete this.objects[id];\n changed = true;\n }\n\n Object.keys(this.objectsSubscribes).forEach(_id => {\n if (_id === id || this.objectsSubscribes[_id].reg.test(id)) {\n this.objectsSubscribes[_id].cbs.forEach(cb => {\n try {\n cb(id, obj, oldObj as ioBroker.Object);\n } catch (e) {\n console.error(`Error by callback of objectChange: ${e}`);\n }\n });\n }\n });\n\n if (changed && this.props.onObjectChange) {\n void this.props.onObjectChange(id, obj);\n }\n }\n\n /**\n * Called internally.\n */\n private stateChange(id: string, state: ioBroker.State | null): void {\n for (const task in this.statesSubscribes) {\n if (\n Object.prototype.hasOwnProperty.call(this.statesSubscribes, task) &&\n this.statesSubscribes[task].reg.test(id)\n ) {\n this.statesSubscribes[task].cbs.forEach(cb => {\n try {\n void (cb as ioBroker.StateChangeHandler)(id, state);\n } catch (e) {\n const knownError = e as Error;\n console.error(`Error by callback of stateChange: ${knownError?.message}`);\n }\n });\n }\n }\n }\n\n /**\n * Called internally.\n *\n * @param messageType The message type\n * @param sourceInstance The source instance\n * @param data Payload\n */\n instanceMessage(messageType: string, sourceInstance: string, data: Record<string, any>): void {\n if (this._instanceSubscriptions[sourceInstance]) {\n this._instanceSubscriptions[sourceInstance].forEach(sub => {\n if (sub.messageType === messageType) {\n sub.callback(data, sourceInstance, messageType);\n }\n });\n }\n }\n\n /**\n * Gets all states.\n *\n * @param pattern The pattern to filter states\n * @param disableProgressUpdate Don't call onProgress() when done\n */\n getStates(pattern?: string | boolean, disableProgressUpdate?: boolean): Promise<Record<string, ioBroker.State>> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (typeof pattern === 'boolean') {\n disableProgressUpdate = pattern;\n pattern = undefined;\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('getStates', pattern, (err: string | null, res: Record<string, ioBroker.State>) => {\n this.states = res;\n !disableProgressUpdate && this.onProgress(PROGRESS.STATES_LOADED);\n err ? reject(new Error(err)) : resolve(this.states);\n });\n });\n }\n\n /**\n * Gets the given state.\n *\n * @param id The state ID\n */\n getState(id: string): Promise<ioBroker.State | null> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n if (id && id === this.ignoreState) {\n return Promise.resolve(this.simStates[id] || ({ val: null, ack: true } as ioBroker.State));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('getState', id, (err: string | null, state: ioBroker.State) =>\n err ? reject(new Error(err)) : resolve(state),\n );\n });\n }\n\n /**\n * Get the given binary state.\n *\n * @deprecated since js-controller 5.0. Use files instead.\n * @param id The state ID.\n */\n getBinaryState(id: string): Promise<string> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n // the data will come in base64\n return new Promise((resolve, reject) => {\n this._socket.emit('getBinaryState', id, (err: string | null, base64: string) =>\n err ? reject(new Error(err)) : resolve(base64),\n );\n });\n }\n\n /**\n * Set the given binary state.\n *\n * @deprecated since js-controller 5.0. Use files instead.\n * @param id The state ID.\n * @param base64 The Base64 encoded binary data.\n */\n setBinaryState(id: string, base64: string): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n // the data will come in base64\n return new Promise((resolve, reject) => {\n this._socket.emit('setBinaryState', id, base64, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Sets the given state value.\n *\n * @param id The state ID\n * @param val The state value\n * @param ack The acknowledgment flag\n */\n setState(id: string, val: string | number | boolean | ioBroker.SettableState | null, ack?: boolean): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n // extra handling for \"nothing_selected\" state for vis\n if (id && id === this.ignoreState) {\n let state: ioBroker.State;\n if (typeof ack === 'boolean') {\n state = val as ioBroker.State;\n } else if (typeof val === 'object' && (val as ioBroker.State).val !== undefined) {\n state = val as ioBroker.State;\n } else {\n state = {\n val: val as string | number | boolean | null,\n ack: false,\n ts: Date.now(),\n lc: Date.now(),\n from: 'system.adapter.vis.0',\n };\n }\n\n this.simStates[id] = state;\n\n // inform subscribers about changes\n if (this.statesSubscribes[id]) {\n for (const cb of this.statesSubscribes[id].cbs) {\n try {\n void (cb as ioBroker.StateChangeHandler)(id, state);\n } catch (e) {\n console.error(`Error by callback of stateChanged: ${e}`);\n }\n }\n }\n\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('setState', id, val, (err: string | null) => (err ? reject(new Error(err)) : resolve()));\n });\n }\n\n /**\n * Gets all objects.\n *\n * @param update Set to true to retrieve all objects from the server (instead of using the local cache)\n * @param disableProgressUpdate Don't call onProgress() when done\n */\n getObjects(update?: boolean, disableProgressUpdate?: boolean): Promise<Record<string, ioBroker.Object>> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n if (!update && this.objects) {\n resolve(this.objects);\n } else {\n this._socket.emit(\n LegacyConnection.isWeb() ? 'getObjects' : 'getAllObjects',\n (err: string | null, res: Record<string, ioBroker.Object>) => {\n this.objects = res;\n disableProgressUpdate && this.onProgress(PROGRESS.OBJECTS_LOADED);\n err ? reject(new Error(err)) : resolve(this.objects);\n },\n );\n }\n });\n }\n\n /**\n * Gets objects by list of IDs.\n *\n * @param list Array of object IDs to retrieve\n */\n getObjectsById(list: string[]): Promise<Record<string, ioBroker.Object>> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('getObjects', list, (err: string | null, res: Record<string, ioBroker.Object>) =>\n err ? reject(new Error(err)) : resolve(res),\n );\n });\n }\n\n /**\n * Called internally.\n */\n private _subscribe(isEnable: boolean): void {\n if (isEnable && !this.subscribed) {\n this.subscribed = true;\n this.autoSubscribes.forEach(id => this._socket.emit('subscribeObjects', id));\n // re-subscribe objects\n Object.keys(this.objectsSubscribes).forEach(id => this._socket.emit('subscribeObjects', id));\n // re-subscribe logs\n this.autoSubscribeLog && this._socket.emit('requireLog', true);\n // re-subscribe states\n const ids = Object.keys(this.statesSubscribes);\n ids.forEach(id => this._socket.emit('subscribe', id));\n ids.length &&\n this._socket.emit(\n LegacyConnection.isWeb() ? 'getStates' : 'getForeignStates',\n ids,\n (err: string | null, states: Record<string, ioBroker.State>) => {\n err && console.error(`Cannot getForeignStates: ${JSON.stringify(err)}`);\n // inform about states\n states && Object.keys(states).forEach(id => this.stateChange(id, states[id]));\n },\n );\n } else if (!isEnable && this.subscribed) {\n this.subscribed = false;\n // un-subscribe objects\n this.autoSubscribes.forEach(id => this._socket.emit('unsubscribeObjects', id));\n Object.keys(this.objectsSubscribes).forEach(id => this._socket.emit('unsubscribeObjects', id));\n // un-subscribe logs\n this.autoSubscribeLog && this._socket.emit('requireLog', false);\n\n // un-subscribe states\n Object.keys(this.statesSubscribes).forEach(id => this._socket.emit('unsubscribe', id));\n }\n }\n\n /**\n * Requests log updates.\n *\n * @param isEnabled Set to true to get logs\n */\n requireLog(isEnabled: boolean): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('requireLog', isEnabled, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Deletes the given object.\n *\n * @param id The object ID\n * @param maintenance Force deletion of non-conform IDs\n */\n delObject(id: string, maintenance?: boolean): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('delObject', id, { maintenance: !!maintenance }, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Deletes the given object and all its children.\n *\n * @param id The object ID\n * @param maintenance Force deletion of non-conform IDs\n */\n delObjects(id: string, maintenance?: boolean): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('delObjects', id, { maintenance: !!maintenance }, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Sets the object.\n */\n setObject(id: string, obj: ioBroker.SettableObject): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (!obj) {\n return Promise.reject(new Error('Null object is not allowed'));\n }\n\n obj = JSON.parse(JSON.stringify(obj));\n\n if (Object.prototype.hasOwnProperty.call(obj, 'from')) {\n delete obj.from;\n }\n if (Object.prototype.hasOwnProperty.call(obj, 'user')) {\n delete obj.user;\n }\n if (Object.prototype.hasOwnProperty.call(obj, 'ts')) {\n delete obj.ts;\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('setObject', id, obj, (err: string | null) => (err ? reject(new Error(err)) : resolve()));\n });\n }\n\n /**\n * Gets the object with the given id from the server.\n */\n getObject(id: string): Promise<ioBroker.Object> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n if (id && id === this.ignoreState) {\n return Promise.resolve({\n _id: this.ignoreState,\n type: 'state',\n common: {\n name: 'ignored state',\n type: 'mixed',\n read: true,\n write: true,\n role: 'state',\n },\n native: {},\n });\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('getObject', id, (err: string | null, obj: ioBroker.Object) =>\n err ? reject(new Error(err)) : resolve(obj),\n );\n });\n }\n\n /**\n * Get all instances of the given adapter or all instances of all adapters.\n *\n * @param adapter The name of the adapter\n * @param update Force update\n */\n getAdapterInstances(adapter?: string | boolean, update?: boolean): Promise<ioBroker.InstanceObject[]> {\n if (typeof adapter === 'boolean') {\n update = adapter;\n adapter = '';\n }\n adapter = adapter || '';\n\n if (!update && this._promises[`instances_${adapter}`]) {\n return this._promises[`instances_${adapter}`] as Promise<ioBroker.InstanceObject[]>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises[`instances_${adapter}`] = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n timeout = null;\n this.getObjectView(\n `system.adapter.${adapter ? `${adapter}.` : ''}`,\n `system.adapter.${adapter ? `${adapter}.` : ''}\\u9999`,\n 'instance',\n )\n .then(items =>\n resolve(Object.keys(items).map(id => fixAdminUI(items[id] as ioBroker.AdapterObject))),\n )\n .catch(e => reject(new Error(e)));\n }, TIMEOUT_FOR_ADMIN4);\n\n this._socket.emit(\n 'getAdapterInstances',\n adapter,\n (err: string | null, instances: ioBroker.InstanceObject[]) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n err ? reject(new Error(err)) : resolve(instances);\n }\n },\n );\n });\n\n return this._promises[`instances_${adapter}`] as Promise<ioBroker.InstanceObject[]>;\n }\n\n /**\n * Get adapters with the given name or all adapters.\n *\n * @param adapter The name of the adapter\n * @param update Force update\n */\n getAdapters(adapter?: string | boolean, update?: boolean): Promise<ioBroker.AdapterObject[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (typeof adapter === 'boolean') {\n update = adapter;\n adapter = '';\n }\n\n adapter = adapter || '';\n\n if (!update && this._promises[`adapter_${adapter}`]) {\n return this._promises[`adapter_${adapter}`] as Promise<ioBroker.AdapterObject[]>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises[`adapter_${adapter}`] = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n timeout = null;\n this.getObjectView(`system.adapter.${adapter}.`, `system.adapter.${adapter}.\\u9999`, 'adapter')\n .then(items => {\n resolve(Object.keys(items).map(id => fixAdminUI(items[id] as ioBroker.AdapterObject)));\n })\n .catch(e => reject(new Error(e)));\n }, TIMEOUT_FOR_ADMIN4);\n\n this._socket.emit('getAdapters', adapter, (err: string | null, adapters: ioBroker.AdapterObject[]) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n err ? reject(new Error(err)) : resolve(adapters);\n }\n });\n });\n\n return this._promises[`adapter_${adapter}`] as Promise<ioBroker.AdapterObject[]>;\n }\n\n /**\n * Called internally.\n */\n private _renameGroups(objs: RenameGroupObject[], cb: (err: string | null) => void): void {\n if (!objs || !objs.length) {\n cb && cb(null);\n } else {\n const obj = objs.pop();\n if (!obj) {\n setTimeout(() => this._renameGroups(objs, cb), 0);\n return;\n }\n const oldId = obj._id;\n obj._id = obj.newId as ioBroker.ObjectIDs.Group;\n delete obj.newId;\n\n this.setObject(obj._id, obj)\n .then(() => this.delObject(oldId))\n .then(() => setTimeout(() => this._renameGroups(objs, cb), 0))\n .catch((err: string | null) => cb && cb(err));\n }\n }\n\n /**\n * Rename a group.\n *\n * @param id The id.\n * @param newId The new id.\n * @param newName The new name.\n */\n async renameGroup(id: string, newId: string, newName: ioBroker.StringOrTranslated): Promise<void> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n const groups = await this.getGroups(true);\n if (groups.length) {\n // find all elements\n const groupsToRename: RenameGroupObject[] = (groups as RenameGroupObject[]).filter(group =>\n group._id.startsWith(`${id}.`),\n );\n\n groupsToRename.forEach(group => {\n group.newId = (newId + group._id.substring(id.length)) as ioBroker.ObjectIDs.Group;\n });\n\n await new Promise((resolve, reject) => {\n this._renameGroups(groupsToRename, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(null),\n );\n });\n const obj = groups.find(group => group._id === id);\n\n if (obj) {\n obj._id = newId as ioBroker.ObjectIDs.Group;\n if (newName !== undefined) {\n obj.common = obj.common || ({} as ioBroker.GroupCommon);\n // @ts-expect-error will be corrected in the next js-controller release\n obj.common.name = newName;\n }\n\n return this.setObject(obj._id, obj).then(() => this.delObject(id));\n }\n }\n\n return Promise.resolve();\n }\n\n /**\n * Sends a message to a specific instance or all instances of some specific adapter.\n *\n * @param instance The instance to send this message to.\n * @param command Command name of the target instance.\n * @param data The message data to send.\n */\n sendTo(instance: string, command: string, data: any): Promise<{ result?: any; error?: string }> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise(resolve => {\n this._socket.emit('sendTo', instance, command, data, (result: { result?: any; error?: string }) =>\n resolve(result),\n );\n });\n }\n\n /**\n * Extend an object and create it if it might not exist.\n *\n * @param id The id.\n * @param obj The object.\n */\n extendObject(id: string, obj: ioBroker.PartialObject): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n obj = JSON.parse(JSON.stringify(obj));\n\n if (Object.prototype.hasOwnProperty.call(obj, 'from')) {\n delete obj.from;\n }\n if (Object.prototype.hasOwnProperty.call(obj, 'user')) {\n delete obj.user;\n }\n if (Object.prototype.hasOwnProperty.call(obj, 'ts')) {\n delete obj.ts;\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('extendObject', id, obj, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Register a handler for log messages.\n */\n registerLogHandler(handler: (message: string) => void): void {\n !this.onLogHandlers.includes(handler) && this.onLogHandlers.push(handler);\n }\n\n /**\n * Unregister a handler for log messages.\n */\n unregisterLogHandler(handler: (message: string) => void): void {\n const pos = this.onLogHandlers.indexOf(handler);\n pos !== -1 && this.onLogHandlers.splice(pos, 1);\n }\n\n /**\n * Register a handler for the connection state.\n */\n registerConnectionHandler(handler: (connected: boolean) => void): void {\n !this.onConnectionHandlers.includes(handler) && this.onConnectionHandlers.push(handler);\n }\n\n /**\n * Unregister a handler for the connection state.\n */\n unregisterConnectionHandler(handler: (connected: boolean) => void): void {\n const pos = this.onConnectionHandlers.indexOf(handler);\n pos !== -1 && this.onConnectionHandlers.splice(pos, 1);\n }\n\n /**\n * Set the handler for standard output of a command.\n *\n * @param handler The handler.\n */\n registerCmdStdoutHandler(handler: (id: string, text: string) => void): void {\n this.onCmdStdoutHandler = handler;\n }\n\n /**\n * Unset the handler for standard output of a command.\n */\n unregisterCmdStdoutHandler(/* handler */): void {\n this.onCmdStdoutHandler = undefined;\n }\n\n /**\n * Set the handler for standard error of a command.\n *\n * @param handler The handler.\n */\n registerCmdStderrHandler(handler: (id: string, text: string) => void): void {\n this.onCmdStderrHandler = handler;\n }\n\n /**\n * Unset the handler for standard error of a command.\n */\n unregisterCmdStderrHandler(): void {\n this.onCmdStderrHandler = undefined;\n }\n\n /**\n * Set the handler for exit of a command.\n */\n registerCmdExitHandler(handler: (id: string, exitCode: number) => void): void {\n this.onCmdExitHandler = handler;\n }\n\n /**\n * Unset the handler for exit of a command.\n */\n unregisterCmdExitHandler(): void {\n this.onCmdExitHandler = undefined;\n }\n\n /**\n * Get all enums with the given name.\n */\n getEnums(\n /** The name of the enum. */\n _enum?: string,\n /** Force update. */\n update?: boolean,\n ): Promise<Record<string, ioBroker.EnumObject>> {\n if (!update && this._promises[`enums_${_enum || 'all'}`]) {\n return this._promises[`enums_${_enum || 'all'}`] as Promise<Record<string, ioBroker.EnumObject>>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises[`enums_${_enum || 'all'}`] = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getObjectView',\n 'system',\n 'enum',\n { startkey: `enum.${_enum || ''}`, endkey: `enum.${_enum ? `${_enum}.` : ''}\\u9999` },\n (err: string | null, res: { rows: { value: ioBroker.EnumObject; id: string }[] }) => {\n if (!err && res) {\n const _res: Record<string, ioBroker.EnumObject> = {};\n for (let i = 0; i < res.rows.length; i++) {\n if (_enum && res.rows[i].id === `enum.${_enum}`) {\n continue;\n }\n _res[res.rows[i].id] = res.rows[i].value;\n }\n resolve(_res);\n } else if (err) {\n reject(new Error(err));\n } else {\n reject(new Error('Invalid response while getting enums'));\n }\n },\n );\n });\n\n return this._promises[`enums_${_enum || 'all'}`] as Promise<Record<string, ioBroker.EnumObject>>;\n }\n\n /**\n * Query a predefined object view.\n *\n * @param design design - 'system' or other designs like `custom`.\n * @param type The type of object.\n * @param start The start ID.\n * @param end The end ID.\n */\n getObjectViewCustom(\n /** The design: 'system' or other designs like `custom`. */\n design: string,\n /** The type of object. */\n type: ioBroker.ObjectType,\n /** The start ID. */\n start: string,\n /** The end ID. */\n end?: string,\n ): Promise<Record<string, ioBroker.Object>> {\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'getObjectView',\n design,\n type,\n { startkey: start, endkey: end },\n (err: string | null, res: { rows: { value: ioBroker.Object; id: string }[] }) => {\n if (!err) {\n const _res: Record<string, ioBroker.Object> = {};\n if (res && res.rows) {\n for (let i = 0; i < res.rows.length; i++) {\n _res[res.rows[i].id] = res.rows[i].value;\n }\n }\n resolve(_res);\n } else {\n reject(new Error(err));\n }\n },\n );\n });\n }\n\n /**\n * Query a predefined object view.\n *\n * @param type The type of object.\n * @param start The start ID.\n * @param end The end ID.\n */\n getObjectViewSystem(\n type: ioBroker.ObjectType,\n start: string,\n end?: string,\n ): Promise<Record<string, ioBroker.Object>> {\n return this.getObjectViewCustom('system', type, start, end);\n }\n\n /**\n * @deprecated since version 1.1.15, cause parameter order does not match backend\n *\n * Query a predefined object view.\n * @param start The start ID.\n * @param end The end ID.\n * @param type The type of object.\n */\n getObjectView(start: string, end: string, type: ioBroker.ObjectType): Promise<Record<string, ioBroker.Object>> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n start = start || '';\n end = end || '\\u9999';\n return this.getObjectViewCustom('system', type, start, end);\n }\n\n /**\n * Get the stored certificates.\n *\n * @param update Force update.\n */\n getCertificates(update?: boolean): Promise<{ name: string; type: 'public' | 'private' | 'chained' | '' }[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (this._promises.cert && !update) {\n return this._promises.cert;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.cert = this.getObject('system.certificates').then(res => {\n const certs: { name: string; type: 'public' | 'private' | 'chained' | '' }[] = [];\n if (res && res.native && res.native.certificates) {\n Object.keys(res.native.certificates).forEach(c => {\n const cert: string = res.native.certificates[c];\n if (!cert) {\n return;\n }\n const _cert: { name: string; type: 'public' | 'private' | 'chained' | '' } = {\n name: c,\n type: '',\n };\n // If it is a filename, it could be everything\n if (cert.length < 700 && (cert.includes('/') || cert.includes('\\\\'))) {\n if (c.toLowerCase().includes('private')) {\n _cert.type = 'private';\n } else if (cert.toLowerCase().includes('private')) {\n _cert.type = 'private';\n } else if (c.toLowerCase().includes('public')) {\n _cert.type = 'public';\n } else if (cert.toLowerCase().includes('public')) {\n _cert.type = 'public';\n }\n certs.push(_cert);\n } else {\n _cert.type =\n cert.substring(0, '-----BEGIN RSA PRIVATE KEY'.length) === '-----BEGIN RSA PRIVATE KEY' ||\n cert.substring(0, '-----BEGIN PRIVATE KEY'.length) === '-----BEGIN PRIVATE KEY'\n ? 'private'\n : 'public';\n\n if (_cert.type === 'public') {\n const m = cert.split('-----END CERTIFICATE-----');\n if (m.filter((t: string) => t.replace(/\\r\\n|\\r|\\n/, '').trim()).length > 1) {\n _cert.type = 'chained';\n }\n }\n\n certs.push(_cert);\n }\n });\n }\n return certs;\n });\n\n return this._promises.cert;\n }\n\n /**\n * Get the logs from a host (only for admin connection).\n */\n getLogs(host: string, linesNumber?: number): Promise<string[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise(resolve => {\n this._socket.emit('sendToHost', host, 'getLogs', linesNumber || 200, (lines: string[]) => resolve(lines));\n });\n }\n\n /**\n * Get the log files (only for admin connection).\n */\n getLogsFiles(host: string): Promise<string[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('readLogs', host, (err: string | null, files: string[]) =>\n err ? reject(new Error(err)) : resolve(files),\n );\n });\n }\n\n /**\n * Delete the logs from a host (only for admin connection).\n */\n delLogs(host: string): Promise<void> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('sendToHost', host, 'delLogs', null, (error: string | null) =>\n error ? reject(new Error(error)) : resolve(),\n );\n });\n }\n\n /**\n * Read the meta items.\n */\n readMetaItems(): Promise<ioBroker.MetaObject[]> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'getObjectView',\n 'system',\n 'meta',\n { startkey: '', endkey: '\\u9999' },\n (err: string | null, objs: { rows: { value: ioBroker.MetaObject; id: string }[] }) =>\n err\n ? reject(new Error(err))\n : resolve(\n objs.rows &&\n objs.rows.map((obj: { value: ioBroker.MetaObject; id: string }) => obj.value),\n ),\n );\n });\n }\n\n /**\n * Read the directory of an adapter.\n *\n * @param adapter The adapter name.\n * @param fileName The directory name.\n */\n readDir(adapter: string, fileName: string): Promise<ioBroker.ReadDirResult[]> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('readDir', adapter, fileName, (err: string | null, files: ioBroker.ReadDirResult[]) =>\n err ? reject(new Error(err)) : resolve(files),\n );\n });\n }\n\n /**\n * Read a file of an adapter.\n *\n * @param adapter The adapter name.\n * @param fileName The file name.\n * @param base64 If it must be a base64 format.\n */\n readFile(adapter: string, fileName: string, base64?: boolean): Promise<string | { data: string; type: string }> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n if (!base64) {\n this._socket.emit('readFile', adapter, fileName, (err: string | null, data: string, type: string) => {\n err ? reject(new Error(err)) : resolve({ data, type });\n });\n } else {\n this._socket.emit('readFile64', adapter, fileName, base64, (err: string | null, data: string) =>\n err ? reject(new Error(err)) : resolve(data),\n );\n }\n });\n }\n\n /**\n * Write a file of an adapter.\n *\n * @param adapter The adapter name.\n * @param fileName The file name.\n * @param data The data (if it's a Buffer, it will be converted to Base64)\n */\n writeFile64(adapter: string, fileName: string, data: Buffer | string): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n if (typeof data === 'string') {\n this._socket.emit('writeFile', adapter, fileName, data, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n } else {\n const base64 = btoa(\n new Uint8Array(data).reduce((_data, byte) => _data + String.fromCharCode(byte), ''),\n );\n\n this._socket.emit('writeFile64', adapter, fileName, base64, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n }\n });\n }\n\n /**\n * Delete a file of an adapter.\n *\n * @param adapter The adapter name.\n * @param fileName The file name.\n */\n deleteFile(adapter: string, fileName: string): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('unlink', adapter, fileName, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Delete a folder of an adapter.\n * All files in folder will be deleted.\n *\n * @param adapter The adapter name.\n * @param folderName The folder name.\n */\n deleteFolder(adapter: string, folderName: string): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('deleteFolder', adapter, folderName, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Get the list of all hosts.\n *\n * @param update Force update.\n */\n getHosts(update?: boolean): Promise<ioBroker.HostObject[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!update && this._promises.hosts) {\n return this._promises.hosts;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.hosts = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getObjectView',\n 'system',\n 'host',\n { startkey: 'system.host.', endkey: 'system.host.\\u9999' },\n (err: string | null, doc: { rows: { value: ioBroker.HostObject; id: string }[] }) => {\n if (err) {\n reject(new Error(err));\n } else {\n resolve(doc.rows.map(item => item.value));\n }\n },\n );\n });\n\n return this._promises.hosts;\n }\n\n /**\n * Get the list of all users.\n *\n * @param update Force update.\n */\n getUsers(update?: boolean): Promise<ioBroker.UserObject[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!update && this._promises.users) {\n return this._promises.users;\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.users = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getObjectView',\n 'system',\n 'user',\n { startkey: 'system.user.', endkey: 'system.user.\\u9999' },\n (err: string | null, doc: { rows: { value: ioBroker.UserObject; id: string }[] }) => {\n if (err) {\n reject(new Error(err));\n } else {\n resolve(doc.rows.map(item => item.value));\n }\n },\n );\n });\n\n return this._promises.users;\n }\n\n /**\n * Get the list of all groups.\n *\n * @param update Force update.\n */\n getGroups(update?: boolean): Promise<ioBroker.GroupObject[]> {\n if (!update && this._promises.groups) {\n return this._promises.groups;\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.groups = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getObjectView',\n 'system',\n 'group',\n { startkey: 'system.group.', endkey: 'system.group.\\u9999' },\n (err: string | null, doc: { rows: { value: ioBroker.GroupObject; id: string }[] }) => {\n if (err) {\n reject(new Error(err));\n } else {\n resolve(doc.rows.map(item => item.value));\n }\n },\n );\n });\n\n return this._promises.groups;\n }\n\n /**\n * Get the host information.\n *\n * @param host The host name.\n * @param update Force update.\n * @param timeoutMs Optional read timeout.\n */\n getHostInfo(host: string, update?: boolean, timeoutMs?: number): Promise<HostInfo> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!host.startsWith('system.host.')) {\n host += `system.host.${host}`;\n }\n\n if (!update && this._promises[`hostInfo_${host}`]) {\n return this._promises[`hostInfo_${host}`] as Promise<HostInfo>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises[`hostInfo_${host}`] = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('getHostInfo timeout'));\n }\n }, timeoutMs || this.props.cmdTimeout);\n\n this._socket.emit('sendToHost', host, 'getHostInfo', null, (data: string | HostInfo) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getHostInfo\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"getHostInfo\"'));\n } else {\n resolve(data);\n }\n }\n });\n });\n\n return this._promises[`hostInfo_${host}`] as Promise<HostInfo>;\n }\n\n /**\n * Get the host information (short version).\n *\n * @param host The host name.\n * @param update Force update.\n * @param timeoutMs Optional read timeout.\n */\n getHostInfoShort(host: string, update?: boolean, timeoutMs?: number): Promise<HostInfo> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!host.startsWith('system.host.')) {\n host += `system.host.${host}`;\n }\n if (!update && this._promises[`hostInfoShort_${host}`]) {\n return this._promises[`hostInfoShort_${host}`] as Promise<HostInfo>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises[`hostInfoShort_${host}`] = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('hostInfoShort timeout'));\n }\n }, timeoutMs || this.props.cmdTimeout);\n\n this._socket.emit('sendToHost', host, 'getHostInfoShort', null, (data: string | HostInfo) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getHostInfoShort\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"getHostInfoShort\"'));\n } else {\n resolve(data);\n }\n }\n });\n });\n\n return this._promises[`hostInfoShort_${host}`] as Promise<HostInfo>;\n }\n\n /**\n * Get the repository.\n *\n * @param host The host name.\n * @param options Options.\n * @param update Force update.\n * @param timeoutMs Timeout in ms.\n */\n getRepository(\n host: string,\n options?: { update: boolean; repo: string } | string,\n update?: boolean,\n timeoutMs?: number,\n ): Promise<Record<string, ioBroker.AdapterObject>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!update && this._promises.repo) {\n return this._promises.repo;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (!host.startsWith('system.host.')) {\n host += `system.host.${host}`;\n }\n\n this._promises.repo = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('getRepository timeout'));\n }\n }, timeoutMs || this.props.cmdTimeout);\n\n this._socket.emit(\n 'sendToHost',\n host,\n 'getRepository',\n options,\n (data: string | Record<string, ioBroker.AdapterObject>) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getRepository\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"getRepository\"'));\n } else {\n resolve(data);\n }\n }\n },\n );\n });\n\n return this._promises.repo;\n }\n\n /**\n * Get the installed.\n *\n * @param host The host name.\n * @param update Force update.\n * @param cmdTimeout Timeout in ms.\n */\n getInstalled(host: string, update?: boolean, cmdTimeout?: number): Promise<Record<string, ioBroker.AdapterObject>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n this._promises.installed = this._promises.installed || {};\n\n if (!update && this._promises.installed[host]) {\n return this._promises.installed[host] as Promise<Record<string, ioBroker.AdapterObject>>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (!host.startsWith('system.host.')) {\n host += `system.host.${host}`;\n }\n\n this._promises.installed[host] = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('getInstalled timeout'));\n }\n }, cmdTimeout || this.props.cmdTimeout);\n\n this._socket.emit(\n 'sendToHost',\n host,\n 'getInstalled',\n null,\n (data: string | Record<string, ioBroker.AdapterObject>) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getInstalled\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"getInstalled\"'));\n } else {\n resolve(data);\n }\n }\n },\n );\n });\n\n return this._promises.installed[host] as Promise<Record<string, ioBroker.AdapterObject>>;\n }\n\n /**\n * Rename file or folder in ioBroker DB\n *\n * @param adapter Instance name, like `vis-2.0`.\n * @param oldName The current file name, e.g., main/vis-views.json\n * @param newName The new file name, e.g., main/vis-views-new.json\n */\n rename(adapter: string, oldName: string, newName: string): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('rename', adapter, oldName, newName, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Rename file in ioBroker DB\n */\n renameFile(\n /** instance name */\n adapter: string,\n /** current file name, e.g., main/vis-views.json */\n oldName: string,\n /** new file name, e.g., main/vis-views-new.json */\n newName: string,\n ): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('renameFile', adapter, oldName, newName, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Execute a command on a host.\n */\n cmdExec(\n /** The host name. */\n host: string,\n /** The command. */\n cmd: string,\n /** The command ID. */\n cmdId: string,\n /** Timeout of command in ms */\n cmdTimeout: number,\n ): Promise<void> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (!host.startsWith(host)) {\n host += `system.host.${host}`;\n }\n\n return new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = cmdTimeout\n ? setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('cmdExec timeout'));\n }\n }, cmdTimeout)\n : null;\n\n this._socket.emit('cmdExec', host, cmdId, cmd, null, (err: string | null) => {\n if (!cmdTimeout || timeout) {\n timeout && clearTimeout(timeout);\n timeout = null;\n if (err) {\n reject(new Error(err));\n } else {\n resolve();\n }\n }\n });\n });\n }\n\n /**\n * Checks if a given feature is supported.\n */\n checkFeatureSupported(\n /** The feature to check. */\n feature: string,\n /** Force update. */\n update?: boolean,\n ): Promise<boolean> {\n if (!update && this._promises[`supportedFeatures_${feature}`]) {\n return this._promises[`supportedFeatures_${feature}`] as Promise<boolean>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises[`supportedFeatures_${feature}`] = new Promise((resolve, reject) => {\n this._socket.emit('checkFeatureSupported', feature, (err: string | null, supported: boolean) =>\n err ? reject(new Error(err)) : resolve(supported),\n );\n });\n\n return this._promises[`supportedFeatures_${feature}`] as Promise<boolean>;\n }\n\n /**\n * Read the base settings of a given host.\n */\n async readBaseSettings(host: string): Promise<Record<string, any>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n const result = await this.checkFeatureSupported('CONTROLLER_READWRITE_BASE_SETTINGS');\n if (result) {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('readBaseSettings timeout'));\n }\n }, this.props.cmdTimeout);\n\n if (host.startsWith('system.host.')) {\n host = host.replace(/^system\\.host\\./, '');\n }\n\n this._socket.emit(\n 'sendToHost',\n host,\n 'readBaseSettings',\n null,\n (data: Record<string, any> | string) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"BaseSettings\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"BaseSettings\"'));\n } else {\n resolve(data);\n }\n }\n },\n );\n });\n }\n return Promise.reject(new Error('Not supported'));\n }\n\n /**\n * Write the base settings of a given host.\n *\n * @param host The host name.\n * @param config The new base settings.\n */\n writeBaseSettings(host: string, config: IoBJson): Promise<{ result?: 'ok'; error?: string }> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n return this.checkFeatureSupported('CONTROLLER_READWRITE_BASE_SETTINGS').then(result => {\n if (result) {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('writeBaseSettings timeout'));\n }\n }, this.props.cmdTimeout);\n\n this._socket.emit(\n 'sendToHost',\n host,\n 'writeBaseSettings',\n config,\n (data: { result?: 'ok'; error?: string } | string) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not write \"BaseSettings\"'));\n } else if (!data) {\n reject(new Error('Cannot write \"BaseSettings\"'));\n } else {\n resolve(data as { result?: 'ok'; error?: string });\n }\n }\n },\n );\n });\n }\n\n return Promise.reject(new Error('Not supported'));\n });\n }\n\n /**\n * Send command to restart the iobroker on host\n */\n restartController(host: string): Promise<boolean> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('sendToHost', host, 'restartController', null, (error: string | null) => {\n error ? reject(new Error(error)) : resolve(true);\n });\n });\n }\n\n /**\n * Read statistics information from host\n *\n * @param host Host name\n * @param typeOfDiag one of none, normal, no-city, extended\n */\n getDiagData(host: string, typeOfDiag: 'none' | 'normal' | 'no-city' | 'extended'): Promise<Record<string, any>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n return new Promise(resolve => {\n this._socket.emit('sendToHost', host, 'getDiagData', typeOfDiag, (result: Record<string, any>) =>\n resolve(result),\n );\n });\n }\n\n /**\n * Read all states (which might not belong to this adapter) which match the given pattern.\n */\n getForeignStates(pattern?: string): Promise<Record<string, ioBroker.State>> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n if (LegacyConnection.isWeb()) {\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'getStates',\n pattern || '*',\n (err: string | null, states: Record<string, ioBroker.State>) =>\n err ? reject(new Error(err)) : resolve(states),\n );\n });\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'getForeignStates',\n pattern || '*',\n (err: string | null, states: Record<string, ioBroker.State>) =>\n err ? reject(new Error(err)) : resolve(states),\n );\n });\n }\n\n /**\n * Get foreign objects by pattern, by specific type and resolve their enums. (Only admin)\n */\n getForeignObjects(pattern: string, type?: ioBroker.ObjectType): Promise<Record<string, ioBroker.State>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'getForeignObjects',\n pattern || '*',\n type,\n (err: string | null, states: Record<string, ioBroker.State>) =>\n err ? reject(new Error(err)) : resolve(states),\n );\n });\n }\n\n /**\n * Gets the system configuration.\n *\n * @param update Force update.\n */\n getSystemConfig(update?: boolean): Promise<ioBroker.SystemConfigObject> {\n if (!update && this._promises.systemConfig) {\n return this._promises.systemConfig;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.systemConfig = this.getObject('system.config').then(obj => {\n const systemConfig: ioBroker.SystemConfigObject = (obj || {}) as ioBroker.SystemConfigObject;\n systemConfig.common = systemConfig.common || ({} as ioBroker.SystemConfigCommon);\n systemConfig.native = systemConfig.native || {};\n return systemConfig;\n });\n\n return this._promises.systemConfig;\n }\n\n /**\n * Sets the system configuration.\n */\n setSystemConfig(\n obj: ioBroker.SettableObjectWorker<ioBroker.SystemConfigObject>,\n ): Promise<ioBroker.SystemConfigObject> {\n return this.setObject('system.config', obj).then(\n () => (this._promises.systemConfig = Promise.resolve(obj as ioBroker.SystemConfigObject)),\n );\n }\n\n /**\n * Get the raw socket.io socket.\n */\n getRawSocket(): SocketClient {\n return this._socket;\n }\n\n /**\n * Get the history of a given state.\n */\n getHistory(id: string, options: ioBroker.GetHistoryOptions): Promise<ioBroker.GetHistoryResult> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('getHistory', id, options, (err: string | null, values: ioBroker.GetHistoryResult) =>\n err ? reject(new Error(err)) : resolve(values),\n );\n });\n }\n\n /**\n * Get the history of a given state.\n */\n getHistoryEx(\n id: string,\n options: ioBroker.GetHistoryOptions,\n ): Promise<{ values: ioBroker.GetHistoryResult; sessionId: string; stepIgnore: number }> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'getHistory',\n id,\n options,\n (err: string | null, values: ioBroker.GetHistoryResult, stepIgnore: number, sessionId: string) =>\n err ? reject(new Error(err)) : resolve({ values, sessionId, stepIgnore }),\n );\n });\n }\n\n /**\n * Change the password of the given user.\n */\n changePassword(user: string, password: string): Promise<void> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('changePassword', user, password, (err: string | null) =>\n err ? reject(new Error(err)) : resolve(),\n );\n });\n }\n\n /**\n * Get the IP addresses of the given host.\n */\n getIpAddresses(\n host: string,\n /** Force update. */\n update?: boolean,\n ): Promise<string[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!host.startsWith('system.host.')) {\n host = `system.host.${host}`;\n }\n\n if (!update && this._promises[`IPs_${host}`]) {\n return this._promises[`IPs_${host}`] as Promise<string[]>;\n }\n this._promises[`IPs_${host}`] = this.getObject(host).then(obj => (obj?.common ? obj.common.address || [] : []));\n\n return this._promises[`IPs_${host}`] as Promise<string[]>;\n }\n\n /**\n * Get the IP addresses with interface names of the given host or find host by IP.\n */\n getHostByIp(\n ipOrHostName: string,\n /** Force update. */\n update?: boolean,\n ): Promise<{ name: string; address: string; family: 'ipv4' | 'ipv6' }[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (ipOrHostName.startsWith('system.host.')) {\n ipOrHostName = ipOrHostName.replace(/^system\\.host\\./, '');\n }\n\n if (!update && this._promises[`rIPs_${ipOrHostName}`]) {\n return this._promises[`rIPs_${ipOrHostName}`] as Promise<\n { name: string; address: string; family: 'ipv4' | 'ipv6' }[]\n >;\n }\n this._promises[`rIPs_${ipOrHostName}`] = new Promise(resolve => {\n this._socket.emit('getHostByIp', ipOrHostName, (ip: string, host: any) => {\n const IPs4: {\n name: string;\n address: string;\n family: 'ipv4' | 'ipv6';\n }[] = [{ name: '[IPv4] 0.0.0.0 - Listen on all IPs', address: '0.0.0.0', family: 'ipv4' }];\n const IPs6: {\n name: string;\n address: string;\n family: 'ipv4' | 'ipv6';\n }[] = [{ name: '[IPv6] :: - Listen on all IPs', address: '::', family: 'ipv6' }];\n if (host?.native?.hardware?.networkInterfaces) {\n for (const eth in host.native.hardware.networkInterfaces) {\n if (!Object.prototype.hasOwnProperty.call(host.native.hardware.networkInterfaces, eth)) {\n continue;\n }\n for (let num = 0; num < host.native.hardware.networkInterfaces[eth].length; num++) {\n if (host.native.hardware.networkInterfaces[eth][num].family !== 'IPv6') {\n IPs4.push({\n name: `[${host.native.hardware.networkInterfaces[eth][num].family}] ${host.native.hardware.networkInterfaces[eth][num].address} - ${eth}`,\n address: host.native.hardware.networkInterfaces[eth][num].address,\n family: 'ipv4',\n });\n } else {\n IPs6.push({\n name: `[${host.native.hardware.networkInterfaces[eth][num].family}] ${host.native.hardware.networkInterfaces[eth][num].address} - ${eth}`,\n address: host.native.hardware.networkInterfaces[eth][num].address,\n family: 'ipv6',\n });\n }\n }\n }\n }\n for (let i = 0; i < IPs6.length; i++) {\n IPs4.push(IPs6[i]);\n }\n resolve(IPs4);\n });\n });\n\n return this._promises[`rIPs_${ipOrHostName}`] as Promise<\n { name: string; address: string; family: 'ipv4' | 'ipv6' }[]\n >;\n }\n\n /**\n * Encrypt a text\n */\n encrypt(text: string): Promise<string> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('encrypt', text, (err: string | null, _text: string) =>\n err ? reject(new Error(err)) : resolve(_text),\n );\n });\n }\n\n /**\n * Decrypt a text\n */\n decrypt(encryptedText: string): Promise<string> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('decrypt', encryptedText, (err: string | null, text: string) =>\n err ? reject(new Error(err)) : resolve(text),\n );\n });\n }\n\n /**\n * Gets the version.\n */\n getVersion(update?: boolean): Promise<{ version: string; serverName: string }> {\n if (update && this._promises.version) {\n delete this._promises.version;\n }\n\n this._promises.version =\n this._promises.version ||\n new Promise((resolve, reject) => {\n this._socket.emit('getVersion', (err: string | null, version: string, serverName: string) => {\n // support of old socket.io\n if (err && !version && typeof err === 'string' && err.match(/\\d+\\.\\d+\\.\\d+/)) {\n resolve({ version: err, serverName: 'socketio' });\n } else {\n err ? reject(new Error(err)) : resolve({ version, serverName });\n }\n });\n });\n\n return this._promises.version;\n }\n\n /**\n * Gets the web server name.\n */\n getWebServerName(): Promise<string> {\n this._promises.webName =\n this._promises.webName ||\n new Promise((resolve, reject) => {\n this._socket.emit('getAdapterName', (err: string | null, name: string) =>\n err ? reject(new Error(err)) : resolve(name),\n );\n });\n\n return this._promises.webName;\n }\n\n /**\n * Gets the admin version.\n *\n * @deprecated use getVersion()\n */\n getAdminVersion(): Promise<{ version: string; serverName: string }> {\n console.log('Deprecated: use getVersion');\n return this.getVersion();\n }\n\n /**\n * Change access rights for a file\n *\n * @param adapter The adapter name.\n * @param fileName file name with a full path. It could be like vis.0/*\n * @param options like {mode: 0x644}\n * @param options.mode Access rights. Default is 0x644\n */\n chmodFile(\n adapter: string,\n fileName: string,\n options?: { mode: number },\n ): Promise<{ entries: ioBroker.ChownFileResult[]; id: string }> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'chmodFile',\n adapter,\n fileName,\n options,\n (err: string | null, entries: ioBroker.ChownFileResult[], id: string) =>\n err ? reject(new Error(err)) : resolve({ entries, id }),\n );\n });\n }\n\n /**\n * Change an owner or/and owner group for a file\n *\n * @param adapter The adapter name.\n * @param fileName file name with a full path. It could be like vis.0/*\n * @param options like {owner: 'user', ownerGroup: 'group'}\n * @param options.owner User name\n * @param options.ownerGroup Group name\n */\n chownFile(\n adapter: string,\n fileName: string,\n options: { owner?: string; ownerGroup?: string },\n ): Promise<{ entries: ioBroker.ChownFileResult[]; id: string }> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'chownFile',\n adapter,\n fileName,\n options,\n (err: string | null, entries: ioBroker.ChownFileResult[], id: string) =>\n err ? reject(new Error(err)) : resolve({ entries, id }),\n );\n });\n }\n\n /**\n * Check if the file exists\n *\n * @param adapter The adapter name.\n * @param fileName file name with a full path. It could be like vis.0/*\n */\n fileExists(adapter: string, fileName: string): Promise<boolean> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('fileExists', adapter, fileName, (err: string | null, exists: boolean) =>\n err ? reject(new Error(err)) : resolve(exists),\n );\n });\n }\n\n /**\n * Get the alarm notifications from a host (only for admin connection).\n */\n getNotifications(host: string, category?: string): Promise<FilteredNotificationInformation> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise(resolve => {\n this._socket.emit(\n 'sendToHost',\n host,\n 'getNotifications',\n { category },\n (notifications: FilteredNotificationInformation) => resolve(notifications),\n );\n });\n }\n\n /**\n * Clear the alarm notifications on a host (only for admin connection).\n *\n * @param host The host name.\n * @param category optional\n */\n clearNotifications(host: string, category?: string): Promise<{ result: 'ok' }> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise(resolve => {\n this._socket.emit('sendToHost', host, 'clearNotifications', { category }, (result: { result: 'ok' }) =>\n resolve(result),\n );\n });\n }\n\n /**\n * Read if only easy mode is allowed (only for admin connection).\n */\n getIsEasyModeStrict(): Promise<boolean> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('getIsEasyModeStrict', (error: null | string, isStrict: boolean) =>\n error ? reject(new Error(error)) : resolve(isStrict),\n );\n });\n }\n\n /**\n * Read easy mode configuration (only for admin connection).\n */\n getEasyMode(): Promise<any> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('getEasyMode', (error: string | null, config: any) =>\n error ? reject(new Error(error)) : resolve(config),\n );\n });\n }\n\n /**\n * Read current user\n */\n getCurrentUser(): Promise<string> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise(resolve => {\n this._socket.emit('authEnabled', (isSecure: boolean, user: string) => resolve(user));\n });\n }\n\n getCurrentSession(cmdTimeout?: number): Promise<{ expireInSec: number }> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n const controller = new AbortController();\n\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n controller.abort();\n reject(new Error('getCurrentSession timeout'));\n }\n }, cmdTimeout || 5000);\n\n fetch('./session', { signal: controller.signal })\n .then(res => res.json())\n .then(json => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n resolve(json);\n }\n })\n .catch(e => reject(new Error(`getCurrentSession: ${e}`)));\n });\n }\n\n /**\n * Read adapter ratings\n */\n getRatings(update?: boolean): Promise<any> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit('getRatings', update, (err: string | null, ratings: any) =>\n err ? reject(new Error(err)) : resolve(ratings),\n );\n });\n }\n\n /**\n * Read current web, socketio or admin namespace, like admin.0\n */\n getCurrentInstance(): Promise<string> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.currentInstance =\n this._promises.currentInstance ||\n new Promise((resolve, reject) => {\n this._socket.emit('getCurrentInstance', (err: string | null, namespace: string) =>\n err ? reject(new Error(err)) : resolve(namespace),\n );\n });\n\n return this._promises.currentInstance;\n }\n\n // returns very optimized information for adapters to minimize a connection load\n getCompactAdapters(update?: boolean): Promise<Record<string, ioBroker.AdapterObject>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!update && this._promises.compactAdapters) {\n return this._promises.compactAdapters;\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n this._promises.compactAdapters = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getCompactAdapters',\n (err: string | null, adapters: Record<string, ioBroker.AdapterObject>) =>\n err ? reject(new Error(err)) : resolve(adapters),\n );\n });\n\n return this._promises.compactAdapters;\n }\n\n getAdaptersResetCache(adapter?: string): void {\n adapter = adapter || '';\n delete this._promises.compactAdapters;\n delete this._promises[`adapter_${adapter}`];\n }\n\n // returns very optimized information for adapters to minimize a connection load\n getCompactInstances(update?: boolean): Promise<Record<string, ioBroker.InstanceObject>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!update && this._promises.compactInstances) {\n return this._promises.compactInstances;\n }\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.compactInstances = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getCompactInstances',\n (err: string | null, instances: Record<string, ioBroker.InstanceObject>) =>\n err ? reject(new Error(err)) : resolve(instances),\n );\n });\n\n return this._promises.compactInstances;\n }\n\n getAdapternInstancesResetCache(adapter?: string): void {\n adapter = adapter || '';\n delete this._promises.compactInstances;\n delete this._promises[`instances_${adapter}`];\n }\n\n /**\n * Returns very optimized information for adapters to minimize a connection load.\n * Reads only version of installed adapter\n */\n getCompactInstalled(\n host: string,\n update?: boolean,\n cmdTimeout?: number,\n ): Promise<Record<string, ioBroker.AdapterObject>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n this._promises.installedCompact = this._promises.installedCompact || {};\n\n if (!update && this._promises.installedCompact[host]) {\n return this._promises.installedCompact[host] as Promise<Record<string, ioBroker.AdapterObject>>;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (!host.startsWith('system.host.')) {\n host += `system.host.${host}`;\n }\n\n this._promises.installedCompact[host] = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('getCompactInstalled timeout'));\n }\n }, cmdTimeout || this.props.cmdTimeout);\n\n this._socket.emit('getCompactInstalled', host, (data: Record<string, ioBroker.AdapterObject> | string) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getCompactInstalled\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"getCompactInstalled\"'));\n } else {\n resolve(data);\n }\n }\n });\n });\n\n return this._promises.installedCompact[host] as Promise<Record<string, ioBroker.AdapterObject>>;\n }\n\n // returns very optimized information for adapters to minimize a connection load.\n // reads only version of installed adapter\n getCompactSystemRepositories(update?: boolean, cmdTimeout?: number): Promise<CompactSystemRepository> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (!update && this._promises.getCompactSystemRepositories) {\n return this._promises.getCompactSystemRepositories;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.getCompactSystemRepositories = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('getCompactSystemRepositories timeout'));\n }\n }, cmdTimeout || this.props.cmdTimeout);\n\n this._socket.emit('getCompactSystemRepositories', (data: CompactSystemRepository | string) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getCompactSystemRepositories\"'));\n } else if (!data || typeof data !== 'object') {\n reject(new Error('Cannot read \"getCompactSystemRepositories\"'));\n } else {\n resolve(data);\n }\n }\n });\n });\n\n return this._promises.getCompactSystemRepositories;\n }\n\n // returns very optimized information for adapters to minimize a connection load\n getCompactSystemConfig(update?: boolean): Promise<ioBroker.SystemConfigObject> {\n if (!update && this._promises.systemConfigPromise) {\n return this._promises.systemConfigPromise;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.systemConfigPromise = new Promise((resolve, reject) => {\n this._socket.emit(\n 'getCompactSystemConfig',\n (err: string | null, systemConfig: ioBroker.SystemConfigObject) =>\n err ? reject(new Error(err)) : resolve(systemConfig),\n );\n });\n\n return this._promises.systemConfigPromise;\n }\n\n /**\n * Get the repository in compact form (only version and icon).\n *\n * @param host The host name.\n * @param update Force update.\n * @param timeoutMs timeout in ms.\n */\n getCompactRepository(\n host: string,\n update?: boolean,\n timeoutMs?: number,\n ): Promise<Record<string, { version: string; icon: string }>> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n\n if (!update && this._promises.repoCompact) {\n return this._promises.repoCompact;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n if (!host.startsWith('system.host.')) {\n host += `system.host.${host}`;\n }\n\n this._promises.repoCompact = new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n if (timeout) {\n timeout = null;\n reject(new Error('getCompactRepository timeout'));\n }\n }, timeoutMs || this.props.cmdTimeout);\n\n this._socket.emit(\n 'getCompactRepository',\n host,\n (data: Record<string, { version: string; icon: string }> | string) => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n if (data === PERMISSION_ERROR) {\n reject(new Error('May not read \"getCompactRepository\"'));\n } else if (!data) {\n reject(new Error('Cannot read \"getCompactRepository\"'));\n } else {\n resolve(data);\n }\n }\n },\n );\n });\n\n return this._promises.repoCompact;\n }\n\n getInstalledResetCache(): void {\n delete this._promises.repoCompact;\n delete this._promises.repo;\n }\n\n /**\n * Get the list of all hosts in compact form (only _id, common.name, common.icon, common.color, native.hardware.networkInterfaces)\n */\n getCompactHosts(update?: boolean): Promise<ioBroker.HostObject[]> {\n if (LegacyConnection.isWeb()) {\n return Promise.reject(new Error('Allowed only in admin'));\n }\n if (!update && this._promises.hostsCompact) {\n return this._promises.hostsCompact;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.hostsCompact = new Promise((resolve, reject) => {\n this._socket.emit('getCompactHosts', (err: string | null, hosts: ioBroker.HostObject[]) =>\n err ? reject(new Error(err)) : resolve(hosts),\n );\n });\n\n return this._promises.hostsCompact;\n }\n\n /**\n * Get uuid\n */\n getUuid(): Promise<string | undefined> {\n if (this._promises.uuid) {\n return this._promises.uuid;\n }\n\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n this._promises.uuid = this.getObject('system.meta.uuid').then(obj => obj?.native?.uuid);\n\n return this._promises.uuid;\n }\n\n /**\n * Subscribe on instance message\n *\n * @param targetInstance instance, like 'cameras.0'\n * @param messageType message type like 'startCamera/cam3'\n * @param data optional data object\n * @param callback message handler\n */\n subscribeOnInstance(\n targetInstance: string,\n messageType: string,\n data: any,\n callback: (_data: Record<string, any>, sourceInstance: string, _messageType: string) => void,\n ): Promise<{ error?: string; accepted?: boolean; heartbeat?: number }> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n return new Promise((resolve, reject) => {\n this._socket.emit(\n 'clientSubscribe',\n targetInstance,\n messageType,\n data,\n (err: string | null, result: { error?: string; accepted?: boolean; heartbeat?: number }) => {\n if (err) {\n reject(new Error(err));\n } else if (result?.error) {\n reject(new Error(result.error));\n } else {\n if (!targetInstance.startsWith('system.adapter.')) {\n targetInstance = `system.adapter.${targetInstance}`;\n }\n // save callback\n this._instanceSubscriptions[targetInstance] = this._instanceSubscriptions[targetInstance] || [];\n if (\n !this._instanceSubscriptions[targetInstance].find(\n sub => sub.messageType === messageType && sub.callback === callback,\n )\n ) {\n this._instanceSubscriptions[targetInstance].push({\n messageType,\n callback,\n });\n }\n resolve(result);\n }\n },\n );\n });\n }\n\n /**\n * Unsubscribe from instance message\n *\n * @param targetInstance instance, like 'cameras.0'\n * @param messageType message type like 'startCamera/cam3'\n * @param callback message handler. Could be null if all callbacks for this messageType should be unsubscribed\n */\n unsubscribeFromInstance(\n targetInstance: string,\n messageType?: string,\n callback?: (data: Record<string, any>, sourceInstance: string, _messageType: string) => void,\n ): Promise<boolean> {\n if (!targetInstance.startsWith('system.adapter.')) {\n targetInstance = `system.adapter.${targetInstance}`;\n }\n let deleted;\n const promiseResults: Promise<boolean>[] = [];\n do {\n deleted = false;\n const index = this._instanceSubscriptions[targetInstance]?.findIndex(\n sub => (!messageType || sub.messageType === messageType) && (!callback || sub.callback === callback),\n );\n\n if (index !== undefined && index !== null && index !== -1) {\n deleted = true;\n // remember messageType\n const _messageType = this._instanceSubscriptions[targetInstance][index].messageType;\n\n this._instanceSubscriptions[targetInstance].splice(index, 1);\n if (!this._instanceSubscriptions[targetInstance].length) {\n delete this._instanceSubscriptions[targetInstance];\n }\n\n // try to find another subscription for this instance and messageType\n const found =\n this._instanceSubscriptions[targetInstance] &&\n this._instanceSubscriptions[targetInstance].find(sub => sub.messageType === _messageType);\n\n if (!found) {\n promiseResults.push(\n new Promise((resolve, reject) => {\n this._socket.emit(\n 'clientUnsubscribe',\n targetInstance,\n messageType,\n (err: string | null, wasSubscribed: boolean) => {\n if (err) {\n reject(new Error(err));\n } else {\n resolve(wasSubscribed);\n }\n },\n );\n }),\n );\n }\n }\n } while (deleted && (!callback || !messageType));\n\n if (promiseResults.length) {\n return Promise.all(promiseResults).then((results: boolean[]) => results.find(result => result) || false);\n }\n\n return Promise.resolve(false);\n }\n\n /**\n * Send log to ioBroker log\n */\n log(text: string, level?: 'info' | 'debug' | 'warn' | 'error' | 'silly'): void {\n text && this._socket.emit('log', text, level || 'debug');\n }\n\n /**\n * Logout current user\n */\n logout(): Promise<void> {\n if (!this.connected) {\n return Promise.reject(new Error(NOT_CONNECTED));\n }\n\n return new Promise((resolve, reject) => {\n this._socket.emit('logout', (err: string | null) => (err ? reject(new Error(err)) : resolve()));\n });\n }\n\n /**\n * This is a special method for vis.\n * It is used to not send to server the changes about \"nothing_selected\" state\n *\n * @param id The state that has to be ignored by communication\n */\n setStateToIgnore(id?: string | null): void {\n this.ignoreState = id || '';\n }\n}\n"],"names":["step","toInt","hex","rgb","r","g","b","length","parseInt","substr","getElevation","color","overlayColor","elevation","overlay","int","Math","round","toString","getElevations","elevations","i","backgroundColor","Theme","type","overrides","_options$palette","_options$palette$prim","_palette$grey","_palette$grey2","_palette$text","_palette$action","_palette$text2","_palette$action2","_palette$text3","_palette$text4","_palette$action3","options","localOverrides","MuiAppBar","colorDefault","MuiLink","root","textTransform","transition","orange","MuiPaper","name","palette","mode","background","paper","default","primary","main","secondary","expert","text","disabled","dark","light","toolbar","height","saveToolbar","button","borderRadius","grey","theme","createTheme","undefined","components","MuiButton","variants","props","variant","style","getContrastText","borderColor","border","action","disabledBackground","alpha","hoverOpacity","printPrompt","console","log","loaderStyles","Loader","useEffect","window","document","getElementById","createElement","setAttribute","innerHTML","head","appendChild","size","themeName","themeType","React","className","backgroundImage","loadingBackgroundImage","loadingBackgroundColor","backgroundSize","loadingHideLogo","width","left","borderWidth","top","bottom","Router","Component","constructor","super","this","onHashChangedBound","onHashChanged","bind","componentDidMount","addEventListener","componentWillUnmount","removeEventListener","getLocation","hash","location","replace","parts","split","map","item","decodeURIComponent","error","tab","dialog","id","arg","doNavigate","clipboardToIE11Formatting","defaultMessage","copy","reselectPrevious","range","selection","mark","success","debug","_selection","_active","getSelection","rangeCount","active","activeElement","ranges","push","getRangeAt","tagName","toUpperCase","blur","removeAllRanges","forEach","addRange","focus","deselectCurrent","createRange","textContent","ariaHidden","all","position","clip","whiteSpace","userSelect","e","_options","stopPropagation","format","preventDefault","clipboardData","_window$clipboardData","_window$clipboardData2","warn","clearData","_format","setData","_e$clipboardData","_e$clipboardData2","body","selectNodeContents","execCommand","Error","err","message","copyKey","test","navigator","userAgent","prompt","removeRange","removeChild","I18n","setLanguage","lang","extendTranslations","words","prefix","wordsWithPrefix","Object","keys","key","_lang","_words","wordsOfOneLanguage","word","startsWith","translations","languageDictionary","en","de","ru","wordsOfOneLang","assign","_word","setTranslations","getLanguage","t","translation","w","unknownTranslations","includes","_disableWarning","wordEn","_len","arguments","args","Array","_key","i18nShow","filter","result","JSON","stringify","disableWarning","disable","sysLang","i18nDisableWarning","NAMESPACE","days","months","QUALITY_BITS","SIGNATURES","JVBERi0","R0lGODdh","R0lGODlh","iVBORw0KGgo","PHN2Zw","Qk1","AAABAA","Utils","CapitalWords","substring","toLowerCase","join","formatSeconds","seconds","days_","floor","hours","padStart","minutes","secondsStr","getObjectName","objects","settings","isDesc","_settings","_item$common","_text","language","common","textObj","desc","pos","lastIndexOf","trim","getObjectNameFromObj","obj","noTrim","_settings2","_item$common2","_item$common3","_id","getSettingsOrder","forEnumId","_common","prototype","hasOwnProperty","call","custom","user","subOrder","parse","order","getSettingsCustomURLs","_common2","subURLs","URLs","reorder","list","source","dest","from","removed","splice","getSettings","defaultEnabling","_common3","enabled","useCustom","icon","setSettings","s","useCommon","getIcon","alt","src","getObjectIcon","_obj2","_obj2$common","_obj","pathname","match","splitCamelCase","isUseBright","defaultValue","slice","getTimeString","parseFloat","Number","isNaN","secs","getWindDirection","angle","padding","num","setDataFormat","dateFormat","indexOf","date2string","now","m","a","year","find","y","day","mm","Date","abs","getTime","date","getDay","getDate","getMonth","renderTextWithA","start","index","href","target","rel","title","getSmartName","states","instanceId","noCommon","_obj$common2","_obj$common","smartName","getSmartNameFromObj","_obj$common3","_obj$common3$custom","enableSmartName","removeSmartName","updateSmartName","newSmartName","byON","smartType","nnn","native","_smartName","role","empty","nl","pl","it","fr","pt","es","uk","disableSmartName","copyToClipboard","getFileExtension","fileName","formatBytes","bytes","units","u","toFixed","getInvertedColor","invert","invertedColor","invertColor","bw","alfa","rs","gs","bd","color2rgb","rgb2lab","x","z","colorDistance","color1","color2","rgb1","rgb2","lab1","lab2","dltL","dltA","dltB","c1","sqrt","dltC","dltH","dltCkcsc","dltHkhsh","_toVal","mix","str","isArray","k","clsx","tmp","_i","getThemeName","vendorPrefix","_localStorage","localStorage","getItem","matchMedia","matches","getThemeType","setThemeName","setItem","toggleTheme","themes","getThemeNames","newTheme","parseQuery","query","part","attr","value","f","getParentId","p","pop","formatDate","dateObj","dd","getFullYear","getHours","getMinutes","getSeconds","getMilliseconds","formatTime","d","h","MDtext2link","openLink","url","open","MDgetTitle","_header$title","MDextractHeader","header","lines","attrs","line","pos_","MDremoveDocsify","doc","generateFile","json","el","encodeURIComponent","display","click","quality2text","quality","clone","object","getStates","_obj$common4","false","true","getSvg","response","fetch","blob","Promise","resolve","reader","FileReader","onload","_this$result","readAsDataURL","detectMimeType","base64","signature","isStableRepository","activeRepo","isStringInteger","isValidDate","getStyle","attr1","namespace","INSTANCES","FORBIDDEN_CHARS","styles","buttonIcon","marginRight","SaveCloseButtons","newReact","isIFrame","self","render","noTextOnButtons","buttonStyle","paddingLeft","right","dense","minHeight","Toolbar","Fab","changed","onClick","onSave","IconSave","marginLeft","IconClose","flexGrow","onClose","suppress","fontSize","suppressRoot","marginTop","DialogConfirm","dialogName","suppressQuestionMinutes","removeItem","state","handleOk","handleCancel","setTimeout","Dialog","maxWidth","fullWidth","event","reason","DialogTitle","DialogContent","DialogContentText","FormControlLabel","sx","control","Checkbox","checked","onChange","setState","label","suppressText","DialogActions","Button","autoFocus","startIcon","IconCheck","ok","cancel","DialogError","dictionary","GenericApp","_ref","_settings$instance","ConnectionClass","Connection","isWeb","io","port","SocketClient","sentryStarted","sentryInited","resizeTimer","onSystemConfigChanged","_this$_systemConfig","socket","systemLang","_systemConfig","expertMode","getExpertMode","onReceiveMessage","data","newThemeName","onThemeChange","onThemeChanged","onToggleExpertMode","onResize","clearTimeout","getWidth","search","instance","adapterName","themeInstance","selectedTab","selectedTabNum","errorText","connected","loaded","isConfigurationError","toast","bottomButtons","confirmClose","_alert","_alertType","_alertMessage","savedNative","encryptedFields","sentryDSN","socketUrl","protocol","hostname","alertDialogRendered","oldAlert","alert","showAlert","doNotLoadAllObjects","onProgress","progress","PROGRESS","CONNECTING","READY","onReady","subscribeObject","then","getSystemConfig","_secret","secret","getObject","async","_await$this$socket$ge","_this$_systemConfig2","waitPromise","instanceObj","sentryEnabled","getState","val","diag","version","disableDataReporting","host","Sentry","dsn","release","integrations","uuidObj","uuid","setUser","onPrepareLoad","encryptedNative","onConnectionReady","catch","onError","showError","renderAlertSnackbar","Snackbar","autoHideDuration","_e","SIZES","xs","sm","md","lg","xl","innerWidth","reverse","currentTheme","_newThemeName","_expertMode","_this$_systemConfig3","sessionStorage","encrypt","String","fromCharCode","charCodeAt","decrypt","selectTab","onPrepareSave","getExtendableInstances","instances","getObjectViewSystem","values","_instance$common","webExtendable","getIpAddresses","_this$common","ips","getHostByIp","ip4","ip","address","ip6","isClose","oldObj","_oldObj","setObject","reject","globalThis","parent","postMessage","renderToast","_this$props$classes","anchorOrigin","vertical","horizontal","ContentProps","IconButton","classes","close","$iframeDialog","renderError","getIsChanged","isChanged","onLoadConfig","newNative","setConfigurationError","renderSaveCloseButtons","isYes","_updateNativeValue","shift","updateNativeValue","cb","showToast","renderHelperDialogs","delButton","swatch","mt","boxShadow","cursor","verticalAlign","swatchDisabled","opacity","popover","textAlign","popoverList","closeButton","cover","textDense","mb","picker","iconButton","minWidth","ColorPicker","handleClick","displayColorPicker","anchorEl","currentTarget","handleClose","handleChange","getColor","isHex","oColor","rColor","rgb2hex","componentDidUpdate","_prevProps","prevState","renderCustomPalette","customPalette","flexWrap","_this$props$theme","Box","component","noInputField","TextField","margin","mr","IconDelete","boxSizing","barWidth","Menu","ChromePicker","onChangeComplete","_color","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","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","_r$result","contents","onLoad","readAsText","news","titleLang","upload","readme","float","win","IconHelp","IconUpload","IconDownload","MDUtils","text2link","getTitle","extractHeader","removeDocsify","onCopy","IconAdapter","IconChannel","rx","strokeWidth","stroke","ry","cy","cx","y2","x2","y1","x1","fillOpacity","strokeOpacity","IconCopy","IconDevice","IconDocument","IconDocumentReadOnly","IconState","IconClearFilter","container","TabContainer","_props$styles","Paper","Grid2","wrap","overflowAuto","TabContent","TabHeader","ICON_SIZE","SMALL_BUTTON_SIZE","COLOR_NAME_USERDATA","COLOR_NAME_ALIAS","COLOR_NAME_ERROR_DARK","COLOR_NAME_ERROR_LIGHT","COLOR_NAME_CONNECTED_DARK","COLOR_NAME_CONNECTED_LIGHT","COLOR_NAME_DISCONNECTED_DARK","COLOR_NAME_DISCONNECTED_LIGHT","toolbarButtons","switchColumnAuto","dialogColumns","dialogColumnsLabel","columnCustom","columnCustomEditable","columnCustom_center","columnCustom_left","columnCustom_right","width100","transparent_10","transparent_20","transparent_30","transparent_40","transparent_50","transparent_60","transparent_70","transparent_80","transparent_90","transparent_100","headerRow","buttonClearFilter","buttonClearFilterIcon","tableDiv","tableRow","tableRowLines","borderBottom","borderRight","tableRowNoDragging","tableRowAlias","tableRowAliasReadWrite","tableRowFocused","checkBox","cellId","cellIdSpan","cellIdIconFolder","cellIdIconDocument","cellIdIconOwn","cellIdTooltip","cellIdTooltipLink","cellCopyButton","cellCopyButtonInDetails","cellEditButton","cellName","cellNameWithDesc","cellNameDivDiv","cellDescription","cellIdAlias","cellIdAliasReadWriteDiv","cellIdAliasAlone","cellIdAliasReadWrite","cellType","cellRole","cellRoom","cellEnumParent","cellFunc","cellValue","cellValueButton","cellValueButtonFalse","cellAdapter","cellValueTooltip","cellValueText","cellValueFile","cellValueTooltipTitle","cellValueTooltipValue","cellValueTooltipImage","cellValueTooltipBoth","cellValueTooltipBox","cellValueTextUnit","cellValueTextState","cellValueTooltipCopy","cellValueTooltipEdit","cellButtons","cellButtonsButton","cellButtonsEmptyButton","cellButtonMinWidth","cellButtonsButtonAlone","cellButtonsButtonWithCustoms","cellButtonsButtonWithoutCustoms","cellButtonsValueButton","cellButtonsValueButtonCopy","cellButtonsValueButtonEdit","cellDetailsLine","cellDetailsName","filteredOut","filteredParentOut","filterInput","selectIcon","selectNone","headerCell","headerCellValue","headerCellInput","headerCellSelectItem","visibleButtons","grow","enumIconDiv","enumIcon","enumDialog","enumList","enumButton","enumCheckbox","buttonDiv","aclText","rightsObject","rightsState","textCenter","tooltipAccessControl","flexDirection","fontSizeTitle","draggable","nonDraggable","selectClearButton","iconDeviceConnected","iconDeviceDisconnected","iconDeviceError","resizeHandle","resizeHandleRight","borderRightStyle","invertedBackground","invertedBackgroundFlex","contextMenuEdit","contextMenuEditValue","contextMenuView","contextMenuCustom","contextMenuACL","contextMenuRoom","contextMenuRole","contextMenuDelete","contextMenuKeys","contextMenuWithSubMenu","ButtonIcon","filterObject","filterKeys","excludeTranslations","iteratee","copiedObject","walkThroughArray","isObject","walkThroughObject","excludeSystemRepositories","filteredObject","beautify","binarySearch","_start","_end","middle","getName","getSelectIdIconFromObjects","_id_","aIcon","applyFilter","filters","context","counter","customFilter","selectedTypes","_depth","_objects$filters$room","_objects$filters$room2","_objects$filters$func","_objects$filters$func2","room","members","func","_data$obj","_customFilter$common","_customFilter$common2","_customFilter$common3","_customFilter$common4","_customFilter$common5","filterOfCustom","customs","cst","fID","fName","visible","hasVisibleChildren","sumVisibility","hasVisibleParent","getVisibleItems","_result","_item$children","IconLink","IconData","getObjectTooltip","_data$obj2","_data$obj2$common","getIdFieldTooltip","buildTree","ids","currentPathArr","currentPath","currentPathLen","funcEnums","roomEnums","roles","types","enums","hasSomeCustoms","aliasesMap","cRoot","_common$adminUI","_obj$common$alias","supportCustoms","adminUI","alias","usedId","readId","read","writeId","write","repeat","_obj$common5","_obj$common6","_obj$common7","curPath","_cRoot","generated","hasCustoms","switch","move","_objects$a","_objects$a$common","_objects$b","_objects$b$common","aName","bName","_objects$a2","_objects$a2$common","_objects$b2","_objects$b2$common","findNode","_parts","_path","_level","found","findRoomsForObject","per","_info$objects$room","_common$members","ownEnums","findEnumsForObjectAsIds","enumName","funcs","_info$objects$info$en","_common$members2","findFunctionsForObject","pef","_info$objects$info$fu","_common$members3","formatValue","isFloatComma","texts","isCommon","fileViewer","v","parsedDate","isInteger","valText","valFull","unit","full","ack","lc","c","q","nbr","prepareSparkData","time","nm1","ITEM_IMAGES","channel","device","enum","IconEnum","chart","IconChart","config","IconConfig","group","schedule","IconSchedule","script","IconScript","SCREEN_WIDTHS","idWidth","fields","widths","buttons","changedFrom","qualityCode","timestamp","lastChange","objectsAlreadyLoaded","DEFAULT_FILTER","_NON_EXPERT_NAMESPACES","_classPrivateFieldLooseKey","ObjectBrowserClass","lastAppliedFilter","pausedSubscribes","subscribes","unsubscribeTimer","statesUpdateTimer","objectsUpdateTimer","filterTimer","adapterColumns","styleTheme","edit","customWidth","resizeTimeout","resizerNextName","resizerActiveName","resizerCurrentWidths","resizeLeft","resizerOldWidth","resizerMin","resizerNextMin","resizerOldWidthNext","resizerPosition","resizerActiveDiv","resizerNextDiv","storedWidths","defaultHistory","columnsVisibility","changedIds","contextMenu","recordStates","customColumnDialog","onContextMenu","showContextMenu","clientX","clientY","onStateChange","onObjectChangeFromWorker","events","newInnerState","filtered","processOnObjectChangeElement","afterObjectUpdated","onObjectChange","getEnumsForId","_this$objects$_id","_this$objects$_id$com","_this$objects$_id$com2","enumItem","mobile","_createAllEnums","objId","_oldObj$common","_oldObj$common$member","newObj","toolTipObjectCreating","selectedNonObject","_this$objects$id","_this$objects$id2","renderTooltipAccessControl","check","valueNum","arrayTooltipText","funcRenderStateObject","rights","ownerGroup","ownerUser","owner","resizerMouseMove","widthNext","scrollBarWidth","resizerMouseUp","resizerMouseDown","parentNode","dataset","_handle","previousElementSibling","handle","querySelector","nextElementSibling","offsetWidth","resizerReset","calculateColumnsVisibility","lastSelectedItemStr","selectFirst","lastSelectedItems","filterStr","defaultFilters","_sessionStorage","tableRef","createRef","filterRefs","visibleCols","columns","possibleCols","customDialog","router","pauseSubscribe","columnsStr","foldersFirst","columnsWidths","foldersFirstStr","statesView","objectStatesView","filterKey","focused","depth","expandAllVisible","editObjectDialog","editObjectAlias","viewFileDialog","showAliasEditor","roleDialog","columnsForAdmin","columnsSelectorShow","columnsAuto","columnsDialogTransparent","columnsEditCustomDialog","customColumnDialogValueChanged","showExportDialog","showAllExportOptions","linesEnabled","showDescription","noStatesByExportImport","beautifyJsonExport","excludeSystemRepositoriesFromExport","tooltipInfo","aliasMenu","categories","editObject","deleteObject","customConfig","copyState","editState","filter_id","filter_name","filter_type","filter_role","filter_room","filter_func","filter_custom","filterCustomsWithout","objectChangedByUser","objectChangedBy","objectChangedFrom","stateChangedBy","stateChangedFrom","deviceError","deviceDisconnected","deviceConnected","aclOwner_read_object","aclOwner_read_state","aclOwner_write_object","aclOwner_write_state","aclGroup_read_object","aclGroup_read_state","aclGroup_write_object","aclGroup_write_state","aclEveryone_read_object","aclEveryone_read_state","aclEveryone_write_object","aclEveryone_write_state","create","createBooleanState","createNumberState","createStringState","createState","createChannel","createDevice","createFolder","resizerCurrentWidthsStr","loadAllObjects","update","updating","objectsWorker","getObjects","moreObjects","systemConfig","defaultNewAcl","filterFunc","propsTypes","setObjectsReference","getAdditionalColumns","node","expandAllSelected","onAfterSelect","e1","isNonExpertId","_classPrivateFieldLooseBase","saveNamespace","isDouble","_this$state$selected","registerHandler","unregisterHandler","unsubscribeObject","pattern","unsubscribeState","showDeleteDialog","_item$children2","_obj$common8","onObjectDelete","dontDelete","refreshComponent","renderErrorDialog","toggleItem","multiSelect","_renderDefinedList","isLast","cols","_this$state$columns","ListItemButton","disableRipple","renderColumnsSelectorDialog","Switch","List","column","_this$state$columns2","getAdapters","parseObjectForAdmins","checkUnsubscribes","unsubscribe","_root","_partyId","adminColumns","aColumns","cColumns","objTypes","updateAliases","aliasId","_this$info","aliasesIds","_obj$common9","_obj$common9$alias","subscribe","subscribeState","isPause","onFilter","_name","current","filterRef","onFilterChanged","clearFilter","childNodes","isFilterEmpty","getFilterInput","filterName","_this$filterRefs$filt","_this$filterRefs$filt2","_this$filterRefs$filt3","underline","firstChild","_this$filterRefs$filt4","getFilterSelect","_this$filterRefs$name","_this$filterRefs$name2","_this$filterRefs$name3","hasIcons","inputProps","displayEmpty","_this$filterRefs$name4","newFilter","getFilterSelectRole","getFilterSelectRoom","_this$objects$id3","_this$objects$id3$com","_this$objects$id4","_this$objects$id4$com","getFilterSelectFunction","_this$objects$id5","_this$objects$id5$com","_this$objects$id6","_this$objects$id6$com","getFilterSelectType","getFilterSelectCustoms","onExpandAll","_root$children","onCollapseAll","expandDepth","_root$children2","collapseDepth","onExpandVisible","onStatesViewVisible","onCollapseVisible","loadObjects","def","_getSelectedIdsForExport","idDot","idLen","_exportObjects","isAll","_result$key","renderExportDialog","handleJsonUpload","_target$files","_e$target","getToolbar","allowObjectCreation","disableColumnSelector","IconColumns","Badge","badgeContent","badge","LooksOneIcon","TextFieldsIcon","objectAddBoolean","modalNewObj","AddIcon","objectImportExport","PublishIcon","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","fixAdminUI","noConfig","jsonConfig","materialize","jsonCustom","materializeTab","adminTab","pattern2RegEx","startsWithWildcard","endsWithWildcard","LegacyConnection","_waitForFirstConnectionResolve","_promises","firstConnect","waitForRestart","statesSubscribes","objectsSubscribes","filesSubscribes","onConnectionHandlers","onLogHandlers","loadTimer","loadCounter","ignoreState","simStates","autoSubscribes","autoSubscribeLog","ioTimeout","cmdTimeout","_instanceSubscriptions","doNotLoadACL","_waitForFirstConnection","admin5only","startSocket","iob","registerSocketOnLoad","scriptLoadCounter","_socket","parsed","URL","connect","on","noTimeout","getVersion","major","minor","patch","_authTimer","onPreConnect","emit","isOk","isSecure","reload","_subscribe","subscribed","authenticate","onLog","_err","operation","objectChange","stateChange","messageType","instanceMessage","fileChange","onCmdStdoutHandler","onCmdStderrHandler","exitCode","onCmdExitHandler","_isOk","onConnect","isCloud","isConnected","waitForFirstConnection","_getUserPermissions","getCompactSystemConfig","userLanguage","onLanguage","toSubscribe","cbs","reg","RegExp","getBinaryState","subscribeStateAsync","toUnsubscribe","regId","regFilePattern","filePattern","filePatterns","task","sourceInstance","callback","disableProgressUpdate","setBinaryState","getObjectsById","isEnable","requireLog","isEnabled","delObject","maintenance","delObjects","getAdapterInstances","getObjectView","adapters","_renameGroups","oldId","renameGroup","newName","groups","getGroups","groupsToRename","sendTo","command","extendObject","registerLogHandler","handler","unregisterLogHandler","registerConnectionHandler","unregisterConnectionHandler","registerCmdStdoutHandler","unregisterCmdStdoutHandler","registerCmdStderrHandler","unregisterCmdStderrHandler","registerCmdExitHandler","unregisterCmdExitHandler","getEnums","_enum","startkey","endkey","_res","rows","getObjectViewCustom","design","getCertificates","cert","certs","certificates","_cert","getLogs","linesNumber","getLogsFiles","delLogs","_data","folderName","getHosts","hosts","getUsers","users","getHostInfo","timeoutMs","getHostInfoShort","getRepository","repo","getInstalled","installed","rename","oldName","renameFile","cmdExec","cmd","cmdId","feature","supported","readBaseSettings","writeBaseSettings","restartController","getDiagData","typeOfDiag","getForeignStates","getForeignObjects","setSystemConfig","getRawSocket","getHistoryEx","stepIgnore","sessionId","changePassword","password","ipOrHostName","_host$native","_host$native$hardware","IPs4","family","IPs6","hardware","networkInterfaces","eth","encryptedText","serverName","getWebServerName","webName","getAdminVersion","chmodFile","entries","chownFile","fileExists","exists","getNotifications","category","notifications","clearNotifications","getIsEasyModeStrict","isStrict","getEasyMode","getCurrentUser","getCurrentSession","controller","AbortController","abort","signal","getRatings","ratings","getCurrentInstance","currentInstance","getCompactAdapters","compactAdapters","getAdaptersResetCache","getCompactInstances","compactInstances","getAdapternInstancesResetCache","getCompactInstalled","installedCompact","getCompactSystemRepositories","systemConfigPromise","getCompactRepository","repoCompact","getInstalledResetCache","getCompactHosts","hostsCompact","getUuid","_obj$native","subscribeOnInstance","targetInstance","unsubscribeFromInstance","deleted","promiseResults","_this$_instanceSubscr","_messageType","wasSubscribed","results","logout","setStateToIgnore"],"sourceRoot":""}