iobroker.admin 7.4.4 → 7.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -8
- package/adminWww/asset-manifest.json +37 -37
- package/adminWww/index.html +1 -1
- package/adminWww/static/js/1737.08641cc2.chunk.js +3 -0
- package/adminWww/static/js/1737.08641cc2.chunk.js.map +1 -0
- package/adminWww/static/js/1892.3c30ecff.chunk.js.map +1 -1
- package/adminWww/static/js/{288.20da45b9.chunk.js → 288.23e8413f.chunk.js} +2 -2
- package/adminWww/static/js/288.23e8413f.chunk.js.map +1 -0
- package/adminWww/static/js/2930.8e88fcf2.chunk.js.LICENSE.txt +1 -1
- package/adminWww/static/js/2930.8e88fcf2.chunk.js.map +1 -1
- package/adminWww/static/js/3363.a4c36649.chunk.js.map +1 -1
- package/adminWww/static/js/3834.d81ffc60.chunk.js +2 -0
- package/adminWww/static/js/3834.d81ffc60.chunk.js.map +1 -0
- package/adminWww/static/js/4289.cbde8e52.chunk.js +2 -0
- package/adminWww/static/js/4289.cbde8e52.chunk.js.map +1 -0
- package/adminWww/static/js/471.8a82d825.chunk.js.map +1 -1
- package/adminWww/static/js/4720.6112531a.chunk.js +2 -0
- package/adminWww/static/js/4720.6112531a.chunk.js.map +1 -0
- package/adminWww/static/js/5503.a4ce73d8.chunk.js +3 -0
- package/adminWww/static/js/5503.a4ce73d8.chunk.js.map +1 -0
- package/adminWww/static/js/5687.d7fa0a4e.chunk.js +2 -0
- package/adminWww/static/js/5687.d7fa0a4e.chunk.js.map +1 -0
- package/adminWww/static/js/{6361.48a28196.chunk.js → 6361.ec86271d.chunk.js} +2 -2
- package/adminWww/static/js/6361.ec86271d.chunk.js.map +1 -0
- package/adminWww/static/js/6603.ee9b0df5.chunk.js +3 -0
- package/adminWww/static/js/6603.ee9b0df5.chunk.js.map +1 -0
- package/adminWww/static/js/6853.ff130602.chunk.js +2 -0
- package/adminWww/static/js/6853.ff130602.chunk.js.map +1 -0
- package/adminWww/static/js/7137.7b5ca6b5.chunk.js.map +1 -1
- package/adminWww/static/js/7424.223daaa3.chunk.js +2 -0
- package/adminWww/static/js/7424.223daaa3.chunk.js.map +1 -0
- package/adminWww/static/js/{8144.ae502bba.chunk.js → 8144.5989b02c.chunk.js} +3 -3
- package/adminWww/static/js/8144.5989b02c.chunk.js.map +1 -0
- package/adminWww/static/js/8387.2cb15163.chunk.js.map +1 -1
- package/adminWww/static/js/9072.4505ce12.chunk.js +2 -0
- package/adminWww/static/js/9072.4505ce12.chunk.js.map +1 -0
- package/adminWww/static/js/9086.a4fdc813.chunk.js +2 -0
- package/adminWww/static/js/9086.a4fdc813.chunk.js.map +1 -0
- package/adminWww/static/js/9228.cf388444.chunk.js +3 -0
- package/adminWww/static/js/9228.cf388444.chunk.js.map +1 -0
- package/adminWww/static/js/9701.2178b9bd.chunk.js +2 -0
- package/adminWww/static/js/9701.2178b9bd.chunk.js.map +1 -0
- package/adminWww/static/js/9731.b09a7023.chunk.js +3 -0
- package/adminWww/static/js/{9731.f67b583c.chunk.js.LICENSE.txt → 9731.b09a7023.chunk.js.LICENSE.txt} +1 -1
- package/adminWww/static/js/9731.b09a7023.chunk.js.map +1 -0
- package/adminWww/static/js/main.a833ed54.js +2 -0
- package/adminWww/static/js/main.a833ed54.js.map +1 -0
- package/build-backend/main.js +1 -1
- package/build-backend/main.js.map +1 -1
- package/io-package.json +27 -27
- package/package.json +5 -5
- package/adminWww/static/js/288.20da45b9.chunk.js.map +0 -1
- package/adminWww/static/js/38.e125c16b.chunk.js +0 -3
- package/adminWww/static/js/38.e125c16b.chunk.js.map +0 -1
- package/adminWww/static/js/3834.2e04eb51.chunk.js +0 -2
- package/adminWww/static/js/3834.2e04eb51.chunk.js.map +0 -1
- package/adminWww/static/js/4289.e9a5790f.chunk.js +0 -2
- package/adminWww/static/js/4289.e9a5790f.chunk.js.map +0 -1
- package/adminWww/static/js/4720.4bbc23ec.chunk.js +0 -2
- package/adminWww/static/js/4720.4bbc23ec.chunk.js.map +0 -1
- package/adminWww/static/js/5503.751d48e4.chunk.js +0 -3
- package/adminWww/static/js/5503.751d48e4.chunk.js.map +0 -1
- package/adminWww/static/js/5687.c249e41f.chunk.js +0 -2
- package/adminWww/static/js/5687.c249e41f.chunk.js.map +0 -1
- package/adminWww/static/js/6361.48a28196.chunk.js.map +0 -1
- package/adminWww/static/js/6603.614b4df4.chunk.js +0 -3
- package/adminWww/static/js/6603.614b4df4.chunk.js.map +0 -1
- package/adminWww/static/js/6853.f9170a75.chunk.js +0 -2
- package/adminWww/static/js/6853.f9170a75.chunk.js.map +0 -1
- package/adminWww/static/js/7424.98e61818.chunk.js +0 -2
- package/adminWww/static/js/7424.98e61818.chunk.js.map +0 -1
- package/adminWww/static/js/7863.92e61020.chunk.js +0 -2
- package/adminWww/static/js/7863.92e61020.chunk.js.map +0 -1
- package/adminWww/static/js/8144.ae502bba.chunk.js.map +0 -1
- package/adminWww/static/js/9072.4eaaedc2.chunk.js +0 -2
- package/adminWww/static/js/9072.4eaaedc2.chunk.js.map +0 -1
- package/adminWww/static/js/9228.3ce3911c.chunk.js +0 -3
- package/adminWww/static/js/9228.3ce3911c.chunk.js.map +0 -1
- package/adminWww/static/js/9701.b2813984.chunk.js +0 -2
- package/adminWww/static/js/9701.b2813984.chunk.js.map +0 -1
- package/adminWww/static/js/9731.f67b583c.chunk.js +0 -3
- package/adminWww/static/js/9731.f67b583c.chunk.js.map +0 -1
- package/adminWww/static/js/main.11639e29.js +0 -2
- package/adminWww/static/js/main.11639e29.js.map +0 -1
- /package/adminWww/static/js/{38.e125c16b.chunk.js.LICENSE.txt → 1737.08641cc2.chunk.js.LICENSE.txt} +0 -0
- /package/adminWww/static/js/{5503.751d48e4.chunk.js.LICENSE.txt → 5503.a4ce73d8.chunk.js.LICENSE.txt} +0 -0
- /package/adminWww/static/js/{6603.614b4df4.chunk.js.LICENSE.txt → 6603.ee9b0df5.chunk.js.LICENSE.txt} +0 -0
- /package/adminWww/static/js/{8144.ae502bba.chunk.js.LICENSE.txt → 8144.5989b02c.chunk.js.LICENSE.txt} +0 -0
- /package/adminWww/static/js/{9228.3ce3911c.chunk.js.LICENSE.txt → 9228.cf388444.chunk.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static/js/4720.6112531a.chunk.js","mappings":"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","sources":["../../../dm-gui-components/src/TooltipButton.tsx","../../../dm-gui-components/src/Utils.tsx","../../../dm-gui-components/src/DeviceActionButton.tsx","../../../dm-gui-components/src/DeviceControl.tsx","../../../dm-gui-components/src/DeviceStatus.tsx","../../../dm-gui-components/src/JsonConfig.tsx","../../../dm-gui-components/src/DeviceImageUpload.tsx","../../../dm-gui-components/src/DeviceCard.tsx","../../../dm-gui-components/src/Communication.tsx","../../../dm-gui-components/src/InstanceActionButton.tsx","../../../dm-gui-components/src/DeviceList.tsx","../../../dm-gui-components/src/index.ts"],"sourcesContent":["import React from 'react';\nimport { IconButton, Tooltip, Typography } from '@mui/material';\n\ninterface TooltipButtonProps {\n tooltip?: string;\n label?: string;\n disabled?: boolean;\n Icon: React.JSX.Element | null;\n onClick?: () => void;\n}\n\nexport default function TooltipButton(props: TooltipButtonProps): React.JSX.Element {\n const { tooltip, label, disabled, Icon, onClick } = props;\n\n const text = !!label && (\n <Typography\n variant=\"button\"\n style={{ marginLeft: 4 }}\n >\n {label}\n </Typography>\n );\n\n if (tooltip) {\n return (\n <Tooltip\n title={tooltip}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <span>\n <IconButton\n onClick={onClick}\n disabled={disabled}\n size=\"small\"\n >\n {Icon}\n {text}\n </IconButton>\n </span>\n </Tooltip>\n );\n }\n\n return (\n <IconButton\n onClick={onClick}\n disabled={disabled}\n size=\"small\"\n >\n {Icon}\n {text}\n </IconButton>\n );\n}\n","import React from 'react';\n\nimport type { ControlBase } from '@iobroker/dm-utils/build/types/base';\nimport type { ActionBase } from '@iobroker/dm-utils/build/types/api';\nimport {\n Add,\n Article,\n Bluetooth,\n BluetoothDisabled,\n Delete,\n Edit,\n FastForward,\n FastRewind,\n Fluorescent,\n Group,\n Info,\n Lightbulb,\n Link as LinkIcon,\n LinkOff,\n NotListedLocation,\n Pause,\n Person,\n PlayArrow,\n Power,\n QrCode,\n QuestionMark,\n Refresh,\n Search,\n Settings,\n Stop,\n Visibility,\n WbIncandescent,\n Wifi,\n WifiFind,\n WifiOff,\n} from '@mui/icons-material';\n\nimport { I18n, Icon } from '@iobroker/adapter-react-v5';\n\n/**\n * Get Icon by font-awesome name. Do not use these name, use names from getIconByName\n *\n * @param icon font-awesome icon name\n * Only following font-awesome icons are supported:\n * - fa-trash-can, fa-trash\n * - fa-pen\n * - fa-redo-alt\n * - fa-plus\n * - fa-qrcode, qrcode\n * - fa-wifi\n * - fa-wifi-slash\n * - fa-bluetooth\n * - fa-bluetooth-slash\n * - fa-eye\n * - fa-search\n * - fa-unlink\n * - fa-link\n * - fa-search-location\n * - fa-play\n * - fa-stop\n * - fa-pause\n * @param color color of the icon\n */\nfunction getFaIcon(icon: string, color?: string): React.JSX.Element | null {\n const iconStyle = icon\n .split(' ')\n .map(s => s.trim())\n .filter(s => s !== 'fa-solid');\n\n if (iconStyle.includes('fa-trash-can') || iconStyle.includes('fa-trash')) {\n return <Delete style={{ color }} />;\n }\n if (iconStyle.includes('fa-pen')) {\n return <Edit style={{ color }} />;\n }\n if (iconStyle.includes('fa-redo-alt')) {\n return <Refresh style={{ color }} />;\n }\n if (iconStyle.includes('fa-plus')) {\n return <Add style={{ color }} />;\n }\n if (iconStyle.includes('fa-qrcode') || iconStyle.includes('qrcode')) {\n return <QrCode style={{ color }} />;\n }\n if (iconStyle.includes('fa-wifi')) {\n return <Wifi style={{ color }} />;\n }\n if (iconStyle.includes('fa-wifi-slash')) {\n return <WifiOff style={{ color }} />;\n }\n if (iconStyle.includes('fa-bluetooth')) {\n return <Bluetooth style={{ color }} />;\n }\n if (iconStyle.includes('fa-bluetooth-slash')) {\n return <BluetoothDisabled style={{ color }} />;\n }\n if (iconStyle.includes('fa-eye')) {\n return <Visibility style={{ color }} />;\n }\n if (iconStyle.includes('fa-search')) {\n return <Search style={{ color }} />;\n }\n if (iconStyle.includes('fa-unlink')) {\n return <LinkOff style={{ color }} />;\n }\n if (iconStyle.includes('fa-link')) {\n return <LinkIcon style={{ color }} />;\n }\n if (iconStyle.includes('fa-search-location')) {\n return <NotListedLocation style={{ color }} />;\n }\n if (iconStyle.includes('fa-play')) {\n return <PlayArrow style={{ color }} />;\n }\n if (iconStyle.includes('fa-stop')) {\n return <Stop style={{ color }} />;\n }\n if (iconStyle.includes('fa-pause')) {\n return <Pause style={{ color }} />;\n }\n return <QuestionMark style={{ color }} />;\n}\n\n/**\n * Get Icon by name or by action\n *\n * @param name action name\n * possible action or icon names are\n * - edit, rename\n * - delete\n * - refresh\n * - newDevice, new, add\n * - discover, search\n * - unpairDevice, unpair\n * - pairDevice, pair\n * - identify\n * - play\n * - stop\n * - pause\n * - forward, next\n * - rewind, previous\n * - lamp, light\n * - backlight\n * - dimmer\n * - socket\n * - settings\n * - users, group\n * - user\n * - qrcode\n * - identify\n * - info\n * - lines\n * @param altName icon name\n * @param color color of the icon\n */\nfunction getIconByName(name: string, altName?: string, color?: string): React.JSX.Element | null {\n if (name === 'edit' || name === 'rename' || altName === 'edit' || altName === 'rename') {\n return <Edit style={{ color }} />;\n }\n if (name === 'delete' || altName === 'delete') {\n return <Delete style={{ color }} />;\n }\n if (name === 'refresh' || altName === 'refresh') {\n return <Refresh style={{ color }} />;\n }\n if (\n name === 'newDevice' ||\n name === 'new' ||\n name === 'add' ||\n altName === 'newDevice' ||\n altName === 'new' ||\n altName === 'add'\n ) {\n return <Add style={{ color }} />;\n }\n if (name === 'discover' || name === 'search' || altName === 'discover' || altName === 'search') {\n return <Search style={{ color }} />;\n }\n if (name === 'unpairDevice' || name === 'unpair' || altName === 'unpairDevice' || altName === 'unpair') {\n return <LinkOff style={{ color }} />;\n }\n if (name === 'pairDevice' || name === 'pair' || altName === 'pairDevice' || altName === 'pair') {\n return <LinkIcon style={{ color }} />;\n }\n if (name === 'identify' || altName === 'identify') {\n return <NotListedLocation style={{ color }} />;\n }\n if (name === 'play' || altName === 'play') {\n return <PlayArrow style={{ color }} />;\n }\n if (name === 'stop' || altName === 'stop') {\n return <Stop style={{ color }} />;\n }\n if (name === 'pause' || altName === 'pause') {\n return <Pause style={{ color }} />;\n }\n if (name === 'forward' || name === 'next' || altName === 'forward' || altName === 'next') {\n return <FastForward style={{ color }} />;\n }\n if (name === 'rewind' || name === 'previous' || altName === 'rewind' || altName === 'previous') {\n return <FastRewind style={{ color }} />;\n }\n if (name === 'lamp' || name === 'light' || altName === 'lamp' || altName === 'light') {\n return <Lightbulb style={{ color }} />;\n }\n if (name === 'backlight' || altName === 'backlight') {\n return <Fluorescent style={{ color }} />;\n }\n if (name === 'dimmer' || altName === 'dimmer') {\n return <WbIncandescent style={{ color }} />;\n }\n if (name === 'socket' || altName === 'socket') {\n return <Power style={{ color }} />;\n }\n if (name === 'settings' || altName === 'settings') {\n return <Settings style={{ color }} />;\n }\n if (name === 'users' || name === 'group' || altName === 'users' || altName === 'group') {\n return <Group style={{ color }} />;\n }\n if (name === 'user' || altName === 'user') {\n return <Person style={{ color }} />;\n }\n if (name === 'qrcode' || altName === 'qrcode') {\n return <QrCode style={{ color }} />;\n }\n if (name === 'identify' || altName === 'identify') {\n return <WifiFind style={{ color }} />;\n }\n if (name === 'info' || altName === 'info') {\n return <Info style={{ color }} />;\n }\n if (name === 'lines' || altName === 'lines') {\n return <Article style={{ color }} />;\n }\n return <QuestionMark style={{ color }} />;\n}\n\nexport function renderControlIcon(\n action: ControlBase,\n colors?: { primary: string; secondary: string },\n value?: string | number | boolean | null,\n): React.JSX.Element | null {\n if (!action) {\n return null;\n }\n\n let color = (value && action.colorOn) || action.color || (action.state ? 'primary' : 'inherit');\n\n if (colors) {\n if (color === 'primary') {\n color = colors.primary;\n } else if (color === 'secondary') {\n color = colors.secondary;\n }\n }\n\n if (action.icon?.startsWith('fa-') || action.icon?.startsWith('fas')) {\n return getFaIcon(action.icon, color);\n }\n if (value && action.iconOn?.startsWith('data:image')) {\n return (\n <Icon\n src={action.iconOn}\n style={{ color }}\n />\n );\n }\n if (action.icon?.startsWith('data:image')) {\n return (\n <Icon\n src={action.icon}\n style={{ color }}\n />\n );\n }\n return getIconByName(action.id, action.icon, color);\n}\n\nexport function renderActionIcon(action: ActionBase): React.JSX.Element | null {\n if (!action) {\n return null;\n }\n\n if (action.icon?.startsWith('fa-') || action.icon?.startsWith('fas')) {\n return getFaIcon(action.icon, action.color);\n }\n if (action.icon?.startsWith('data:image')) {\n return (\n <Icon\n src={action.icon}\n style={{ color: action.color }}\n />\n );\n }\n return getIconByName(action.id, action.icon, action.color);\n}\n\nlet language: ioBroker.Languages;\n\n/**\n * Get Translation\n */\nexport function getTranslation(\n /** Text to translate */\n text: ioBroker.StringOrTranslated,\n noTranslation?: boolean,\n): string {\n language = language || I18n.getLanguage();\n\n if (typeof text === 'object') {\n return text[language] || text.en;\n }\n\n return noTranslation ? text : I18n.t(text);\n}\n","import React from 'react';\n\nimport type { ActionBase, DeviceAction } from '@iobroker/dm-utils';\nimport TooltipButton from './TooltipButton';\nimport { renderActionIcon, getTranslation } from './Utils';\n\ninterface DeviceActionButtonProps {\n deviceId: string;\n action: DeviceAction;\n refresh: () => void;\n deviceHandler: (deviceId: string, action: ActionBase, refresh: () => void) => () => void;\n disabled?: boolean;\n}\n\nexport default function DeviceActionButton(props: DeviceActionButtonProps): React.JSX.Element {\n const { deviceId, action, refresh, deviceHandler, disabled } = props;\n\n const icon = renderActionIcon(action);\n\n const tooltip = getTranslation(action.description ?? '') || (icon ? null : action.id);\n\n return (\n <TooltipButton\n tooltip={tooltip || undefined}\n disabled={disabled || action.disabled}\n Icon={icon}\n onClick={deviceHandler(deviceId, action, refresh)}\n />\n );\n}\n","import React, { Component, type JSX } from 'react';\nimport { Button, Fab, Switch } from '@mui/material';\n\nimport type { Connection } from '@iobroker/adapter-react-v5';\nimport type { ControlBase, ControlState, DeviceControl } from '@iobroker/dm-utils';\n\nimport { renderControlIcon, getTranslation } from './Utils';\n\ninterface DeviceControlProps {\n deviceId: string;\n /** Control object */\n control: DeviceControl;\n socket: Connection;\n /** Control handler to set the state */\n controlHandler: (\n deviceId: string,\n control: ControlBase,\n state: ControlState,\n ) => () => Promise<ioBroker.State | null>;\n /** Control handler to read the state */\n controlStateHandler: (deviceId: string, control: ControlBase) => () => Promise<ioBroker.State | null>;\n colors: { primary: string; secondary: string };\n disabled?: boolean;\n}\n\ninterface DeviceControlState {\n value?: ControlState;\n ts?: number;\n}\n\n/**\n * Device Control component\n */\nexport default class DeviceControlComponent extends Component<DeviceControlProps, DeviceControlState> {\n constructor(props: DeviceControlProps) {\n super(props);\n this.state = {\n value: props.control.state?.val,\n ts: props.control.state?.ts,\n };\n }\n\n async componentDidMount(): Promise<void> {\n if (this.props.control.stateId) {\n const mayBePromise = this.props.socket.subscribeState(this.props.control.stateId, this.stateHandler);\n if (mayBePromise instanceof Promise) {\n await mayBePromise;\n }\n }\n }\n\n stateHandler = async (id: string, state: ioBroker.State): Promise<void> => {\n if (id === this.props.control.stateId && state) {\n // request new state\n const newState: ioBroker.State | null = await this.props.controlStateHandler(\n this.props.deviceId,\n this.props.control,\n )();\n if (newState?.ts && (!this.state.ts || newState.ts > this.state.ts)) {\n this.setState({\n value: newState.val,\n ts: newState.ts,\n });\n }\n }\n };\n\n componentWillUnmount(): void {\n if (this.props.control.stateId) {\n this.props.socket.unsubscribeState(this.props.control.stateId, this.stateHandler);\n }\n }\n\n static getDerivedStateFromProps(\n props: DeviceControlProps,\n state: DeviceControlState,\n ): Partial<DeviceControlState> | null {\n if (props.control.state?.ts && (!state.ts || props.control.state?.ts > state.ts)) {\n return {\n value: props.control.state.val,\n ts: props.control.state.ts,\n };\n }\n\n return null;\n }\n\n async sendControl(deviceId: string, control: ControlBase, value: ControlState): Promise<void> {\n const result = await this.props.controlHandler(deviceId, control, value)();\n if (result?.ts && (!this.state.ts || result?.ts > this.state.ts)) {\n this.setState({\n value: result.val,\n ts: result.ts,\n });\n }\n }\n\n renderButton(): JSX.Element {\n const tooltip = getTranslation(this.props.control.description ?? '');\n const icon = renderControlIcon(this.props.control, this.props.colors, this.state.value);\n\n if (!this.props.control.label) {\n return (\n <Fab\n size=\"small\"\n disabled={this.props.disabled}\n title={tooltip}\n onClick={() => this.sendControl(this.props.deviceId, this.props.control, true)}\n >\n {icon}\n </Fab>\n );\n }\n return (\n <Button\n disabled={this.props.disabled}\n title={tooltip}\n onClick={() => this.sendControl(this.props.deviceId, this.props.control, true)}\n startIcon={icon}\n >\n {getTranslation(this.props.control.label)}\n </Button>\n );\n }\n\n renderSwitch(): JSX.Element {\n const tooltip = getTranslation(this.props.control.description ?? '');\n // const icon = renderIcon(this.props.control, this.props.colors, this.state.value);\n\n return (\n <Switch\n disabled={this.props.disabled}\n title={tooltip}\n checked={!!this.state.value}\n onChange={e => this.sendControl(this.props.deviceId, this.props.control, e.target.checked)}\n />\n );\n }\n\n getColor(): string | undefined {\n let color: string | undefined;\n if (this.state.value) {\n color = this.props.control.colorOn || 'primary';\n } else if (this.props.control.type === 'switch') {\n color = this.props.control.color;\n }\n if (color === 'primary') {\n return this.props.colors.primary;\n }\n if (color === 'secondary') {\n return this.props.colors.secondary;\n }\n return color;\n }\n\n // TODO: implement the following render methods\n // eslint-disable-next-line react/no-unused-class-component-methods,class-methods-use-this\n renderSelect(): JSX.Element | null {\n return null;\n }\n\n // eslint-disable-next-line react/no-unused-class-component-methods,class-methods-use-this\n renderSlider(): JSX.Element | null {\n return null;\n }\n\n // eslint-disable-next-line react/no-unused-class-component-methods,class-methods-use-this\n renderColor(): JSX.Element | null {\n return null;\n }\n\n renderIcon(): JSX.Element {\n const tooltip = getTranslation(this.props.control.description ?? '');\n const icon = renderControlIcon(this.props.control, this.props.colors, this.state.value);\n const color = this.getColor();\n const style: React.CSSProperties | undefined =\n color === this.props.colors.primary || color === this.props.colors.secondary ? {} : { color };\n const colorProps =\n color === this.props.colors.primary\n ? 'primary'\n : color === this.props.colors.secondary\n ? 'secondary'\n : undefined;\n\n if (!this.props.control.label) {\n style.width = 34;\n style.height = 34;\n style.minHeight = 34;\n\n return (\n <Fab\n disabled={this.props.disabled}\n size=\"small\"\n title={tooltip}\n color={colorProps}\n style={style}\n onClick={() => this.sendControl(this.props.deviceId, this.props.control, !this.state.value)}\n >\n {icon}\n </Fab>\n );\n }\n return (\n <Button\n disabled={this.props.disabled}\n title={tooltip}\n color={colorProps}\n style={style}\n onClick={() => this.sendControl(this.props.deviceId, this.props.control, !this.state.value)}\n startIcon={icon}\n >\n {getTranslation(this.props.control.label)}\n </Button>\n );\n }\n\n render(): JSX.Element {\n if (this.props.control.type === 'button') {\n return this.renderButton();\n }\n\n if (this.props.control.type === 'icon') {\n return this.renderIcon();\n }\n\n if (this.props.control.type === 'switch') {\n return this.renderSwitch();\n }\n\n return <div style={{ color: 'red' }}>{this.props.control.type}</div>;\n }\n}\n","import React from 'react';\nimport { Tooltip } from '@mui/material';\n\nimport {\n Link as LinkIcon,\n LinkOff as LinkOffIcon,\n NetworkCheck as NetworkCheckIcon,\n Battery20 as Battery20Icon,\n Battery30 as Battery30Icon,\n Battery50 as Battery50Icon,\n Battery60 as Battery60Icon,\n Battery80 as Battery80Icon,\n Battery90 as Battery90Icon,\n BatteryFull as BatteryFullIcon,\n BatteryAlert as BatteryAlertIcon,\n Warning as WarningIcon,\n BatteryCharging50 as BatteryCharging50Icon,\n} from '@mui/icons-material';\n\nimport type { DeviceStatus } from '@iobroker/dm-utils';\n\nimport { getTranslation } from './Utils';\n\nconst styles: Record<string, React.CSSProperties> = {\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\ninterface DeviceStatusProps {\n status: DeviceStatus | null;\n}\n/**\n * Device Status component\n *\n * @param params - Parameters\n * @param params.status - Status object, e.g. { connection: 'connected', battery: 100, rssi: -50 }\n */\nexport default function DeviceStatus(params: DeviceStatusProps): React.JSX.Element | null {\n if (!params.status) {\n return null;\n }\n\n let status: DeviceStatus;\n\n if (typeof params.status === 'string') {\n status = {\n connection: params.status,\n };\n } else {\n status = params.status;\n }\n\n const iconStyleOK = {\n fill: '#00ac00',\n };\n const iconStyleNotOK = {\n fill: '#ff0000',\n };\n const iconStyleWarning = {\n fill: '#ff9900',\n };\n\n let batteryIconTooltip: React.ReactNode = null;\n if (typeof status.battery === 'number') {\n if (status.battery >= 96 && status.battery <= 100) {\n batteryIconTooltip = <BatteryFullIcon style={iconStyleOK} />;\n } else if (status.battery >= 90 && status.battery <= 95) {\n batteryIconTooltip = <Battery90Icon style={iconStyleOK} />;\n } else if (status.battery >= 80 && status.battery <= 89) {\n batteryIconTooltip = <Battery80Icon style={iconStyleOK} />;\n } else if (status.battery >= 60 && status.battery <= 79) {\n batteryIconTooltip = <Battery60Icon style={iconStyleOK} />;\n } else if (status.battery >= 50 && status.battery <= 59) {\n batteryIconTooltip = <Battery50Icon style={iconStyleOK} />;\n } else if (status.battery >= 30 && status.battery <= 49) {\n batteryIconTooltip = <Battery30Icon style={iconStyleOK} />;\n } else if (status.battery >= 20 && status.battery <= 29) {\n batteryIconTooltip = <Battery20Icon style={iconStyleNotOK} />;\n } else {\n batteryIconTooltip = <BatteryAlertIcon style={iconStyleNotOK} />;\n }\n }\n\n return (\n <div style={{ display: 'flex', alignItems: 'center' }}>\n {status.connection === 'connected' && (\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <Tooltip\n title={getTranslation('connectedIconTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <LinkIcon style={iconStyleOK} />\n </div>\n </Tooltip>\n </div>\n )}\n\n {status.connection === 'disconnected' && (\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <Tooltip\n title={getTranslation('disconnectedIconTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <LinkOffIcon style={iconStyleNotOK} />\n </div>\n </Tooltip>\n </div>\n )}\n\n {status.rssi && (\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <Tooltip\n title=\"RSSI\"\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <NetworkCheckIcon />\n <p style={{ fontSize: 'small', margin: 0 }}>{status.rssi}</p>\n </div>\n </Tooltip>\n </div>\n )}\n\n {typeof status.battery === 'number' && (\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {batteryIconTooltip}\n <p style={{ fontSize: 'small', margin: 0 }}>{status.battery}%</p>\n </div>\n </Tooltip>\n </div>\n )}\n\n {typeof status.battery === 'string' && (\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {status.battery === 'charging' ? <BatteryCharging50Icon /> : <BatteryFullIcon />}\n {status.battery !== 'charging' ? (\n status.battery.includes('V') || status.battery.includes('mV') ? (\n <p style={{ fontSize: 'small', margin: 0 }}>{status.battery}</p>\n ) : (\n <p style={{ fontSize: 'small', margin: 0 }}>\n <span style={{ marginRight: 4 }}>{status.battery}</span>\n mV\n </p>\n )\n ) : null}\n </div>\n </Tooltip>\n </div>\n )}\n\n {typeof status.battery === 'boolean' && (\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {status.battery ? (\n <BatteryFullIcon style={iconStyleOK} />\n ) : (\n <BatteryAlertIcon style={iconStyleNotOK} />\n )}\n </div>\n </Tooltip>\n </div>\n )}\n\n {status.warning && (\n <div style={{ display: 'flex', alignItems: 'center' }}>\n {typeof status.warning === 'string' || typeof status.warning === 'object' ? (\n <Tooltip\n title={getTranslation(status.warning)}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <WarningIcon style={iconStyleWarning} />\n </div>\n </Tooltip>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <WarningIcon style={iconStyleWarning} />\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport type { Connection, AdminConnection, ThemeName, ThemeType, IobTheme } from '@iobroker/adapter-react-v5';\nimport { JsonConfigComponent, type ConfigItemPanel, type ConfigItemTabs } from '@iobroker/json-config';\n\ninterface JsonConfigDmProps {\n instanceId: string;\n socket: Connection;\n schema: ConfigItemPanel | ConfigItemTabs;\n data: Record<string, any>;\n onChange: (data: Record<string, any>) => void;\n themeName: ThemeName;\n themeType: ThemeType;\n theme: IobTheme;\n isFloatComma?: boolean;\n dateFormat?: string;\n expertMode?: boolean;\n}\n\nexport default function JsonConfig(props: JsonConfigDmProps): React.JSX.Element | null {\n const { instanceId, socket, schema, data, onChange } = props;\n const [error, setError] = useState(false);\n\n if (schema === undefined) {\n return null;\n }\n\n const [adapterName, instance] = instanceId.split('.', 2);\n\n return (\n <>\n {error && <div>{error}</div>}\n <JsonConfigComponent\n expertMode={props.expertMode}\n socket={socket as any as AdminConnection}\n adapterName={adapterName}\n instance={parseInt(instance, 10)}\n schema={schema}\n data={data}\n onError={setError}\n onChange={(_data: Record<string, any>) => onChange(_data)}\n embedded\n themeName={props.themeName}\n themeType={props.themeType}\n theme={props.theme}\n isFloatComma={\n props.isFloatComma === undefined\n ? !!props.socket.systemConfig?.common.isFloatComma\n : props.isFloatComma\n }\n dateFormat={\n props.dateFormat === undefined\n ? (props.socket.systemConfig?.common.dateFormat as string)\n : props.dateFormat\n }\n />\n </>\n );\n\n /*\n JSON adapter config:\n className={classes.scroll}\n socket={socket}\n theme={this.props.theme}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n adapterName={this.props.adapterName}\n instance={this.props.instance}\n isFloatComma={this.props.isFloatComma}\n dateFormat={this.props.dateFormat}\n schema={this.state.schema}\n common={this.state.common}\n data={this.state.data}\n updateData={this.state.updateData}\n onError={(error) => this.setState({ error })}\n onChange={(data, changed) => this.setState({ data, changed })}\n customs={{ configCustomEasyAccess: ConfigCustomEasyAccess }}\n Object custom:\n instanceObj={instanceObj}\n customObj={customObj}\n custom={true}\n className={ '' }\n adapterName={adapter}\n instance={parseInt(instance.split('.').pop(), 10) || 0}\n socket={this.props.socket}\n theme={this.props.theme}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n multiEdit={this.props.objectIDs.length > 1}\n\n schema={this.jsonConfigs[adapter].json}\n data={data}\n onError={error =>\n this.setState({error}, () => this.props.onError && this.props.onError(error))}\n onValueChange={(attr, value) => {\n console.log(attr + ' => ' + value);\n const newValues = JSON.parse(JSON.stringify(this.state.newValues));\n newValues[instance] = newValues[instance] || {};\n if (this.commonConfig[instance][attr] === value) {\n delete newValues[instance][attr];\n if (!Object.keys(newValues[instance]).length) {\n delete newValues[instance];\n }\n } else {\n newValues[instance][attr] = value;\n }\n this.setState({newValues, hasChanges: this.isChanged(newValues)}, () =>\n this.props.onChange && this.props.onChange(this.state.hasChanges));\n }}\n */\n}\n","import React, { type ChangeEvent, type ChangeEventHandler } from 'react';\nimport type { Connection } from '@iobroker/adapter-react-v5';\n\ninterface DeviceImageUploadProps {\n socket: Connection;\n manufacturer?: string;\n model?: string;\n deviceId: string;\n onImageSelect: (image: string) => void;\n uploadImagesToInstance: string;\n}\n\nfunction DeviceImageUpload(params: DeviceImageUploadProps): React.JSX.Element | null {\n const { socket, manufacturer, model, deviceId, onImageSelect, uploadImagesToInstance } = params;\n\n const handleImageUpload: ChangeEventHandler<HTMLInputElement> = (event: ChangeEvent<HTMLInputElement>): void => {\n const target = event.target as HTMLInputElement;\n const files: FileList | null = target.files;\n if (!files || files.length === 0) {\n return;\n }\n\n const file = files[0];\n\n if (file) {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent<FileReader>): void => {\n if (!e.target || !e.target.result) {\n return;\n }\n\n const img = new Image();\n img.src = e.target.result as string;\n\n img.onload = async () => {\n const maxWidth = 50;\n const maxHeight = 50;\n let width = img.width;\n let height = img.height;\n\n if (width > height) {\n if (width > maxWidth) {\n height *= maxWidth / width;\n width = maxWidth;\n }\n } else if (height > maxHeight) {\n width *= maxHeight / height;\n height = maxHeight;\n }\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (ctx) {\n canvas.width = width;\n canvas.height = height;\n ctx.drawImage(img, 0, 0, width, height);\n\n const resizedImage = canvas.toDataURL('image/webp');\n\n // Build the file name from a manufacturer and model, if not available, use device id\n const fileName = `${manufacturer ? `${manufacturer}_` : ''}${model || deviceId}`;\n const base64Data = resizedImage.replace(/^data:image\\/webp;base64,/, '');\n const response = await socket.writeFile64(uploadImagesToInstance, fileName, base64Data);\n console.log(`saveImage response: ${JSON.stringify(response)}`);\n\n if (onImageSelect) {\n onImageSelect(resizedImage);\n }\n }\n };\n };\n\n reader.readAsDataURL(file);\n }\n };\n\n const imageUploadButtonStyle: React.CSSProperties = {\n // make the button invisible but still clickable\n opacity: 0,\n position: 'absolute',\n width: '45px',\n height: '45px',\n zIndex: 3,\n };\n\n return (\n <div>\n <input\n style={imageUploadButtonStyle}\n type=\"file\"\n accept=\"image/*\"\n onChange={handleImageUpload}\n />\n </div>\n );\n}\n\nexport default DeviceImageUpload;\n","import React, { Component, type JSX } from 'react';\n\nimport {\n Button,\n Typography,\n Dialog,\n DialogActions,\n DialogContent,\n IconButton,\n Fab,\n DialogTitle,\n Card,\n CardActions,\n CardHeader,\n CardContent,\n Paper,\n Box,\n} from '@mui/material';\n\nimport { MoreVert as MoreVertIcon, VideogameAsset as ControlIcon, Close as CloseIcon } from '@mui/icons-material';\n\nimport {\n Utils,\n type Connection,\n I18n,\n type ThemeName,\n type ThemeType,\n type IobTheme,\n IconDeviceType,\n} from '@iobroker/adapter-react-v5';\nimport type { DeviceDetails, DeviceInfo, ActionBase, ControlBase, ControlState } from '@iobroker/dm-utils';\n\nimport DeviceActionButton from './DeviceActionButton';\nimport DeviceControlComponent from './DeviceControl';\nimport DeviceStatusComponent from './DeviceStatus';\nimport JsonConfig from './JsonConfig';\nimport DeviceImageUpload from './DeviceImageUpload';\nimport { getTranslation } from './Utils';\nimport type { ConfigItemPanel, ConfigItemTabs } from '@iobroker/json-config';\n\nfunction NoImageIcon(props: { style?: React.CSSProperties; className?: string }): JSX.Element {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"24\"\n height=\"24\"\n style={props.style}\n className={props.className}\n >\n <path\n fill=\"currentColor\"\n d=\"M21.9,21.9l-8.49-8.49l0,0L3.59,3.59l0,0L2.1,2.1L0.69,3.51L3,5.83V19c0,1.1,0.9,2,2,2h13.17l2.31,2.31L21.9,21.9z M5,18 l3.5-4.5l2.5,3.01L12.17,15l3,3H5z M21,18.17L5.83,3H19c1.1,0,2,0.9,2,2V18.17z\"\n />\n </svg>\n );\n}\n\ninterface DeviceCardProps {\n title?: string;\n /* Device ID */\n id: string;\n device: DeviceInfo;\n instanceId: string;\n socket: Connection;\n /* Instance, where the images should be uploaded to */\n uploadImagesToInstance?: string;\n deviceHandler: (deviceId: string, action: ActionBase, refresh: () => void) => () => void;\n controlHandler: (\n deviceId: string,\n control: ControlBase,\n state: ControlState,\n ) => () => Promise<ioBroker.State | null>;\n controlStateHandler: (deviceId: string, control: ControlBase) => () => Promise<ioBroker.State | null>;\n smallCards?: boolean;\n alive: boolean;\n themeName: ThemeName;\n themeType: ThemeType;\n theme: IobTheme;\n isFloatComma: boolean;\n dateFormat: string;\n}\n\nfunction getText(text: ioBroker.StringOrTranslated | undefined): string | undefined {\n if (typeof text === 'object') {\n return text[I18n.getLanguage()] || text.en;\n }\n\n return text;\n}\n\ninterface DeviceCardState {\n open: boolean;\n details: DeviceDetails | null;\n data: Record<string, any>;\n icon: string | undefined;\n showControlDialog: boolean;\n}\n\n/**\n * Device Card Component\n */\nclass DeviceCard extends Component<DeviceCardProps, DeviceCardState> {\n constructor(props: DeviceCardProps) {\n super(props);\n\n this.state = {\n open: false,\n details: null,\n data: {},\n icon: props.device.icon,\n showControlDialog: false,\n };\n }\n\n async fetchIcon(): Promise<void> {\n if (!this.props.device.icon) {\n const lang = I18n.getLanguage();\n const manufacturer =\n this.props.device.manufacturer && typeof this.props.device.manufacturer === 'object'\n ? this.props.device.manufacturer[lang] || this.props.device.manufacturer.en\n : this.props.device.manufacturer;\n const model =\n this.props.device.model && typeof this.props.device.model === 'object'\n ? this.props.device.model[lang] || this.props.device.model.en\n : this.props.device.model;\n\n // try to load the icon from file storage\n const fileName = `${manufacturer ? `${manufacturer}_` : ''}${model || this.props.device.id}`;\n\n try {\n const file = await this.props.socket.readFile(\n this.props.instanceId.replace('system.adapter.', ''),\n `${fileName}.webp`,\n true,\n );\n if (file) {\n this.setState({ icon: `data:image/${file.mimeType},${file.file}` });\n } else {\n this.setState({ icon: '' });\n }\n // const response = await fetch(url);\n // if (response.ok) {\n // const blob = await response.blob();\n // const reader = new FileReader();\n // reader.onloadend = () => {\n // setIcon(reader.result);\n // };\n // reader.readAsDataURL(blob);\n // } else {\n // throw new Error('Response not ok');\n // }\n } catch {\n if (this.state.icon) {\n this.setState({ icon: '' });\n }\n }\n }\n }\n\n componentDidMount(): void {\n this.fetchIcon().catch(e => console.error(e));\n }\n\n /**\n * Load the device details\n */\n async loadDetails(): Promise<void> {\n console.log(`Loading device details for ${this.props.device.id}... from ${this.props.instanceId}`);\n const details: DeviceDetails | null = await this.props.socket.sendTo(\n this.props.instanceId,\n 'dm:deviceDetails',\n this.props.device.id,\n );\n console.log(`Got device details for ${this.props.device.id}:`, details);\n this.setState({ details, data: details?.data || {} });\n }\n\n /**\n * Refresh the device details\n */\n refresh = (): void => {\n this.setState({ details: null });\n this.loadDetails().catch(console.error);\n };\n\n /**\n * Copy the device ID to the clipboard\n */\n copyToClipboard = (): void => {\n const textToCopy = this.props.device.id;\n Utils.copyToClipboard(textToCopy);\n alert(`${getTranslation('copied')} ${textToCopy} ${getTranslation('toClipboard')}!`);\n };\n\n renderDialog(): JSX.Element | null {\n if (!this.state.open || !this.state.details) {\n return null;\n }\n\n return (\n <Dialog\n open={!0}\n maxWidth=\"md\"\n onClose={() => this.setState({ open: false })}\n >\n <DialogContent>\n <JsonConfig\n instanceId={this.props.instanceId}\n socket={this.props.socket}\n schema={this.state.details.schema as ConfigItemPanel | ConfigItemTabs}\n data={this.state.data}\n onChange={(data: Record<string, any>) => this.setState({ data })}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n isFloatComma={this.props.isFloatComma}\n dateFormat={this.props.dateFormat}\n />\n </DialogContent>\n <DialogActions>\n <Button\n disabled={!this.props.alive}\n variant=\"contained\"\n color=\"primary\"\n onClick={() => this.setState({ open: false })}\n autoFocus\n >\n {getTranslation('closeButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n renderControlDialog(): JSX.Element | null {\n if (!this.state.showControlDialog || !this.props.alive) {\n return null;\n }\n const colors = { primary: '#111', secondary: '#888' };\n return (\n <Dialog\n open={!0}\n onClose={() => this.setState({ showControlDialog: false })}\n >\n <DialogTitle>\n {this.props.title}\n <IconButton\n style={{\n position: 'absolute',\n top: 5,\n right: 5,\n zIndex: 10,\n }}\n onClick={() => this.setState({ showControlDialog: false })}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent style={{ display: 'flex', flexDirection: 'column' }}>\n {this.props.device.controls?.map(control => (\n <DeviceControlComponent\n disabled={false}\n key={control.id}\n control={control}\n socket={this.props.socket}\n colors={colors}\n deviceId={this.props.device.id}\n controlHandler={this.props.controlHandler}\n controlStateHandler={this.props.controlStateHandler}\n />\n ))}\n </DialogContent>\n </Dialog>\n );\n }\n\n renderControls(): JSX.Element | null {\n const colors = { primary: '#111', secondary: '#888' };\n const firstControl = this.props.device.controls?.[0];\n if (\n this.props.device.controls?.length === 1 &&\n firstControl &&\n (firstControl.type === 'icon' || firstControl.type === 'switch') &&\n !firstControl.label\n ) {\n // control can be placed in button icon\n return (\n <DeviceControlComponent\n disabled={!this.props.alive}\n control={firstControl}\n colors={colors}\n socket={this.props.socket}\n deviceId={this.props.device.id}\n controlHandler={this.props.controlHandler}\n controlStateHandler={this.props.controlStateHandler}\n />\n );\n }\n\n if (this.props.device.controls?.length) {\n // place button and show controls dialog\n return (\n <Fab\n size=\"small\"\n disabled={!this.props.alive}\n onClick={() => this.setState({ showControlDialog: true })}\n >\n <ControlIcon />\n </Fab>\n );\n }\n return null;\n }\n\n renderActions(): JSX.Element[] | null {\n return this.props.device.actions?.length\n ? this.props.device.actions.map(a => (\n <DeviceActionButton\n disabled={!this.props.alive}\n key={a.id}\n deviceId={this.props.device.id}\n action={a}\n deviceHandler={this.props.deviceHandler}\n refresh={this.refresh}\n />\n ))\n : null;\n }\n\n renderSmall(): JSX.Element {\n const hasDetails = this.props.device.hasDetails;\n const status = !this.props.device.status\n ? []\n : Array.isArray(this.props.device.status)\n ? this.props.device.status\n : [this.props.device.status];\n\n const icon = this.state.icon ? <IconDeviceType src={this.state.icon} /> : <NoImageIcon />;\n\n return (\n <Card\n sx={{\n maxWidth: 345,\n minWidth: 200,\n }}\n >\n <CardHeader\n sx={theme => ({\n backgroundColor:\n this.props.device.color === 'primary'\n ? theme.palette.primary.main\n : theme.palette.secondary.main === 'secondary'\n ? theme.palette.secondary.main\n : this.props.device.color || theme.palette.secondary.main,\n color:\n this.props.device.color &&\n this.props.device.color !== 'primary' &&\n this.props.device.color !== 'secondary'\n ? Utils.invertColor(this.props.device.color, true)\n : theme.palette.secondary.contrastText,\n maxWidth: 345,\n })}\n avatar={\n <div>\n {this.props.uploadImagesToInstance ? (\n <DeviceImageUpload\n uploadImagesToInstance={this.props.uploadImagesToInstance}\n deviceId={this.props.device.id}\n manufacturer={getText(this.props.device.manufacturer)}\n model={getText(this.props.device.model)}\n onImageSelect={(imageData: string): void => {\n if (imageData) {\n this.setState({ icon: imageData });\n }\n }}\n socket={this.props.socket}\n />\n ) : null}\n {icon}\n </div>\n }\n action={\n hasDetails ? (\n <IconButton\n aria-label=\"settings\"\n onClick={() => {\n if (!this.state.open) {\n this.loadDetails().catch(console.error);\n this.setState({ open: true });\n }\n }}\n >\n <MoreVertIcon />\n </IconButton>\n ) : null\n }\n title={this.props.title}\n subheader={\n this.props.device.manufacturer ? (\n <span>\n <b style={{ marginRight: 4 }}>{getTranslation('manufacturer')}:</b>\n {getText(this.props.device.manufacturer)}\n </span>\n ) : null\n }\n />\n <CardContent style={{ position: 'relative' }}>\n {status?.length ? (\n <div\n style={{\n display: 'flex',\n position: 'absolute',\n top: -11,\n background: '#88888880',\n padding: '0 8px',\n borderRadius: 5,\n width: 'calc(100% - 46px)',\n }}\n >\n {status.map((s, i) => (\n <DeviceStatusComponent\n key={i}\n status={s}\n />\n ))}\n </div>\n ) : null}\n <div>\n <Typography variant=\"body1\">\n <div\n onClick={this.copyToClipboard}\n style={{ textOverflow: 'ellipsis', overflow: 'hidden' }}\n >\n <b>ID:</b>\n <span style={{ marginLeft: 4 }}>{this.props.device.id.replace(/.*\\.\\d\\./, '')}</span>\n </div>\n {this.props.device.manufacturer ? (\n <div>\n <b style={{ marginRight: 4 }}>{getTranslation('manufacturer')}:</b>\n {getText(this.props.device.manufacturer)}\n </div>\n ) : null}\n {this.props.device.model ? (\n <div>\n <b style={{ marginRight: 4 }}>{getTranslation('model')}:</b>\n {getText(this.props.device.model)}\n </div>\n ) : null}\n </Typography>\n </div>\n </CardContent>\n <CardActions disableSpacing>\n {this.renderActions()}\n <div style={{ flexGrow: 1 }} />\n {this.renderControls()}\n </CardActions>\n {this.renderDialog()}\n {this.renderControlDialog()}\n </Card>\n );\n }\n\n renderBig(): JSX.Element {\n const cardStyle: React.CSSProperties = {\n width: 300,\n minHeight: 280,\n margin: 10,\n overflow: 'hidden',\n display: 'inline-block',\n };\n const headerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n paddingLeft: 8,\n paddingRight: 8,\n position: 'relative',\n minHeight: 60,\n color: '#000',\n };\n const imgAreaStyle: React.CSSProperties = {\n height: 45,\n width: 45,\n justifyContent: 'center',\n display: 'flex',\n alignItems: 'center',\n };\n const imgStyle: React.CSSProperties = {\n zIndex: 2,\n maxWidth: '100%',\n maxHeight: '100%',\n color: '#FFF',\n };\n const titleStyle: React.CSSProperties = {\n fontSize: 16,\n fontWeight: 'bold',\n // whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n };\n const detailsButtonStyle: React.CSSProperties = {\n right: 20,\n bottom: -20,\n position: 'absolute',\n };\n const bodyStyle: React.CSSProperties = {\n height: 'calc(100% - 116px)',\n };\n const deviceInfoStyle: React.CSSProperties = {\n padding: '20px 16px 0 16px',\n height: 133,\n };\n const statusStyle: React.CSSProperties = {\n padding: '15px 15px 0 15px',\n height: 41,\n };\n const status = !this.props.device.status\n ? []\n : Array.isArray(this.props.device.status)\n ? this.props.device.status\n : [this.props.device.status];\n\n const icon = this.state.icon ? (\n <IconDeviceType\n src={this.state.icon}\n style={imgStyle}\n />\n ) : (\n <NoImageIcon style={imgStyle} />\n );\n\n const title: string = this.state.details?.data?.name || this.props.title || '';\n\n return (\n <Paper\n style={cardStyle}\n key={this.props.id}\n >\n <Box\n sx={theme => ({ backgroundColor: theme.palette.secondary.main })}\n style={headerStyle}\n >\n <div style={imgAreaStyle}>\n {this.props.uploadImagesToInstance ? (\n <DeviceImageUpload\n uploadImagesToInstance={this.props.uploadImagesToInstance}\n deviceId={this.props.device.id}\n manufacturer={getText(this.props.device.manufacturer)}\n model={getText(this.props.device.model)}\n onImageSelect={(imageData: string): void => {\n if (imageData) {\n this.setState({ icon: imageData });\n }\n }}\n socket={this.props.socket}\n />\n ) : null}\n {icon}\n </div>\n <Box\n style={titleStyle}\n title={title.length > 20 ? title : undefined}\n sx={theme => ({ color: theme.palette.secondary.contrastText })}\n >\n {this.state.details?.data?.name || this.props.title}\n </Box>\n {this.props.device.hasDetails ? (\n <Fab\n disabled={!this.props.alive}\n size=\"small\"\n style={detailsButtonStyle}\n onClick={() => {\n if (!this.state.open) {\n this.loadDetails().catch(console.error);\n this.setState({ open: true });\n }\n }}\n color=\"primary\"\n >\n <MoreVertIcon />\n </Fab>\n ) : null}\n </Box>\n <div style={statusStyle}>\n {status.map((s, i) => (\n <DeviceStatusComponent\n key={i}\n status={s}\n />\n ))}\n </div>\n <div style={bodyStyle}>\n <Typography\n variant=\"body1\"\n style={deviceInfoStyle}\n >\n <div onClick={this.copyToClipboard}>\n <b style={{ marginRight: 4 }}>ID:</b>\n {this.props.device.id.replace(/.*\\.\\d\\./, '')}\n </div>\n {this.props.device.manufacturer ? (\n <div>\n <b style={{ marginRight: 4 }}>{getTranslation('manufacturer')}:</b>\n {getText(this.props.device.manufacturer)}\n </div>\n ) : null}\n {this.props.device.model ? (\n <div>\n <b style={{ marginRight: 4 }}>{getTranslation('model')}:</b>\n {getText(this.props.device.model)}\n </div>\n ) : null}\n </Typography>\n {!!this.props.device.actions?.length && (\n <div\n style={{\n flex: 1,\n position: 'relative',\n display: 'flex',\n gap: 8,\n paddingBottom: 5,\n height: 34,\n paddingLeft: 10,\n paddingRight: 10,\n }}\n >\n {this.renderActions()}\n <div style={{ flexGrow: 1 }} />\n {this.renderControls()}\n </div>\n )}\n </div>\n {this.renderDialog()}\n {this.renderControlDialog()}\n </Paper>\n );\n }\n\n render(): JSX.Element {\n if (this.props.smallCards) {\n return this.renderSmall();\n }\n\n return this.renderBig();\n }\n}\n\nexport default DeviceCard;\n","import React, { Component } from 'react';\n\nimport {\n Backdrop,\n Box,\n Button,\n Checkbox,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n FormControl,\n FormControlLabel,\n Grid2,\n IconButton,\n Input,\n InputAdornment,\n InputLabel,\n LinearProgress,\n MenuItem,\n Select,\n Slider,\n Snackbar,\n TextField,\n Typography,\n} from '@mui/material';\n\nimport { Close, Check } from '@mui/icons-material';\n\nimport {\n type Connection,\n type AdminConnection,\n type ThemeName,\n type ThemeType,\n type IobTheme,\n I18n,\n Icon,\n} from '@iobroker/adapter-react-v5';\nimport type {\n ActionBase,\n ControlBase,\n ControlState,\n DeviceInfo,\n DeviceRefresh,\n InstanceDetails,\n JsonFormSchema,\n ActionButton,\n} from '@iobroker/dm-utils';\nimport type { ConfigItemPanel, ConfigItemTabs } from '@iobroker/json-config';\n\nimport { getTranslation } from './Utils';\nimport JsonConfig from './JsonConfig';\n\ndeclare module '@mui/material/Button' {\n interface ButtonPropsColorOverrides {\n grey: true;\n }\n}\n\nexport type CommunicationProps = {\n /** Socket connection */\n socket: Connection;\n /** Instance to communicate with device-manager backend, like `adapterName.X` */\n selectedInstance: string; // adapterName.X\n registerHandler?: (handler: null | ((command: string) => void)) => void;\n themeName: ThemeName;\n themeType: ThemeType;\n theme: IobTheme;\n isFloatComma: boolean;\n dateFormat: string;\n};\n\ninterface CommunicationForm {\n title?: ioBroker.StringOrTranslated | null | undefined;\n label?: ioBroker.StringOrTranslated | null | undefined; // same as title\n noTranslation?: boolean; // Do not translate title/label\n schema: JsonFormSchema;\n data?: Record<string, any>;\n buttons?: (ActionButton | 'apply' | 'cancel' | 'close')[];\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n}\n\ninterface CommunicationFormInState extends CommunicationForm {\n handleClose?: (data?: Record<string, any>) => void;\n originalData: string;\n changed: boolean;\n}\n\ninterface InputAction extends ActionBase {\n /** If it is a device action */\n deviceId?: string;\n /** Optional refresh function to execute */\n refresh?: () => void;\n}\n\nexport type CommunicationState = {\n showSpinner: boolean;\n showToast: string | null;\n message: {\n message: string;\n handleClose: () => void;\n } | null;\n confirm: {\n message: string;\n handleClose: (confirmation?: boolean) => void;\n } | null;\n form: CommunicationFormInState | null;\n progress: {\n open: boolean;\n progress: number;\n } | null;\n showConfirmation: InputAction | null;\n showInput: InputAction | null;\n inputValue: string | boolean | number | null;\n};\n\ninterface DmResponse {\n /* Type of message */\n type: 'message' | 'confirm' | 'progress' | 'result' | 'form';\n /* Origin */\n origin: string;\n}\n\ninterface DmControlResponse extends DmResponse {\n result: {\n error?: {\n code: number;\n message: string;\n };\n state?: ioBroker.State;\n deviceId: string;\n controlId: string;\n };\n}\n\ninterface Message {\n actionId?: string;\n deviceId?: string;\n value?: unknown;\n origin?: string;\n confirm?: boolean;\n data?: any;\n}\n\ninterface DmActionResponse extends DmResponse {\n result: {\n refresh?: DeviceRefresh;\n error?: {\n code: number;\n message: string;\n };\n };\n message?: string;\n confirm?: string;\n form?: CommunicationForm;\n progress?: {\n open: boolean;\n progress: number;\n };\n}\n\n/**\n * Device List Component\n */\nclass Communication<P extends CommunicationProps, S extends CommunicationState> extends Component<P, S> {\n private responseTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n instanceHandler: (action: ActionBase) => () => void;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n deviceHandler: (deviceId: string, action: ActionBase, refresh: () => void) => () => void;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n controlHandler: (\n deviceId: string,\n control: ControlBase,\n state: ControlState,\n ) => () => Promise<ioBroker.State | null>;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n controlStateHandler: (deviceId: string, control: ControlBase) => () => Promise<ioBroker.State | null>;\n\n constructor(props: P) {\n super(props);\n\n this.state = {\n showSpinner: false,\n showToast: null,\n message: null,\n confirm: null,\n form: null,\n progress: null,\n showConfirmation: null,\n showInput: null,\n inputValue: null,\n } as S;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n this.instanceHandler = action => () => {\n if (action.confirmation) {\n this.setState({ showConfirmation: action });\n return;\n }\n if (action.inputBefore) {\n this.setState({ showInput: action });\n return;\n }\n\n this.sendActionToInstance('dm:instanceAction', { actionId: action.id });\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n this.deviceHandler = (deviceId, action, refresh) => () => {\n if (action.confirmation) {\n this.setState({ showConfirmation: { ...action, deviceId, refresh } });\n return;\n }\n if (action.inputBefore) {\n this.setState({\n showInput: { ...action, deviceId, refresh },\n inputValue: action.inputBefore.defaultValue || '',\n });\n return;\n }\n\n this.sendActionToInstance('dm:deviceAction', { deviceId, actionId: action.id }, refresh);\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n this.controlHandler = (deviceId, control, state) => () =>\n this.sendControlToInstance('dm:deviceControl', { deviceId, controlId: control.id, state });\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n this.controlStateHandler = (deviceId, control) => () =>\n this.sendControlToInstance('dm:deviceControlState', { deviceId, controlId: control.id });\n\n if (this.props.registerHandler) {\n this.props.registerHandler(() => this.loadData());\n }\n }\n\n componentWillUnmount(): void {\n if (this.responseTimeout) {\n clearTimeout(this.responseTimeout);\n this.responseTimeout = null;\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n loadData(): void {\n console.error('loadData not implemented');\n }\n\n sendActionToInstance = (command: `dm:${string}`, messageToSend: Message, refresh?: () => void): void => {\n const send = async (): Promise<void> => {\n this.setState({ showSpinner: true });\n this.responseTimeout = setTimeout(() => {\n this.setState({ showSpinner: false });\n window.alert(I18n.t('ra_No response from the backend'));\n }, 5000);\n\n const response: DmActionResponse = await this.props.socket.sendTo(\n this.props.selectedInstance,\n command,\n messageToSend,\n );\n\n if (this.responseTimeout) {\n clearTimeout(this.responseTimeout);\n this.responseTimeout = null;\n }\n\n const type: string = response.type;\n console.log(`Response: ${response.type}`);\n switch (type) {\n case 'message':\n console.log(`Message received: ${response.message}`);\n if (response.message) {\n this.setState({\n message: {\n message: response.message,\n handleClose: () =>\n this.setState({ message: null }, () =>\n this.sendActionToInstance(\n 'dm:actionProgress',\n { origin: response.origin },\n refresh,\n ),\n ),\n },\n showSpinner: false,\n });\n }\n break;\n\n case 'confirm':\n console.log(`Confirm received: ${response.confirm}`);\n if (response.confirm) {\n this.setState({\n confirm: {\n message: response.confirm,\n handleClose: (confirm?: boolean) =>\n this.setState({ confirm: null }, () =>\n this.sendActionToInstance(\n 'dm:actionProgress',\n {\n origin: response.origin,\n confirm,\n },\n refresh,\n ),\n ),\n },\n showSpinner: false,\n });\n }\n break;\n\n case 'form':\n console.log('Form received');\n if (response.form) {\n const data: Record<string, any> | undefined = response.form.data;\n const originalData: Record<string, any> = {};\n if (data) {\n Object.keys(data).forEach(key => {\n if (data[key] !== undefined) {\n originalData[key] = data[key];\n }\n });\n }\n response.form.data = JSON.parse(JSON.stringify(originalData)) as Record<string, any>;\n\n this.setState({\n form: {\n ...response.form,\n changed: false,\n originalData: JSON.stringify(originalData),\n handleClose: (data: any) =>\n this.setState({ form: null }, () => {\n console.log(`Form ${JSON.stringify(data)}`);\n this.sendActionToInstance(\n 'dm:actionProgress',\n {\n origin: response.origin,\n data,\n },\n refresh,\n );\n }),\n },\n showSpinner: false,\n });\n }\n break;\n\n case 'progress':\n if (response.progress) {\n if (this.state.progress) {\n const progress = { ...this.state.progress, ...response.progress };\n this.setState({ progress, showSpinner: false });\n } else {\n this.setState({ progress: response.progress, showSpinner: false });\n }\n }\n this.sendActionToInstance('dm:actionProgress', { origin: response.origin }, refresh);\n break;\n\n case 'result':\n console.log('Response content', response.result);\n if (response.result.refresh) {\n if (response.result.refresh === true) {\n console.log('Refreshing all');\n this.loadData();\n } else if (response.result.refresh === 'instance') {\n console.log(`Refreshing instance infos: ${this.props.selectedInstance}`);\n } else if (response.result.refresh === 'device') {\n if (!refresh) {\n console.log('No refresh function provided to refresh \"device\"');\n } else {\n console.log(`Refreshing device infos: ${this.props.selectedInstance}`);\n refresh();\n }\n } else {\n console.log('Not refreshing anything');\n }\n }\n if (response.result.error) {\n console.error(`Error: ${response.result.error.message}`);\n this.setState({ showToast: response.result.error.message, showSpinner: false });\n } else {\n this.setState({ showSpinner: false });\n }\n break;\n\n default:\n console.log(`Unknown response type: ${type}`);\n this.setState({ showSpinner: false });\n break;\n }\n };\n\n void send().catch(console.error);\n };\n\n sendControlToInstance = async (\n command: string,\n messageToSend: { deviceId: string; controlId: string; state?: ControlState },\n ): Promise<null | ioBroker.State> => {\n const response: DmControlResponse = await this.props.socket.sendTo(\n this.props.selectedInstance,\n command,\n messageToSend,\n );\n const type = response.type;\n console.log(`Response: ${response.type}`);\n if (response.type === 'result') {\n console.log('Response content', response.result);\n if (response.result.error) {\n console.error(`Error: ${response.result.error.message}`);\n this.setState({ showToast: response.result.error.message });\n } else if (response.result.state !== undefined) {\n return response.result.state;\n }\n } else {\n console.warn('Unexpected response type', type);\n }\n\n return null;\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n loadDevices(): Promise<DeviceInfo[]> {\n return this.props.socket.sendTo(this.props.selectedInstance, 'dm:listDevices');\n }\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n loadInstanceInfos(): Promise<InstanceDetails> {\n return this.props.socket.sendTo(this.props.selectedInstance, 'dm:instanceInfo');\n }\n\n renderMessageDialog(): React.JSX.Element | null {\n if (!this.state.message) {\n return null;\n }\n\n return (\n <Dialog\n open={!0}\n onClose={() => this.state.message?.handleClose()}\n hideBackdrop\n aria-describedby=\"message-dialog-description\"\n >\n <DialogContent>\n <DialogContentText id=\"message-dialog-description\">{this.state.message?.message}</DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n color=\"primary\"\n onClick={() => this.state.message?.handleClose()}\n variant=\"contained\"\n autoFocus\n >\n {getTranslation('okButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n renderConfirmDialog(): React.JSX.Element | null {\n if (!this.state.confirm) {\n return null;\n }\n\n return (\n <Dialog\n open={!0}\n onClose={() => this.state.confirm?.handleClose()}\n hideBackdrop\n aria-describedby=\"confirm-dialog-description\"\n >\n <DialogContent>\n <DialogContentText id=\"confirm-dialog-description\">\n {getTranslation(this.state.confirm?.message)}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => this.state.confirm?.handleClose(true)}\n autoFocus\n >\n {getTranslation('yesButtonText')}\n </Button>\n <Button\n variant=\"contained\"\n color=\"grey\"\n onClick={() => this.state.confirm?.handleClose(false)}\n autoFocus\n >\n {getTranslation('noButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n renderSnackbar(): React.JSX.Element {\n return (\n <Snackbar\n open={!!this.state.showToast}\n autoHideDuration={6_000}\n onClose={() => this.setState({ showToast: null })}\n message={this.state.showToast}\n />\n );\n }\n\n getOkButton(button?: ActionButton | 'apply' | 'cancel' | 'close'): React.JSX.Element {\n if (typeof button === 'string') {\n button = undefined;\n }\n return (\n <Button\n key=\"apply\"\n disabled={!this.state.form?.changed}\n variant={button?.variant || 'contained'}\n color={button?.color || 'primary'}\n onClick={() => this.state.form?.handleClose && this.state.form.handleClose(this.state.form?.data)}\n startIcon={button?.icon ? <Icon src={button?.icon} /> : undefined}\n >\n {getTranslation(button?.label || 'okButtonText', button?.noTranslation)}\n </Button>\n );\n }\n\n getCancelButton(button?: ActionButton | 'apply' | 'cancel' | 'close'): React.JSX.Element {\n let isClose = false;\n if (typeof button === 'string') {\n isClose = button === 'close';\n button = undefined;\n }\n return (\n <Button\n key=\"cancel\"\n variant={button?.variant || 'contained'}\n color={button?.color || 'grey'}\n onClick={() => this.state.form?.handleClose && this.state.form.handleClose()}\n startIcon={isClose ? <Close /> : button?.icon ? <Icon src={button?.icon} /> : undefined}\n >\n {getTranslation(button?.label || 'cancelButtonText', button?.noTranslation)}\n </Button>\n );\n }\n\n renderFormDialog(): React.JSX.Element | null {\n if (!this.state.form || !this.state.form.schema) {\n return null;\n }\n let buttons: React.JSX.Element[];\n if (this.state.form.buttons) {\n buttons = [];\n this.state.form.buttons.forEach((button: ActionButton | 'apply' | 'cancel' | 'close'): void => {\n if (button === 'apply' || (button as ActionButton).type === 'apply') {\n buttons.push(this.getOkButton(button));\n } else {\n buttons.push(this.getCancelButton(button));\n }\n });\n } else {\n buttons = [this.getOkButton(), this.getCancelButton()];\n }\n return (\n <Dialog\n open={!0}\n onClose={() => this.state.form?.handleClose && this.state.form.handleClose()}\n hideBackdrop\n fullWidth\n maxWidth={this.state.form.maxWidth || 'md'}\n >\n {this.state.form?.title ? (\n <DialogTitle>\n {getTranslation(\n this.state.form?.label || this.state.form?.title,\n this.state.form.noTranslation,\n )}\n </DialogTitle>\n ) : null}\n <DialogContent>\n <JsonConfig\n instanceId={this.props.selectedInstance}\n schema={this.state.form.schema as ConfigItemPanel | ConfigItemTabs}\n data={this.state.form.data || {}}\n socket={this.props.socket as AdminConnection}\n onChange={(data: Record<string, any>) => {\n console.log('handleFormChange', { data });\n const form: CommunicationFormInState = {\n ...(this.state.form as CommunicationFormInState),\n };\n if (form) {\n form.data = data;\n form.changed = JSON.stringify(data) !== form.originalData;\n this.setState({ form });\n }\n }}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n isFloatComma={this.props.isFloatComma}\n dateFormat={this.props.dateFormat}\n />\n </DialogContent>\n <DialogActions>{buttons}</DialogActions>\n </Dialog>\n );\n }\n\n renderProgressDialog(): React.JSX.Element | null {\n if (!this.state.progress?.open) {\n return null;\n }\n\n return (\n <Dialog\n open={!0}\n onClose={() => {}}\n hideBackdrop\n >\n <LinearProgress\n variant=\"determinate\"\n value={this.state.progress?.progress || 0}\n />\n </Dialog>\n );\n }\n\n // eslint-disable-next-line class-methods-use-this\n renderContent(): React.JSX.Element | React.JSX.Element[] | null {\n return null;\n }\n\n renderSpinner(): React.JSX.Element | null {\n if (!this.state.showSpinner) {\n return null;\n }\n return (\n <Backdrop\n style={{ zIndex: 1000 }}\n open={!0}\n >\n <CircularProgress />\n </Backdrop>\n );\n }\n\n renderConfirmationDialog(): React.JSX.Element | null {\n if (!this.state.showConfirmation) {\n return null;\n }\n return (\n <Dialog\n open={!0}\n onClose={() => this.setState({ showConfirmation: null })}\n >\n <DialogTitle>\n {getTranslation(\n this.state.showConfirmation.confirmation === true\n ? getTranslation('areYouSureText')\n : getTranslation(this.state.showConfirmation.confirmation as ioBroker.StringOrTranslated),\n )}\n </DialogTitle>\n <DialogActions>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n if (!this.state.showConfirmation) {\n return;\n }\n\n const showConfirmation = this.state.showConfirmation;\n this.setState({ showConfirmation: null }, () => {\n if (showConfirmation.deviceId) {\n this.sendActionToInstance(\n 'dm:deviceAction',\n { actionId: showConfirmation.id, deviceId: showConfirmation.deviceId },\n showConfirmation.refresh,\n );\n } else {\n this.sendActionToInstance('dm:instanceAction', { actionId: showConfirmation.id });\n }\n });\n }}\n autoFocus\n startIcon={<Check />}\n >\n {getTranslation('yesButtonText')}\n </Button>\n <Button\n variant=\"contained\"\n color=\"grey\"\n onClick={() => this.setState({ showConfirmation: null })}\n startIcon={<Close />}\n >\n {getTranslation('cancelButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n onShowInputOk(): void {\n if (!this.state.showInput) {\n return;\n }\n\n const showInput = this.state.showInput;\n this.setState({ showInput: null }, () => {\n if (showInput.deviceId) {\n this.sendActionToInstance(\n 'dm:deviceAction',\n {\n actionId: showInput.id,\n deviceId: showInput.deviceId,\n value:\n showInput.inputBefore?.type === 'checkbox'\n ? !!this.state.inputValue\n : showInput.inputBefore?.type === 'number'\n ? parseFloat(this.state.inputValue as string) || 0\n : this.state.inputValue,\n },\n showInput.refresh,\n );\n } else {\n this.sendActionToInstance('dm:instanceAction', {\n actionId: showInput.id,\n value:\n showInput.inputBefore?.type === 'checkbox'\n ? !!this.state.inputValue\n : showInput.inputBefore?.type === 'number'\n ? parseFloat(this.state.inputValue as string) || 0\n : this.state.inputValue,\n });\n }\n });\n }\n\n renderInputDialog(): React.JSX.Element | null {\n if (!this.state.showInput || !this.state.showInput.inputBefore) {\n return null;\n }\n let okDisabled = false;\n if (!this.state.showInput.inputBefore.allowEmptyValue && this.state.showInput.inputBefore.type !== 'checkbox') {\n if (\n this.state.showInput.inputBefore.type === 'number' ||\n this.state.showInput.inputBefore.type === 'slider'\n ) {\n okDisabled =\n this.state.inputValue === '' ||\n this.state.inputValue === null ||\n !window.isFinite(this.state.inputValue as number);\n } else {\n okDisabled = !this.state.inputValue;\n }\n }\n\n return (\n <Dialog\n open={!0}\n onClose={() => this.setState({ showInput: null })}\n >\n <DialogTitle>{getTranslation('pleaseEnterValueText')}</DialogTitle>\n <DialogContent>\n {this.state.showInput.inputBefore.type === 'text' ||\n this.state.showInput.inputBefore.type === 'number' ||\n !this.state.showInput.inputBefore.type ? (\n <TextField\n autoFocus\n margin=\"dense\"\n label={getTranslation(this.state.showInput.inputBefore.label)}\n slotProps={{\n htmlInput:\n this.state.showInput.inputBefore.type === 'number'\n ? {\n min: this.state.showInput.inputBefore.min,\n max: this.state.showInput.inputBefore.max,\n step: this.state.showInput.inputBefore.step,\n }\n : undefined,\n input: {\n endAdornment: this.state.inputValue ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ inputValue: '' })}\n >\n <Close />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n type={this.state.showInput.inputBefore.type === 'number' ? 'number' : 'text'}\n fullWidth\n value={this.state.inputValue}\n onChange={e => this.setState({ inputValue: e.target.value })}\n onKeyUp={(e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n this.onShowInputOk();\n }\n }}\n />\n ) : null}\n {this.state.showInput.inputBefore.type === 'checkbox' ? (\n <FormControlLabel\n control={\n <Checkbox\n checked={!!this.state.inputValue}\n autoFocus\n onChange={e => this.setState({ inputValue: e.target.checked })}\n />\n }\n label={getTranslation(this.state.showInput.inputBefore.label)}\n />\n ) : null}\n {this.state.showInput.inputBefore.type === 'select' ? (\n <FormControl fullWidth>\n <InputLabel>{getTranslation(this.state.showInput.inputBefore.label)}</InputLabel>\n <Select\n variant=\"standard\"\n value={this.state.inputValue}\n onChange={e => this.setState({ inputValue: e.target.value })}\n >\n {this.state.showInput.inputBefore.options?.map(item => (\n <MenuItem\n key={item.value}\n value={item.value}\n >\n {getTranslation(item.label)}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n ) : null}\n {this.state.showInput.inputBefore.type === 'slider' ? (\n <Box sx={{ width: '100%' }}>\n <Typography gutterBottom>\n {getTranslation(this.state.showInput.inputBefore.label)}\n </Typography>\n <Grid2\n container\n spacing={2}\n alignItems=\"center\"\n >\n <Grid2>\n <Slider\n value={typeof this.state.inputValue === 'number' ? this.state.inputValue : 0}\n onChange={(_event: Event, newValue: number) =>\n this.setState({ inputValue: newValue })\n }\n />\n </Grid2>\n <Grid2>\n <Input\n value={this.state.inputValue}\n size=\"small\"\n onChange={e =>\n this.setState({\n inputValue: e.target.value === '' ? 0 : Number(e.target.value),\n })\n }\n onBlur={() => {\n if (!this.state.showInput) {\n return;\n }\n\n const min =\n this.state.showInput.inputBefore?.min === undefined\n ? 0\n : this.state.showInput.inputBefore.min;\n const max =\n this.state.showInput.inputBefore?.max === undefined\n ? 100\n : this.state.showInput.inputBefore.max;\n\n if ((this.state.inputValue as number) < min) {\n this.setState({ inputValue: min });\n } else if ((this.state.inputValue as number) > max) {\n this.setState({ inputValue: max });\n }\n }}\n inputProps={{\n step: this.state.showInput.inputBefore.step,\n min:\n this.state.showInput.inputBefore.min === undefined\n ? 0\n : this.state.showInput.inputBefore.min,\n max:\n this.state.showInput.inputBefore.max === undefined\n ? 100\n : this.state.showInput.inputBefore.max,\n type: 'number',\n }}\n />\n </Grid2>\n </Grid2>\n </Box>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n disabled={okDisabled}\n color=\"primary\"\n onClick={() => this.onShowInputOk()}\n startIcon={<Check />}\n >\n {getTranslation('yesButtonText')}\n </Button>\n <Button\n variant=\"contained\"\n color=\"grey\"\n onClick={() => this.setState({ showInput: null })}\n startIcon={<Close />}\n >\n {getTranslation('cancelButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n render(): React.JSX.Element {\n return (\n <>\n {this.renderSnackbar()}\n {this.renderContent()}\n {this.renderConfirmDialog()}\n {this.renderMessageDialog()}\n {this.renderFormDialog()}\n {this.renderProgressDialog()}\n {this.renderConfirmationDialog()}\n {this.renderInputDialog()}\n {this.renderSpinner()}\n </>\n );\n }\n}\n\nexport default Communication;\n","import React from 'react';\n\nimport type { ActionBase, InstanceAction } from '@iobroker/dm-utils';\n\nimport TooltipButton from './TooltipButton';\nimport { getTranslation, renderActionIcon } from './Utils';\n\ninterface InstanceActionButtonProps {\n action: InstanceAction;\n instanceHandler: (action: ActionBase) => () => void;\n}\n\nexport default function InstanceActionButton(params: InstanceActionButtonProps): React.JSX.Element | null {\n const { action, instanceHandler } = params;\n\n const tooltip = getTranslation(action?.description ? action.description : '');\n const title = getTranslation(action?.title ? action.title : '');\n\n const icon = renderActionIcon(action);\n\n return (\n <TooltipButton\n tooltip={tooltip}\n label={title}\n disabled={action.disabled}\n Icon={icon}\n onClick={instanceHandler(action)}\n />\n );\n}\n","import React, { type JSX } from 'react';\nimport {\n IconButton,\n InputAdornment,\n TextField,\n Toolbar,\n Tooltip,\n LinearProgress,\n Select,\n MenuItem,\n} from '@mui/material';\n\nimport { Clear, QuestionMark, Refresh, FilterAltOff } from '@mui/icons-material';\n\nimport { I18n, IconDeviceType } from '@iobroker/adapter-react-v5';\nimport type { DeviceInfo, InstanceDetails } from '@iobroker/dm-utils';\n\nimport DeviceCard from './DeviceCard';\nimport { getTranslation } from './Utils';\nimport Communication, { type CommunicationProps, type CommunicationState } from './Communication';\nimport InstanceActionButton from './InstanceActionButton';\n\nimport de from './i18n/de.json';\nimport en from './i18n/en.json';\nimport ru from './i18n/ru.json';\nimport pt from './i18n/pt.json';\nimport nl from './i18n/nl.json';\nimport fr from './i18n/fr.json';\nimport it from './i18n/it.json';\nimport es from './i18n/es.json';\nimport pl from './i18n/pl.json';\nimport uk from './i18n/uk.json';\nimport zhCn from './i18n/zh-cn.json';\n\ninterface DeviceListProps extends CommunicationProps {\n /** Instance to upload images to, like `adapterName.X` */\n uploadImagesToInstance?: string;\n /** Filter devices with this string */\n filter?: string;\n /** If this component is used in GUI with own toolbar. `false` if this list is used with multiple instances and true if only with one (in this case, it will monitor alive itself */\n embedded?: boolean;\n /** If embedded, this text is shown in the toolbar */\n title?: string;\n /** Style of a component that displays all devices */\n style?: React.CSSProperties;\n /** Use small cards for devices */\n smallCards?: boolean;\n /** To trigger the reload of devices, just change this variable */\n triggerLoad?: number;\n}\n\ninterface DeviceListState extends CommunicationState {\n devices: DeviceInfo[];\n filteredDevices: DeviceInfo[];\n filter: string;\n instanceInfo: InstanceDetails;\n loading: boolean;\n alive: boolean | null;\n triggerLoad: number;\n groupKey: string;\n}\n\n/**\n * Device List Component\n */\nexport default class DeviceList extends Communication<DeviceListProps, DeviceListState> {\n static i18nInitialized = false;\n\n private lastPropsFilter: string | undefined;\n\n private lastInstance: string;\n\n private lastTriggerLoad = 0;\n\n private filterTimeout: ReturnType<typeof setTimeout> | null;\n\n private readonly language: ioBroker.Languages;\n\n constructor(props: DeviceListProps) {\n super(props);\n\n if (!DeviceList.i18nInitialized) {\n DeviceList.i18nInitialized = true;\n I18n.extendTranslations({\n en,\n de,\n ru,\n pt,\n nl,\n fr,\n it,\n es,\n pl,\n uk,\n 'zh-cn': zhCn,\n });\n }\n\n Object.assign(this.state, {\n devices: [],\n filteredDevices: [],\n filter: '',\n instanceInfo: null,\n loading: null,\n alive: null,\n groupKey: '',\n });\n\n this.lastPropsFilter = this.props.filter;\n this.lastInstance = this.props.selectedInstance;\n this.lastTriggerLoad = this.props.triggerLoad || 0;\n this.filterTimeout = null;\n this.language = I18n.getLanguage();\n }\n\n async componentDidMount(): Promise<void> {\n let alive = false;\n if (this.state.alive === null) {\n try {\n // check if instance is alive\n const stateAlive = await this.props.socket.getState(\n `system.adapter.${this.props.selectedInstance}.alive`,\n );\n if (stateAlive?.val) {\n alive = true;\n }\n } catch (error) {\n console.error(error);\n }\n this.setState({ alive }, () =>\n this.props.socket.subscribeState(\n `system.adapter.${this.props.selectedInstance}.alive`,\n this.aliveHandler,\n ),\n );\n if (!alive) {\n return;\n }\n } else {\n alive = this.state.alive;\n }\n\n if (!this.props.embedded && alive) {\n try {\n const instanceInfo = await this.loadInstanceInfos();\n this.setState({ instanceInfo });\n } catch (error) {\n console.error(error);\n }\n }\n if (alive) {\n this.loadData();\n }\n }\n\n componentWillUnmount(): void {\n this.props.socket.unsubscribeState(`system.adapter.${this.props.selectedInstance}.alive`, this.aliveHandler);\n }\n\n aliveHandler: ioBroker.StateChangeHandler = (id: string, state: ioBroker.State | null | undefined): void => {\n if (id === `system.adapter.${this.props.selectedInstance}.alive`) {\n const alive = !!state?.val;\n if (alive !== this.state.alive) {\n this.setState({ alive }, () => {\n if (alive) {\n this.componentDidMount().catch(console.error);\n }\n });\n }\n }\n };\n\n /**\n * Load devices\n */\n override loadData(): void {\n this.setState({ loading: true }, async () => {\n console.log(`Loading devices for ${this.props.selectedInstance}...`);\n let devices: DeviceInfo[] = [];\n try {\n devices = await this.loadDevices();\n\n if (!devices || !Array.isArray(devices)) {\n console.error(\n `Message returned from sendTo() doesn't look like one from DeviceManagement, did you accidentally handle the message in your adapter? ${JSON.stringify(\n devices,\n )}`,\n );\n devices = [];\n }\n } catch (error) {\n console.error(error);\n devices = [];\n }\n\n this.setState({ devices, loading: false }, () => this.applyFilter());\n });\n }\n\n getText(text: ioBroker.StringOrTranslated): string {\n if (typeof text === 'object') {\n return text[this.language] || text.en;\n }\n\n return text;\n }\n\n applyFilter(): void {\n const filter = this.props.embedded ? this.props.filter : this.state.filter;\n\n // filter devices name\n if (filter) {\n const filteredDevices = this.state.devices.filter(device =>\n this.getText(device.name).toLowerCase().includes(filter.toLowerCase()),\n );\n this.setState({ filteredDevices });\n } else {\n this.setState({ filteredDevices: this.state.devices });\n }\n }\n\n handleFilterChange(filter: string): void {\n this.setState({ filter }, () => {\n if (this.filterTimeout) {\n clearTimeout(this.filterTimeout);\n }\n this.filterTimeout = setTimeout(() => {\n this.filterTimeout = null;\n this.applyFilter();\n }, 250);\n });\n }\n\n renderGroups(\n groups: { name: string; value: string; count: number; icon?: React.JSX.Element | string | null }[] | undefined,\n ): React.JSX.Element | null {\n if (!groups?.length) {\n return null;\n }\n\n return (\n <Select\n style={{ minWidth: 120, marginRight: 8, marginTop: 12.5 }}\n variant=\"standard\"\n value={this.state.groupKey || '_'}\n renderValue={value => {\n if (value === '_') {\n value = '';\n }\n const g = groups.find(g => g.value === value);\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {g?.icon || <div style={{ width: 24 }} />}\n {g?.name || value}\n </div>\n );\n }}\n onChange={e => this.setState({ groupKey: e.target.value === '_' ? '' : e.target.value })}\n >\n {groups.map(g => (\n <MenuItem\n value={g.value || '_'}\n key={g.value || '_'}\n style={{ display: 'flex', alignItems: 'center', gap: 8 }}\n >\n {g.icon || <div style={{ width: 24 }} />}\n {g.name}\n </MenuItem>\n ))}\n </Select>\n );\n }\n\n renderContent(): JSX.Element | JSX.Element[] | null {\n const emptyStyle: React.CSSProperties = {\n padding: 25,\n };\n\n if ((this.props.triggerLoad || 0) !== this.lastTriggerLoad) {\n this.lastTriggerLoad = this.props.triggerLoad || 0;\n setTimeout(() => this.loadData(), 50);\n }\n\n if (this.props.embedded && this.lastPropsFilter !== this.props.filter) {\n this.lastPropsFilter = this.props.filter;\n setTimeout(() => this.applyFilter(), 50);\n }\n // if instance changed\n if (this.props.embedded && this.lastInstance !== this.props.selectedInstance) {\n this.lastInstance = this.props.selectedInstance;\n setTimeout(() => this.loadData(), 50);\n }\n const deviceGroups: { name: string; value: string; count: number; icon?: React.JSX.Element | string | null }[] =\n [];\n let list: React.JSX.Element[] | undefined;\n if (!this.props.embedded && !this.state.alive) {\n list = [\n <div\n style={emptyStyle}\n key=\"notAlive\"\n >\n <span>{getTranslation('instanceNotAlive')}</span>\n </div>,\n ];\n } else if (!this.state.devices.length && this.props.selectedInstance) {\n list = [\n <div\n style={emptyStyle}\n key=\"notFound\"\n >\n <span>{getTranslation('noDevicesFoundText')}</span>\n </div>,\n ];\n } else if (this.state.devices.length && !this.state.filteredDevices.length) {\n list = [\n <div\n style={emptyStyle}\n key=\"filtered\"\n >\n <span>{getTranslation('allDevicesFilteredOut')}</span>\n </div>,\n ];\n } else {\n // build device types list\n let filteredDevices = this.state.filteredDevices;\n if (!this.props.embedded && filteredDevices.find(device => device.group)) {\n deviceGroups.push({\n name: I18n.t('All'),\n value: '',\n count: filteredDevices.length,\n icon: <FilterAltOff />,\n });\n filteredDevices.forEach(device => {\n if (device.group) {\n const type = deviceGroups.find(t => t.value === device.group?.key);\n if (type) {\n type.count++;\n } else {\n const icon = device.group.icon ? <IconDeviceType src={device.group.icon} /> : null;\n\n deviceGroups.push({\n name: this.getText(device.group.name || device.group.key),\n value: device.group.key,\n count: 1,\n icon,\n });\n }\n }\n });\n const unknown = filteredDevices.filter(device => !device.group);\n if (unknown.length) {\n deviceGroups.push({\n name: I18n.t('Unknown'),\n value: '?',\n count: unknown.length,\n icon: <QuestionMark />,\n });\n }\n\n if (this.state.groupKey) {\n // filter out all devices belonging to this group\n if (this.state.groupKey === '?') {\n filteredDevices = filteredDevices.filter(device => !device.group?.key);\n } else {\n filteredDevices = filteredDevices.filter(device => device.group?.key === this.state.groupKey);\n }\n if (!filteredDevices.length) {\n list = [\n <div\n style={emptyStyle}\n key=\"filtered\"\n >\n <span>{getTranslation('allDevicesFilteredOut')}</span>\n </div>,\n ];\n }\n }\n }\n\n if (filteredDevices.length) {\n list = filteredDevices.map(device => (\n <DeviceCard\n alive={!!this.state.alive}\n key={device.id}\n id={device.id}\n title={this.getText(device.name)}\n device={device}\n instanceId={this.props.selectedInstance}\n uploadImagesToInstance={this.props.uploadImagesToInstance}\n deviceHandler={this.deviceHandler}\n controlHandler={this.controlHandler}\n controlStateHandler={this.controlStateHandler}\n socket={this.props.socket}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n isFloatComma={this.props.isFloatComma}\n dateFormat={this.props.dateFormat}\n />\n ));\n }\n }\n\n if (this.props.embedded) {\n return (\n <>\n {this.state.loading ? <LinearProgress style={{ width: '100%' }} /> : null}\n {list}\n </>\n );\n }\n\n return (\n <div style={{ width: '100%', height: '100%', overflow: 'hidden' }}>\n <Toolbar\n variant=\"dense\"\n style={{ backgroundColor: '#777', display: 'flex' }}\n >\n {this.props.title}\n {this.props.selectedInstance ? (\n <Tooltip\n title={getTranslation('refreshTooltip')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <span>\n <IconButton\n onClick={() => this.loadData()}\n disabled={!this.state.alive}\n size=\"small\"\n >\n <Refresh />\n </IconButton>\n </span>\n </Tooltip>\n ) : null}\n {this.state.alive && this.state.instanceInfo?.actions?.length ? (\n <div style={{ marginLeft: 20 }}>\n {this.state.instanceInfo.actions.map(action => (\n <InstanceActionButton\n key={action.id}\n action={action}\n instanceHandler={this.instanceHandler}\n />\n ))}\n </div>\n ) : null}\n\n <div style={{ flexGrow: 1 }} />\n\n {this.renderGroups(deviceGroups)}\n {this.state.alive ? (\n <TextField\n variant=\"standard\"\n style={{ width: 200 }}\n size=\"small\"\n label={getTranslation('filterLabelText')}\n onChange={e => this.handleFilterChange(e.target.value)}\n value={this.state.filter}\n autoComplete=\"off\"\n slotProps={{\n input: {\n autoComplete: 'new-password',\n endAdornment: this.state.filter ? (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() => this.handleFilterChange('')}\n edge=\"end\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n htmlInput: {\n autoComplete: 'off',\n },\n }}\n />\n ) : null}\n </Toolbar>\n <div\n style={{\n width: '100%',\n height: 'calc(100% - 56px)',\n marginTop: 8,\n overflow: 'auto',\n // justifyContent: 'center',\n // alignItems: 'stretch',\n // display: 'grid',\n // columnGap: 8,\n // rowGap: 8,\n ...this.props.style,\n }}\n >\n {this.state.loading ? <LinearProgress style={{ width: '100%' }} /> : null}\n {list}\n </div>\n </div>\n );\n }\n}\n","import DeviceList from './DeviceList';\n\nexport default DeviceList;\n"],"names":["TooltipButton","props","tooltip","label","disabled","Icon","onClick","text","_jsx","Typography","variant","style","marginLeft","children","Tooltip","title","slotProps","popper","sx","pointerEvents","_jsxs","IconButton","size","getFaIcon","icon","color","iconStyle","split","map","s","trim","filter","includes","Delete","Edit","Refresh","Add","QrCode","Wifi","WifiOff","Bluetooth","BluetoothDisabled","Visibility","Search","LinkOff","LinkIcon","NotListedLocation","PlayArrow","Stop","Pause","QuestionMark","getIconByName","name","altName","FastForward","FastRewind","Lightbulb","Fluorescent","WbIncandescent","Power","Settings","Group","Person","WifiFind","Info","Article","renderControlIcon","action","colors","value","_action$icon","_action$icon2","_action$iconOn","_action$icon3","colorOn","state","primary","secondary","startsWith","iconOn","src","id","renderActionIcon","_action$icon4","_action$icon5","_action$icon6","language","getTranslation","noTranslation","I18n","getLanguage","en","t","DeviceActionButton","_action$description","deviceId","refresh","deviceHandler","description","undefined","DeviceControlComponent","Component","constructor","_props$control$state","_props$control$state2","super","stateHandler","async","this","control","stateId","newState","controlStateHandler","ts","setState","val","componentDidMount","mayBePromise","socket","subscribeState","Promise","componentWillUnmount","unsubscribeState","getDerivedStateFromProps","_props$control$state3","_props$control$state4","sendControl","result","controlHandler","renderButton","_this$props$control$d","Button","startIcon","Fab","renderSwitch","_this$props$control$d2","Switch","checked","onChange","e","target","getColor","type","renderSelect","renderSlider","renderColor","renderIcon","_this$props$control$d3","colorProps","width","height","minHeight","render","styles","DeviceStatus","params","status","connection","iconStyleOK","fill","iconStyleNotOK","iconStyleWarning","batteryIconTooltip","battery","BatteryFullIcon","Battery90Icon","Battery80Icon","Battery60Icon","Battery50Icon","Battery30Icon","Battery20Icon","BatteryAlertIcon","display","alignItems","flexDirection","LinkOffIcon","rssi","NetworkCheckIcon","fontSize","margin","BatteryCharging50Icon","marginRight","warning","WarningIcon","JsonConfig","_props$socket$systemC","_props$socket$systemC2","instanceId","schema","data","error","setError","useState","adapterName","instance","_Fragment","JsonConfigComponent","expertMode","parseInt","onError","_data","embedded","themeName","themeType","theme","isFloatComma","systemConfig","common","dateFormat","manufacturer","model","onImageSelect","uploadImagesToInstance","opacity","position","zIndex","accept","event","files","length","file","reader","FileReader","onload","img","Image","canvas","document","createElement","ctx","getContext","drawImage","resizedImage","toDataURL","fileName","concat","base64Data","replace","response","writeFile64","console","log","JSON","stringify","readAsDataURL","NoImageIcon","viewBox","className","d","getText","DeviceCard","details","loadDetails","catch","copyToClipboard","textToCopy","device","Utils","alert","open","showControlDialog","fetchIcon","lang","readFile","mimeType","_unused","sendTo","renderDialog","Dialog","maxWidth","onClose","DialogContent","DialogActions","alive","autoFocus","renderControlDialog","_this$props$device$co","DialogTitle","top","right","CloseIcon","controls","renderControls","_this$props$device$co2","_this$props$device$co3","_this$props$device$co4","firstControl","ControlIcon","renderActions","_this$props$device$ac","actions","a","renderSmall","hasDetails","Array","isArray","IconDeviceType","Card","minWidth","CardHeader","backgroundColor","palette","main","invertColor","contrastText","avatar","DeviceImageUpload","imageData","MoreVertIcon","subheader","CardContent","background","padding","borderRadius","i","DeviceStatusComponent","textOverflow","overflow","CardActions","disableSpacing","flexGrow","renderBig","_this$state$details","_this$state$details$d","_this$state$details2","_this$state$details2$","_this$props$device$ac2","imgStyle","maxHeight","Paper","Box","gap","paddingLeft","paddingRight","justifyContent","fontWeight","bottom","flex","paddingBottom","smallCards","Communication","responseTimeout","instanceHandler","sendActionToInstance","command","messageToSend","showSpinner","setTimeout","window","selectedInstance","clearTimeout","message","handleClose","origin","confirm","form","originalData","Object","keys","forEach","key","parse","_objectSpread","changed","progress","loadData","showToast","send","sendControlToInstance","warn","showConfirmation","showInput","inputValue","confirmation","inputBefore","actionId","defaultValue","controlId","registerHandler","loadDevices","loadInstanceInfos","renderMessageDialog","_this$state$message2","_this$state$message","hideBackdrop","DialogContentText","_this$state$message3","renderConfirmDialog","_this$state$confirm2","_this$state$confirm","_this$state$confirm3","_this$state$confirm4","renderSnackbar","Snackbar","autoHideDuration","getOkButton","button","_this$state$form","_button","_button2","_button3","_button4","_button5","_button6","_this$state$form2","_this$state$form3","getCancelButton","_button7","_button8","_button9","_button10","_button11","_button12","isClose","_this$state$form4","Close","renderFormDialog","_this$state$form6","_this$state$form7","_this$state$form8","buttons","push","_this$state$form5","fullWidth","renderProgressDialog","_this$state$progress","_this$state$progress2","LinearProgress","renderContent","renderSpinner","Backdrop","CircularProgress","renderConfirmationDialog","Check","onShowInputOk","_showInput$inputBefor","_showInput$inputBefor2","_showInput$inputBefor3","_showInput$inputBefor4","parseFloat","renderInputDialog","_this$state$showInput","okDisabled","allowEmptyValue","isFinite","TextField","htmlInput","min","max","step","input","endAdornment","InputAdornment","onKeyUp","FormControlLabel","Checkbox","FormControl","InputLabel","Select","options","item","MenuItem","gutterBottom","Grid2","container","spacing","Slider","_event","newValue","Input","Number","onBlur","_this$state$showInput2","_this$state$showInput3","inputProps","InstanceActionButton","DeviceList","lastPropsFilter","lastInstance","lastTriggerLoad","filterTimeout","aliveHandler","i18nInitialized","extendTranslations","de","ru","pt","nl","fr","it","es","pl","uk","zhCn","assign","devices","filteredDevices","instanceInfo","loading","groupKey","triggerLoad","stateAlive","getState","applyFilter","toLowerCase","handleFilterChange","renderGroups","groups","marginTop","renderValue","g","find","_this$state$instanceI","_this$state$instanceI2","emptyStyle","deviceGroups","list","group","count","FilterAltOff","_device$group","unknown","_device$group2","_device$group3","Toolbar","autoComplete","edge","Clear"],"sourceRoot":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/*! For license information please see 5503.a4ce73d8.chunk.js.LICENSE.txt */
|
|
2
|
+
"use strict";(self.webpackChunksrc_rx=self.webpackChunksrc_rx||[]).push([[5503],{83123:(e,t,o)=>{o.d(t,{A:()=>r});const r={50:"#fff8e1",100:"#ffecb3",200:"#ffe082",300:"#ffd54f",400:"#ffca28",500:"#ffc107",600:"#ffb300",700:"#ffa000",800:"#ff8f00",900:"#ff6f00",A100:"#ffe57f",A200:"#ffd740",A400:"#ffc400",A700:"#ffab00"}},89069:(e,t,o)=>{o.d(t,{A:()=>r});const r={50:"#eceff1",100:"#cfd8dc",200:"#b0bec5",300:"#90a4ae",400:"#78909c",500:"#607d8b",600:"#546e7a",700:"#455a64",800:"#37474f",900:"#263238",A100:"#cfd8dc",A200:"#b0bec5",A400:"#78909c",A700:"#455a64"}},38455:(e,t,o)=>{o.d(t,{A:()=>h});var r=o(89379),n=o(53986),c=(o(29183),o(67856)),s=o(99947),l=o(79159);const a=["theme"];function i(e){let{theme:t}=e,o=(0,n.A)(e,a);const i=s.A in t?t[s.A]:void 0;return(0,l.jsx)(c.A,(0,r.A)((0,r.A)({},o),{},{themeId:i?s.A:void 0,theme:i||t}))}var d=o(88024);const m=["theme"];function h(e){let{theme:t}=e,o=(0,n.A)(e,m);if("function"===typeof t)return(0,l.jsx)(i,(0,r.A)({theme:t},o));return"colorSchemes"in(s.A in t?t[s.A]:t)?(0,l.jsx)(d.Zr,(0,r.A)({theme:t},o)):(0,l.jsx)(i,(0,r.A)({theme:t},o))}},88024:(e,t,o)=>{o.d(t,{Zr:()=>_,Gk:()=>j,Gs:()=>I,Ut:()=>x});var r=o(89379),n=o(29183),c=o(76608),s=o(53986),l=(o(91999),o(9761)),a=o(20979),i=o(67856),d=o(79159);const m="mode",h="color-scheme",u="data-color-scheme";function f(e){if("undefined"!==typeof window&&"function"===typeof window.matchMedia&&"system"===e){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}}function S(e,t){return"light"===e.mode||"system"===e.mode&&"light"===e.systemMode?t("light"):"dark"===e.mode||"system"===e.mode&&"dark"===e.systemMode?t("dark"):void 0}function p(e,t){if("undefined"===typeof window)return;let o;try{o=localStorage.getItem(e)||void 0,o||localStorage.setItem(e,t)}catch(r){}return o||t}function y(e){const{defaultMode:t="light",defaultLightColorScheme:o,defaultDarkColorScheme:c,supportedColorSchemes:s=[],modeStorageKey:l=m,colorSchemeStorageKey:a=h,storageWindow:i=("undefined"===typeof window?void 0:window),noSsr:d=!1}=e,u=s.join(","),y=s.length>1,[g,v]=n.useState((()=>{const e=p(l,t),r=p("".concat(a,"-light"),o),n=p("".concat(a,"-dark"),c);return{mode:e,systemMode:f(e),lightColorScheme:r,darkColorScheme:n}})),[A,C]=n.useState(d||!y);n.useEffect((()=>{C(!0)}),[]);const k=function(e){return S(e,(t=>"light"===t?e.lightColorScheme:"dark"===t?e.darkColorScheme:void 0))}(g),b=n.useCallback((e=>{v((o=>{if(e===o.mode)return o;const n=null!==e&&void 0!==e?e:t;try{localStorage.setItem(l,n)}catch(c){}return(0,r.A)((0,r.A)({},o),{},{mode:n,systemMode:f(n)})}))}),[l,t]),x=n.useCallback((e=>{e?"string"===typeof e?e&&!u.includes(e)?console.error("`".concat(e,"` does not exist in `theme.colorSchemes`.")):v((t=>{const o=(0,r.A)({},t);return S(t,(t=>{try{localStorage.setItem("".concat(a,"-").concat(t),e)}catch(r){}"light"===t&&(o.lightColorScheme=e),"dark"===t&&(o.darkColorScheme=e)})),o})):v((t=>{const n=(0,r.A)({},t),s=null===e.light?o:e.light,l=null===e.dark?c:e.dark;if(s)if(u.includes(s)){n.lightColorScheme=s;try{localStorage.setItem("".concat(a,"-light"),s)}catch(i){}}else console.error("`".concat(s,"` does not exist in `theme.colorSchemes`."));if(l)if(u.includes(l)){n.darkColorScheme=l;try{localStorage.setItem("".concat(a,"-dark"),l)}catch(i){}}else console.error("`".concat(l,"` does not exist in `theme.colorSchemes`."));return n})):v((e=>{try{localStorage.setItem("".concat(a,"-light"),o),localStorage.setItem("".concat(a,"-dark"),c)}catch(t){}return(0,r.A)((0,r.A)({},e),{},{lightColorScheme:o,darkColorScheme:c})}))}),[u,a,o,c]),w=n.useCallback((e=>{"system"===g.mode&&v((t=>{const o=null!==e&&void 0!==e&&e.matches?"dark":"light";return t.systemMode===o?t:(0,r.A)((0,r.A)({},t),{},{systemMode:o})}))}),[g.mode]),j=n.useRef(w);return j.current=w,n.useEffect((()=>{if("function"!==typeof window.matchMedia||!y)return;const e=function(){return j.current(...arguments)},t=window.matchMedia("(prefers-color-scheme: dark)");return t.addListener(e),e(t),()=>{t.removeListener(e)}}),[y]),n.useEffect((()=>{if(i&&y){const e=e=>{const o=e.newValue;"string"!==typeof e.key||!e.key.startsWith(a)||o&&!u.match(o)||(e.key.endsWith("light")&&x({light:o}),e.key.endsWith("dark")&&x({dark:o})),e.key!==l||o&&!["light","dark","system"].includes(o)||b(o||t)};return i.addEventListener("storage",e),()=>{i.removeEventListener("storage",e)}}}),[x,b,l,a,u,t,i,y]),(0,r.A)((0,r.A)({},g),{},{mode:A?g.mode:void 0,systemMode:A?g.systemMode:void 0,colorScheme:A?k:void 0,setMode:b,setColorScheme:x})}const g=["colorSchemes","components","cssVarPrefix"];var v=o(15719),A=o(4757),C=o(99947);const k={attribute:"data-mui-color-scheme",colorSchemeStorageKey:"mui-color-scheme",defaultLightColorScheme:"light",defaultDarkColorScheme:"dark",modeStorageKey:"mui-mode"},{CssVarsProvider:b,useColorScheme:x,getInitColorSchemeScript:w}=function(e){const{themeId:t,theme:o={},modeStorageKey:c=m,colorSchemeStorageKey:f=h,disableTransitionOnChange:S=!1,defaultColorScheme:p,resolveTheme:v}=e,A={allColorSchemes:[],colorScheme:void 0,darkColorScheme:void 0,lightColorScheme:void 0,mode:void 0,setColorScheme:()=>{},setMode:()=>{},systemMode:void 0},C=n.createContext(void 0),k="string"===typeof p?p:p.light,b="string"===typeof p?p:p.dark;return{CssVarsProvider:function(e){var m,h,u,A;const{children:k,theme:b,modeStorageKey:x=c,colorSchemeStorageKey:w=f,disableTransitionOnChange:j=S,storageWindow:M=("undefined"===typeof window?void 0:window),documentNode:I=("undefined"===typeof document?void 0:document),colorSchemeNode:_=("undefined"===typeof document?void 0:document.documentElement),disableNestedContext:E=!1,disableStyleSheetGeneration:P=!1,defaultMode:O="system",noSsr:K}=e,L=n.useRef(!1),T=(0,a.A)(),W=n.useContext(C),V=!!W&&!E,D=n.useMemo((()=>b||("function"===typeof o?o():o)),[b]),N=D[t],R=N||D,{colorSchemes:F={},components:G={},cssVarPrefix:U}=R,H=(0,s.A)(R,g),q=Object.keys(F).filter((e=>!!F[e])).join(","),Y=n.useMemo((()=>q.split(",")),[q]),Z="string"===typeof p?p:p.light,$="string"===typeof p?p:p.dark,z=F[Z]&&F[$]?O:(null===(m=F[H.defaultColorScheme])||void 0===m||null===(m=m.palette)||void 0===m?void 0:m.mode)||(null===(h=H.palette)||void 0===h?void 0:h.mode),{mode:B,setMode:J,systemMode:Q,lightColorScheme:X,darkColorScheme:ee,colorScheme:te,setColorScheme:oe}=y({supportedColorSchemes:Y,defaultLightColorScheme:Z,defaultDarkColorScheme:$,modeStorageKey:x,colorSchemeStorageKey:w,defaultMode:z,storageWindow:M,noSsr:K});let re=B,ne=te;V&&(re=W.mode,ne=W.colorScheme);const ce=ne||H.defaultColorScheme,se=(null===(u=H.generateThemeVars)||void 0===u?void 0:u.call(H))||H.vars,le=(0,r.A)((0,r.A)({},H),{},{components:G,colorSchemes:F,cssVarPrefix:U,vars:se});if("function"===typeof le.generateSpacing&&(le.spacing=le.generateSpacing()),ce){const e=F[ce];e&&"object"===typeof e&&Object.keys(e).forEach((t=>{e[t]&&"object"===typeof e[t]?le[t]=(0,r.A)((0,r.A)({},le[t]),e[t]):le[t]=e[t]}))}const ae=H.colorSchemeSelector;n.useEffect((()=>{if(ne&&_&&ae&&"media"!==ae){const e=ae;let t=ae;if("class"===e&&(t=".%s"),"data"===e&&(t="[data-%s]"),null!==e&&void 0!==e&&e.startsWith("data-")&&!e.includes("%s")&&(t="[".concat(e,'="%s"]')),t.startsWith("."))_.classList.remove(...Y.map((e=>t.substring(1).replace("%s",e)))),_.classList.add(t.substring(1).replace("%s",ne));else{const e=t.replace("%s",ne).match(/\[([^\]]+)\]/);if(e){const[t,o]=e[1].split("=");o||Y.forEach((e=>{_.removeAttribute(t.replace(ne,e))})),_.setAttribute(t,o?o.replace(/"|'/g,""):"")}else _.setAttribute(t,ne)}}}),[ne,ae,_,Y]),n.useEffect((()=>{let e;if(j&&L.current&&I){const t=I.createElement("style");t.appendChild(I.createTextNode("*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),I.head.appendChild(t),window.getComputedStyle(I.body),e=setTimeout((()=>{I.head.removeChild(t)}),1)}return()=>{clearTimeout(e)}}),[ne,j,I]),n.useEffect((()=>(L.current=!0,()=>{L.current=!1})),[]);const ie=n.useMemo((()=>({allColorSchemes:Y,colorScheme:ne,darkColorScheme:ee,lightColorScheme:X,mode:re,setColorScheme:oe,setMode:J,systemMode:Q})),[Y,ne,ee,X,re,oe,J,Q,le.colorSchemeSelector]);let de=!0;(P||!1===H.cssVariables||V&&(null===T||void 0===T?void 0:T.cssVarPrefix)===U)&&(de=!1);const me=(0,d.jsxs)(n.Fragment,{children:[(0,d.jsx)(i.A,{themeId:N?t:void 0,theme:v?v(le):le,children:k}),de&&(0,d.jsx)(l.A,{styles:(null===(A=le.generateStyleSheets)||void 0===A?void 0:A.call(le))||[]})]});return V?me:(0,d.jsx)(C.Provider,{value:ie,children:me})},useColorScheme:()=>n.useContext(C)||A,getInitColorSchemeScript:e=>function(e){const{defaultMode:t="system",defaultLightColorScheme:o="light",defaultDarkColorScheme:r="dark",modeStorageKey:n=m,colorSchemeStorageKey:c=h,attribute:s=u,colorSchemeNode:l="document.documentElement",nonce:a}=e||{};let i="",f=s;if("class"===s&&(f=".%s"),"data"===s&&(f="[data-%s]"),f.startsWith(".")){const e=f.substring(1);i+="".concat(l,".classList.remove('").concat(e,"'.replace('%s', light), '").concat(e,"'.replace('%s', dark));\n ").concat(l,".classList.add('").concat(e,"'.replace('%s', colorScheme));")}const S=f.match(/\[([^\]]+)\]/);if(S){const[e,t]=S[1].split("=");t||(i+="".concat(l,".removeAttribute('").concat(e,"'.replace('%s', light));\n ").concat(l,".removeAttribute('").concat(e,"'.replace('%s', dark));")),i+="\n ".concat(l,".setAttribute('").concat(e,"'.replace('%s', colorScheme), ").concat(t?"".concat(t,".replace('%s', colorScheme)"):'""',");")}else i+="".concat(l,".setAttribute('").concat(f,"', colorScheme);");return(0,d.jsx)("script",{suppressHydrationWarning:!0,nonce:"undefined"===typeof window?a:"",dangerouslySetInnerHTML:{__html:"(function() {\ntry {\n let colorScheme = '';\n const mode = localStorage.getItem('".concat(n,"') || '").concat(t,"';\n const dark = localStorage.getItem('").concat(c,"-dark') || '").concat(r,"';\n const light = localStorage.getItem('").concat(c,"-light') || '").concat(o,"';\n if (mode === 'system') {\n // handle system mode\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n if (mql.matches) {\n colorScheme = dark\n } else {\n colorScheme = light\n }\n }\n if (mode === 'light') {\n colorScheme = light;\n }\n if (mode === 'dark') {\n colorScheme = dark;\n }\n if (colorScheme) {\n ").concat(i,"\n }\n} catch(e){}})();")}},"mui-color-scheme-init")}((0,r.A)({colorSchemeStorageKey:f,defaultLightColorScheme:k,defaultDarkColorScheme:b,modeStorageKey:c},e))}}({themeId:C.A,theme:()=>(0,v.A)({cssVariables:!0}),colorSchemeStorageKey:k.colorSchemeStorageKey,modeStorageKey:k.modeStorageKey,defaultColorScheme:{light:k.defaultLightColorScheme,dark:k.defaultDarkColorScheme},resolveTheme:e=>{const t=(0,r.A)((0,r.A)({},e),{},{typography:(0,A.A)(e.palette,e.typography)});return t.unstable_sx=function(e){return(0,c.A)({sx:e,theme:this})},t}});function j(e){return(0,d.jsx)(b,(0,r.A)({},e))}let M=!1;const I=e=>(M||(console.warn(["MUI: The getInitColorSchemeScript function has been deprecated.","","You should use `import InitColorSchemeScript from '@mui/material/InitColorSchemeScript'`","and replace the function call with `<InitColorSchemeScript />` instead."].join("\n")),M=!0),w(e)),_=b},40219:(e,t,o)=>{o.d(t,{A:()=>n});var r=o(29183);const n=r.createContext(null)},20979:(e,t,o)=>{o.d(t,{A:()=>c});var r=o(29183),n=o(40219);function c(){return r.useContext(n.A)}},9761:(e,t,o)=>{o.d(t,{A:()=>c});o(29183),o(91999);var r=o(3832),n=o(79159);function c(e){const{styles:t,defaultTheme:o={}}=e,c="function"===typeof t?e=>{return t(void 0===(r=e)||null===r||0===Object.keys(r).length?o:e);var r}:t;return(0,n.jsx)(r.Global,{styles:c})}},81587:(e,t,o)=>{o.d(t,{A:()=>i});o(29183),o(91999);var r=o(3832),n=o(8091),c=o(48648),s=o(79159);const l=e=>{const t=(0,n.A)(e);class o extends c.v{constructor(e){super(e),this.prepend=t.sheet.prepend}}return t.sheet=new o({key:t.key,nonce:t.sheet.nonce,container:t.sheet.container,speedy:t.sheet.isSpeedy,prepend:t.sheet.prepend,insertionPoint:t.sheet.insertionPoint}),t};let a;function i(e){const{injectFirst:t,children:o}=e;return t&&a?(0,s.jsx)(r.CacheProvider,{value:a,children:o}):o}"object"===typeof document&&(a=l({key:"css",prepend:!0}))},59402:(e,t,o)=>{o.d(t,{A:()=>a,b:()=>l});var r=o(29183),n=(o(91999),o(31778)),c=o(79159);const s=r.createContext(void 0);function l(e){let{props:t,name:o}=e;return function(e){const{theme:t,name:o,props:r}=e;if(!t||!t.components||!t.components[o])return r;const c=t.components[o];return c.defaultProps?(0,n.A)(c.defaultProps,r):c.styleOverrides||c.variants?r:(0,n.A)(c,r)}({props:t,name:o,theme:{components:r.useContext(s)}})}const a=function(e){let{value:t,children:o}=e;return(0,c.jsx)(s.Provider,{value:t,children:o})}},67856:(e,t,o)=>{o.d(t,{A:()=>p});var r=o(89379),n=o(29183),c=(o(91999),o(20979)),s=o(40219);const l="function"===typeof Symbol&&Symbol.for?Symbol.for("mui.nested"):"__THEME_NESTED__";var a=o(79159);const i=function(e){const{children:t,theme:o}=e,i=(0,c.A)(),d=n.useMemo((()=>{const e=null===i?(0,r.A)({},o):function(e,t){if("function"===typeof t)return t(e);return(0,r.A)((0,r.A)({},e),t)}(i,o);return null!=e&&(e[l]=null!==i),e}),[o,i]);return(0,a.jsx)(s.A.Provider,{value:d,children:t})};var d=o(3832),m=o(46096),h=o(29239),u=o(59402);const f={};function S(e,t,o){let c=arguments.length>3&&void 0!==arguments[3]&&arguments[3];return n.useMemo((()=>{const n=e&&t[e]||t;if("function"===typeof o){const s=o(n),l=e?(0,r.A)((0,r.A)({},t),{},{[e]:s}):s;return c?()=>l:l}return e?(0,r.A)((0,r.A)({},t),{},{[e]:o}):(0,r.A)((0,r.A)({},t),o)}),[e,t,o,c])}const p=function(e){const{children:t,theme:o,themeId:r}=e,n=(0,m.A)(f),s=(0,c.A)()||f,l=S(r,n,o),p=S(r,s,o,!0),y="rtl"===(r?l[r]:l).direction;return(0,a.jsx)(i,{theme:p,children:(0,a.jsx)(d.ThemeContext.Provider,{value:l,children:(0,a.jsx)(h.A,{value:y,children:(0,a.jsx)(u.A,{value:r?l[r].components:l.components,children:t})})})})}},46096:(e,t,o)=>{o.d(t,{A:()=>c});var r=o(29183),n=o(3832);const c=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;const t=r.useContext(n.ThemeContext);return t&&(o=t,0!==Object.keys(o).length)?t:e;var o}},31778:(e,t,o)=>{o.d(t,{A:()=>n});var r=o(89379);function n(e,t){const o=(0,r.A)({},t);for(const c in e)if(Object.prototype.hasOwnProperty.call(e,c)){const s=c;if("components"===s||"slots"===s)o[s]=(0,r.A)((0,r.A)({},e[s]),o[s]);else if("componentsProps"===s||"slotProps"===s){const c=e[s],l=t[s];if(l)if(c){o[s]=(0,r.A)({},l);for(const e in c)if(Object.prototype.hasOwnProperty.call(c,e)){const t=e;o[s][t]=n(c[t],l[t])}}else o[s]=l;else o[s]=c||{}}else void 0===o[s]&&(o[s]=e[s])}return o}},30365:(e,t,o)=>{var r=o(29183),n=Symbol.for("react.element"),c=Symbol.for("react.fragment"),s=Object.prototype.hasOwnProperty,l=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,a={key:!0,ref:!0,__self:!0,__source:!0};function i(e,t,o){var r,c={},i=null,d=null;for(r in void 0!==o&&(i=""+o),void 0!==t.key&&(i=""+t.key),void 0!==t.ref&&(d=t.ref),t)s.call(t,r)&&!a.hasOwnProperty(r)&&(c[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===c[r]&&(c[r]=t[r]);return{$$typeof:n,type:e,key:i,ref:d,props:c,_owner:l.current}}t.Fragment=c,t.jsx=i,t.jsxs=i},79159:(e,t,o)=>{e.exports=o(30365)}}]);
|
|
3
|
+
//# sourceMappingURL=5503.a4ce73d8.chunk.js.map
|