iobroker.admin 6.3.1 → 6.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["components/ObjectBrowser.jsx"],"names":["ICON_SIZE","ROW_HEIGHT","ITEM_LEVEL","SMALL_BUTTON_SIZE","COLOR_NAME_SYSTEM","COLOR_NAME_SYSTEM_ADAPTER","COLOR_NAME_ERROR_DARK","COLOR_NAME_ERROR_LIGHT","COLOR_NAME_CONNECTED_DARK","COLOR_NAME_CONNECTED_LIGHT","COLOR_NAME_DISCONNECTED_DARK","COLOR_NAME_DISCONNECTED_LIGHT","styles","theme","generateFile","filename","obj","el","binarySearch","list","find","_start","_end","middle","getName","name","lang","getSelectIdIcon","objects","id","imagePrefix","src","_id_","aIcon","common","cIcon","instance","applyFilter","item","filters","context","counter","customFilter","selectedTypes","_depth","filteredOut","data","role","_item","getVisibleItems","type","_result","getSystemIcon","k","icon","getIdFieldTooltip","classes","tooltip","buildTree","options","ids","a","b","currentPathArr","currentPath","currentPathLen","root","info","croot","i","parts","repeat","curPath","_croot","u","move","_a","_b","_c","_d","aName","bName","findNode","_parts","_path","_level","found","_id","findRoomsForObject","withParentInfo","rooms","ownEnums","findEnumsForObjectAsIds","enumName","funcs","findFunctionsForObject","formatValue","state","texts","dateFormat","isFloatComma","states","isCommon","valText","v","valFull","from","user","prepareSparkData","values","time","val","DEFAULT_FILTER","ITEM_IMAGES","StyledBadge","SCREEN_WIDTHS","objectsAlreadyLoaded","ObjectBrowser","props","newState","event","columnsForAdmin","result","en","enums","objId","e","_enObj","enObj","objs","error","evt","contents","json","len","err","t","value","acl","check","arrayTooltipText","funcRenderStateObject","rights","width","widthNext","handle","expanded","filter","pos","customDialog","location","selected","columns","columnsWidths","foldersFirst","statesView","resizerCurrentWidths","update","resolve","_objects","moreObjects","node","cb","changed","path","isDouble","pattern","toggleItem","instances","_root","_partyId","isPause","_name","attr","hasIcons","newFilter","func","types","customs","depth","keys","idDot","idLen","key","isAll","allowObjectCreation","input","text","count","start","aclSystemConfig","now","nowMs","sparks","s","copyText","enumIds","newArray","enumId","promises","toCheck","itemEnums","enumsOriginal","labelId","enumDialogEnums","ObjectBrowserEditRole","isSave","it","p","isExpanded","iconFolder","itemType","iconItem","typeImg","paddingLeft","per","pef","checkbox","valueEditable","enumEditable","checkVisibleObjectType","newValue","newValueTitle","readWriteAlias","alias","checkColor","invertBackground","background","icons","colorSet","q","items","leaf","DragWrapper","columnsAuto","WIDTHS","widthSum","adapter","column","newWidth","accumulator","filterClearInValue","scrollBarWidth","ObjectCustomDialog","changedIds","valAck","ObjectBrowserEditObject","updateAlias","ObjectBrowserViewFile","ObjectBrowserValue","res","jsonFilter","_export"],"mappings":"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MF,EAAaE,GAAqB,EACxC,MAAOA,EAAoB,EAC3B,QAAS,GACT,UAAW,CACP,QAAS,CACb,CACJ,EACA,SAAU,CACN,QAAS,eACT,cAAe,MACf,SAAU,GACV,WAAY,EACZ,SAAU,SACV,aAAc,WACd,SAAU,WACV,gBAAiB,CACb,QAAS,MACb,EACA,sBAAuB,CACnB,QAAS,OACb,CACJ,EACA,YAAa,CACT,UAAW,SACX,SAAU,GACV,QAAS,GACT,UAAW,CACP,MAAOU,EAAM,QAAQ,OAAS,OAAS,UAAY,SACvD,CACJ,EACA,wBAAyB,CACrB,OAAQ,GACR,UAAW,EACf,EACA,iBAAkB,CACd,WAAY,CAChB,EACA,qBAAsB,CAClB,WAAY,MAChB,EACA,SAAU,CACN,QAAS,eACT,cAAe,MACf,cAAe,CACX,cAAe,SACf,MAAOb,EACP,OAAQA,EACR,QAAS,cACb,EACA,oBAAqB,CACjB,WAAY,CAChB,CACJ,EACA,SAAU,CACN,QAAS,eACT,cAAe,MACf,aAAc,WACd,SAAU,QACd,EACA,SAAU,CACN,QAAS,eACT,cAAe,MACf,aAAc,WACd,SAAU,QACd,EACA,eAAgB,CACZ,QAAS,EACb,EACA,SAAU,CACN,QAAS,eACT,cAAe,MACf,aAAc,WACd,SAAU,QACd,EACA,UAAW,CACP,QAAS,eACT,cAAe,MACf,aAAc,WACd,SAAU,QACd,EACA,gBAAiB,CACb,UAAW,EACX,WAAY,CACR,UAAW,YACf,CACJ,EACA,qBAAsB,CAClB,QAAS,EACb,EACA,YAAa,CACT,QAAS,eACT,cAAe,KACnB,EACA,iBAAkB,CACd,SAAU,EACd,EACA,cAAe,CACX,MAAO,OACP,OAAQC,EACR,SAAU,GACV,QAAS,eACT,SAAU,SACV,aAAc,WACd,SAAU,WACV,cAAe,MACf,gBAAiB,CACb,QAAS,MACb,EACA,sBAAuB,CACnB,QAAS,OACb,CACJ,EACA,cAAe,CACX,MAAO,SACX,EACA,sBAAuB,CACnB,UAAW,SACX,MAAO,IACP,QAAS,cACb,EACA,sBAAuB,CACnB,MAAO,IACP,QAAS,eAET,WAAY,SACZ,aAAc,UAClB,E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","file":"static/js/6322.4b730316.chunk.js","sourcesContent":["/**\n * Copyright 2020-2022, bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n * To all editors: please merge asap the changes to https://github.com/ioBroker/adapter-react/blob/master/src/Components/ObjectBrowser.js\n * This file is here only temporary for better debugging\n **/\nimport React, { Component, createRef } from 'react';\nimport PropTypes from 'prop-types';\nimport withStyles from '@mui/styles/withStyles';\nimport SVG from 'react-inlinesvg';\n\nimport IconButton from '@mui/material/IconButton';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport MenuItem from '@mui/material/MenuItem';\nimport Select from '@mui/material/Select';\nimport FormControl from '@mui/material/FormControl';\nimport Input from '@mui/material/Input';\nimport Grid from '@mui/material/Grid';\nimport Badge from '@mui/material/Badge';\nimport Tooltip from '@mui/material/Tooltip';\nimport Snackbar from '@mui/material/Snackbar';\nimport Checkbox from '@mui/material/Checkbox';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction';\nimport ListItemText from '@mui/material/ListItemText';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport Dialog from '@mui/material/Dialog';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogContentText from '@mui/material/DialogContentText';\nimport DialogActions from '@mui/material/DialogActions';\nimport Button from '@mui/material/Button';\nimport Fab from '@mui/material/Fab';\nimport TextField from '@mui/material/TextField';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Switch from '@mui/material/Switch';\n// import ListItemButton from '@mui/material/ListItemButton';\n// import Slider from '@mui/material/Slider';\n// import Typography from '@mui/material/Typography';\n\n// Icons\nimport IconEdit from '@mui/icons-material/Edit';\nimport IconDelete from '@mui/icons-material/Delete';\nimport IconConfig from '@mui/icons-material/Settings';\nimport IconSystem from '@mui/icons-material/SettingsApplications';\nimport IconPhoto from '@mui/icons-material/Photo';\nimport IconGroup from '@mui/icons-material/SupervisedUserCircle';\nimport IconSchedule from '@mui/icons-material/CalendarToday';\nimport IconUser from '@mui/icons-material/PersonOutlined';\nimport IconHost from '@mui/icons-material/Router';\nimport IconConnection from '@mui/icons-material/Wifi';\nimport IconInfo from '@mui/icons-material/Info';\nimport IconMeta from '@mui/icons-material/Description';\nimport IconScript from '@mui/icons-material/Code';\nimport IconChart from '@mui/icons-material/ShowChart';\nimport IconEnum from '@mui/icons-material/ListAlt';\nimport IconColumns from '@mui/icons-material/ViewColumn';\nimport IconClose from '@mui/icons-material/Close';\nimport IconCheck from '@mui/icons-material/Check';\nimport BuildIcon from '@mui/icons-material/Build';\nimport PublishIcon from '@mui/icons-material/Publish';\nimport AddIcon from '@mui/icons-material/Add';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport LooksOneIcon from '@mui/icons-material/LooksOne';\nimport PressButtonIcon from '@mui/icons-material/RoomService';\nimport IconError from '@mui/icons-material/Error';\nimport IconDisconnected from '@mui/icons-material/WifiOff';\n\nimport IconExpert from '@iobroker/adapter-react-v5/icons/IconExpert';\nimport IconAdapter from '@iobroker/adapter-react-v5/icons/IconAdapter';\nimport IconAlias from '@iobroker/adapter-react-v5/icons/IconAlias';\nimport IconChannel from '@iobroker/adapter-react-v5/icons/IconChannel';\nimport IconCopy from '@iobroker/adapter-react-v5/icons/IconCopy';\nimport IconDevice from '@iobroker/adapter-react-v5/icons/IconDevice';\nimport IconDocument from '@iobroker/adapter-react-v5/icons/IconDocument';\nimport IconDocumentReadOnly from '@iobroker/adapter-react-v5/icons/IconDocumentReadOnly';\nimport IconInstance from '@iobroker/adapter-react-v5/icons/IconInstance';\nimport IconState from '@iobroker/adapter-react-v5/icons/IconState';\nimport IconClosed from '@iobroker/adapter-react-v5/icons/IconClosed';\nimport IconOpen from '@iobroker/adapter-react-v5/icons/IconOpen';\nimport IconClearFilter from '@iobroker/adapter-react-v5/icons/IconClearFilter';\n\n// own\nimport Icon from '@iobroker/adapter-react-v5/Components/Icon';\nimport withWidth from '@iobroker/adapter-react-v5/Components/withWidth';\nimport Utils from './Utils'; // @iobroker/adapter-react-v5/Components/Utils\nimport TabContainer from './TabContainer';\nimport TabContent from './TabContent';\nimport TabHeader from './TabHeader';\n\nconst ICON_SIZE = 24;\nconst ROW_HEIGHT = 32;\nconst ITEM_LEVEL = 16;\nconst SMALL_BUTTON_SIZE = 20;\nconst COLOR_NAME_SYSTEM = '#ff6d69';\nconst COLOR_NAME_SYSTEM_ADAPTER = '#5773ff';\nconst COLOR_NAME_ERROR_DARK = '#ff413c';\nconst COLOR_NAME_ERROR_LIGHT = '#86211f';\nconst COLOR_NAME_CONNECTED_DARK = '#57ff45';\nconst COLOR_NAME_CONNECTED_LIGHT = '#098c04';\nconst COLOR_NAME_DISCONNECTED_DARK = '#f3ad11';\nconst COLOR_NAME_DISCONNECTED_LIGHT = '#6c5008';\n\nconst styles = theme => ({\n toolbar: {\n minHeight: 38, // Theme.toolbar.height,\n // boxShadow: '0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12)'\n },\n toolbarButtons: {\n padding: 4,\n marginLeft: 4,\n },\n switchColumnAuto: {\n marginLeft: theme.spacing(2),\n },\n dialogColumns: {\n transition: 'opacity 1s',\n },\n dialogColumnsLabel: {\n fontSize: 12,\n paddingTop: theme.spacing(1),\n },\n columnCustom: {\n width: '100%',\n display: 'inline-block',\n },\n columnCustomEditable: {\n cursor: 'text',\n },\n columnCustomCenter: {\n textAlign: 'center',\n },\n columnCustomLeft: {\n textAlign: 'left',\n },\n columnCustomRight: {\n textAlign: 'right',\n },\n width100: {\n width: '100%',\n },\n transparent_10: {\n opacity: 0.1,\n },\n transparent_20: {\n opacity: 0.2,\n },\n transparent_30: {\n opacity: 0.3,\n },\n transparent_40: {\n opacity: 0.4,\n },\n transparent_50: {\n opacity: 0.5,\n },\n transparent_60: {\n opacity: 0.6,\n },\n transparent_70: {\n opacity: 0.7,\n },\n transparent_80: {\n opacity: 0.8,\n },\n transparent_90: {\n opacity: 0.9,\n },\n transparent_100: {\n opacity: 1,\n },\n columnsDialogInputWidth: {\n width: 80,\n },\n headerRow: {\n paddingLeft: theme.spacing(1),\n height: 38,\n whiteSpace: 'nowrap',\n userSelect: 'none',\n },\n buttonClearFilter: {\n position: 'relative',\n float: 'right',\n padding: 0,\n },\n buttonClearFilterIcon: {\n zIndex: 2,\n position: 'absolute',\n top: 0,\n left: 0,\n color: '#FF0000',\n opacity: 0.7,\n },\n\n tableDiv: {\n paddingTop: 0, // theme.spacing(1),\n paddingLeft: 0,\n width: `calc(100% - ${theme.spacing(1)})`,\n height: 'calc(100% - 38px)',\n overflow: 'auto',\n },\n tableRow: {\n paddingLeft: theme.spacing(1),\n height: ROW_HEIGHT,\n lineHeight: `${ROW_HEIGHT}px`,\n verticalAlign: 'top',\n userSelect: 'none',\n width: '100%',\n '&:hover': {\n background: `${theme.palette.mode === 'dark' ? theme.palette.primary.dark : theme.palette.primary.light} !important`,\n color: Utils.invertColor(theme.palette.primary.main, true),\n },\n whiteSpace: 'nowrap',\n flexWrap: 'nowrap',\n },\n tableRowLines: {\n borderBottom: `1px solid ${theme.palette.mode === 'dark' ? '#8888882e' : '#8888882e'}`,\n '& > div': {\n borderRight: `1px solid ${theme.palette.mode === 'dark' ? '#8888882e' : '#8888882e'}`,\n },\n },\n tableRowNoDragging: {\n cursor: 'pointer',\n },\n tableRowAlias: {\n height: ROW_HEIGHT + 10,\n },\n tableRowAliasReadWrite: {\n height: ROW_HEIGHT + 22,\n },\n checkBox: {\n padding: 0,\n },\n cellId: {\n position: 'relative',\n fontSize: '1rem',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n // verticalAlign: 'top',\n // position: 'relative',\n '& .copyButton': {\n display: 'none',\n },\n '&:hover .copyButton': {\n display: 'block',\n },\n '& .iconOwn': {\n display: 'block',\n width: ROW_HEIGHT - 4,\n height: ROW_HEIGHT - 4,\n marginTop: 2,\n float: 'right',\n },\n '&:hover .iconOwn': {\n display: 'none',\n },\n '& *': {\n width: 'initial',\n },\n },\n cellIdSpan: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n // display: 'inline-block',\n // verticalAlign: 'top',\n },\n cellIdIconFolder: {\n marginRight: theme.spacing(1),\n width: ROW_HEIGHT - 4,\n height: ROW_HEIGHT - 4,\n cursor: 'pointer',\n color: theme.palette.secondary.main || '#fbff7d',\n verticalAlign: 'top',\n },\n cellIdIconDocument: {\n verticalAlign: 'middle',\n marginLeft: (ROW_HEIGHT - SMALL_BUTTON_SIZE) / 2,\n marginRight: theme.spacing(1),\n width: SMALL_BUTTON_SIZE,\n height: SMALL_BUTTON_SIZE,\n },\n cellIdIconOwn: {\n\n },\n cellIdTooltip: {\n fontSize: 14,\n },\n cellIdTooltipLink: {\n color: \"#7ec2fd\",\n \"&:hover\": {\n color: \"#7ec2fd\"\n },\n \"&:visited\": {\n color: \"#7ec2fd\"\n }\n },\n cellCopyButton: {\n width: SMALL_BUTTON_SIZE,\n height: SMALL_BUTTON_SIZE,\n top: (ROW_HEIGHT - SMALL_BUTTON_SIZE) / 2,\n opacity: 0.8,\n '&:hover': {\n opacity: 1,\n },\n position: 'absolute',\n right: 3,\n },\n cellEditButton: {\n width: SMALL_BUTTON_SIZE,\n height: SMALL_BUTTON_SIZE,\n color: 'white',\n position: 'absolute',\n top: (ROW_HEIGHT - SMALL_BUTTON_SIZE) / 2,\n right: SMALL_BUTTON_SIZE + 3,\n opacity: 0.7,\n '&:hover': {\n opacity: 1,\n },\n },\n cellName: {\n display: 'inline-block',\n verticalAlign: 'top',\n fontSize: 14,\n marginLeft: 5,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n position: 'relative',\n '& .copyButton': {\n display: 'none',\n },\n '&:hover .copyButton': {\n display: 'block',\n },\n },\n cellIdAlias: {\n fontStyle: 'italic',\n fontSize: 12,\n opacity: 0.7,\n '&:hover': {\n color: theme.palette.mode === 'dark' ? '#009900' : '#007700',\n },\n },\n cellIdAliasReadWriteDiv: {\n height: 24,\n marginTop: -5,\n },\n cellIdAliasAlone: {\n lineHeight: 0,\n },\n cellIdAliasReadWrite: {\n lineHeight: '12px',\n },\n cellType: {\n display: 'inline-block',\n verticalAlign: 'top',\n '& .itemIcon': {\n verticalAlign: 'middle',\n width: ICON_SIZE,\n height: ICON_SIZE,\n display: 'inline-block',\n },\n '& .itemIconFolder': {\n marginLeft: 3,\n },\n },\n cellRole: {\n display: 'inline-block',\n verticalAlign: 'top',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n cellRoom: {\n display: 'inline-block',\n verticalAlign: 'top',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n cellEnumParent: {\n opacity: 0.4,\n },\n cellFunc: {\n display: 'inline-block',\n verticalAlign: 'top',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n cellValue: {\n display: 'inline-block',\n verticalAlign: 'top',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n cellValueButton: {\n marginTop: 5,\n '&:active': {\n transform: 'scale(0.8)',\n },\n },\n cellValueButtonFalse: {\n opacity: 0.3,\n },\n cellAdapter: {\n display: 'inline-block',\n verticalAlign: 'top',\n },\n cellValueTooltip: {\n fontSize: 12,\n },\n cellValueText: {\n width: '100%',\n height: ROW_HEIGHT,\n fontSize: 16,\n display: 'inline-block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n position: 'relative',\n verticalAlign: 'top',\n '& .copyButton': {\n display: 'none',\n },\n '&:hover .copyButton': {\n display: 'block',\n },\n },\n cellValueFile: {\n color: '#2837b9',\n },\n cellValueTooltipTitle: {\n fontStyle: 'italic',\n width: 100,\n display: 'inline-block',\n },\n cellValueTooltipValue: {\n width: 120,\n display: 'inline-block',\n // overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n },\n cellValueTooltipBoth: {\n width: 220,\n display: 'inline-block',\n whiteSpace: 'nowrap',\n },\n cellValueTooltipBox: {\n width: 250,\n overflow: 'hidden',\n },\n cellValueTextUnit: {\n marginLeft: theme.spacing(0.5),\n opacity: 0.8,\n },\n newValue: {\n animation: '$newValueAnimation 2s ease-in-out',\n },\n '@keyframes newValueAnimation': {\n '0%': {\n color: '#00f900',\n },\n '80%': {\n color: '#008000',\n },\n '100%': {\n color: theme.palette.mode === 'dark' ? '#fff' : '#000',\n },\n },\n cellValueTextState: {\n opacity: 0.7,\n },\n cellValueTooltipCopy: {\n position: 'absolute',\n bottom: 3,\n right: 3,\n },\n cellValueTooltipEdit: {\n position: 'absolute',\n bottom: 3,\n right: 15,\n },\n cellButtons: {\n display: 'inline-block',\n verticalAlign: 'top',\n },\n cellButtonsButton: {\n display: 'inline-block',\n opacity: 0.7,\n width: SMALL_BUTTON_SIZE + 4,\n height: SMALL_BUTTON_SIZE + 4,\n '&:hover': {\n opacity: 1,\n },\n paddingTop: 0,\n paddingLeft: 0,\n marginTop: -2,\n },\n cellButtonsEmptyButton: {\n fontSize: 12,\n },\n cellButtonMinWidth: {\n minWidth: 47,\n },\n cellButtonsButtonAlone: {\n marginLeft: SMALL_BUTTON_SIZE + 4,\n paddingTop: 0,\n marginTop: -2,\n },\n cellButtonsButtonWithCustoms: {\n color: theme.palette.secondary.main,\n },\n cellButtonsButtonWithoutCustoms: {\n opacity: 0.2,\n },\n cellButtonsValueButton: {\n position: 'absolute',\n display: 'inline-block',\n top: SMALL_BUTTON_SIZE / 2 - 2,\n opacity: 0.7,\n width: SMALL_BUTTON_SIZE - 2,\n height: SMALL_BUTTON_SIZE - 2,\n color: theme.palette.action.active,\n '&:hover': {\n opacity: 1,\n },\n },\n cellButtonsValueButtonCopy: {\n right: theme.spacing(1),\n cursor: 'pointer',\n },\n cellButtonsValueButtonEdit: {\n right: SMALL_BUTTON_SIZE / 2 + parseInt(theme.spacing(2), 10),\n },\n\n filteredOut: {\n opacity: 0.5,\n },\n filteredParentOut: {\n opacity: 0.3,\n },\n filterInput: {\n marginTop: 0,\n marginBottom: 0,\n },\n selectIcon: {\n width: 24,\n height: 24,\n marginRight: 4,\n },\n selectNone: {\n opacity: 0.5,\n },\n itemSelected: {\n background: `${theme.palette.primary.main} !important`,\n color: `${Utils.invertColor(theme.palette.primary.main, true)} !important`,\n },\n header: {\n width: '100%',\n },\n headerCell: {\n display: 'inline-block',\n verticalAlign: 'top',\n },\n headerCellValue: {\n paddingTop: 4,\n // paddingLeft: 5,\n fontSize: 16,\n },\n headerCellInput: {\n width: 'calc(100% - 5px)',\n height: ROW_HEIGHT,\n paddingTop: 3,\n '& .itemIcon': {\n verticalAlign: 'middle',\n width: ICON_SIZE,\n height: ICON_SIZE,\n display: 'inline-block',\n },\n },\n headerCellSelectItem: {\n '& .itemIcon': {\n width: ICON_SIZE,\n height: ICON_SIZE,\n marginRight: 5,\n display: 'inline-block',\n },\n },\n visibleButtons: {\n color: '#2196f3',\n opacity: 0.7,\n },\n grow: {\n flexGrow: 1,\n },\n enumIconDiv: {\n marginRight: theme.spacing(1),\n width: 32,\n height: 32,\n borderRadius: 8,\n background: '#FFFFFF',\n },\n enumIcon: {\n marginTop: 4,\n marginLeft: 4,\n width: 24,\n height: 24,\n },\n enumDialog: {\n overflow: 'hidden',\n },\n enumList: {\n minWidth: 250,\n height: 'calc(100% - 50px)',\n overflow: 'auto',\n },\n enumButton: {\n float: 'right',\n },\n enumCheckbox: {\n minWidth: 0,\n },\n buttonDiv: {\n display: 'flex',\n height: '100%',\n alignItems: 'center',\n },\n aclText: {\n fontSize: 13,\n },\n rightsObject: {\n color: '#55ff55',\n paddingLeft: 3,\n },\n rightsState: {\n color: '#86b6ff',\n paddingLeft: 3,\n },\n textCenter: {\n padding: 12,\n textAlign: 'center',\n },\n tooltipAccessControl: {\n display: 'flex',\n flexDirection: 'column',\n },\n '@media screen and (max-width: 465px)': {\n columnsDialogInputWidth: {\n width: 50,\n },\n fontSizeTitle: {\n '& *': {\n fontSize: 12,\n },\n },\n },\n '@media screen and (max-width: 700px)': {\n\n },\n '@media screen and (max-width: 430px)': {\n\n },\n draggable: {\n cursor: 'copy',\n },\n nonDraggable: {\n cursor: 'no-drop',\n },\n selectClearButton: {\n position: 'absolute',\n top: 0,\n right: 0,\n borderRadius: 20,\n backgroundColor: theme.palette.background.default,\n },\n iconDeviceConnected: {\n color: theme.palette.mode === 'dark' ? COLOR_NAME_CONNECTED_DARK : COLOR_NAME_CONNECTED_LIGHT,\n opacity: 0.8,\n position: 'absolute',\n top: 4,\n right: 32,\n width: 20,\n },\n iconDeviceDisconnected: {\n color: theme.palette.mode === 'dark' ? COLOR_NAME_DISCONNECTED_DARK : COLOR_NAME_DISCONNECTED_LIGHT,\n opacity: 0.8,\n position: 'absolute',\n top: 4,\n right: 32,\n width: 20,\n },\n iconDeviceError: {\n color: theme.palette.mode === 'dark' ? COLOR_NAME_ERROR_DARK : COLOR_NAME_ERROR_LIGHT,\n opacity: 0.8,\n position: 'absolute',\n top: 4,\n right: 50,\n width: 20,\n },\n resizeHandle: {\n display: 'block',\n position: 'absolute',\n cursor: 'col-resize',\n width: 7,\n top: 2,\n bottom: 2,\n zIndex: 1,\n },\n resizeHandleRight: {\n right: 3,\n borderRight: '2px dotted #888',\n '&:hover': {\n borderColor: '#ccc',\n borderRightStyle: 'solid',\n },\n '&.active': {\n borderColor: '#517ea5',\n borderRightStyle: 'solid',\n },\n },\n resizeHandleLeft: {\n left: -4,\n borderLeft: '2px dotted #888',\n '&:hover': {\n borderColor: '#ccc',\n borderLeftStyle: 'solid',\n },\n '&.active': {\n borderColor: '#517ea5',\n borderLeftStyle: 'solid',\n },\n },\n invertedBackground: {\n backgroundColor: theme.palette.mode === 'dark' ? '#9a9a9a' : '#565656',\n padding: '0 3px',\n borderRadius: '2px 0 0 2px',\n },\n invertedBackgroundFlex: {\n backgroundColor: theme.palette.mode === 'dark' ? '#9a9a9a' : '#565656',\n borderRadius: '0 2px 2px 0',\n },\n});\n\nfunction generateFile(filename, obj) {\n const el = document.createElement('a');\n el.setAttribute('href', `data:application/json;charset=utf-8,${encodeURIComponent(JSON.stringify(obj, null, 2))}`);\n el.setAttribute('download', filename);\n\n el.style.display = 'none';\n document.body.appendChild(el);\n\n el.click();\n\n document.body.removeChild(el);\n}\n\n// d=data, t=target, s=start, e=end, m=middle\nfunction binarySearch(list, find, _start, _end) {\n _start = _start || 0;\n if (_end === undefined) {\n _end = list.length - 1;\n if (!_end) {\n return list[0] === find;\n }\n }\n const middle = Math.floor((_start + _end) / 2);\n if (find === list[middle]) {\n return list[middle];\n }\n if (_end - 1 === _start) {\n return list[_start] === find || list[_end] === find;\n }\n if (find > list[middle]) {\n return binarySearch(list, find, middle, _end);\n }\n if (find < list[middle]) {\n return binarySearch(list, find, _start, middle);\n }\n return false;\n}\n\nfunction getName(name, lang) {\n if (name && typeof name === 'object') {\n return (name[lang] || name.en || '').toString();\n }\n\n return (name || '').toString();\n}\n\nfunction getSelectIdIcon(objects, id, imagePrefix) {\n imagePrefix = imagePrefix || '.'; // http://localhost:8081';\n let src = '';\n const _id_ = `system.adapter.${id}`;\n const aIcon = id && objects[_id_] && objects[_id_].common && objects[_id_].common.icon;\n if (aIcon) {\n // if not BASE64\n if (!aIcon.startsWith('data:image/')) {\n if (aIcon.includes('.')) {\n src = `${imagePrefix}/adapter/${objects[_id_].common.name}/${aIcon}`;\n } else if (aIcon && aIcon.length < 3) {\n return aIcon; // utf-8\n } else {\n return null; // '<i class=\"material-icons iob-list-icon\">' + objects[_id_].common.icon + '</i>';\n }\n }\n if (aIcon.startsWith('data:image/svg')) {\n src = <SVG className=\"iconOwn\" src={aIcon} width={28} height={28} />;\n } else {\n src = aIcon;\n }\n } else {\n const common = objects[id] && objects[id].common;\n\n if (common) {\n const cIcon = common.icon;\n if (cIcon) {\n if (!cIcon.startsWith('data:image/')) {\n if (cIcon.includes('.')) {\n let instance;\n if (objects[id].type === 'instance' || objects[id].type === 'adapter') {\n src = `${imagePrefix}/adapter/${common.name}/${cIcon}`;\n } else if (id && id.startsWith('system.adapter.')) {\n instance = id.split('.', 3);\n if (cIcon[0] === '/') {\n instance[2] += cIcon;\n } else {\n instance[2] += `/${cIcon}`;\n }\n src = `${imagePrefix}/adapter/${instance[2]}`;\n } else {\n instance = id.split('.', 2);\n if (cIcon[0] === '/') {\n instance[0] += cIcon;\n } else {\n instance[0] += `/${cIcon}`;\n }\n src = `${imagePrefix}/adapter/${instance[0]}`;\n }\n } else if (aIcon && aIcon.length < 3) {\n return aIcon; // utf-8\n } else {\n return null;\n }\n } else if (cIcon.startsWith('data:image/svg')) {\n // if base 64 image\n src = <SVG className=\"iconOwn\" src={cIcon} width={28} height={28} />;\n } else {\n src = cIcon;\n }\n }\n }\n }\n\n return src || null;\n}\n\nfunction applyFilter(item, filters, lang, objects, context, counter, customFilter, selectedTypes, _depth) {\n _depth = _depth || 0;\n let filteredOut = false;\n if (!context) {\n context = {};\n if (filters.id) {\n context.id = filters.id.toLowerCase();\n }\n if (filters.name) {\n context.name = filters.name.toLowerCase();\n }\n if (filters.type) {\n context.type = filters.type.toLowerCase();\n }\n if (filters.custom) {\n context.custom = filters.custom.toLowerCase();\n }\n if (filters.role) {\n context.role = filters.role.toLowerCase();\n }\n if (filters.room) {\n context.room = (objects[filters.room] && objects[filters.room].common && objects[filters.room].common.members) || [];\n }\n if (filters.func) {\n context.func = (objects[filters.func] && objects[filters.func].common && objects[filters.func].common.members) || [];\n }\n }\n\n const data = item.data;\n\n if (data && data.id) {\n const common = data.obj?.common;\n\n if (customFilter) {\n if (customFilter.type) {\n if (typeof customFilter.type === 'string') {\n if (!data.obj || customFilter.type !== data.obj.type) {\n filteredOut = true;\n }\n } else if (Array.isArray(customFilter.type)) {\n if (!data.obj || !customFilter.type.includes(data.obj.type)) {\n filteredOut = true;\n }\n }\n }\n if (!filteredOut && customFilter.common?.type) {\n if (!common?.type) {\n filteredOut = true;\n } else if (typeof customFilter.common.type === 'string') {\n if (customFilter.common.type !== common.type) {\n filteredOut = true;\n }\n } else if (Array.isArray(customFilter.common.type)) {\n if (!customFilter.type.includes(common.type)) {\n filteredOut = true;\n }\n }\n }\n if (!filteredOut && customFilter.common?.role) {\n if (!common?.role) {\n filteredOut = true;\n } else if (typeof customFilter.common.role === 'string') {\n if (common.role.startsWith(customFilter.common.role)) {\n filteredOut = true;\n }\n } else if (Array.isArray(customFilter.common.role)) {\n if (!customFilter.common.role.find(role => customFilter.role.includes(role))) {\n filteredOut = true;\n }\n }\n }\n if (!filteredOut && customFilter.common?.custom) {\n if (!common?.custom) {\n filteredOut = true;\n } else\n if (customFilter.common.custom === '_dataSources') {\n // TODO: make it configurable\n if (!Object.keys(common.custom).find(id => id.startsWith('history.') || id.startsWith('sql.') || id.startsWith('influxdb.'))) {\n filteredOut = true;\n }\n } else\n if (customFilter.common.custom !== true &&\n !Object.keys(common.custom).find(id => id.startsWith(customFilter.common.custom))\n ) {\n filteredOut = true;\n }\n }\n }\n\n if (!filteredOut && !filters.expertMode) {\n filteredOut =\n data.id === 'system' ||\n data.id === 'enum' ||\n // (data.obj && data.obj.type === 'meta') ||\n data.id.startsWith('system.') ||\n data.id.startsWith('enum.') ||\n data.id.startsWith('_design/') ||\n data.id.endsWith('.admin') ||\n (common && common.expert);\n }\n if (!filteredOut && context.id) {\n if (data.fID === undefined) {\n data.fID = data.id.toLowerCase();\n }\n filteredOut = !data.fID.includes(context.id);\n }\n if (!filteredOut && context.name) {\n if (common) {\n if (data.fName === undefined) {\n data.fName = (common && getName(common.name, lang)) || '';\n data.fName = data.fName.toLowerCase();\n }\n filteredOut = !data.fName.includes(context.name);\n } else {\n filteredOut = true;\n }\n }\n if (!filteredOut && filters.role && common) {\n if (common) {\n filteredOut = !(common.role && common.role.startsWith(context.role));\n } else {\n filteredOut = true;\n }\n }\n if (!filteredOut && context.room) {\n filteredOut = !context.room.find(id => id === data.id || data.id.startsWith(`${id}.`));\n }\n if (!filteredOut && context.func) {\n filteredOut = !context.func.find(id => id === data.id || data.id.startsWith(`${id}.`));\n }\n if (!filteredOut && context.type) {\n filteredOut = !(data.obj && data.obj.type && data.obj.type === context.type);\n }\n if (!filteredOut && selectedTypes) {\n filteredOut = !(data.obj && data.obj.type && selectedTypes.includes(data.obj.type));\n }\n if (!filteredOut && context.custom) {\n if (common) {\n filteredOut = !common.custom || !common.custom[context.custom];\n } else {\n filteredOut = true;\n }\n }\n }\n\n data.visible = !filteredOut;\n\n data.hasVisibleChildren = false;\n if (item.children && _depth < 20) {\n item.children.forEach(_item => {\n const visible = applyFilter(_item, filters, lang, objects, context, counter, customFilter, selectedTypes, _depth + 1);\n if (visible) {\n data.hasVisibleChildren = true;\n }\n });\n }\n\n // const visible = data.visible || data.hasVisibleChildren;\n data.sumVisibility = data.visible || data.hasVisibleChildren;// || data.hasVisibleParent;\n if (counter && data.sumVisibility) {\n counter.count++;\n }\n\n // show all children of visible object with opacity 0.5\n if (data.id && data.sumVisibility && item.children) {\n item.children.forEach(_item => _item.data.hasVisibleParent = true);\n }\n\n return data.visible || data.hasVisibleChildren;\n}\n\nfunction getVisibleItems(item, type, objects, _result) {\n _result = _result || [];\n const data = item.data;\n if (data.sumVisibility) {\n data.id && objects[data.id] && (!type || objects[data.id].type === type) && _result.push(data.id);\n item.children?.forEach(_item =>\n getVisibleItems(_item, type, objects, _result));\n }\n\n return _result;\n}\n\nfunction getSystemIcon(objects, id, k, imagePrefix) {\n let icon;\n\n // system or design have special icons\n if (id.startsWith('_design/') || (id === 'system')) {\n icon = <IconSystem className=\"iconOwn\" />;\n } else if (id === '0_userdata' || id === '0_userdata.0') {\n icon = <IconPhoto className=\"iconOwn\" />;\n } else if (id === 'alias' || id === 'alias.0') {\n icon = <IconAlias className=\"iconOwn\" />;\n } else if (id === 'system.adapter') {\n icon = <IconSystem className=\"iconOwn\" />;\n } else if (id === 'system.group') {\n icon = <IconGroup className=\"iconOwn\" />;\n } else if (id === 'system.user') {\n icon = <IconUser className=\"iconOwn\" />;\n } else if (id === 'system.host') {\n icon = <IconHost className=\"iconOwn\" />;\n } else if (id.endsWith('.connection') || id.endsWith('.connected')) {\n icon = <IconConnection className=\"iconOwn\" />;\n } else if (id.endsWith('.info')) {\n icon = <IconInfo className=\"iconOwn\" />;\n } else if (objects[id] && objects[id].type === 'meta') {\n icon = <IconMeta className=\"iconOwn\" />;\n } else if (k < 2) {\n // detect \"cloud.0\"\n if (objects[`system.adapter.${id}`]) {\n icon = getSelectIdIcon(objects, `system.adapter.${id}`, imagePrefix);\n }\n }\n\n return icon || null;\n}\n\nfunction getIdFieldTooltip(data, classes, lang) {\n if (data?.obj?.common?.desc && data.obj.common.desc !== '') {\n let tooltip = '';\n\n if (typeof data?.obj?.common?.desc === 'object' && data.obj.common.desc[lang] !== undefined) {\n tooltip = data.obj.common.desc[lang];\n } else if (typeof data?.obj?.common?.desc === 'object' && data.obj.common.desc['en'] !== undefined) {\n tooltip = data.obj.common.desc['en'];\n } else if (typeof data?.obj?.common?.desc === 'object' && data.obj.common.desc[lang] === undefined) {\n return data.id;\n } else {\n tooltip = data.obj.common.desc;\n }\n\n if (tooltip?.startsWith('http')) {\n return <a\n className={Utils.clsx(classes.cellIdTooltipLink)}\n href={tooltip}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {tooltip}\n </a>;\n }\n\n return <span className={Utils.clsx(classes.cellIdTooltip)}>{tooltip}</span>;\n }\n\n return data.id;\n}\n\nfunction buildTree(objects, options) {\n options = options || {};\n const imagePrefix = options.imagePrefix || '.';\n\n const ids = Object.keys(objects);\n\n ids.sort((a, b) => {\n if (a === b) return 0;\n a = a.replace(/\\./g, '!!!');\n b = b.replace(/\\./g, '!!!');\n if (a > b) return 1;\n return -1;\n });\n\n // find empty nodes and create names for it\n let currentPathArr = [];\n let currentPath = '';\n let currentPathLen = 0;\n const root = {\n data: {\n name: '',\n id: '',\n },\n children: [],\n };\n\n const info = {\n funcEnums: [],\n roomEnums: [],\n roles: [],\n ids: [],\n types: [],\n objects,\n customs: [],\n enums: [],\n hasSomeCustoms: false,\n };\n\n let croot = root;\n\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n if (!id) {\n continue;\n }\n const obj = objects[id];\n const parts = id.split('.');\n\n if (obj.type && !info.types.includes(obj.type)) {\n info.types.push(obj.type);\n }\n\n if (obj) {\n const common = obj.common;\n const role = common && common.role;\n if (role && !info.roles.includes(role)) {\n info.roles.push(role);\n } else if (id.startsWith('enum.rooms.')) {\n info.roomEnums.push(id);\n info.enums.push(id);\n } else if (id.startsWith('enum.functions.')) {\n info.funcEnums.push(id);\n info.enums.push(id);\n } else if (obj.type === 'enum') {\n info.enums.push(id);\n } else if (obj.type === 'instance' && common && (common.supportCustoms || common.adminUI?.custom)) {\n info.hasSomeCustoms = true;\n info.customs.push(id.substring('system.adapter.'.length));\n }\n }\n\n info.ids.push(id);\n\n let repeat;\n\n // if next level\n do {\n repeat = false;\n\n // If current level is still OK, and we can add ID to children\n if (!currentPath || id.startsWith(`${currentPath}.`)) {\n // if more than one level added\n if (parts.length - currentPathLen > 1) {\n let curPath = currentPath;\n // generate missing levels\n for (let k = currentPathLen; k < parts.length - 1; k++) {\n curPath += (curPath ? '.' : '') + parts[k];\n // level does not exist\n if (!binarySearch(info.ids, curPath)) {\n const _croot = {\n data: {\n name: parts[k],\n parent: croot,\n id: curPath,\n obj: objects[curPath],\n level: k,\n icon: getSystemIcon(objects, curPath, k, imagePrefix),\n generated: true,\n },\n };\n\n croot.children = croot.children || [];\n croot.children.push(_croot);\n croot = _croot;\n info.ids.push(curPath); // IDs will be added by alphabet\n } else {\n croot = croot.children.find(item => item.data.name === parts[k]);\n }\n }\n }\n\n const _croot = {\n data: {\n name: parts[parts.length - 1],\n title: getName(obj && obj.common && obj.common.name, options.lang),\n obj,\n parent: croot,\n icon: getSelectIdIcon(objects, id, imagePrefix) || getSystemIcon(objects, id, 0, imagePrefix),\n id,\n hasCustoms: obj.common?.custom && Object.keys(obj.common.custom).length,\n level: parts.length - 1,\n generated: false,\n button: obj.type === 'state' && obj.common?.role && typeof obj.common.role === 'string' && obj.common.role.startsWith('button') && obj.common?.write !== false,\n },\n };\n\n croot.children = croot.children || [];\n croot.children.push(_croot);\n croot = _croot;\n\n currentPathLen = parts.length;\n currentPathArr = parts;\n currentPath = id;\n } else {\n let u = 0;\n\n while (currentPathArr[u] === parts[u]) {\n u++;\n }\n\n if (u > 0) {\n let move = currentPathArr.length;\n currentPathArr = currentPathArr.splice(0, u);\n currentPathLen = u;\n currentPath = currentPathArr.join('.');\n while (move > u) {\n croot = croot.data.parent;\n move--;\n }\n } else {\n croot = root;\n currentPathArr = [];\n currentPath = '';\n currentPathLen = 0;\n }\n repeat = true;\n }\n } while (repeat);\n }\n\n info.roomEnums.sort((a, b) => {\n const aName = getName(objects[a]?.common?.name || a.split('.').pop());\n const bName = getName(objects[b]?.common?.name || b.split('.').pop());\n if (aName > bName) {\n return 1;\n }\n if (aName < bName) {\n return -1;\n }\n return 0;\n });\n info.funcEnums.sort((a, b) => {\n const aName = getName(objects[a]?.common?.name || a.split('.').pop());\n const bName = getName(objects[b]?.common?.name || b.split('.').pop());\n if (aName > bName) {\n return 1;\n }\n if (aName < bName) {\n return -1;\n }\n return 0;\n });\n info.roles.sort();\n info.types.sort();\n\n return { info, root };\n}\n\nfunction findNode(root, id, _parts, _path, _level) {\n if (root.data.id === id) {\n return root;\n }\n if (!_parts) {\n _parts = id.split('.');\n _level = 0;\n _path = _parts[_level];\n }\n if (!root.children && root.data.id !== id) {\n return null;\n }\n let found;\n for (let i = 0; i < root.children.length; i++) {\n const _id = root.children[i].data.id;\n if (_id === _path) {\n found = root.children[i];\n break;\n } else\n if (_id > _path) {\n break;\n }\n }\n if (found) {\n return findNode(found, id, _parts, `${_path}.${_parts[_level + 1]}`, _level + 1);\n }\n\n return null;\n}\n\nfunction findRoomsForObject(data, id, lang, withParentInfo, rooms) {\n if (!id) {\n return { rooms: [], per: false };\n }\n rooms = rooms || [];\n for (let i = 0; i < data.roomEnums.length; i++) {\n const common = data.objects[data.roomEnums[i]]?.common;\n const name = getName(common.name, lang);\n\n if (common?.members?.includes(id) && !rooms.includes(name)) {\n if (!withParentInfo) {\n rooms.push(name);\n } else {\n rooms.push({ name, origin: id });\n }\n }\n }\n\n let ownEnums;\n\n // Check parent\n const parts = id.split('.');\n parts.pop();\n id = parts.join('.');\n if (data.objects[id]) {\n ownEnums = rooms.length;\n findRoomsForObject(data, id, lang, withParentInfo, rooms);\n }\n\n return { rooms, per: !ownEnums }; // pe is if the enums are from parent\n}\n\nfunction findEnumsForObjectAsIds(data, id, enumName, funcs) {\n if (!id) {\n return [];\n }\n funcs = funcs || [];\n for (let i = 0; i < data[enumName].length; i++) {\n const common = data.objects[data[enumName][i]]?.common;\n if (common?.members?.includes(id) && !funcs.includes(data[enumName][i])) {\n funcs.push(data[enumName][i]);\n }\n }\n funcs.sort();\n\n return funcs;\n}\n\nfunction findFunctionsForObject(data, id, lang, withParentInfo, funcs) {\n if (!id) {\n return { funcs: [], pef: false };\n }\n funcs = funcs || [];\n for (let i = 0; i < data.funcEnums.length; i++) {\n const common = data.objects[data.funcEnums[i]]?.common;\n const name = getName(common.name, lang);\n if (common?.members?.includes(id) && !funcs.includes(name)) {\n if (!withParentInfo) {\n funcs.push(name);\n } else {\n funcs.push({ name, origin: id });\n }\n }\n }\n\n let ownEnums;\n\n // Check parent\n const parts = id.split('.');\n parts.pop();\n id = parts.join('.');\n if (data.objects[id]) {\n ownEnums = funcs.length;\n findFunctionsForObject(data, id, lang, withParentInfo, funcs);\n }\n\n return { funcs, pef: !ownEnums };\n}\n\n/*\nfunction quality2text(q) {\n if (!q) {\n return 'ok';\n }\n const custom = q & 0xFFFF0000;\n let text = '';\n if (q & 0x40) text += 'device';\n if (q & 0x80) text += 'sensor';\n if (q & 0x01) text += ' bad';\n if (q & 0x02) text += ' not connected';\n if (q & 0x04) text += ' error';\n\n return text + (custom ? '|0x' + (custom >> 16).toString(16).toUpperCase() : '') + ' [0x' + q.toString(16).toUpperCase() + ']';\n}\n*/\n\nfunction formatValue(id, state, obj, texts, dateFormat, isFloatComma) {\n const states = Utils.getStates(obj);\n const isCommon = obj.common;\n\n const valText = {};\n let v = (isCommon && isCommon.type === 'file') ? '[file]' : (!state || state.val === null ? '(null)' : (state.val === undefined ? '[undef]' : state.val));\n const type = typeof v;\n\n if (isCommon && isCommon.role && typeof isCommon.role === 'string' && isCommon.role.match(/^value\\.time|^date/)) {\n if (v && typeof v === 'string') {\n if (v.length === 13) { // (length of \"1647597254924\") warning, this solution only works till Nov 20 2286 18:46:39CET\n v = new Date(parseInt(v, 10)).toString();\n } else {\n // we don't know what is that, so leave it as it is\n }\n } else {\n if (v > 946681200 && v < 946681200000) { // '2000-01-01T00:00:00' => 946681200000\n v *= 1000; // may be the time is in seconds (UNIX time)\n }\n // null and undefined could not be here. See `let v = (isCommon && isCommon.type === 'file') ....` above\n v = v ? new Date(v).toString() : v;\n }\n } else {\n if (type === 'number') {\n v = Math.round(v * 100000000) / 100000000; // remove 4.00000000000000001\n if (isFloatComma) {\n v = v.toString().replace('.', ',');\n }\n } else if (type === 'object') {\n v = JSON.stringify(v);\n } else if (type !== 'string') {\n v = v.toString();\n }\n\n if (typeof v !== 'string') {\n v = v.toString();\n }\n }\n\n // try to replace number with \"common.states\"\n if (states && states[v] !== undefined) {\n if (v !== states[v]) {\n valText.s = v;\n v = states[v];\n }\n }\n\n if (isCommon && isCommon.unit) {\n valText.u = isCommon.unit;\n }\n const valFull = [{ t: texts.value, v }];\n\n if (state) {\n if (state.ack !== undefined && state.ack !== null) {\n valFull.push({ t: texts.ack, v: state.ack.toString() });\n }\n if (state.ts) {\n valFull.push({ t: texts.ts, v: state.ts ? Utils.formatDate(new Date(state.ts), dateFormat) : '' });\n }\n if (state.lc) {\n valFull.push({ t: texts.lc, v: state.lc ? Utils.formatDate(new Date(state.lc), dateFormat) : '' });\n }\n if (state.from) {\n let from = state.from.toString();\n if (from.startsWith('system.adapter.')) {\n from = from.substring(15);\n }\n valFull.push({ t: texts.from, v: from });\n }\n if (state.user) {\n let user = state.user.toString();\n if (user.startsWith('system.user.')) {\n user = user.substring(12);\n }\n valFull.push({ t: texts.user, v: user });\n }\n if (state.c) {\n valFull.push({ t: texts.c, v: state.c });\n }\n valFull.push({ t: texts.quality, v: Utils.quality2text(state.q || 0).join(', '), nbr: true });\n }\n\n valText.v = v;\n\n return {\n valText,\n valFull,\n style: { color: state?.ack ? (state.q ? '#ffa500' : '') : '#ff2222c9' },\n };\n}\n\nfunction prepareSparkData(values, from) {\n // set every hour one point\n let time = from;\n let i = 1;\n const v = [];\n\n while (i < values.length && time < from + 25 * 3600000) {\n // find the interval\n while (values[i - 1].ts < time && time <= values[i].ts && i < values.length) {\n i++;\n }\n if (i === 1 && values[i - 1].ts >= time) {\n // assume the value was always null\n v.push(0);\n } else\n if (i < values.length) {\n if (typeof values[i].val === 'boolean' || typeof values[i - 1].val === 'boolean') {\n v.push(values[i].val ? 1 : 0);\n } else {\n // remove nulls\n values[i - 1].val = values[i - 1].val || 0;\n values[i].val = values[i].val || 0;\n // interpolate\n const val = values[i - 1].val + ((values[i].val - values[i - 1].val) * (time - values[i - 1].ts)) / (values[i].ts - values[i - 1].ts);\n\n v.push(val);\n }\n }\n\n time += 3600000;\n }\n\n return v;\n}\n\n/**\n * @type {import('./types').ObjectBrowserTableFilter}\n */\nconst DEFAULT_FILTER = {\n id: '',\n name: '',\n room: '',\n func: '',\n role: '',\n type: '',\n custom: '',\n expertMode: false,\n};\n\nconst ITEM_IMAGES = {\n state: <IconState className=\"itemIcon\" />,\n channel: <IconChannel className=\"itemIcon\" />,\n device: <IconDevice className=\"itemIcon\" />,\n adapter: <IconAdapter className=\"itemIcon\" />,\n meta: <IconMeta className=\"itemIcon\" />,\n instance: <IconInstance className=\"itemIcon\" style={{ color: '#7da7ff' }} />,\n enum: <IconEnum className=\"itemIcon\" />,\n chart: <IconChart className=\"itemIcon\" />,\n config: <IconConfig className=\"itemIcon\" />,\n group: <IconGroup className=\"itemIcon\" />,\n user: <IconUser className=\"itemIcon\" />,\n host: <IconHost className=\"itemIcon\" />,\n schedule: <IconSchedule className=\"itemIcon\" />,\n script: <IconScript className=\"itemIcon\" />,\n folder: <IconClosed className=\"itemIcon itemIconFolder\" />,\n};\n\nconst StyledBadge = withStyles(theme => ({\n badge: {\n right: 3,\n top: 3,\n border: `2px solid ${theme.palette.background.paper}`,\n padding: '0 4px',\n },\n}))(Badge);\n\nconst SCREEN_WIDTHS = {\n // extra-small: 0px\n xs: { idWidth: '100%', fields: [], widths: {} },\n // small: 600px\n sm: { idWidth: 300, fields: ['room', 'val'], widths: { room: 100, val: 200 } },\n // medium: 960px\n md: {\n idWidth: 300,\n fields: ['room', 'func', 'val', 'buttons'],\n widths: {\n name: 200, room: 150, func: 150, val: 120, buttons: 120,\n },\n },\n // large: 1280px\n lg: {\n idWidth: 300,\n fields: ['name', 'type', 'role', 'room', 'func', 'val', 'buttons', 'changedFrom', 'qualityCode', 'timestamp', 'lastChange'],\n widths: {\n name: 300,\n type: 80,\n role: 120,\n room: 180,\n func: 180,\n val: 140,\n buttons: 120,\n changedFrom: 120,\n qualityCode: 100,\n timestamp: 165,\n lastChange: 165,\n },\n },\n // /////////////\n // extra-large: 1920px\n xl: {\n idWidth: 550,\n fields: ['name', 'type', 'role', 'room', 'func', 'val', 'buttons', 'changedFrom', 'qualityCode', 'timestamp', 'lastChange'],\n widths: {\n name: 400,\n type: 80,\n role: 120,\n room: 180,\n func: 180,\n val: 140,\n buttons: 120,\n changedFrom: 120,\n qualityCode: 100,\n timestamp: 170,\n lastChange: 170,\n },\n },\n};\n\nlet objectsAlreadyLoaded = false;\n\n/**\n * @extends {React.Component<import('./types').ObjectBrowserProps>}\n */\nclass ObjectBrowser extends Component {\n /**\n * @param {import('./types').ObjectBrowserProps} props\n */\n constructor(props) {\n super(props);\n\n this.lastSelectedItems = (window._localStorage || window.localStorage).getItem(`${props.dialogName || 'App'}.objectSelected`) || '[]';\n try {\n this.lastSelectedItems = JSON.parse(this.lastSelectedItems);\n if (typeof this.lastSelectedItems !== 'object') {\n this.lastSelectedItems = [this.lastSelectedItems];\n }\n this.lastSelectedItems = this.lastSelectedItems.filter(id => id);\n } catch (e) {\n // ignore\n }\n\n let expanded = (window._localStorage || window.localStorage).getItem(`${props.dialogName || 'App'}.objectExpanded`) || '[]';\n try {\n expanded = JSON.parse(expanded);\n } catch (e) {\n expanded = [];\n }\n\n let filter =\n props.defaultFilters ||\n (window._localStorage || window.localStorage).getItem(`${props.dialogName || 'App'}.objectFilter`) ||\n { ...DEFAULT_FILTER };\n\n if (typeof filter === 'string') {\n try {\n filter = JSON.parse(filter);\n } catch (e) {\n filter = { ...DEFAULT_FILTER };\n }\n }\n\n filter.expertMode = props.expertMode !== undefined ? props.expertMode : ((window._sessionStorage || window.sessionStorage).getItem('App.expertMode') === 'true');\n this.tableRef = createRef();\n this.filterRefs = {};\n\n Object.keys(DEFAULT_FILTER).forEach(name =>\n this.filterRefs[name] = createRef());\n\n this.lastAppliedFilter = null;\n this.pausedSubscribes = false;\n\n this.selectedFound = false;\n this.root = null;\n this.states = {};\n this.subscribes = [];\n this.statesUpdateTimer = null;\n this.objectsUpdateTimer = null;\n\n this.visibleCols = props.columns || SCREEN_WIDTHS[props.width].fields;\n // remove type column if only one type must be selected\n if (props.types && props.types.length === 1) {\n const pos = this.visibleCols.indexOf('type');\n pos !== -1 && this.visibleCols.splice(pos, 1);\n }\n\n // this.possibleCols = SCREEN_WIDTHS.xl.fields;\n\n let customDialog = null;\n\n if (props.router) {\n const location = props.router.getLocation();\n if (location.id && location.dialog === 'customs') {\n customDialog = [location.id];\n this.pauseSubscribe(true);\n }\n }\n\n let selected = (props.selected || '');\n if (typeof selected !== 'object') {\n selected = [selected];\n }\n selected = selected.map(id => id.replace(/[\"']/g, '')).filter(id => id);\n\n let columns = null; // (window._localStorage || window.localStorage).getItem(`${props.dialogName || 'App'}.columns`);\n try {\n columns = columns ? JSON.parse(columns) : null;\n } catch (e) {\n columns = null;\n }\n\n let columnsWidths = null; // (window._localStorage || window.localStorage).getItem(`${props.dialogName || 'App'}.columnsWidths`);\n try {\n columnsWidths = columnsWidths ? JSON.parse(columnsWidths) : {};\n } catch (e) {\n columnsWidths = {};\n }\n\n this.imagePrefix = props.imagePrefix || '.';\n let foldersFirst = (window._localStorage || window.localStorage).getItem(`${props.dialogName || 'App'}.foldersFirst`);\n if (foldersFirst === 'false') {\n foldersFirst = false;\n } else if (foldersFirst === 'true') {\n foldersFirst = true;\n } else {\n foldersFirst = props.foldersFirst === undefined ? true : props.foldersFirst;\n }\n\n let statesView = false;\n try {\n statesView = this.props.objectStatesView ? JSON.parse((window._localStorage || window.localStorage).getItem(`${props.dialogName || 'App'}.objectStatesView`)) || false : false;\n } catch (error) {\n // ignore\n }\n\n this.state = {\n loaded: false,\n foldersFirst,\n selected,\n selectedNonObject: (window._localStorage || window.localStorage).getItem(`${props.dialogName || 'App'}.selectedNonObject`) || '',\n filter,\n filterKey: 0,\n depth: 0,\n expandAllVisible: false,\n expanded,\n toast: '',\n lang: props.lang,\n scrollBarWidth: 16,\n customDialog,\n editObjectDialog: '',\n viewFileDialog: '',\n enumDialog: null,\n roleDialog: null,\n statesView,\n columns,\n columnsForAdmin: null,\n columnsSelectorShow: false,\n columnsAuto: true, // (window._localStorage || window.localStorage).getItem(`${props.dialogName || 'App'}.columnsAuto`) !== 'false',\n columnsWidths,\n columnsDialogTransparent: 100,\n columnsEditCustomDialog: null,\n customColumnDialogValueChanged: false,\n showExportDialog: false,\n linesEnabled: (window._localStorage || window.localStorage).getItem(`${props.dialogName || 'App'}.lines`) === 'true',\n };\n\n this.edit = {};\n\n this.texts = {\n value: props.t('ra_tooltip_value'),\n ack: props.t('ra_tooltip_ack'),\n ts: props.t('ra_tooltip_ts'),\n lc: props.t('ra_tooltip_lc'),\n from: props.t('ra_tooltip_from'),\n user: props.t('ra_tooltip_user'),\n c: props.t('ra_tooltip_comment'),\n quality: props.t('ra_tooltip_quality'),\n editObject: props.t('ra_tooltip_editObject'),\n deleteObject: props.t('ra_tooltip_deleteObject'),\n customConfig: props.t('ra_tooltip_customConfig'),\n copyState: props.t('ra_tooltip_copyState'),\n editState: props.t('ra_tooltip_editState'),\n close: props.t('ra_Close'),\n filter_id: props.t('ra_filter_id'),\n filter_name: props.t('ra_filter_name'),\n filter_type: props.t('ra_filter_type'),\n filter_role: props.t('ra_filter_role'),\n filter_room: props.t('ra_filter_room'),\n filter_func: props.t('ra_filter_func'),\n filter_custom: props.t('ra_filter_customs'), //\n objectChangedByUser: props.t('ra_object_changed_by_user'), // Object last changed at\n objectChangedBy: props.t('ra_object_changed_by'), // Object changed by\n objectChangedFrom: props.t('ra_state_changed_from'), // Object changed from\n stateChangedBy: props.t('ra_state_changed_by'), // State changed by\n stateChangedFrom: props.t('ra_state_changed_from'), // State changed from\n ownerGroup: props.t('ra_Owner group'),\n ownerUser: props.t('ra_Owner user'),\n deviceError: props.t('ra_Error'),\n deviceDisconnected: props.t('ra_Disconnected'),\n deviceConnected: props.t('ra_Connected'),\n\n aclOwner_read_object: props.t('ra_aclOwner_read_object'),\n aclOwner_read_state: props.t('ra_aclOwner_read_state'),\n aclOwner_write_object: props.t('ra_aclOwner_write_object'),\n aclOwner_write_state: props.t('ra_aclOwner_write_state'),\n aclGroup_read_object: props.t('ra_aclGroup_read_object'),\n aclGroup_read_state: props.t('ra_aclGroup_read_state'),\n aclGroup_write_object: props.t('ra_aclGroup_write_object'),\n aclGroup_write_state: props.t('ra_aclGroup_write_state'),\n aclEveryone_read_object: props.t('ra_aclEveryone_read_object'),\n aclEveryone_read_state: props.t('ra_aclEveryone_read_state'),\n aclEveryone_write_object: props.t('ra_aclEveryone_write_object'),\n aclEveryone_write_state: props.t('ra_aclEveryone_write_state'),\n };\n\n this.levelPadding = props.levelPadding || ITEM_LEVEL;\n\n let resizerCurrentWidths = (window._localStorage || window.localStorage).getItem(`${this.props.dialogName || 'App'}.table`);\n if (resizerCurrentWidths) {\n try {\n resizerCurrentWidths = JSON.parse(resizerCurrentWidths);\n this.storedWidths = JSON.parse(JSON.stringify(SCREEN_WIDTHS[this.props.width]));\n Object.keys(resizerCurrentWidths)\n .forEach(id => {\n if (id === 'id') {\n SCREEN_WIDTHS[this.props.width].idWidth = resizerCurrentWidths.id;\n } else if (id === 'nameHeader') {\n SCREEN_WIDTHS[this.props.width].widths.name = resizerCurrentWidths[id];\n } else if (SCREEN_WIDTHS[this.props.width].widths[id] !== undefined) {\n SCREEN_WIDTHS[this.props.width].widths[id] = resizerCurrentWidths[id];\n }\n });\n\n this.customWidth = true;\n } catch (e) {\n // ignore\n }\n }\n\n this.calculateColumnsVisibility();\n }\n\n loadAllObjects(update) {\n const props = this.props;\n let objects;\n\n return new Promise(resolve => {\n this.setState({ updating: true }, () => resolve());\n })\n .then(() => (this.props.objectsWorker ?\n this.props.objectsWorker.getObjects(update) :\n props.socket.getObjects(update, true)))\n .then(_objects => {\n objects = _objects;\n if (props.types && props.types[0] !== 'state') {\n if (props.length >= 1) {\n console.error('more than one type does not supported! Use filterFunc instead');\n }\n return props.socket.getObjectView(null, null, props.types[0]);\n }\n return !objects['system.config'] ? props.socket.getObject('system.config')\n .then(obj => ({ 'system.config': obj })) : Promise.resolve(null);\n })\n .then(moreObjects => {\n this.systemConfig = objects['system.config'] || moreObjects['system.config'] || {};\n\n if (moreObjects) {\n if (moreObjects['system.config']) {\n delete moreObjects['system.config'];\n }\n Object.assign(objects, moreObjects);\n }\n\n this.systemConfig.common = this.systemConfig.common || {};\n this.systemConfig.common.defaultNewAcl = this.systemConfig.common.defaultNewAcl || {};\n this.systemConfig.common.defaultNewAcl.owner = this.systemConfig.common.defaultNewAcl.owner || 'system.user.admin';\n this.systemConfig.common.defaultNewAcl.ownerGroup = this.systemConfig.common.defaultNewAcl.ownerGroup || 'system.group.administrator';\n if (typeof this.systemConfig.common.defaultNewAcl.state !== 'number') {\n // TODO: may be convert here from string\n this.systemConfig.common.defaultNewAcl.state = 0x664;\n }\n if (typeof this.systemConfig.common.defaultNewAcl.object !== 'number') {\n // TODO: may be convert here from string\n this.systemConfig.common.defaultNewAcl.state = 0x664;\n }\n\n if (typeof props.filterFunc === 'function') {\n this.objects = {};\n Object.keys(objects).forEach(id => {\n try {\n if (props.filterFunc(objects[id])) {\n this.objects[id] = objects[id];\n }\n } catch (e) {\n console.log(`Error by filtering of \"${id}\": ${e}`);\n }\n });\n } else\n if (props.types) {\n this.objects = {};\n Object.keys(objects).forEach(id => {\n const type = objects[id] && objects[id].type;\n // include \"folder\" types too\n if (type && (\n type === 'channel' ||\n type === 'device' ||\n type === 'enum' ||\n type === 'folder' ||\n type === 'adapter' ||\n type === 'instance' ||\n props.types.includes(type))) {\n this.objects[id] = objects[id];\n }\n });\n } else {\n this.objects = objects;\n }\n\n // read default history\n this.defaultHistory = this.systemConfig.common.defaultHistory;\n if (this.defaultHistory) {\n props.socket.getState(`system.adapter.${this.defaultHistory}.alive`)\n .then(state => {\n if (!state || !state.val) {\n this.defaultHistory = '';\n }\n })\n .catch(e => window.alert(`Cannot get state: ${e}`));\n }\n\n return this.getAdditionalColumns();\n })\n .then(columnsForAdmin => {\n this.calculateColumnsVisibility(null, null, columnsForAdmin);\n\n const { info, root } = buildTree(this.objects, this.props);\n this.root = root;\n this.info = info;\n\n // Show first selected item\n const node = this.state.selected && this.state.selected.length && findNode(this.root, this.state.selected[0]);\n\n this.lastAppliedFilter = null;\n\n // If selected ID is not visible, reset filter\n if (node && !applyFilter(node, this.state.filter, this.state.lang, this.objects, null, null, props.customFilter, props.types)) {\n // reset filter\n this.setState({ filter: { ...DEFAULT_FILTER }, columnsForAdmin }, () => {\n this.setState({ loaded: true, updating: false }, () =>\n this.expandAllSelected(() =>\n this.onAfterSelect()));\n });\n } else {\n this.setState({ loaded: true, updating: false, columnsForAdmin }, () =>\n this.expandAllSelected(() =>\n this.onAfterSelect()));\n }\n })\n .catch(e => this.showError(e));\n }\n\n /**\n * @private\n * @param {ioBroker.EmptyCallback} cb\n */\n expandAllSelected(cb) {\n const expanded = [...this.state.expanded];\n let changed = false;\n this.state.selected.forEach(id => {\n const parts = id.split('.');\n const path = [];\n for (let i = 0; i < parts.length - 1; i++) {\n path.push(parts[i]);\n if (!expanded.includes(path.join('.'))) {\n expanded.push(path.join('.'));\n changed = true;\n }\n }\n });\n if (changed) {\n expanded.sort();\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n this.setState({ expanded }, cb);\n } else {\n cb && cb();\n }\n }\n\n /**\n * @private\n * @param {boolean} [isDouble]\n */\n onAfterSelect(isDouble) {\n this.lastSelectedItems = [...this.state.selected];\n if (this.state.selected && this.state.selected.length) {\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectSelected`, JSON.stringify(this.lastSelectedItems));\n\n const name = this.lastSelectedItems.length === 1 ? Utils.getObjectName(this.objects, this.lastSelectedItems[0], null, { language: this.state.lang }) : '';\n this.props.onSelect && this.props.onSelect(this.lastSelectedItems, name, isDouble);\n } else {\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectSelected`, '');\n if (this.state.selected.length) {\n this.setState({ selected: [] }, () => this.props.onSelect && this.props.onSelect([], ''));\n } else {\n this.props.onSelect && this.props.onSelect([], '');\n }\n }\n }\n\n /**\n * @private\n * @param {import('./types').ObjectBrowserProps} props\n * @param {any} state\n */\n static getDerivedStateFromProps(props, state) {\n const newState = {};\n let changed = false;\n if (props.expertMode !== undefined && props.expertMode !== state.filter.expertMode) {\n changed = true;\n newState.filter = { ...state.filter };\n newState.filter.expertMode = props.expertMode;\n }\n return changed ? newState : null;\n }\n\n /**\n * Called when component is mounted.\n */\n componentDidMount() {\n this.loadAllObjects(!objectsAlreadyLoaded)\n .then(() => {\n if (this.props.objectsWorker) {\n this.props.objectsWorker.registerHandler(this.onObjectChange);\n } else {\n this.props.socket.subscribeObject('*', this.onObjectChange);\n }\n\n objectsAlreadyLoaded = true;\n });\n }\n\n /**\n * Called when component is unmounted.\n */\n componentWillUnmount() {\n this.filterTimer && clearTimeout(this.filterTimer);\n this.filterTimer = null;\n\n if (this.props.objectsWorker) {\n this.props.objectsWorker.unregisterHandler(this.onObjectChange, true);\n } else {\n this.props.socket.unsubscribeObject('*', this.onObjectChange);\n }\n\n // remove all subscribes\n this.subscribes.forEach(pattern => {\n console.log(`- unsubscribe ${pattern}`);\n this.props.socket.unsubscribeState(pattern, this.onStateChange);\n });\n\n this.subscribes = [];\n this.objects = {};\n }\n\n /**\n * Called when component is mounted.\n */\n refreshComponent() {\n // remove all subscribes\n this.subscribes.forEach(pattern => {\n console.log(`- unsubscribe ${pattern}`);\n this.props.socket.unsubscribeState(pattern, this.onStateChange);\n });\n\n this.subscribes = [];\n\n this.loadAllObjects(true)\n .then(() => console.log('updated!'));\n }\n\n /**\n * Renders the error dialog.\n * @returns {JSX.Element | null}\n */\n renderErrorDialog() {\n return this.state.error ? <Dialog\n open={!0}\n maxWidth=\"sm\"\n fullWidth\n onClose={() => this.setState({ error: '' })}\n aria-labelledby=\"error-dialog-title\"\n aria-describedby=\"error-dialog-description\"\n >\n <DialogTitle id=\"alert-dialog-title\">{this.props.title || this.props.t('ra_Error')}</DialogTitle>\n <DialogContent>\n <DialogContentText id=\"alert-dialog-description\">\n {this.state.error}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({ error: '' })}\n color=\"primary\"\n autoFocus\n startIcon={<IconCheck />}\n >\n {this.props.t('ra_Ok')}\n </Button>\n </DialogActions>\n </Dialog> : null;\n }\n\n /**\n * Show the error dialog.\n * @param {any} error\n */\n showError(error) {\n this.setState({ error: typeof error === 'object' ? (error && typeof error.toString === 'function' ? error.toString() : JSON.stringify(error)) : error });\n }\n\n /**\n * Called when an item is selected/deselected.\n * @param {string} toggleItem\n * @param {boolean} [isDouble]\n */\n onSelect(toggleItem, isDouble) {\n if (!this.props.multiSelect) {\n if (this.objects[toggleItem] && (!this.props.types || this.props.types.includes(this.objects[toggleItem].type))) {\n (window._localStorage || window.localStorage).removeItem(`${this.props.dialogName || 'App'}.selectedNonObject`);\n if (this.state.selected[0] !== toggleItem) {\n this.setState({ selected: [toggleItem], selectedNonObject: '' }, () =>\n this.onAfterSelect(isDouble));\n } else if (isDouble && this.props.onSelect) {\n this.onAfterSelect(isDouble);\n }\n } else {\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.selectedNonObject`, toggleItem);\n this.setState({ selected: [], selectedNonObject: toggleItem }, () =>\n this.onAfterSelect());\n }\n } else if (this.objects[toggleItem] && (!this.props.types || this.props.types.includes(this.objects[toggleItem].type))) {\n (window._localStorage || window.localStorage).removeItem(`${this.props.dialogName || 'App'}.selectedNonObject`);\n\n const selected = [...this.state.selected];\n const pos = selected.indexOf(toggleItem);\n if (pos === -1) {\n selected.push(toggleItem);\n selected.sort();\n } else if (!isDouble) {\n selected.splice(pos, 1);\n }\n\n this.setState({ selected, selectedNonObject: '' }, () =>\n this.onAfterSelect(isDouble));\n }\n }\n\n /**\n * @private\n * @param {boolean} isLast\n */\n /*\n _renderDefinedList(isLast) {\n const cols = [...this.possibleCols];\n cols.unshift('id');\n if (this.props.columns && !this.props.columns.includes('buttons')) {\n const pos = cols.indexOf('buttons');\n if (pos !== -1) {\n cols.splice(pos, 1);\n }\n }\n return cols\n .filter(id => (isLast && (id === 'val' || id === 'buttons')) || (!isLast && id !== 'val' && id !== 'buttons'))\n .map(id =>\n <ListItemButton onClick={() => {\n if (!this.state.columnsAuto && id !== 'id') {\n const columns = [...(this.state.columns || [])];\n const pos = columns.indexOf(id);\n if (pos === -1) {\n columns.push(id);\n columns.sort();\n } else {\n columns.splice(pos, 1);\n }\n (window._localStorage || window.localStorage).setItem((this.props.dialogName || 'App') + '.columns', JSON.stringify(columns));\n this.calculateColumnsVisibility(null, columns);\n this.setState({ columns });\n }\n }} key={id}>\n <Checkbox\n edge=\"start\"\n disabled={id === 'id' || this.state.columnsAuto}\n checked={id === 'id' || (this.state.columnsAuto ? this.visibleCols.includes(id) : (this.state.columns && this.state.columns.includes(id)))}\n disableRipple\n />\n <ListItemText primary={this.texts['filter_' + id] || this.props.t('ra_' + id)} />\n <ListItemSecondaryAction>\n <FormControl\n variant=\"standard\"\n className={this.props.classes.columnsDialogInputWidth}\n style={{ marginTop: 0, marginBottom: 0 }}\n margin=\"dense\"\n >\n <Input\n classes={{ underline: 'no-underline' }}\n placeholder={this.props.t('ra_Width')}\n value={this.state.columnsWidths[id] || ''}\n onChange={e => {\n const columnsWidths = JSON.parse(JSON.stringify(this.state.columnsWidths));\n columnsWidths[id] = e.target.value;\n (window._localStorage || window.localStorage).setItem((this.props.dialogName || 'App') + '.columnsWidths', JSON.stringify(columnsWidths));\n this.calculateColumnsVisibility(null, null, null, columnsWidths);\n this.setState({ columnsWidths });\n }}\n autoComplete=\"off\"\n />\n </FormControl>\n </ListItemSecondaryAction>\n </ListItemButton>\n );\n }\n */\n\n /**\n * Renders the columns selector.\n * @returns {JSX.Element | null}\n */\n renderColumnsSelectorDialog() {\n if (!this.state.columnsSelectorShow) {\n return null;\n }\n return <Dialog\n onClose={() => this.setState({ columnsSelectorShow: false })}\n open={!0}\n classes={{ root: Utils.clsx(this.props.classes.dialogColumns, this.props.classes[`transparent_${this.state.columnsDialogTransparent}`]) }}\n >\n <DialogTitle className={this.props.classes.fontSizeTitle}>{this.props.t('ra_Configure')}</DialogTitle>\n <DialogContent className={this.props.classes.fontSizeTitle}>\n {\n /*\n <FormControlLabel\n className={this.props.classes.switchColumnAuto}\n control={<Switch checked={this.state.columnsAuto} onChange={() => {\n (window._localStorage || window.localStorage).setItem((this.props.dialogName || 'App') + '.columnsAuto', this.state.columnsAuto ? 'false' : 'true');\n if (!this.state.columnsAuto) {\n this.calculateColumnsVisibility(true);\n this.setState({ columnsAuto: true });\n } else {\n if (!this.state.columns) {\n this.calculateColumnsVisibility(false, [...this.visibleCols]);\n this.setState({ columnsAuto: false, columns: [...this.visibleCols] });\n } else {\n this.calculateColumnsVisibility(false);\n this.setState({ columnsAuto: false });\n }\n }\n }} />}\n label={this.props.t('ra_Auto (no custom columns)')}\n /> */\n }\n <FormControlLabel\n className={this.props.classes.switchColumnAuto}\n control={<Switch\n checked={this.state.foldersFirst}\n onChange={() => {\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.foldersFirst`, this.state.foldersFirst ? 'false' : 'true');\n this.setState({ foldersFirst: !this.state.foldersFirst });\n }}\n />}\n label={this.props.t('ra_Folders always first')}\n />\n <FormControlLabel\n className={this.props.classes.switchColumnAuto}\n control={<Switch\n checked={this.state.linesEnabled}\n onChange={() => {\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.lines`, this.state.linesEnabled ? 'false' : 'true');\n this.setState({ linesEnabled: !this.state.linesEnabled });\n }}\n />}\n label={this.props.t('ra_Show lines between rows')}\n />\n {\n /*\n <Typography classes={{ root: this.props.classes.dialogColumnsLabel }}>{this.props.t('ra_Transparent dialog')}</Typography>\n <Slider classes={{ root: this.props.classes.width100 }} value={this.state.columnsDialogTransparent} min={20} max={100} step={10} onChange={(event, newValue) =>\n this.setState({ columnsDialogTransparent: newValue })\n } />\n <List>\n {this._renderDefinedList(false)}\n\n {this.state.columnsForAdmin && Object.keys(this.state.columnsForAdmin).sort().map(adapter =>\n this.state.columnsForAdmin[adapter].map(column =>\n <ListItemButton onClick={() => {\n if (!this.state.columnsAuto) {\n const columns = [...(this.state.columns || [])];\n const id = '_' + adapter + '_' + column.path;\n const pos = columns.indexOf(id);\n if (pos === -1) {\n columns.push(id);\n columns.sort();\n } else {\n columns.splice(pos, 1);\n }\n this.calculateColumnsVisibility(null, columns);\n (window._localStorage || window.localStorage).setItem((this.props.dialogName || 'App') + '.columns', JSON.stringify(columns));\n this.setState({ columns });\n }\n }} key={adapter + '_' + column.name}>\n <ListItemIcon>\n <Checkbox\n disabled={this.state.columnsAuto}\n edge=\"start\"\n checked={!this.state.columnsAuto && this.state.columns && this.state.columns.includes('_' + adapter + '_' + column.path)}\n disableRipple\n />\n </ListItemIcon>\n <ListItemText primary={column.name + ' (' + adapter + ')'} />\n <ListItemSecondaryAction>\n <FormControl\n variant=\"standard\"\n className={this.props.classes.columnsDialogInputWidth}\n style={{ marginTop: 0, marginBottom: 0 }}\n margin=\"dense\"\n >\n <Input\n classes={{ underline: 'no-underline' }}\n placeholder={this.props.t('ra_Width')}\n value={this.state.columnsWidths['_' + adapter + '_' + column.path] || ''}\n onChange={e => {\n const columnsWidths = JSON.parse(JSON.stringify(this.state.columnsWidths));\n columnsWidths['_' + adapter + '_' + column.path] = e.target.value;\n (window._localStorage || window.localStorage).setItem((this.props.dialogName || 'App') + '.columnsWidths', JSON.stringify(columnsWidths));\n this.calculateColumnsVisibility(null, null, null, columnsWidths);\n this.setState({ columnsWidths });\n }}\n autoComplete=\"off\"\n />\n </FormControl>\n </ListItemSecondaryAction>\n </ListItemButton>\n )\n )}\n {this._renderDefinedList(true)}\n </List>\n */}\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({ columnsSelectorShow: false })}\n color=\"primary\"\n startIcon={<IconClose />}\n >\n {this.texts.close}\n </Button>\n </DialogActions>\n </Dialog>;\n }\n\n /**\n * @private\n */\n getAdditionalColumns() {\n return this.props.socket.getAdapters()\n .then(instances => {\n let columnsForAdmin = null;\n // find all additional columns\n instances.forEach(obj =>\n columnsForAdmin = this.parseObjectForAdmins(columnsForAdmin, obj));\n\n return columnsForAdmin;\n })\n .catch(() => {\n // window.alert('Cannot get adapters: ' + e);\n // Object browser in Web has no additional columns\n });\n }\n\n /**\n * @private\n */\n checkUnsubscribes() {\n // Remove unused subscriptions\n for (let i = this.subscribes.length - 1; i >= 0; i--) {\n !this.recordStates.includes(this.subscribes[i]) && this.unsubscribe(this.subscribes[i]);\n }\n this.recordStates = [];\n }\n\n /**\n * Find an item.\n * @param {string} id\n * @param {string[] | undefined} [_parts]\n * @param {{ data: { name: string; id: string; }; children: never[]; } | null | undefined} [_root]\n * @param {string | undefined} [_partyId]\n * @returns {any}\n */\n findItem(id, _parts, _root, _partyId) {\n _parts = _parts || id.split('.');\n _root = _root || this.root;\n if (!_root || !_parts.length) {\n return null;\n }\n\n _partyId = (_partyId ? `${_partyId}.` : '') + _parts.shift();\n\n if (_root.children) {\n const item = _root.children.find(i => i.data.id === _partyId);\n if (item) {\n if (item.data.id === id) {\n return item;\n }\n if (_parts.length) {\n return this.findItem(id, _parts, item, _partyId);\n }\n } else {\n return null;\n }\n }\n\n return null;\n }\n\n /**\n * Called when a state changes.\n * @param {string} id\n * @param {ioBroker.State} state\n */\n onStateChange = (id, state) => {\n console.log(`> stateChange ${id}`);\n if (this.states[id]) {\n const item = this.findItem(id);\n if (item && item.data.state) {\n item.data.state = null;\n }\n }\n this.states[id] = state;\n\n if (!this.pausedSubscribes) {\n if (!this.statesUpdateTimer) {\n this.statesUpdateTimer = setTimeout(() => {\n this.statesUpdateTimer = null;\n this.forceUpdate();\n }, 300);\n }\n } else if (this.statesUpdateTimer) {\n clearTimeout(this.statesUpdateTimer);\n this.statesUpdateTimer = null;\n }\n };\n\n /**\n * @private\n * @param {{ [x: string]: any; }} columnsForAdmin\n * @param {any} obj\n */\n parseObjectForAdmins(columnsForAdmin, obj) {\n if (obj.common && obj.common.adminColumns && obj.common.name) {\n let columns = obj.common.adminColumns;\n if (typeof columns !== 'object') {\n columns = [columns];\n }\n columns = columns.map(item => {\n if (typeof item !== 'object') {\n return { path: item, name: item.split('.').pop() };\n }\n\n // string => array\n if (item.objTypes && typeof item.objTypes !== 'object') {\n item.objTypes = [item.objTypes];\n } else if (!item.objTypes) {\n item.objTypes = null;\n }\n\n if (!item.name && item.path) {\n return {\n path: item.path,\n name: item.path.split('.').pop(),\n width: item.width,\n edit: !!item.edit,\n type: item.type,\n objTypes: item.objTypes,\n };\n }\n if (typeof item.name !== 'object' && item.path) {\n return {\n path: item.path,\n name: item.name,\n width: item.width,\n edit: !!item.edit,\n type: item.type,\n objTypes: item.objTypes,\n };\n }\n if (!item.path) {\n console.warn(`Admin columns for ${obj._id} ignored, because path not found`);\n return null;\n }\n return {\n path: item.path,\n name: item.name[this.props.lang] || item.name.en,\n width: item.width,\n edit: !!item.edit,\n type: item.type,\n objTypes: item.objTypes,\n };\n }).filter(item => item);\n\n if (columns && columns.length) {\n columnsForAdmin = columnsForAdmin || {};\n columnsForAdmin[obj.common.name] = columns.sort((a, b) => (a.path > b.path ? -1 : (a.path < b.path ? 1 : 0)));\n }\n } else if (obj.common && obj.common.name && columnsForAdmin && columnsForAdmin[obj.common.name]) {\n delete columnsForAdmin[obj.common.name];\n }\n return columnsForAdmin;\n }\n\n /**\n * @param {string} id\n * @param {ioBroker.Object} obj\n */\n onObjectChange = (id, obj/* , oldObj */) => {\n let newState;\n\n if (Array.isArray(id)) {\n id.forEach(event => {\n console.log(`> objectChange ${event.id}`);\n\n if (event.obj && typeof this.props.filterFunc === 'function' && !this.props.filterFunc(event.obj)) {\n return;\n }\n\n if (event.id.startsWith('system.adapter.') && event.obj && event.obj.type === 'adapter') {\n const columnsForAdmin = JSON.parse(JSON.stringify(this.state.columnsForAdmin));\n\n this.parseObjectForAdmins(columnsForAdmin, event.obj);\n\n if (JSON.stringify(this.state.columnsForAdmin) !== JSON.stringify(columnsForAdmin)) {\n newState = { columnsForAdmin };\n }\n }\n this.objects = this.objects || [];\n if (this.objects[event.id]) {\n if (event.obj) {\n this.objects[event.id] = event.obj;\n } else {\n delete this.objects[event.id];\n }\n }\n });\n } else {\n console.log(`> objectChange ${id}`);\n this.objects = this.objects || [];\n\n if (obj && typeof this.props.filterFunc === 'function' && !this.props.filterFunc(obj)) {\n return;\n }\n\n if (id.startsWith('system.adapter.') && obj && obj.type === 'adapter') {\n const columnsForAdmin = JSON.parse(JSON.stringify(this.state.columnsForAdmin));\n this.parseObjectForAdmins(columnsForAdmin, obj);\n if (JSON.stringify(this.state.columnsForAdmin) !== JSON.stringify(columnsForAdmin)) {\n newState = { columnsForAdmin };\n }\n }\n\n if (this.objects[id]) {\n if (obj) {\n this.objects[id] = obj;\n } else {\n delete this.objects[id];\n }\n }\n }\n\n newState && this.setState(newState);\n\n if (!this.objectsUpdateTimer && this.objects) {\n this.objectsUpdateTimer = setTimeout(() => {\n this.objectsUpdateTimer = null;\n const { info, root } = buildTree(this.objects, this.props);\n this.root = root;\n this.info = info;\n this.lastAppliedFilter = null; // apply filter anew\n\n if (!this.pausedSubscribes) {\n this.forceUpdate();\n }\n // else it will be re-rendered when dialog will be closed\n }, 500);\n }\n };\n\n /**\n * @private\n * @param {string} id\n */\n subscribe(id) {\n if (!this.subscribes.includes(id)) {\n this.subscribes.push(id);\n console.log(`+ subscribe ${id}`);\n !this.pausedSubscribes && this.props.socket.subscribeState(id, this.onStateChange);\n }\n }\n\n /**\n * @private\n * @param {string} id\n */\n unsubscribe(id) {\n const pos = this.subscribes.indexOf(id);\n if (pos !== -1) {\n this.subscribes.splice(pos, 1);\n if (this.states[id]) {\n delete this.states[id];\n }\n console.log(`- unsubscribe ${id}`);\n this.props.socket.unsubscribeState(id, this.onStateChange);\n\n if (this.pausedSubscribes) {\n console.warn('Unsubscribe during pause?');\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} isPause\n */\n pauseSubscribe(isPause) {\n if (!this.pausedSubscribes && isPause) {\n this.pausedSubscribes = true;\n this.subscribes.forEach(id => this.props.socket.unsubscribeState(id, this.onStateChange));\n } else if (this.pausedSubscribes && !isPause) {\n this.pausedSubscribes = false;\n this.subscribes.forEach(id => this.props.socket.subscribeState(id, this.onStateChange));\n }\n }\n\n /**\n * @private\n * @param {string} [name]\n * @param {boolean} [value]\n */\n onFilter(name, value) {\n this.filterTimer = null;\n const filter = { ...this.state.filter };\n\n Object.keys(this.filterRefs).forEach(_name => {\n if (this.filterRefs[_name] && this.filterRefs[_name].current) {\n for (let i = 0; i < this.filterRefs[_name].current.children.length; i++) {\n if (this.filterRefs[_name].current.children[i].tagName === 'INPUT') {\n filter[_name] = this.filterRefs[_name].current.children[i].value;\n break;\n }\n }\n }\n });\n\n if (name) {\n filter[name] = value;\n if (name === 'expertMode') {\n (window._sessionStorage || window.sessionStorage).setItem('App.expertMode', value ? 'true' : 'false');\n }\n }\n\n if (JSON.stringify(this.state.filter) !== JSON.stringify(filter)) {\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectFilter`, JSON.stringify(filter));\n this.setState({ filter }, () =>\n this.props.onFilterChanged && this.props.onFilterChanged(filter));\n }\n }\n\n clearFilter() {\n const filter = { ...this.state.filter };\n\n Object.keys(this.filterRefs).forEach(name => {\n if (this.filterRefs[name] && this.filterRefs[name].current) {\n for (let i = 0; i < this.filterRefs[name].current.childNodes.length; i++) {\n const item = this.filterRefs[name].current.childNodes[i];\n if (item.tagName === 'INPUT') {\n filter[name] = '';\n item.value = '';\n break;\n }\n }\n }\n });\n\n if (JSON.stringify(this.state.filter) !== JSON.stringify(filter)) {\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectFilter`, JSON.stringify(filter));\n this.setState({ filter, filterKey: this.state.filterKey + 1 }, () =>\n this.props.onFilterChanged && this.props.onFilterChanged(filter));\n }\n }\n\n isFilterEmpty() {\n const someNotEmpty = Object.keys(this.state.filter).find(attr =>\n attr !== 'expertMode' && this.state.filter[attr]);\n return !someNotEmpty;\n }\n\n /**\n * @private\n * @param {string} name\n */\n getFilterInput(name) {\n return <FormControl\n className={Utils.clsx(this.props.classes.headerCellInput, this.props.classes.filterInput)}\n key={`${name}_${this.state.filterKey}`}\n // style={{ marginTop: 0, marginBottom: 0 }}\n margin=\"dense\"\n >\n <Input\n ref={this.filterRefs[name]}\n classes={{ underline: 'no-underline' }}\n id={name}\n placeholder={this.texts[`filter_${name}`]}\n defaultValue={this.state.filter[name]}\n onChange={() => {\n this.filterTimer && clearTimeout(this.filterTimer);\n this.filterTimer = setTimeout(() => this.onFilter(), 400);\n }}\n autoComplete=\"off\"\n />\n {this.filterRefs[name]?.current?.firstChild.value ?\n <div\n style={{\n position: 'absolute',\n right: 0,\n }}\n >\n <IconButton\n size=\"small\"\n onClick={() => {\n this.filterRefs[name].current.firstChild.value = '';\n this.onFilter(name, '');\n }}\n >\n <IconClose />\n </IconButton>\n </div> : null}\n </FormControl>;\n }\n\n /**\n * @private\n * @param {string} name\n * @param {any[]} values\n */\n getFilterSelect(name, values) {\n const hasIcons = !!values.find(item => item.icon);\n return <div style={{ position: 'relative' }}>\n <Select\n variant=\"standard\"\n key={`${name}_${this.state.filterKey}`}\n ref={this.filterRefs[name]}\n className={`${this.props.classes.headerCellInput} no-underline`}\n onChange={() => {\n this.filterTimer && clearTimeout(this.filterTimer);\n this.filterTimer = setTimeout(() => this.onFilter(), 400);\n }}\n defaultValue={this.state.filter[name] || ''}\n inputProps={{ name, id: name }}\n displayEmpty\n >\n <MenuItem key=\"empty\" value=\"\">\n <span className={this.props.classes.selectNone}>{this.texts[`filter_${name}`]}</span>\n </MenuItem>\n {values.map(item => {\n let id;\n let _name;\n let icon;\n if (typeof item === 'object') {\n id = item.value;\n _name = item.name;\n icon = item.icon;\n } else {\n id = item;\n _name = item;\n }\n return <MenuItem className={this.props.classes.headerCellSelectItem} key={id} value={id}>\n {icon || (hasIcons ? <div className=\"itemIcon\" /> : null)}\n {_name}\n </MenuItem>;\n })}\n </Select>\n {this.filterRefs[name]?.current?.childNodes[1]?.value ?\n <div className={Utils.clsx(this.props.classes.selectClearButton)}>\n <IconButton\n size=\"small\"\n onClick={() => {\n const newFilter = { ...this.state.filter };\n newFilter[name] = '';\n this.filterRefs[name].current.childNodes[1].value = '';\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectFilter`, JSON.stringify(newFilter));\n this.setState({ filter: newFilter, filterKey: this.state.filterKey + 1 }, () =>\n this.props.onFilterChanged && this.props.onFilterChanged(newFilter));\n }}\n >\n <IconClose />\n </IconButton>\n </div> : null}\n </div>;\n }\n\n /**\n * @private\n */\n getFilterSelectRole() {\n return this.getFilterSelect('role', this.info.roles);\n }\n\n /**\n * @private\n */\n getFilterSelectRoom() {\n const rooms = this.info.roomEnums.map(id => ({\n name: getName(this.objects[id]?.common?.name || id.split('.').pop()),\n value: id,\n icon: <Icon src={this.objects[id]?.common?.icon || ''} className={this.props.classes.selectIcon} />,\n }));\n\n return this.getFilterSelect('room', rooms);\n }\n\n /**\n * @private\n */\n getFilterSelectFunction() {\n const func = this.info.funcEnums.map(id => ({\n name: getName((this.objects[id] && this.objects[id].common && this.objects[id].common.name) || id.split('.').pop()),\n value: id,\n icon: <Icon src={this.objects[id]?.common?.icon || ''} className={this.props.classes.selectIcon} />,\n }));\n\n return this.getFilterSelect('func', func);\n }\n\n /**\n * @private\n */\n getFilterSelectType() {\n const types = this.info.types.map(type => ({\n name: type,\n value: type,\n icon: ITEM_IMAGES[type],\n }));\n\n return this.getFilterSelect('type', types);\n }\n\n /**\n * @private\n */\n getFilterSelectCustoms() {\n if (this.info.customs.length) {\n const customs = this.info.customs.map(id => ({\n name: id,\n value: id,\n icon: <Icon src={getSelectIdIcon(this.objects, id, this.imagePrefix) || ''} className={this.props.classes.selectIcon} />,\n }));\n return this.getFilterSelect('custom', customs);\n }\n return null;\n }\n\n /**\n * @private\n * @param {any} [root]\n * @param {any[]} [expanded]\n */\n onExpandAll(root, expanded) {\n root = root || this.root;\n expanded = expanded || [];\n\n root.children && root.children.forEach(item => {\n if (item.data.sumVisibility) {\n expanded.push(item.data.id);\n this.onExpandAll(item, expanded);\n }\n });\n\n if (root === this.root) {\n expanded.sort();\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n\n this.setState({ expanded });\n }\n }\n\n /**\n * @private\n */\n onCollapseAll() {\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify([]));\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectSelected`, '[]');\n this.setState({ expanded: [], depth: 0, selected: [] }, () =>\n this.onAfterSelect());\n }\n\n /**\n * @private\n * @param {any} root\n * @param {number} depth\n * @param {any[]} expanded\n */\n expandDepth(root, depth, expanded) {\n root = root || this.root;\n if (depth > 0) {\n if (root.children) {\n root.children.forEach(item => {\n if (item.data.sumVisibility) {\n if (!binarySearch(expanded, item.data.id)) {\n expanded.push(item.data.id);\n expanded.sort();\n }\n if (depth - 1 > 0) {\n this.expandDepth(item, depth - 1, expanded);\n }\n }\n });\n }\n }\n }\n\n /**\n * @private\n * @param {number} depth\n * @param {any[]} expanded\n */\n static collapseDepth(depth, expanded) {\n return expanded.filter(id => id.split('.').length <= depth);\n }\n\n /**\n * @private\n */\n onExpandVisible() {\n if (this.state.depth < 9) {\n const depth = this.state.depth + 1;\n const expanded = [...this.state.expanded];\n this.expandDepth(this.root, depth, expanded);\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n this.setState({ depth, expanded });\n }\n }\n\n /**\n * @private\n */\n onStatesViewVisible() {\n const statesView = !this.state.statesView;\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectStatesView`, JSON.stringify(statesView));\n this.setState({ statesView });\n }\n\n /**\n * @private\n */\n onCollapseVisible() {\n if (this.state.depth > 0) {\n const depth = this.state.depth - 1;\n const expanded = ObjectBrowser.collapseDepth(depth, this.state.expanded);\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n this.setState({ depth, expanded });\n }\n }\n\n /**\n * @private\n * @param {string} id\n */\n getEnumsForId = id => {\n const result = [];\n this.info.enums.forEach(_id => {\n if (this.objects[_id]?.common?.members?.includes(id)) {\n const en = {\n _id: this.objects[_id]._id,\n common: JSON.parse(JSON.stringify(this.objects[_id].common)),\n native: this.objects[_id].native,\n type: 'enum',\n };\n if (en.common) {\n delete en.common.members;\n delete en.common.custom;\n delete en.common.mobile;\n }\n result.push(en);\n }\n });\n\n return result.length ? result : undefined;\n };\n\n /**\n * @private\n * @param {array} enums\n * @param {string} objId\n */\n _createAllEnums = async (enums, objId) => {\n for (let e = 0; e < enums.length; e++) {\n let id = enums[e];\n let _enObj;\n if (typeof id === 'object') {\n _enObj = id;\n id = id._id;\n }\n let enObj = this.objects[id];\n if (!enObj) {\n enObj = _enObj || {\n _id: id,\n common: {\n name: id.split('.').pop(),\n members: [],\n },\n native: {},\n };\n\n enObj.common = enObj.common || {};\n enObj.common.members = [objId];\n\n await this.props.socket.setObject(id, enObj);\n } else if (!enObj.common?.members?.includes(objId)) {\n enObj.common = enObj.common || {};\n enObj.common.members = enObj.common.members || [];\n // add missing object\n enObj.common.members.push(objId);\n enObj.common.members.sort();\n await this.props.socket.setObject(id, enObj);\n }\n }\n };\n\n /**\n * @private\n * @param {any} objs\n */\n loadObjects = async objs => {\n if (objs) {\n for (const id in objs) {\n if (!Object.hasOwn(objs, id) || !objs[id]) {\n continue;\n }\n const obj = objs[id];\n let enums = null;\n if (obj && obj.common && obj.common.enums) {\n enums = obj.common.enums;\n delete obj.common.enums;\n } else {\n enums = null;\n }\n try {\n await this.props.socket.setObject(id, obj);\n enums && (await this._createAllEnums(enums, obj._id));\n if (obj.type === 'state') {\n try {\n const state = await this.props.socket.getState(obj._id);\n if (!state || state.val === null) {\n try {\n await this.props.socket.setState(obj._id, !obj.common || obj.common.def === undefined ? null : obj.common.def, true);\n } catch (e) {\n window.alert(`Cannot set state \"${obj._id}\": ${e}`);\n }\n }\n } catch (e) {\n window.alert(`Cannot read state \"${obj._id}\": ${e}`);\n }\n }\n } catch (error) {\n window.alert(error);\n }\n }\n }\n };\n\n _getSelectedIdsForExport() {\n if (this.state.selected.length || this.state.selectedNonObject) {\n const result = [];\n const keys = Object.keys(this.objects);\n keys.sort();\n const id = this.state.selected[0] || this.state.selectedNonObject;\n const idDot = `${id}.`;\n const idLen = idDot.length;\n for (let k = 0; k < keys.length; k++) {\n const key = keys[k];\n if (id === key || key.startsWith(idDot)) {\n result.push(key);\n }\n if (key.substring(0, idLen) > idDot) {\n break;\n }\n }\n\n return result;\n }\n return [];\n }\n\n _exportObjects(isAll) {\n if (isAll) {\n generateFile('allObjects.json', this.objects);\n } else\n if (this.state.selected.length || this.state.selectedNonObject) {\n const result = {};\n const id = this.state.selected[0] || this.state.selectedNonObject;\n\n this._getSelectedIdsForExport().forEach(key => {\n result[key] = JSON.parse(JSON.stringify(this.objects[key]));\n // add enum information\n if (result[key].common) {\n const enums = this.getEnumsForId(key);\n if (enums) {\n result[key].common.enums = enums;\n }\n }\n });\n\n generateFile(`${id}.json`, result);\n } else {\n window.alert(this.props.t('ra_Save of objects-tree is not possible'));\n }\n }\n\n renderExportDialog() {\n if (this.state.showExportDialog === false) {\n return null;\n }\n return <Dialog open={!0}>\n <DialogTitle>{this.props.t('Select type of export')}</DialogTitle>\n <DialogContent>\n <DialogContentText>\n {this.props.t('You can export all objects or just the selected branch.')}\n <br />\n {this.props.t('Selected %s object(s)', this.state.showExportDialog)}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button color=\"grey\" variant=\"outlined\" onClick={() => this.setState({ showExportDialog: false }, () => this._exportObjects(true))}>{this.props.t('ra_All objects')} ({Object.keys(this.objects).length})</Button>\n <Button color=\"primary\" variant=\"contained\" autoFocus onClick={() => this.setState({ showExportDialog: false }, () => this._exportObjects(false))}>{this.props.t('ra_Only selected')} ({this.state.showExportDialog})</Button>\n <Button color=\"grey\" variant=\"contained\" onClick={() => this.setState({ showExportDialog: false })} startIcon={<IconClose />}>{this.props.t('ra_Cancel')}</Button>\n </DialogActions>\n </Dialog>;\n }\n\n /**\n * @private\n * @param {object} evt\n */\n handleJsonUpload = evt => {\n const f = evt.target.files[0];\n if (f) {\n const r = new FileReader();\n r.onload = async e => {\n const contents = e.target.result;\n try {\n const json = JSON.parse(contents);\n const len = Object.keys(json).length;\n const id = json._id;\n if (id === undefined && len) {\n await this.loadObjects(json);\n window.alert(this.props.t('ra_%s object(s) processed', len));\n } else {\n // it is only one object in form\n // {\n // \"_id\": \"xxx\",\n // \"common\": \"yyy\",\n // \"native\": \"zzz\"\n // }\n if (!id) {\n return window.alert(this.props.t('ra_Invalid structure'));\n }\n try {\n let enums;\n if (json.common.enums) {\n enums = json.common.enums;\n delete json.common.enums;\n }\n await this.props.socket.setObject(json._id, json);\n if (json.type === 'state') {\n const state = await this.props.socket.getState(json._id);\n if (!state || state.val === null || state.val === undefined) {\n await this.props.socket.getState(json._id, json.common.def === undefined ? null : json.common.def, true);\n }\n }\n if (enums) {\n await this._createAllEnums(enums, json._id);\n }\n\n window.alert(this.props.t('ra_%s was imported', json._id));\n } catch (err) {\n window.alert(err);\n }\n }\n } catch (err) {\n window.alert(err);\n }\n return null;\n };\n r.readAsText(f);\n } else {\n window.alert(this.props.t('ra_Failed to open JSON File'));\n }\n };\n\n toolTipObjectCreating = () => {\n const { t } = this.props;\n\n let value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={2}>{t('ra_Folder → State')}</div>,\n <div key={3}>{t('ra_Folder → Channel → State')}</div>,\n <div key={4}>{t('ra_Folder → Device → Channel → State')}</div>,\n <div key={5}>{t('ra_Device → Channel → State')}</div>,\n <div key={6}>{t('ra_Channel → State')}</div>,\n <div key={7} style={{ height: 10 }} />,\n <div key={8}>{t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}</div>,\n <div key={9}>{t('ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").')}</div>,\n ];\n\n if (this.state.selected.length || this.state.selectedNonObject) {\n const id = this.state.selected[0] || this.state.selectedNonObject;\n if (id.split('.').length < 2 || (this.objects[id] && this.objects[id]?.type === 'state')) {\n // show default tooltip\n } else if (this.state.filter.expertMode) {\n switch (this.objects[id]?.type) {\n case 'device':\n value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={5}>{t('ra_Device → Channel → State')}</div>,\n <div key={7} style={{ height: 10 }} />,\n <div key={8}>{t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}</div>,\n <div key={9}>{t('ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").')}</div>,\n ];\n break;\n case 'folder':\n value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={2}>{t('ra_Folder → State')}</div>,\n <div key={3}>{t('ra_Folder → Channel → State')}</div>,\n <div key={4}>{t('ra_Folder → Device → Channel → State')}</div>,\n <div key={7} style={{ height: 10 }} />,\n <div key={8}>{t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}</div>,\n <div key={9}>{t('ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").')}</div>,\n ];\n break;\n case 'channel':\n value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={1}>{t('ra_Channel → State')}</div>,\n <div key={7} style={{ height: 10 }} />,\n <div key={8}>{t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}</div>,\n <div key={9}>{t('ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").')}</div>,\n ];\n break;\n default:\n break;\n }\n } else if (id.startsWith('alias.0') || id.startsWith('0_userdata')) {\n value = [\n <div key={1}>{t('ra_Only following structures of objects are available:')}</div>,\n <div key={2}>{t('ra_Folder → State')}</div>,\n <div key={3}>{t('ra_Folder → Channel → State')}</div>,\n <div key={4}>{t('ra_Folder → Device → Channel → State')}</div>,\n <div key={5}>{t('ra_Device → Channel → State')}</div>,\n <div key={6}>{t('ra_Channel → State')}</div>,\n <div key={7} style={{ height: 10 }} />,\n <div key={7}>{t('ra_Non-experts may create new objects only in \"0_userdata.0\" or \"alias.0\".')}</div>,\n <div key={8}>{t('ra_The experts may create objects everywhere but from second level (e.g. \"vis.0\" or \"javascript.0\").')}</div>,\n ];\n }\n }\n\n return value.length ? value : t('ra_Add new child object to selected parent');\n };\n\n /**\n * Renders the toolbar.\n * @returns {JSX.Element}\n */\n getToolbar() {\n let allowObjectCreation = false;\n if (this.state.selected.length || this.state.selectedNonObject) {\n const id = this.state.selected[0] || this.state.selectedNonObject;\n\n if (id.split('.').length < 2 || (this.objects[id] && this.objects[id].type === 'state')) {\n allowObjectCreation = false;\n } else if (this.state.filter.expertMode) {\n allowObjectCreation = true;\n } else if (id.startsWith('alias.0') || id.startsWith('0_userdata')) {\n allowObjectCreation = true;\n }\n }\n\n return <div style={{\n display: 'flex',\n width: '100%',\n alignItems: 'center',\n }}\n >\n <div style={{\n display: 'flex',\n width: '100%',\n alignItems: 'center',\n }}\n >\n\n <Tooltip title={this.props.t('ra_Refresh tree')}>\n <div>\n <IconButton\n onClick={() => this.refreshComponent()}\n disabled={this.state.updating}\n size=\"large\"\n >\n <RefreshIcon />\n </IconButton>\n </div>\n </Tooltip>\n {this.props.showExpertButton && !this.props.expertMode &&\n <Tooltip title={this.props.t('ra_expertMode')}>\n <IconButton\n key=\"expertMode\"\n color={this.state.filter.expertMode ? 'secondary' : 'default'}\n onClick={() => this.onFilter('expertMode', !this.state.filter.expertMode)}\n size=\"large\"\n >\n <IconExpert />\n </IconButton>\n </Tooltip>}\n {!this.props.disableColumnSelector &&\n <Tooltip title={this.props.t('ra_Configure')}>\n <IconButton\n key=\"columnSelector\"\n // color={this.state.columnsAuto ? 'primary' : 'default'}\n onClick={() => this.setState({ columnsSelectorShow: true })}\n size=\"large\"\n >\n <IconColumns />\n </IconButton>\n </Tooltip>}\n {this.state.expandAllVisible &&\n <Tooltip title={this.props.t('ra_Expand all nodes')}>\n <IconButton\n key=\"expandAll\"\n onClick={() => this.onExpandAll()}\n size=\"large\"\n >\n <IconOpen />\n </IconButton>\n </Tooltip>}\n <Tooltip title={this.props.t('ra_Collapse all nodes')}>\n <IconButton\n key=\"collapseAll\"\n onClick={() => this.onCollapseAll()}\n size=\"large\"\n >\n <IconClosed />\n </IconButton>\n </Tooltip>\n <Tooltip title={this.props.t('ra_Expand one step node')}>\n <IconButton\n key=\"expandVisible\"\n color=\"primary\"\n onClick={() => this.onExpandVisible()}\n size=\"large\"\n >\n <StyledBadge badgeContent={this.state.depth} color=\"secondary\">\n <IconOpen />\n </StyledBadge>\n </IconButton>\n </Tooltip>\n <Tooltip title={this.props.t('ra_Collapse one step node')}>\n <IconButton\n key=\"collapseVisible\"\n color=\"primary\"\n onClick={() => this.onCollapseVisible()}\n size=\"large\"\n >\n <StyledBadge badgeContent={this.state.depth} color=\"secondary\">\n <IconClosed />\n </StyledBadge>\n </IconButton>\n </Tooltip>\n {this.props.objectStatesView && <Tooltip title={this.props.t('ra_Toggle the states view')}>\n <IconButton\n onClick={() => this.onStatesViewVisible()}\n size=\"large\"\n >\n <LooksOneIcon color={this.state.statesView ? 'primary' : 'inherit'} />\n </IconButton>\n </Tooltip>}\n\n {this.props.objectAddBoolean ?\n <Tooltip title={this.toolTipObjectCreating()}>\n <div>\n <IconButton\n disabled={!allowObjectCreation}\n onClick={() => this.setState({ modalNewObj: true })}\n size=\"large\"\n >\n <AddIcon />\n </IconButton>\n </div>\n </Tooltip>\n : null}\n\n {this.props.objectImportExport &&\n <Tooltip title={this.props.t('ra_Add objects tree from JSON file')}>\n <IconButton\n onClick={() => {\n const input = document.createElement('input');\n input.setAttribute('type', 'file');\n input.setAttribute('id', 'files');\n input.setAttribute('opacity', 0);\n input.addEventListener('change', e => this.handleJsonUpload(e), false);\n input.click();\n }}\n size=\"large\"\n >\n <PublishIcon />\n </IconButton>\n </Tooltip>}\n {this.props.objectImportExport && (!!this.state.selected.length || this.state.selectedNonObject) &&\n <Tooltip title={this.props.t('ra_Save objects tree as JSON file')}>\n <IconButton\n onClick={() => this.setState({ showExportDialog: this._getSelectedIdsForExport().length })}\n size=\"large\"\n >\n <PublishIcon style={{ transform: 'rotate(180deg)' }} />\n </IconButton>\n </Tooltip>}\n </div>\n {!!this.props.objectBrowserEditObject && <div style={{ display: 'flex', whiteSpace: 'nowrap' }}>\n {`${this.props.t('ra_Objects')}: ${Object.keys(this.info.objects).length}, ${this.props.t('ra_States')}: ${Object.keys(this.info.objects).filter(el => this.info.objects[el].type === 'state').length}`}\n </div>}\n {this.props.objectEditBoolean &&\n <Tooltip title={this.props.t('ra_Edit custom config')}>\n <IconButton\n onClick={() => {\n // get all visible states\n const ids = getVisibleItems(this.root, 'state', this.objects);\n\n if (ids.length) {\n this.pauseSubscribe(true);\n\n if (ids.length === 1) {\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectSelected`, this.state.selected[0]);\n this.props.router && this.props.router.doNavigate(null, 'custom', this.state.selected[0]);\n }\n this.setState({ customDialog: ids });\n } else {\n this.setState({ toast: this.props.t('ra_please select object') });\n }\n }}\n size=\"large\"\n >\n <BuildIcon />\n </IconButton>\n </Tooltip>}\n </div>;\n }\n\n /**\n * @private\n * @param {string} id\n */\n toggleExpanded(id) {\n const expanded = JSON.parse(JSON.stringify(this.state.expanded));\n const pos = expanded.indexOf(id);\n if (pos === -1) {\n expanded.push(id);\n expanded.sort();\n } else {\n expanded.splice(pos, 1);\n }\n\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectExpanded`, JSON.stringify(expanded));\n\n this.setState({ expanded });\n }\n\n /**\n * @private\n * @param {Event} e\n * @param {string} text\n */\n onCopy(e, text) {\n e.stopPropagation();\n e.preventDefault();\n Utils.copyToClipboard(text, null);\n if (text.length < 50) {\n this.setState({ toast: this.props.t('ra_Copied %s', text) });\n } else {\n this.setState({ toast: this.props.t('ra_Copied') });\n }\n }\n\n renderTooltipAccessControl = acl => {\n // acl ={object,state,owner,ownerGroup}\n if (!acl) {\n return null;\n }\n const check = [\n {\n value: '0x400', valueNum: 0x400, title: 'read', group: 'Owner',\n },\n {\n value: '0x200', valueNum: 0x200, title: 'write', group: 'Owner',\n },\n {\n value: '0x40', valueNum: 0x40, title: 'read', group: 'Group',\n },\n {\n value: '0x20', valueNum: 0x20, title: 'write', group: 'Group',\n },\n {\n value: '0x4', valueNum: 0x4, title: 'read', group: 'Everyone',\n },\n {\n value: '0x2', valueNum: 0x2, title: 'write', group: 'Everyone',\n },\n ];\n const arrayTooltipText = [];\n const funcRenderStateObject = (value = 'object') => {\n const rights = acl[value];\n check.forEach((el, i) => {\n // eslint-disable-next-line no-bitwise\n if (rights & el.valueNum) {\n arrayTooltipText.push(<span key={value + i}>\n {this.texts[`acl${el.group}_${el.title}_${value}`]}\n,\n <span className={value === 'object' ? this.props.classes.rightsObject : this.props.classes.rightsState}>\n {el.value}\n </span>\n </span>);\n }\n });\n };\n arrayTooltipText.push(<span key=\"group\">{`${this.texts.ownerGroup}: ${(acl.ownerGroup || '').replace('system.group.', '')}`}</span>);\n arrayTooltipText.push(<span key=\"owner\">{`${this.texts.ownerUser}: ${(acl.owner || '').replace('system.user.', '')}`}</span>);\n funcRenderStateObject();\n if (acl.state) {\n funcRenderStateObject('state');\n }\n return arrayTooltipText.length ? <span className={this.props.classes.tooltipAccessControl}>{arrayTooltipText.map(el => el)}</span> : '';\n };\n\n /**\n * @param {string} id\n * @param {{ data: { obj: { type: string; }; hasCustoms: any; }; }} item\n * @param {{ cellButtonsButton: string | undefined; cellButtonsButtonAlone: any; cellButtonsButtonIcon: string | undefined; cellButtonsButtonWithCustoms: any; }} classes\n */\n renderColumnButtons(id, item, classes) {\n if (!item.data.obj) {\n return this.props.onObjectDelete || this.props.objectEditOfAccessControl ? <div className={classes.buttonDiv}>\n {this.state.filter.expertMode && this.props.objectEditOfAccessControl ? <IconButton\n className={Utils.clsx(classes.cellButtonsButton, classes.cellButtonsEmptyButton, classes.cellButtonMinWidth)}\n onClick={() =>\n this.setState({ modalEditOfAccess: true, modalEditOfAccessObjData: item.data })}\n size=\"large\"\n >\n---\n </IconButton> : null}\n {this.props.onObjectDelete && item.children && item.children.length ? <IconButton\n className={Utils.clsx(classes.cellButtonsButton, classes.cellButtonsButtonAlone)}\n size=\"small\"\n aria-label=\"delete\"\n title={this.texts.deleteObject}\n onClick={() => {\n // calculate number of children\n const keys = Object.keys(this.objects);\n keys.sort();\n let count = 0;\n const start = `${id}.`;\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].startsWith(start)) {\n count++;\n } else if (keys[i] > start) {\n break;\n }\n }\n\n this.props.onObjectDelete(id, !!(item.children && item.children.length), false, count + 1);\n }}\n >\n <IconDelete className={classes.cellButtonsButtonIcon} />\n </IconButton> : null}\n </div> : null;\n }\n\n item.data.aclTooltip = item.data.aclTooltip || this.renderTooltipAccessControl(item.data.obj.acl);\n\n const acl = item.data.obj.acl ? (item.data.obj.type === 'state' ? item.data.obj.acl.state : item.data.obj.acl.object) : 0;\n const aclSystemConfig = item.data.obj.acl && (item.data.obj.type === 'state' ? this.systemConfig.common.defaultNewAcl.state : this.systemConfig.common.defaultNewAcl.object);\n\n return [\n this.state.filter.expertMode && this.props.objectEditOfAccessControl ? <Tooltip key=\"acl\" title={item.data.aclTooltip}>\n <IconButton\n className={classes.cellButtonMinWidth}\n onClick={() => this.setState({ modalEditOfAccess: true, modalEditOfAccessObjData: item.data })}\n size=\"large\"\n >\n <div className={classes.aclText}>{Number.isNaN(Number(acl).toString(16)) ? Number(aclSystemConfig).toString(16) : Number(acl).toString(16)}</div>\n </IconButton>\n </Tooltip> : <div key=\"aclEmpty\" className={classes.cellButtonMinWidth} />,\n <IconButton\n key=\"edit\"\n className={classes.cellButtonsButton}\n size=\"small\"\n aria-label=\"edit\"\n title={this.texts.editObject}\n onClick={() => {\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectSelected`, id);\n this.setState({ editObjectDialog: id });\n }}\n >\n <IconEdit className={classes.cellButtonsButtonIcon} />\n </IconButton>,\n this.props.onObjectDelete && (item.children?.length || !item.data.obj.common?.dontDelete) ? <IconButton\n key=\"delete\"\n className={classes.cellButtonsButton}\n size=\"small\"\n aria-label=\"delete\"\n onClick={() => {\n const keys = Object.keys(this.objects);\n keys.sort();\n let count = 0;\n const start = `${id}.`;\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].startsWith(start)) {\n count++;\n } else if (keys[i] > start) {\n break;\n }\n }\n this.props.onObjectDelete(id, !!item.children?.length, !item.data.obj.common?.dontDelete, count);\n }}\n title={this.texts.deleteObject}\n >\n <IconDelete className={classes.cellButtonsButtonIcon} />\n </IconButton> : null,\n this.props.objectCustomDialog && this.info.hasSomeCustoms && item.data.obj.type === 'state' && item.data.obj.common?.type !== 'file' ? <IconButton\n className={Utils.clsx(classes.cellButtonsButton, item.data.hasCustoms ? classes.cellButtonsButtonWithCustoms : classes.cellButtonsButtonWithoutCustoms)}\n key=\"custom\"\n size=\"small\"\n aria-label=\"config\"\n title={this.texts.customConfig}\n onClick={() => {\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.objectSelected`, id);\n\n this.pauseSubscribe(true);\n this.props.router && this.props.router.doNavigate(null, 'customs', id);\n this.setState({ customDialog: [id] });\n }}\n >\n <IconConfig className={classes.cellButtonsButtonIcon} />\n </IconButton> : null,\n ];\n }\n\n /**\n * @private\n * @param {string} id\n */\n readHistory(id) {\n /* interface GetHistoryOptions {\n instance?: string;\n start?: number;\n end?: number;\n step?: number;\n count?: number;\n from?: boolean;\n ack?: boolean;\n q?: boolean;\n addID?: boolean;\n limit?: number;\n ignoreNull?: boolean;\n sessionId?: any;\n aggregate?: 'minmax' | 'min' | 'max' | 'average' | 'total' | 'count' | 'none';\n } */\n if (window.sparkline &&\n this.defaultHistory &&\n this.objects[id] &&\n this.objects[id].common &&\n this.objects[id].common.custom &&\n this.objects[id].common.custom[this.defaultHistory]) {\n\n const now = new Date();\n now.setHours(now.getHours() - 24);\n now.setMinutes(0);\n now.setSeconds(0);\n now.setMilliseconds(0);\n const nowMs = now.getTime();\n\n this.props.socket.getHistory(id, {\n instance: this.defaultHistory,\n start: nowMs,\n end: Date.now(),\n step: 3600000,\n from: false,\n ack: false,\n q: false,\n addID: false,\n aggregate: 'minmax',\n })\n .then(values => {\n const sparks = window.document.getElementsByClassName('sparkline');\n\n for (let s = 0; s < sparks.length; s++) {\n if (sparks[s].dataset.id === id) {\n const v = prepareSparkData(values, nowMs);\n\n window.sparkline.sparkline(sparks[s], v);\n break;\n }\n }\n })\n .catch(e => console.warn(`Cannot read history: ${e}`));\n }\n }\n\n /**\n * @private\n * @param {string} id\n * @param {any} item\n * @param {Record<string, any>} classes\n * @returns {JSX.Element | null}\n */\n renderColumnValue(id, item, classes) {\n const obj = item.data.obj;\n if (!obj || !this.states) {\n return null;\n }\n\n if (obj.common?.type === 'file') {\n return <div className={Utils.clsx(classes.cellValueText, classes.cellValueFile)}>[file]</div>;\n }\n if (!this.states[id]) {\n if (obj.type === 'state') {\n !this.recordStates.includes(id) && this.recordStates.push(id);\n this.states[id] = { val: null };\n this.subscribe(id);\n }\n return null;\n }\n !this.recordStates.includes(id) && this.recordStates.push(id);\n\n const state = this.states[id];\n let info = item.data.state;\n if (!info) {\n item.data.state = item.data.state || formatValue(id, state, obj, this.texts, this.props.dateFormat, this.props.isFloatComma);\n info = item.data.state;\n\n info.valFull = info.valFull.map(_item => {\n if (_item.t === this.texts.quality && state.q) {\n return [\n <div className={classes.cellValueTooltipBoth} key={_item.t}>\n {_item.t}\n :&nbsp;\n {_item.v}\n </div>,\n // <div className={classes.cellValueTooltipValue} key={item.t + '_v'}>{item.v}</div>,\n !_item.nbr ? <br key={`${_item.t}_br`} /> : null,\n ];\n }\n return [\n <div className={classes.cellValueTooltipTitle} key={_item.t}>\n {_item.t}\n :&nbsp;\n </div>,\n <div className={classes.cellValueTooltipValue} key={`${_item.t}_v`}>{_item.v}</div>,\n !_item.nbr ? <br key={`${_item.t}_br`} /> : null,\n ];\n });\n\n if (this.defaultHistory && this.objects[id] && this.objects[id].common && this.objects[id].common.custom && this.objects[id].common.custom[this.defaultHistory]) {\n info.valFull.push(<svg key=\"sparkline\" className=\"sparkline\" data-id={id} style={{ fill: '#3d85de' }} width=\"200\" height=\"30\" strokeWidth=\"3\" />);\n }\n\n const copyText = info.valText.v || '';\n info.val = copyText;\n info.valText = [\n <span className={classes.newValue} key={`${info.valText.v.toString()}valText`}>{info.valText.v.toString()}</span>,\n info.valText.u ? <span className={Utils.clsx(classes.cellValueTextUnit, classes.newValue)} key={`${info.valText.v.toString()}unit`}>{info.valText.u}</span> : null,\n info.valText.s !== undefined ? <span className={Utils.clsx(classes.cellValueTextState, classes.newValue)} key={`${info.valText.v.toString()}states`}>\n (\n {info.valText.s}\n )\n </span> : null,\n <IconCopy className={Utils.clsx(classes.cellButtonsValueButton, 'copyButton', classes.cellButtonsValueButtonCopy)} onClick={e => this.onCopy(e, copyText)} key=\"cc\" />,\n // <IconEdit className={ Utils.clsx(classes.cellButtonsValueButton, 'copyButton', classes.cellButtonsValueButtonEdit) } key=\"ce\" />\n ];\n }\n\n let val = info.valText;\n if (!this.state.filter.expertMode && item.data.button) {\n val = <PressButtonIcon className={Utils.clsx(this.props.classes.cellValueButton, !this.states[id] || !this.states[id].val ? this.props.classes.cellValueButtonFalse : '')} />;\n }\n\n return <Tooltip\n key=\"value\"\n title={info.valFull}\n classes={{ tooltip: this.props.classes.cellValueTooltip, popper: this.props.classes.cellValueTooltipBox }}\n onOpen={() => this.readHistory(id)}\n >\n <div style={info.style} className={classes.cellValueText}>\n {val}\n </div>\n </Tooltip>;\n }\n\n /**\n * @private\n * @returns {undefined}\n */\n _syncEnum(id, enumIds, newArray, cb) {\n if (!enumIds || !enumIds.length) {\n cb && cb();\n return;\n }\n const enumId = enumIds.pop();\n const promises = [];\n if (this.info.objects[enumId]?.common) {\n if (this.info.objects[enumId].common.members?.length) {\n const pos = this.info.objects[enumId].common.members.indexOf(id);\n if (pos !== -1 && !newArray.includes(enumId)) {\n // delete from members\n const obj = JSON.parse(JSON.stringify(this.info.objects[enumId]));\n obj.common.members.splice(pos, 1);\n promises.push(this.props.socket.setObject(enumId, obj)\n .then(() => this.info.objects[enumId] = obj)\n .catch(e => this.showError(e)));\n }\n }\n\n // add to it\n if (newArray.includes(enumId) && !this.info.objects[enumId].common.members?.includes(id)) {\n // add to object\n const obj = JSON.parse(JSON.stringify(this.info.objects[enumId]));\n obj.common.members = obj.common.members || [];\n obj.common.members.push(id);\n obj.common.members.sort();\n promises.push(this.props.socket.setObject(enumId, obj)\n .then(() => this.info.objects[enumId] = obj)\n .catch(e => this.showError(e)));\n }\n }\n\n Promise.all(promises)\n .then(() => setTimeout(() =>\n this._syncEnum(id, enumIds, newArray, cb), 0));\n }\n\n /**\n * @private\n * @returns {Promise}\n */\n syncEnum(id, enumName, newArray) {\n const toCheck = [...this.info[enumName === 'func' ? 'funcEnums' : 'roomEnums']];\n\n return new Promise(resolve => {\n this._syncEnum(id, toCheck, newArray, error => {\n error && this.showError(error);\n // force update of object\n resolve();\n });\n });\n }\n\n /**\n * @private\n * @returns {JSX.Element | null}\n */\n renderEnumDialog() {\n if (this.state.enumDialog) {\n const type = this.state.enumDialog.type;\n const item = this.state.enumDialog.item;\n const itemEnums = this.state.enumDialogEnums;\n const enumsOriginal = this.state.enumDialog.enumsOriginal;\n\n const enums = (type === 'room' ? this.info.roomEnums : this.info.funcEnums).map(id => ({\n name: getName((this.objects[id] && this.objects[id].common && this.objects[id].common.name) || id.split('.').pop(), this.props.lang),\n value: id,\n icon: getSelectIdIcon(this.objects, id, this.imagePrefix),\n }))\n .sort((a, b) => a.name > b.name ? 1 : -1);\n\n enums.forEach(_item => {\n if (_item.icon && typeof _item.icon === 'string') {\n _item.icon = <div className={this.props.classes.enumIconDiv}>\n <img src={_item.icon} className={this.props.classes.enumIcon} alt={_item.name} />\n </div>;\n }\n });\n\n // const hasIcons = !!enums.find(item => item.icon);\n\n return <Dialog\n className={this.props.classes.enumDialog}\n onClose={() => this.setState({ enumDialog: null })}\n aria-labelledby=\"enum-dialog-title\"\n open={!0} // true\n >\n <DialogTitle id=\"enum-dialog-title\">\n {type === 'func' ? this.props.t('ra_Define functions') : this.props.t('ra_Define rooms')}\n <Fab\n className={this.props.classes.enumButton}\n color=\"primary\"\n disabled={JSON.stringify(enumsOriginal) === JSON.stringify(itemEnums)}\n size=\"small\"\n onClick={() =>\n this.syncEnum(item.data.id, type, itemEnums)\n .then(() => this.setState({ enumDialog: null, enumDialogEnums: null }))}\n >\n <IconCheck />\n </Fab>\n </DialogTitle>\n <List classes={{ root: this.props.classes.enumList }}>\n {\n enums.map(_item => {\n let id;\n let name;\n let icon;\n\n if (typeof _item === 'object') {\n id = _item.value;\n name = _item.name;\n icon = _item.icon;\n } else {\n id = _item;\n name = _item;\n }\n const labelId = `checkbox-list-label-${id}`;\n\n return <ListItem\n className={this.props.classes.headerCellSelectItem}\n key={id}\n onClick={() => {\n const pos = itemEnums.indexOf(id);\n const enumDialogEnums = JSON.parse(JSON.stringify(this.state.enumDialogEnums));\n if (pos === -1) {\n enumDialogEnums.push(id);\n enumDialogEnums.sort();\n } else {\n enumDialogEnums.splice(pos, 1);\n }\n this.setState({ enumDialogEnums });\n }}\n >\n <ListItemIcon classes={{ root: this.props.classes.enumCheckbox }}>\n <Checkbox\n edge=\"start\"\n checked={itemEnums.includes(id)}\n tabIndex={-1}\n disableRipple\n inputProps={{ 'aria-labelledby': labelId }}\n />\n </ListItemIcon>\n <ListItemText id={labelId}>{name}</ListItemText>\n {icon ? <ListItemSecondaryAction>{icon}</ListItemSecondaryAction> : null}\n </ListItem>;\n })\n }\n </List>\n </Dialog>;\n }\n return null;\n }\n\n /**\n * @private\n * @returns {JSX.Element | null}\n */\n renderEditRoleDialog() {\n if (this.state.roleDialog && this.props.objectBrowserEditRole) {\n const ObjectBrowserEditRole = this.props.objectBrowserEditRole;\n return <ObjectBrowserEditRole\n key=\"objectBrowserEditRole\"\n id={this.state.roleDialog}\n socket={this.props.socket}\n t={this.props.t}\n roles={this.info.roles}\n onClose={obj => {\n if (obj) {\n this.info.objects[this.state.roleDialog] = obj;\n }\n this.setState({ roleDialog: false });\n }}\n />;\n }\n return null;\n }\n\n /**\n * @private\n * @param {boolean} [isSave]\n */\n onColumnsEditCustomDialogClose(isSave) {\n if (isSave) {\n let value = this.customColumnDialog.value;\n if (this.customColumnDialog.type === 'boolean') {\n value = value === 'true' || value === true;\n } else if (this.customColumnDialog.type === 'number') {\n value = parseFloat(value);\n }\n this.customColumnDialog = null;\n this.props.socket.getObject(this.state.columnsEditCustomDialog.obj._id)\n .then(obj => {\n if (ObjectBrowser.setCustomValue(obj, this.state.columnsEditCustomDialog.it, value)) {\n return this.props.socket.setObject(obj._id, obj);\n }\n throw new Error(this.props.t('ra_Cannot update attribute, because not found in the object'));\n })\n .then(() => this.setState({ columnsEditCustomDialog: null }))\n .catch(e => this.showError(e));\n } else {\n this.customColumnDialog = null;\n this.setState({ columnsEditCustomDialog: null });\n }\n }\n\n /**\n * @private\n */\n renderColumnsEditCustomDialog() {\n if (this.state.columnsEditCustomDialog) {\n if (!this.customColumnDialog) {\n const value = ObjectBrowser.getCustomValue(this.state.columnsEditCustomDialog.obj, this.state.columnsEditCustomDialog.it);\n this.customColumnDialog = {\n type: this.state.columnsEditCustomDialog.it.type || typeof value,\n initValue: (value === null || value === undefined ? '' : value).toString(),\n value: (value === null || value === undefined ? '' : value).toString(),\n };\n }\n\n return <Dialog\n onClose={() => this.setState({ columnsEditCustomDialog: null })}\n maxWidth=\"md\"\n aria-labelledby=\"custom-dialog-title\"\n open={!0}\n >\n <DialogTitle id=\"custom-dialog-title\">{`${this.props.t('ra_Edit object field')}: ${this.state.columnsEditCustomDialog.obj._id}`}</DialogTitle>\n <DialogContent>\n <DialogContentText id=\"alert-dialog-description\">\n {this.customColumnDialog.type === 'boolean' ?\n <FormControlLabel\n control={<Checkbox\n onKeyUp={e => e.keyCode === 13 && this.onColumnsEditCustomDialogClose(true)}\n defaultChecked={this.customColumnDialog.value === 'true'}\n onChange={e => {\n this.customColumnDialog.value = e.target.checked.toString();\n const changed = this.customColumnDialog.value !== this.customColumnDialog.initValue;\n if (changed === !this.state.customColumnDialogValueChanged) {\n this.setState({ customColumnDialogValueChanged: changed });\n }\n }}\n />}\n label={`${this.state.columnsEditCustomDialog.it.name} (${this.state.columnsEditCustomDialog.it.pathText})`}\n />\n :\n <TextField\n variant=\"standard\"\n defaultValue={this.customColumnDialog.value}\n fullWidth\n onKeyUp={e => e.keyCode === 13 && this.onColumnsEditCustomDialogClose(true)}\n label={`${this.state.columnsEditCustomDialog.it.name} (${this.state.columnsEditCustomDialog.it.pathText})`}\n onChange={e => {\n this.customColumnDialog.value = e.target.value;\n const changed = this.customColumnDialog.value !== this.customColumnDialog.initValue;\n if (changed === !this.state.customColumnDialogValueChanged) {\n this.setState({ customColumnDialogValueChanged: changed });\n }\n }}\n autoFocus\n />}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => this.onColumnsEditCustomDialogClose(true)}\n disabled={!this.state.customColumnDialogValueChanged}\n color=\"primary\"\n startIcon={<IconCheck />}\n >\n {this.props.t('ra_Update')}\n </Button>\n <Button\n color=\"grey\"\n variant=\"contained\"\n onClick={() => this.onColumnsEditCustomDialogClose()}\n startIcon={<IconClose />}\n >\n {this.props.t('ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>;\n }\n return null;\n }\n\n /**\n * @private\n * @param {any} obj\n * @param {any} it\n */\n static getCustomValue(obj, it) {\n if (obj && obj._id && obj._id.startsWith(`${it.adapter}.`) && it.path.length > 1) {\n const p = it.path;\n let value;\n if (obj[p[0]] && typeof obj[p[0]] === 'object') {\n if (p.length === 2) { // most common case\n value = obj[p[0]][p[1]];\n } else if (p.length === 3) {\n value = obj[p[0]][p[1]] && typeof obj[p[0]][p[1]] === 'object' ? obj[p[0]][p[1]][p[2]] : null;\n } else if (p.length === 4) {\n value = obj[p[0]][p[1]] && typeof obj[p[0]][p[1]] === 'object' && obj[p[0]][p[1]][p[2]] ? obj[p[0]][p[1]][p[2]][p[3]] : null;\n } else if (p.length === 5) {\n value = obj[p[0]][p[1]] && typeof obj[p[0]][p[1]] === 'object' && obj[p[0]][p[1]][p[2]] && obj[p[0]][p[1]][p[2]][p[3]] ? obj[p[0]][p[1]][p[2]][p[3]][p[4]] : null;\n } else if (p.length === 6) {\n value = obj[p[0]][p[1]] && typeof obj[p[0]][p[1]] === 'object' && obj[p[0]][p[1]][p[2]] && obj[p[0]][p[1]][p[2]][p[3]] && obj[p[0]][p[1]][p[2]][p[3]][p[4]] ? obj[p[0]][p[1]][p[2]][p[3]][p[4]][p[5]] : null;\n }\n if (value === undefined || value === null) {\n return null;\n }\n return value;\n }\n }\n\n return null;\n }\n\n /**\n * @private\n * @param {any} obj\n * @param {any} it\n * @param {any} value\n */\n static setCustomValue(obj, it, value) {\n if (obj && obj._id && obj._id.startsWith(`${it.adapter}.`) && it.path.length > 1) {\n const p = it.path;\n if (obj[p[0]] && typeof obj[p[0]] === 'object') {\n if (p.length === 2) { // most common case\n obj[p[0]][p[1]] = value;\n return true;\n }\n if (p.length === 3) {\n if (obj[p[0]][p[1]] && typeof obj[p[0]][p[1]] === 'object') {\n obj[p[0]][p[1]][p[2]] = value;\n return true;\n }\n } else if (p.length === 4) {\n if (obj[p[0]][p[1]] && typeof obj[p[0]][p[1]] === 'object' && obj[p[0]][p[1]][p[2]] && typeof obj[p[0]][p[1]][p[2]] === 'object') {\n obj[p[0]][p[1]][p[2]][p[3]] = value;\n return true;\n }\n } else if (p.length === 5) {\n if (obj[p[0]][p[1]] && typeof obj[p[0]][p[1]] === 'object' && obj[p[0]][p[1]][p[2]] && typeof obj[p[0]][p[1]][p[2]] === 'object' && obj[p[0]][p[1]][p[2]][p[3]] && typeof obj[p[0]][p[1]][p[2]][p[3]] === 'object') {\n obj[p[0]][p[1]][p[2]][p[3]][p[4]] = value;\n return true;\n }\n } else if (p.length === 6) {\n if (obj[p[0]][p[1]] && typeof obj[p[0]][p[1]] === 'object' && obj[p[0]][p[1]][p[2]] && typeof obj[p[0]][p[1]][p[2]] === 'object' && obj[p[0]][p[1]][p[2]][p[3]] && typeof obj[p[0]][p[1]][p[2]][p[3]] === 'object' && obj[p[0]][p[1]][p[2]][p[3]][p[4]] && typeof obj[p[0]][p[1]][p[2]][p[3]][p[4]] === 'object') {\n obj[p[0]][p[1]][p[2]][p[3]][p[4]][p[5]] = value;\n return true;\n }\n }\n }\n }\n return false;\n }\n\n /**\n * Renders a custom value.\n * @param {any} obj\n * @param {any} it\n * @param {any} item\n * @returns {JSX.Element | null}\n */\n renderCustomValue(obj, it, item) {\n const text = ObjectBrowser.getCustomValue(obj, it);\n if (text !== null && text !== undefined) {\n if (it.edit && !this.props.notEditable && (!it.objTypes || it.objTypes.includes(obj.type))) {\n return <div\n className={Utils.clsx(this.props.classes.columnCustom, this.props.classes.columnCustomEditable, this.props.classes[`columnCustom_${it.align}`])}\n onClick={() => this.setState({ columnsEditCustomDialog: { item, it, obj }, customColumnDialogValueChanged: false })}\n >\n {text}\n </div>;\n }\n return <div\n className={Utils.clsx(this.props.classes.columnCustom, this.props.classes[`columnCustom_${it.align}`])}\n >\n {text}\n </div>;\n }\n return null;\n }\n\n /**\n * Renders a leaf.\n * @param {any} item\n * @param {boolean} isExpanded\n * @param {Record<string, any>} classes\n * @param {{ count: number; }} counter\n * @returns {JSX.Element}\n */\n renderLeaf(item, isExpanded, classes, counter) {\n const id = item.data.id;\n counter.count++;\n isExpanded = isExpanded === undefined ? this.state.expanded.includes(id) : isExpanded;\n\n // icon\n let iconFolder;\n const obj = item.data.obj;\n const itemType = obj?.type;\n\n if (item.children || itemType === 'folder' || itemType === 'device' || itemType === 'channel' || itemType === 'meta') {\n iconFolder = isExpanded ? <IconOpen\n className={classes.cellIdIconFolder}\n onClick={() => this.toggleExpanded(id)}\n /> : <IconClosed\n className={classes.cellIdIconFolder}\n onClick={() => this.toggleExpanded(id)}\n />;\n } else if (obj.common && (obj.common.write === false) && obj.type === 'state') {\n iconFolder = <IconDocumentReadOnly className={classes.cellIdIconDocument} />;\n } else {\n iconFolder = <IconDocument className={classes.cellIdIconDocument} />;\n }\n\n let iconItem = null;\n if (item.data.icon) {\n if (typeof item.data.icon === 'string') {\n if (item.data.icon.length < 3) {\n iconItem = <span className={Utils.clsx(classes.cellIdIconOwn, 'iconOwn')}>{item.data.icon}</span>; // utf-8 char\n } else {\n iconItem = <img className={Utils.clsx(classes.cellIdIconOwn, 'iconOwn')} src={item.data.icon} alt=\"\" />;\n }\n } else {\n iconItem = item.data.icon;\n }\n }\n\n const common = obj?.common;\n\n const typeImg = (obj && obj.type && ITEM_IMAGES[obj.type]) || <div className=\"itemIcon\" />;\n\n const paddingLeft = this.levelPadding * item.data.level;\n\n if (item.data.lang !== this.state.lang) {\n const { rooms, per } = findRoomsForObject(this.info, id, this.state.lang);\n item.data.rooms = rooms.join(', ');\n item.data.per = per;\n const { funcs, pef } = findFunctionsForObject(this.info, id, this.state.lang);\n item.data.funcs = funcs.join(', ');\n item.data.pef = pef;\n item.data.lang = this.state.lang;\n }\n\n const checkbox =\n this.props.multiSelect &&\n this.objects[id] && (!this.props.types || this.props.types.includes(this.objects[id].type)) ?\n <Checkbox\n className={classes.checkBox}\n checked={this.state.selected.includes(id)}\n /> :\n null;\n\n let valueEditable = !this.props.notEditable && itemType === 'state' && (this.state.filter.expertMode || common?.write !== false);\n if (this.props.objectBrowserViewFile && common?.type === 'file') {\n valueEditable = true;\n }\n const enumEditable = !this.props.notEditable && this.objects[id] && (this.state.filter.expertMode || itemType === 'state' || itemType === 'channel' || itemType === 'device');\n const checkVisibleObjectType = this.state.statesView && (itemType === 'state' || itemType === 'channel' || itemType === 'device');\n let newValue = '';\n const newValueTitle = [];\n if (checkVisibleObjectType) {\n newValue = this.states[id]?.from;\n if (newValue === undefined) {\n newValue = '&nbsp;';\n } else {\n newValue = newValue ? newValue.replace(/^system\\.adapter\\.|^system\\./, '') : '';\n newValueTitle.push(`${this.texts.stateChangedFrom} ${newValue}`);\n }\n if (obj.user) {\n const user = obj.user.replace('system.user.', '');\n newValue += `/${user}`;\n newValueTitle.push(`${this.texts.stateChangedBy} ${user}`);\n }\n }\n if (obj) {\n obj.from && newValueTitle.push(`${this.texts.objectChangedFrom} ${obj.from.replace(/^system\\.adapter\\.|^system\\./, '')}`);\n obj.user && newValueTitle.push(`${this.texts.objectChangedBy} ${obj.user.replace(/^system\\.user\\./, '')}`);\n obj.ts && newValueTitle.push(`${this.texts.objectChangedByUser} ${Utils.formatDate(new Date(obj.ts), this.props.dateFormat)}`);\n }\n\n const readWriteAlias = typeof common?.alias?.id === 'object';\n\n const alias = id.startsWith('alias.') && common?.alias?.id ?\n (readWriteAlias ?\n <div className={classes.cellIdAliasReadWriteDiv}>\n {common.alias.id.read ? <div\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n this.onSelect(common.alias.id.read);\n setTimeout(() => {\n this.expandAllSelected(() =>\n this.scrollToItem(common.alias.id.read));\n }, 100);\n }}\n className={Utils.clsx(classes.cellIdAlias, classes.cellIdAliasReadWrite)}\n >\n ←\n {common.alias.id.read}\n </div> : null}\n {common.alias.id.write ? <div\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n this.onSelect(common.alias.id.write);\n setTimeout(() => {\n this.expandAllSelected(() =>\n this.scrollToItem(common.alias.id.write));\n }, 100);\n }}\n className={Utils.clsx(classes.cellIdAlias, classes.cellIdAliasReadWrite)}\n >\n →\n {common.alias.id.write}\n </div> : null}\n </div>\n :\n <div\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n this.onSelect(common.alias.id);\n setTimeout(() => {\n this.expandAllSelected(() =>\n this.scrollToItem(common.alias.id));\n }, 100);\n }}\n className={Utils.clsx(classes.cellIdAlias, classes.cellIdAliasAlone)}\n >\n →\n {common.alias.id}\n </div>\n ) : null;\n\n let checkColor = common?.color;\n let invertBackground = undefined;\n if (checkColor && !this.state.selected.includes(id)) {\n let background = this.props.themeName === 'dark' ? '#1f1f1f' : (this.props.themeName === 'blue' ? '#222a2e' : '#FFFFFF');\n const distance = Utils.colorDistance(checkColor, background);\n // console.log(`Distance: ${checkColor} - ${background} = ${distance}`);\n if (distance < 1000) {\n invertBackground = this.props.themeType === 'dark' ? '#9a9a9a' : '#565656';\n }\n }\n if (id === 'system') {\n checkColor = COLOR_NAME_SYSTEM;\n } else if (id === 'system.adapter') {\n checkColor = COLOR_NAME_SYSTEM_ADAPTER;\n } else\n if (!checkColor || this.state.selected.includes(id)) {\n checkColor = 'inherit';\n }\n\n const icons = [];\n\n if (common?.statusStates) {\n const ids = {};\n Object.keys(common.statusStates).forEach(name => {\n let _id = common.statusStates[name];\n if (_id.split('.').length < 3) {\n _id = `${id}.${_id}`;\n }\n ids[name] = _id;\n\n if (!this.states[_id]) {\n if (this.objects[_id]?.type === 'state') {\n !this.recordStates.includes(_id) && this.recordStates.push(_id);\n this.states[_id] = { val: null };\n this.subscribe(_id);\n }\n } else {\n !this.recordStates.includes(_id) && this.recordStates.push(_id);\n }\n });\n // calculate color\n // errorId has priority\n let colorSet = false;\n if (common.statusStates.errorId && this.states[ids.errorId] && this.states[ids.errorId].val) {\n checkColor = this.props.themeType === 'dark' ? COLOR_NAME_ERROR_DARK : COLOR_NAME_ERROR_LIGHT;\n colorSet = true;\n icons.push(<IconError key=\"error\" title={this.texts.deviceError} className={this.props.classes.iconDeviceError} />);\n }\n\n if (ids.onlineId && this.states[ids.onlineId] && this.states[ids.onlineId].val !== null) {\n if (!colorSet) {\n if (this.states[ids.onlineId].val) {\n checkColor = this.props.themeType === 'dark' ? COLOR_NAME_CONNECTED_DARK : COLOR_NAME_CONNECTED_LIGHT;\n icons.push(<IconConnection key=\"conn\" title={this.texts.deviceError} className={this.props.classes.iconDeviceConnected} />);\n } else {\n checkColor = this.props.themeType === 'dark' ? COLOR_NAME_DISCONNECTED_DARK : COLOR_NAME_DISCONNECTED_LIGHT;\n icons.push(<IconDisconnected key=\"disc\" title={this.texts.deviceError} className={this.props.classes.iconDeviceDisconnected} />);\n }\n } else if (this.states[ids.onlineId].val) {\n icons.push(<IconConnection key=\"conn\" title={this.texts.deviceError} className={this.props.classes.iconDeviceConnected} />);\n } else {\n icons.push(<IconDisconnected key=\"disc\" title={this.texts.deviceError} className={this.props.classes.iconDeviceDisconnected} />);\n }\n } else\n if (ids.offlineId && this.states[ids.offlineId] && this.states[ids.offlineId].val !== null) {\n if (!colorSet) {\n if (this.states[ids.offlineId].val) {\n checkColor = this.props.themeType === 'dark' ? COLOR_NAME_DISCONNECTED_DARK : COLOR_NAME_DISCONNECTED_LIGHT;\n icons.push(<IconDisconnected key=\"disc\" title={this.texts.deviceError} className={this.props.classes.iconDeviceDisconnected} />);\n } else {\n checkColor = this.props.themeType === 'dark' ? COLOR_NAME_CONNECTED_DARK : COLOR_NAME_CONNECTED_LIGHT;\n icons.push(<IconConnection key=\"conn\" title={this.texts.deviceError} className={this.props.classes.iconDeviceConnected} />);\n }\n } else if (this.states[ids.offlineId].val) {\n icons.push(<IconDisconnected key=\"disc\" title={this.texts.deviceError} className={this.props.classes.iconDeviceDisconnected} />);\n } else {\n icons.push(<IconConnection key=\"conn\" title={this.texts.deviceError} className={this.props.classes.iconDeviceConnected} />);\n }\n }\n }\n\n const q = checkVisibleObjectType ? Utils.quality2text(this.states[id]?.q || 0).join(', ') : null;\n\n return <Grid\n container\n direction=\"row\"\n wrap=\"nowrap\"\n className={Utils.clsx(\n classes.tableRow,\n this.state.linesEnabled && classes.tableRowLines,\n !this.props.dragEnabled && classes.tableRowNoDragging,\n alias && classes.tableRowAlias,\n readWriteAlias && classes.tableRowAliasReadWrite,\n !item.data.visible && classes.filteredOut,\n item.data.hasVisibleParent && !item.data.visible && !item.data.hasVisibleChildren && classes.filteredParentOut,\n this.state.selected.includes(id) && classes.itemSelected,\n this.state.selectedNonObject === id && classes.itemSelected,\n )}\n key={id}\n id={id}\n onClick={() => this.onSelect(id)}\n onDoubleClick={() => {\n if (!item.children) {\n this.onSelect(id, true);\n } else {\n this.toggleExpanded(id);\n }\n }}\n >\n <Grid\n container\n wrap=\"nowrap\"\n direction=\"row\"\n className={classes.cellId}\n style={{ width: this.columnsVisibility.id, paddingLeft }}\n >\n <Grid\n item\n container\n alignItems=\"center\"\n style={{\n // color: checkColor,\n // background: invertBackground,\n }}\n >\n {checkbox}\n {iconFolder}\n </Grid>\n <Grid\n item\n style={{ color: checkColor }}\n className={Utils.clsx(classes.cellIdSpan, invertBackground && classes.invertedBackground)}\n >\n <Tooltip title={getIdFieldTooltip(item.data, this.props.classes, this.props.lang)}><div>{item.data.name}</div></Tooltip>\n {alias}\n {icons}\n </Grid>\n <div className={Utils.clsx(classes.grow, invertBackground && classes.invertedBackgroundFlex)} />\n <Grid\n item\n container\n alignItems=\"center\"\n >\n {iconItem}\n </Grid>\n <div>\n <IconCopy className={Utils.clsx(classes.cellCopyButton, 'copyButton')} onClick={e => this.onCopy(e, id)} />\n </div>\n </Grid>\n\n {this.columnsVisibility.name ? <div className={classes.cellName} style={{ width: this.columnsVisibility.name }}>\n {(item.data?.title) || ''}\n {item.data?.title ? <div style={{ color: checkColor }}>\n <IconCopy className={Utils.clsx(classes.cellCopyButton, 'copyButton')} onClick={e => this.onCopy(e, item.data.title)} />\n </div> : null}\n </div> : null}\n\n {!this.state.statesView ?\n <>\n {this.columnsVisibility.type ? <div className={classes.cellType} style={{ width: this.columnsVisibility.type }}>\n {typeImg}\n &nbsp;\n {obj && obj.type}\n </div> : null}\n {this.columnsVisibility.role ? <div className={classes.cellRole} style={{ width: this.columnsVisibility.role, cursor: this.state.filter.expertMode && enumEditable && this.props.objectBrowserEditRole ? 'text' : 'default' }} onClick={this.state.filter.expertMode && enumEditable && this.props.objectBrowserEditRole ? () => this.setState({ roleDialog: item.data.id }) : undefined}>{common?.role}</div> : null}\n {this.columnsVisibility.room ? <div className={`${classes.cellRoom} ${item.data.per ? classes.cellEnumParent : ''}`} style={{ width: this.columnsVisibility.room, cursor: enumEditable ? 'text' : 'default' }} onClick={enumEditable ? () => { const enums = findEnumsForObjectAsIds(this.info, item.data.id, 'roomEnums'); this.setState({ enumDialogEnums: enums, enumDialog: { item, type: 'room', enumsOriginal: JSON.parse(JSON.stringify(enums)) } }); } : undefined}>{item.data.rooms}</div> : null}\n {this.columnsVisibility.func ? <div className={`${classes.cellFunc} ${item.data.pef ? classes.cellEnumParent : ''}`} style={{ width: this.columnsVisibility.func, cursor: enumEditable ? 'text' : 'default' }} onClick={enumEditable ? () => { const enums = findEnumsForObjectAsIds(this.info, item.data.id, 'funcEnums'); this.setState({ enumDialogEnums: enums, enumDialog: { item, type: 'func', enumsOriginal: JSON.parse(JSON.stringify(enums)) } }); } : undefined}>{item.data.funcs}</div> : null}\n </>\n :\n <>\n {this.columnsVisibility.changedFrom ? <div className={classes.cellRole} style={{ width: this.columnsVisibility.changedFrom }} title={newValueTitle.join('\\n')}>{checkVisibleObjectType && this.states[id]?.from ? newValue : null}</div> : null}\n {this.columnsVisibility.qualityCode ? <div className={classes.cellRole} style={{ width: this.columnsVisibility.qualityCode }} title={q || ''}>{q}</div> : null}\n {this.columnsVisibility.timestamp ? <div className={classes.cellRole} style={{ width: this.columnsVisibility.timestamp }}>{checkVisibleObjectType && this.states[id]?.ts ? Utils.formatDate(new Date(this.states[id].ts), this.props.dateFormat) : null}</div> : null}\n {this.columnsVisibility.lastChange ? <div className={classes.cellRole} style={{ width: this.columnsVisibility.lastChange }}>{checkVisibleObjectType && this.states[id]?.lc ? Utils.formatDate(new Date(this.states[id].lc), this.props.dateFormat) : null}</div> : null}\n </>}\n {this.adapterColumns.map(it => <div className={classes.cellAdapter} style={{ width: this.columnsVisibility[it.id] }} key={it.id} title={`${it.adapter} => ${it.pathText}`}>{this.renderCustomValue(obj, it, item)}</div>)}\n {this.columnsVisibility.val ? <div\n className={classes.cellValue}\n style={{ width: this.columnsVisibility.val, cursor: valueEditable ? (common?.type === 'file' ? 'zoom-in' : (item.data.button ? 'grab' : 'text')) : 'default' }}\n onClick={valueEditable ? () => {\n if (!obj || !this.states) {\n // return;\n } else\n if (common?.type === 'file') {\n this.setState({ viewFileDialog: id });\n } else\n // in non-expert mode control button directly\n if (!this.state.filter.expertMode && item.data.button) {\n this.props.socket.setState(id, true)\n .catch(e => window.alert(`Cannot write state \"${id}\": ${e}`));\n } else {\n this.edit = {\n val: this.states[id] ? this.states[id].val : '',\n q: this.states[id] ? this.states[id].q || 0 : 0,\n ack: false,\n id,\n };\n this.setState({ updateOpened: true });\n }\n } : undefined}\n >\n {this.renderColumnValue(id, item, classes)}\n </div> : null}\n {this.columnsVisibility.buttons ? <div className={classes.cellButtons} style={{ width: this.columnsVisibility.buttons }}>{this.renderColumnButtons(id, item, classes)}</div> : null}\n </Grid>;\n }\n\n /**\n * Renders an item.\n * @param {any} root\n * @param {boolean} isExpanded\n * @param {Record<string, any>} classes\n * @param {{ count: any; }} [counter]\n * @returns {JSX.Element[]}\n */\n renderItem(root, isExpanded, classes, counter) {\n const items = [];\n counter = counter || { count: 0 };\n let leaf = this.renderLeaf(root, isExpanded, classes, counter);\n const DragWrapper = this.props.DragWrapper;\n if (this.props.dragEnabled) {\n if (root.data.sumVisibility) {\n leaf = <DragWrapper key={root.data.id} item={root} className={classes.draggable}>{leaf}</DragWrapper>;\n } else {\n // change cursor\n leaf = <div key={root.data.id} className={classes.nonDraggable}>{leaf}</div>;\n }\n }\n root.data.id && items.push(leaf);\n\n isExpanded = isExpanded === undefined ? binarySearch(this.state.expanded, root.data.id) : isExpanded;\n if (!root.data.id || isExpanded) {\n if (!this.state.foldersFirst) {\n root.children && items.push(root.children.map(item => {\n // do not render too many items in column editor mode\n if (!this.state.columnsSelectorShow || counter.count < 15) {\n if (item.data.sumVisibility) {\n return this.renderItem(item, undefined, classes, counter);\n }\n }\n return null;\n }));\n } else {\n // first only folder\n root.children && items.push(root.children.map(item => {\n if (item.children) {\n // do not render too many items in column editor mode\n if (!this.state.columnsSelectorShow || counter.count < 15) {\n if (item.data.sumVisibility) {\n return this.renderItem(item, undefined, classes, counter);\n }\n }\n }\n\n return null;\n }));\n // then items\n root.children && items.push(root.children.map(item => {\n if (!item.children) {\n // do not render too many items in column editor mode\n if (!this.state.columnsSelectorShow || counter.count < 15) {\n if (item.data.sumVisibility) {\n return this.renderItem(item, undefined, classes, counter);\n }\n }\n }\n return null;\n }));\n }\n }\n\n return items;\n }\n\n /**\n * @private\n * @param {boolean} [columnsAuto]\n * @param {string[]} [columns]\n * @param {any} [columnsForAdmin]\n * @param {Record<string, number>} [columnsWidths]\n */\n calculateColumnsVisibility(columnsAuto, columns, columnsForAdmin, columnsWidths) {\n columnsWidths = columnsWidths || this.state.columnsWidths;\n columnsForAdmin = columnsForAdmin || this.state.columnsForAdmin;\n columns = columns || this.state.columns || [];\n columnsAuto = typeof columnsAuto !== 'boolean' ? this.state.columnsAuto : columnsAuto;\n\n columnsWidths = JSON.parse(JSON.stringify(columnsWidths));\n Object.keys(columnsWidths).forEach(name => {\n if (columnsWidths[name]) {\n columnsWidths[name] = parseInt(columnsWidths[name], 10) || 0;\n }\n });\n\n this.adapterColumns = [];\n const WIDTHS = SCREEN_WIDTHS[this.props.width].widths;\n\n if (columnsAuto) {\n this.columnsVisibility = {\n id: SCREEN_WIDTHS[this.props.width].idWidth,\n name: this.visibleCols.includes('name') ? WIDTHS.name || 0 : 0,\n nameHeader: this.visibleCols.includes('name') ? WIDTHS.name || 0 : 0,\n type: this.visibleCols.includes('type') ? WIDTHS.type || 0 : 0,\n role: this.visibleCols.includes('role') ? WIDTHS.role || 0 : 0,\n room: this.visibleCols.includes('room') ? WIDTHS.room || 0 : 0,\n func: this.visibleCols.includes('func') ? WIDTHS.func || 0 : 0,\n changedFrom: this.visibleCols.includes('changedFrom') ? WIDTHS.changedFrom || 0 : 0,\n qualityCode: this.visibleCols.includes('qualityCode') ? WIDTHS.qualityCode || 0 : 0,\n timestamp: this.visibleCols.includes('timestamp') ? WIDTHS.timestamp || 0 : 0,\n lastChange: this.visibleCols.includes('lastChange') ? WIDTHS.lastChange || 0 : 0,\n val: this.visibleCols.includes('val') ? WIDTHS.val || 0 : 0,\n buttons: this.visibleCols.includes('buttons') ? WIDTHS.buttons || 0 : 0,\n };\n\n if (this.columnsVisibility.name && !this.customWidth) {\n let widthSum = this.columnsVisibility.id; // id is always visible\n if (this.state.statesView) {\n widthSum += this.columnsVisibility.changedFrom;\n widthSum += this.columnsVisibility.qualityCode;\n widthSum += this.columnsVisibility.timestamp;\n widthSum += this.columnsVisibility.lastChange;\n } else {\n widthSum += this.columnsVisibility.type;\n widthSum += this.columnsVisibility.role;\n widthSum += this.columnsVisibility.room;\n widthSum += this.columnsVisibility.func;\n }\n widthSum += this.columnsVisibility.val;\n widthSum += this.columnsVisibility.buttons;\n this.columnsVisibility.name = `calc(100% - ${widthSum + 5}px)`;\n this.columnsVisibility.nameHeader = `calc(100% - ${widthSum + 5 + this.state.scrollBarWidth}px)`;\n } else if (!this.customWidth) {\n // Calculate the with of ID\n let widthSum = 0; // id is always visible\n if (this.state.statesView) {\n widthSum += this.columnsVisibility.changedFrom;\n widthSum += this.columnsVisibility.qualityCode;\n widthSum += this.columnsVisibility.timestamp;\n widthSum += this.columnsVisibility.lastChange;\n } else {\n widthSum += this.columnsVisibility.type;\n widthSum += this.columnsVisibility.role;\n widthSum += this.columnsVisibility.room;\n widthSum += this.columnsVisibility.func;\n }\n widthSum += this.columnsVisibility.val;\n widthSum += this.columnsVisibility.buttons;\n this.columnsVisibility.id = `calc(100% - ${widthSum + 5}px)`;\n }\n } else {\n this.columnsVisibility = {\n id: columnsWidths.id || SCREEN_WIDTHS[this.props.width].idWidth,\n name: columns.includes('name') ? columnsWidths.name || WIDTHS.name || SCREEN_WIDTHS[this.props.width].widths.name || 0 : 0,\n type: columns.includes('type') ? columnsWidths.type || WIDTHS.type || SCREEN_WIDTHS[this.props.width].widths.type || 0 : 0,\n role: columns.includes('role') ? columnsWidths.role || WIDTHS.role || SCREEN_WIDTHS[this.props.width].widths.role || 0 : 0,\n room: columns.includes('room') ? columnsWidths.room || WIDTHS.room || SCREEN_WIDTHS[this.props.width].widths.room || 0 : 0,\n func: columns.includes('func') ? columnsWidths.func || WIDTHS.func || SCREEN_WIDTHS[this.props.width].widths.func || 0 : 0,\n };\n let widthSum = this.columnsVisibility.id; // id is always visible\n if (this.columnsVisibility.name) {\n widthSum += this.columnsVisibility.type;\n widthSum += this.columnsVisibility.role;\n widthSum += this.columnsVisibility.room;\n widthSum += this.columnsVisibility.func;\n }\n\n if (columnsForAdmin && columns) {\n Object.keys(columnsForAdmin).sort().forEach(adapter =>\n columnsForAdmin[adapter].forEach(column => {\n const id = `_${adapter}_${column.path}`;\n this.columnsVisibility[id] = columns.includes(id);\n if (columns.includes(id)) {\n const item = {\n adapter,\n id: `_${adapter}_${column.path}`,\n name: column.name,\n path: column.path.split('.'),\n pathText: column.path,\n };\n if (column.edit) {\n item.edit = true;\n if (column.type) {\n item.type = column.type;\n }\n if (column.objTypes) {\n item.objTypes = column.objTypes;\n }\n }\n\n this.adapterColumns.push(item);\n this.columnsVisibility[id] = columnsWidths[item.id] || column.width || SCREEN_WIDTHS[this.props.width].widths.func || SCREEN_WIDTHS.xl.widths.func;\n widthSum += this.columnsVisibility[id];\n } else {\n this.columnsVisibility[id] = 0;\n }\n }));\n }\n this.adapterColumns.sort((a, b) => (a.id > b.id ? -1 : (a.id < b.id ? 1 : 0)));\n this.columnsVisibility.val = columns.includes('val') ? columnsWidths.val || WIDTHS.val || SCREEN_WIDTHS.xl.widths.val : 0;\n\n // do not show buttons if not desired\n if (!this.props.columns || this.props.columns.includes('buttons')) {\n this.columnsVisibility.buttons = columns.includes('buttons') ? columnsWidths.buttons || WIDTHS.buttons || SCREEN_WIDTHS.xl.widths.buttons : 0;\n widthSum += this.columnsVisibility.buttons;\n }\n\n if (this.columnsVisibility.name && !columnsWidths.name) {\n widthSum += this.columnsVisibility.val;\n this.columnsVisibility.name = `calc(100% - ${widthSum}px)`;\n this.columnsVisibility.nameHeader = `calc(100% - ${widthSum + 5 + this.state.scrollBarWidth}px)`;\n } else {\n const newWidth = Object.keys(this.columnsVisibility).reduce(\n (accumulator, name) => {\n if (name === 'id' || typeof this.columnsVisibility[name] === 'string' || !this.columnsVisibility[name]) {\n return accumulator;\n }\n return accumulator + this.columnsVisibility[name];\n },\n 0,\n );\n this.columnsVisibility.id = `calc(100% - ${newWidth}px)`;\n }\n }\n }\n\n resizerMouseMove = e => {\n if (this.resizerActiveDiv) {\n let width;\n let widthNext;\n if (this.resizeLeft) {\n width = this.resizerOldWidth - e.clientX + this.resizerPosition;\n widthNext = this.resizerOldWidthNext + e.clientX - this.resizerPosition;\n } else {\n width = this.resizerOldWidth + e.clientX - this.resizerPosition;\n widthNext = this.resizerOldWidthNext - e.clientX + this.resizerPosition;\n }\n\n if ((!this.resizerMin || width > this.resizerMin) &&\n (!this.resizerNextMin || widthNext > this.resizerNextMin)) {\n this.resizerCurrentWidths[this.resizerActiveName] = width;\n this.resizerCurrentWidths[this.resizerNextName] = widthNext;\n\n this.resizerActiveDiv.style.width = `${width}px`;\n this.resizerNextDiv.style.width = `${widthNext}px`;\n\n this.columnsVisibility[this.resizerActiveName] = width;\n this.columnsVisibility[this.resizerNextName] = widthNext;\n if (this.resizerNextName === 'nameHeader') {\n this.columnsVisibility.name = widthNext - this.state.scrollBarWidth;\n this.resizerCurrentWidths.name = widthNext - this.state.scrollBarWidth;\n } else\n if (this.resizerActiveName === 'nameHeader') {\n this.columnsVisibility.name = width - this.state.scrollBarWidth;\n this.resizerCurrentWidths.name = width - this.state.scrollBarWidth;\n }\n this.customWidth = true;\n this.resizeTimeout && clearTimeout(this.resizeTimeout);\n this.resizeTimeout = setTimeout(() => {\n this.resizeTimeout = null;\n this.forceUpdate();\n }, 200);\n }\n }\n };\n\n resizerMouseUp = () => {\n (window._localStorage || window.localStorage).setItem(`${this.props.dialogName || 'App'}.table`, JSON.stringify(this.resizerCurrentWidths));\n this.resizerActiveName = null;\n this.resizerNextName = null;\n this.resizerActiveDiv = null;\n this.resizerNextDiv = null;\n window.removeEventListener('mousemove', this.resizerMouseMove);\n window.removeEventListener('mouseup', this.resizerMouseUp);\n };\n\n resizerMouseDown = e => {\n if (this.resizerActiveIndex === null || this.resizerActiveIndex === undefined) {\n if (!this.storedWidths) {\n this.storedWidths = JSON.parse(JSON.stringify(SCREEN_WIDTHS[this.props.width]));\n }\n\n this.resizerCurrentWidths = this.resizerCurrentWidths || {};\n this.resizerActiveDiv = e.target.parentNode;\n this.resizerActiveName = this.resizerActiveDiv.dataset.name;\n\n let i = 0;\n if (e.target.dataset.left === 'true') {\n this.resizeLeft = true;\n this.resizerNextDiv = this.resizerActiveDiv.previousElementSibling;\n let handle = this.resizerNextDiv.querySelector(`.${this.props.classes.resizeHandle}`);\n while (this.resizerNextDiv && !handle && i < 10) {\n this.resizerNextDiv = this.resizerNextDiv.previousElementSibling;\n handle = this.resizerNextDiv.querySelector(`.${this.props.classes.resizeHandle}`);\n i++;\n }\n if (handle && handle.dataset.left !== 'true') {\n this.resizerNextDiv = this.resizerNextDiv.nextElementSibling;\n }\n } else {\n this.resizeLeft = false;\n this.resizerNextDiv = this.resizerActiveDiv.nextElementSibling;\n /* while (this.resizerNextDiv && !this.resizerNextDiv.querySelector('.' + this.props.classes.resizeHandle) && i < 10) {\n this.resizerNextDiv = this.resizerNextDiv.nextElementSibling;\n i++;\n } */\n }\n this.resizerNextName = this.resizerNextDiv.dataset.name;\n\n this.resizerMin = parseInt(this.resizerActiveDiv.dataset.min, 10) || 0;\n this.resizerNextMin = parseInt(this.resizerNextDiv.dataset.min, 10) || 0;\n\n this.resizerPosition = e.clientX;\n\n this.resizerCurrentWidths[this.resizerActiveName] = this.resizerActiveDiv.offsetWidth;\n this.resizerCurrentWidths[this.resizerNextName] = this.resizerNextDiv.offsetWidth;\n\n this.resizerOldWidth = this.resizerCurrentWidths[this.resizerActiveName];\n this.resizerOldWidthNext = this.resizerCurrentWidths[this.resizerNextName];\n\n window.addEventListener('mousemove', this.resizerMouseMove);\n window.addEventListener('mouseup', this.resizerMouseUp);\n }\n };\n\n resizerReset = () => {\n this.customWidth = false;\n SCREEN_WIDTHS[this.props.width] = JSON.parse(JSON.stringify(this.storedWidths));\n this.calculateColumnsVisibility();\n (window._localStorage || window.localStorage).removeItem(`${this.props.dialogName || 'App'}.table`);\n this.forceUpdate();\n };\n\n /**\n * @private\n * @returns {JSX.Element}\n */\n renderHeader() {\n const classes = this.props.classes;\n\n let filterClearInValue = null;\n if (!this.columnsVisibility.buttons && !this.isFilterEmpty()) {\n filterClearInValue = <IconButton\n onClick={() => this.clearFilter()}\n className={classes.buttonClearFilter}\n title={this.props.t('ra_Clear filter')}\n size=\"large\"\n >\n <IconClearFilter />\n <IconClose className={classes.buttonClearFilterIcon} />\n </IconButton>;\n }\n\n return <div className={classes.headerRow}>\n <div className={classes.headerCell} style={{ width: this.columnsVisibility.id, position: 'relative' }} data-min={240} data-name=\"id\">\n {this.getFilterInput('id')}\n <div className={`${this.props.classes.resizeHandle} ${this.props.classes.resizeHandleRight}`} onMouseDown={this.resizerMouseDown} onDoubleClick={this.resizerReset} title={this.props.t('ra_Double click to reset table layout')} />\n </div>\n {this.columnsVisibility.name ? <div className={classes.headerCell} style={{ width: this.columnsVisibility.nameHeader }} data-min={100} data-name=\"nameHeader\">{this.getFilterInput('name')}</div> : null}\n {!this.state.statesView && <>\n {this.columnsVisibility.type ? <div className={classes.headerCell} style={{ width: this.columnsVisibility.type }} data-min={100} data-name=\"type\">{this.getFilterSelectType()}</div> : null}\n {this.columnsVisibility.role ? <div className={classes.headerCell} style={{ width: this.columnsVisibility.role }} data-min={100} data-name=\"role\">{this.getFilterSelectRole()}</div> : null}\n {this.columnsVisibility.room ? <div className={classes.headerCell} style={{ width: this.columnsVisibility.room }} data-min={100} data-name=\"room\">{this.getFilterSelectRoom()}</div> : null}\n {this.columnsVisibility.func ? <div className={classes.headerCell} style={{ width: this.columnsVisibility.func }} data-min={100} data-name=\"func\">{this.getFilterSelectFunction()}</div> : null}\n </>}\n {this.state.statesView && <>\n <div className={Utils.clsx(classes.headerCell, classes.headerCellValue)} style={{ width: this.columnsVisibility.changedFrom }} data-min={100} data-name=\"changedFrom\">{this.props.t('ra_Changed from')}</div>\n <div className={Utils.clsx(classes.headerCell, classes.headerCellValue)} style={{ width: this.columnsVisibility.qualityCode }} data-min={100} data-name=\"qualityCode\">{this.props.t('ra_Quality code')}</div>\n <div className={Utils.clsx(classes.headerCell, classes.headerCellValue)} style={{ width: this.columnsVisibility.timestamp }} data-min={100} data-name=\"timestamp\">{this.props.t('ra_Timestamp')}</div>\n <div className={Utils.clsx(classes.headerCell, classes.headerCellValue)} style={{ width: this.columnsVisibility.lastChange }} data-min={100} data-name=\"lastChange\">{this.props.t('ra_Last change')}</div>\n </>}\n {this.adapterColumns.map(item => <div className={Utils.clsx(classes.headerCell, classes.headerCellValue)} style={{ width: this.columnsVisibility[item.id] }} title={item.adapter} key={item.id} data-min={100} data-name={item.id}>{item.name}</div>)}\n {this.columnsVisibility.val ? <div className={Utils.clsx(classes.headerCell, classes.headerCellValue)} style={{ width: this.columnsVisibility.val, position: 'relative' }} data-min={120} data-name=\"val\">\n <div className={`${this.props.classes.resizeHandle} ${this.props.classes.resizeHandleLeft}`} data-left=\"true\" onMouseDown={this.resizerMouseDown} onDoubleClick={this.resizerReset} title={this.props.t('ra_Double click to reset table layout')} />\n {this.props.t('ra_Value')}\n {filterClearInValue}\n </div> : null}\n {this.columnsVisibility.buttons ? <div className={classes.headerCell} style={{ width: this.columnsVisibility.buttons }}>\n {' '}\n {this.getFilterSelectCustoms()}\n </div> : null}\n </div>;\n }\n\n /**\n * @private\n * @returns {JSX.Element}\n */\n renderToast() {\n return <Snackbar\n open={!!this.state.toast}\n autoHideDuration={3000}\n onClick={() => this.setState({ toast: '' })}\n onClose={() => this.setState({ toast: '' })}\n message={this.state.toast}\n action={\n <IconButton size=\"small\" aria-label=\"close\" color=\"inherit\" onClick={() => this.setState({ toast: '' })}>\n <IconClose fontSize=\"small\" />\n </IconButton>\n }\n />;\n }\n\n /**\n * Called when component is updated.\n */\n componentDidUpdate() {\n if (this.tableRef.current) {\n const scrollBarWidth = this.tableRef.current.offsetWidth - this.tableRef.current.clientWidth;\n if (this.state.scrollBarWidth !== scrollBarWidth) {\n setTimeout(() => this.setState({ scrollBarWidth }), 100);\n } else if (!this.selectedFound && ((this.state.selected && this.state.selected[0]) || this.lastSelectedItems)) {\n this.scrollToItem((this.state.selected && this.state.selected[0]) || this.lastSelectedItems);\n }\n }\n }\n\n scrollToItem(id) {\n const node = window.document.getElementById(id);\n node && node.scrollIntoView({\n behavior: 'auto',\n block: 'center',\n inline: 'center',\n });\n this.selectedFound = true;\n }\n\n /**\n * @private\n * @returns {JSX.Element | null}\n */\n renderCustomDialog() {\n if (this.state.customDialog && this.props.objectCustomDialog) {\n const ObjectCustomDialog = this.props.objectCustomDialog;\n\n return <ObjectCustomDialog\n reportChangedIds={changedIds => this.changedIds = [...changedIds]}\n objectIDs={this.state.customDialog}\n expertMode={this.state.filter.expertMode}\n isFloatComma={this.props.isFloatComma}\n t={this.props.t}\n lang={this.props.lang}\n socket={this.props.socket}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n objects={this.objects}\n customsInstances={this.info.customs}\n onClose={() => {\n this.pauseSubscribe(false);\n this.setState({ customDialog: null });\n if (this.changedIds) {\n this.changedIds = null;\n // update all changed IDs\n this.forceUpdate();\n }\n\n this.props.router && this.props.router.doNavigate('tab-objects');\n }}\n />;\n }\n return null;\n }\n\n /**\n * @private\n * @param {Partial<ioBroker.State>} valAck\n */\n onUpdate(valAck) {\n this.props.socket.setState(this.edit.id, {\n val: valAck.val, ack: valAck.ack, q: valAck.q || 0, expire: valAck.expire || undefined,\n })\n .catch(e => this.showError(`Cannot write value: ${e}`));\n }\n\n /**\n * @private\n * @returns {JSX.Element | null}\n */\n renderEditObjectDialog() {\n if (!this.state.editObjectDialog || !this.props.objectBrowserEditObject) {\n return null;\n }\n\n const ObjectBrowserEditObject = this.props.objectBrowserEditObject;\n\n return <ObjectBrowserEditObject\n key={this.state.editObjectDialog}\n obj={this.objects[this.state.editObjectDialog]}\n roleArray={this.info.roles}\n objects={this.objects}\n dateFormat={this.props.dateFormat}\n isFloatComma={this.props.isFloatComma}\n themeName={this.props.themeName}\n socket={this.props.socket}\n dialogName={this.props.dialogName}\n t={this.props.t}\n expertMode={this.state.filter.expertMode}\n onNewObject={obj =>\n this.props.socket.setObject(obj._id, obj)\n .then(() => this.setState({ editObjectDialog: obj._id }, () => this.onSelect(obj._id)))\n .catch(e => this.showError(`Cannot write object: ${e}`))}\n onClose={obj => {\n if (obj) {\n let updateAlias;\n if (this.state.editObjectDialog.startsWith('alias.')) {\n if (JSON.stringify(this.objects[this.state.editObjectDialog].common?.alias) !== JSON.stringify(obj.common?.alias)) {\n updateAlias = this.state.editObjectDialog;\n }\n }\n\n this.props.socket.setObject(obj._id, obj)\n .then(() => {\n if (updateAlias && this.subscribes.includes(updateAlias)) {\n this.unsubscribe(updateAlias);\n setTimeout(() => this.subscribe(updateAlias), 100);\n }\n })\n .catch(e => this.showError(`Cannot write object: ${e}`));\n }\n this.setState({ editObjectDialog: '' });\n }}\n />;\n }\n\n /**\n * @private\n * @returns {JSX.Element | null}\n */\n renderViewObjectFileDialog() {\n if (!this.state.viewFileDialog || !this.props.objectBrowserViewFile) {\n return null;\n }\n const ObjectBrowserViewFile = this.props.objectBrowserViewFile;\n\n return <ObjectBrowserViewFile\n key=\"viewFile\"\n obj={this.objects[this.state.viewFileDialog]}\n themeType={this.props.themeType}\n socket={this.props.socket}\n dialogName={this.props.dialogName}\n t={this.props.t}\n expertMode={this.state.filter.expertMode}\n onClose={() => this.setState({ viewFileDialog: '' })}\n />;\n }\n\n /**\n * @private\n * @returns {JSX.Element | null}\n */\n renderEditValueDialog() {\n if (!this.state.updateOpened || !this.props.objectBrowserValue) {\n return null;\n }\n\n if (!this.edit.id) {\n console.error(`Invalid ID for edit: ${JSON.stringify(this.edit)}`);\n return null;\n }\n\n if (!this.objects[this.edit.id]) {\n console.error(`Something went wrong. Possibly the object ${this.edit.id} was deleted.`);\n return null;\n }\n\n const type = this.objects[this.edit.id].common?.type ?\n this.objects[this.edit.id].common.type : typeof this.edit.val;\n\n const ObjectBrowserValue = this.props.objectBrowserValue;\n\n return <ObjectBrowserValue\n t={this.props.t}\n lang={this.props.lang}\n type={type}\n states={Utils.getStates(this.objects[this.edit.id])}\n themeType={this.props.themeType}\n expertMode={this.state.filter.expertMode}\n value={this.edit.val}\n socket={this.props.socket}\n object={this.objects[this.edit.id]}\n defaultHistory={this.defaultHistory}\n dateFormat={this.props.dateFormat}\n onClose={res => {\n this.setState({ updateOpened: false });\n res && this.onUpdate(res);\n }}\n />;\n }\n\n extendObject = (id, data) =>\n this.props.socket.extendObject(id, data)\n .catch(error => window.alert(error));\n\n setObject = (id, data) =>\n this.props.socket.setObject(id, data)\n .catch(error => window.alert(error));\n\n /**\n * The rendering method of this component.\n * @returns {JSX.Element}\n */\n render() {\n this.recordStates = [];\n this.unsubscribeTimer && clearTimeout(this.unsubscribeTimer);\n\n // apply filter if changed\n const jsonFilter = JSON.stringify(this.state.filter);\n\n if (this.lastAppliedFilter !== jsonFilter && this.objects && this.root) {\n const counter = { count: 0 };\n\n applyFilter(this.root, this.state.filter, this.state.lang, this.objects, null, counter, this.props.customFilter, this.props.types);\n\n if (counter.count < 500 && !this.state.expandAllVisible) {\n setTimeout(() => this.setState({ expandAllVisible: true }));\n } else if (counter.count >= 500 && this.state.expandAllVisible) {\n setTimeout(() => this.setState({ expandAllVisible: false }));\n }\n\n this.lastAppliedFilter = jsonFilter;\n }\n\n this.unsubscribeTimer = setTimeout(() => {\n this.unsubscribeTimer = null;\n this.checkUnsubscribes();\n }, 200);\n\n if (!this.state.loaded) {\n return <CircularProgress key={`${this.props.dialogName}_c`} />;\n }\n const classes = this.props.classes;\n const items = this.renderItem(this.root, undefined, classes);\n\n return <TabContainer key={this.props.dialogName} classes={{ }}>\n <TabHeader>\n {this.getToolbar()}\n </TabHeader>\n <TabContent classes={{ }}>\n {this.renderHeader()}\n <div className={this.props.classes.tableDiv} ref={this.tableRef}>\n {items}\n </div>\n </TabContent>\n {this.renderToast()}\n {this.renderColumnsEditCustomDialog()}\n {this.renderColumnsSelectorDialog()}\n {this.renderCustomDialog()}\n {this.renderEditValueDialog()}\n {this.renderEditObjectDialog()}\n {this.renderViewObjectFileDialog()}\n {this.renderEditRoleDialog()}\n {this.renderEnumDialog()}\n {this.renderErrorDialog()}\n {this.renderExportDialog()}\n {this.state.modalNewObj && this.props.modalNewObject && this.props.modalNewObject(this)}\n {this.state.modalEditOfAccess && this.props.modalEditOfAccessControl && this.props.modalEditOfAccessControl(this, this.state.modalEditOfAccessObjData)}\n </TabContainer>;\n }\n}\n\nObjectBrowser.defaultProps = {\n objectAddBoolean: false,\n objectEditBoolean: false,\n objectStatesView: false,\n objectImportExport: false,\n objectEditOfAccessControl: false,\n modalNewObject: () => { },\n modalEditOfAccessControl: () => { },\n};\n\nObjectBrowser.propTypes = {\n dialogName: PropTypes.string, // where to store settings in localStorage\n classes: PropTypes.object,\n defaultFilters: PropTypes.object,\n selected: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.array,\n ]),\n onSelect: PropTypes.func,\n onFilterChanged: PropTypes.func,\n socket: PropTypes.object,\n showExpertButton: PropTypes.bool,\n expertMode: PropTypes.bool,\n imagePrefix: PropTypes.string,\n themeName: PropTypes.string,\n themeType: PropTypes.string,\n theme: PropTypes.object,\n t: PropTypes.func,\n lang: PropTypes.string.isRequired,\n multiSelect: PropTypes.bool,\n notEditable: PropTypes.bool,\n foldersFirst: PropTypes.bool,\n disableColumnSelector: PropTypes.bool,\n isFloatComma: PropTypes.bool,\n dateFormat: PropTypes.string,\n levelPadding: PropTypes.number,\n\n // components\n objectCustomDialog: PropTypes.oneOfType([\n PropTypes.object,\n PropTypes.func,\n ]),\n objectAddBoolean: PropTypes.bool, // optional toolbar button\n objectEditBoolean: PropTypes.bool, // optional toolbar button\n objectStatesView: PropTypes.bool, // optional toolbar button\n objectImportExport: PropTypes.bool, // optional toolbar button\n objectEditOfAccessControl: PropTypes.bool, // Access Control\n modalNewObject: PropTypes.func, // modal add object\n modalEditOfAccessControl: PropTypes.func, // modal Edit Of Access Control\n onObjectDelete: PropTypes.func, // optional function (id, hasChildren, objectExists, childrenCount+1) { }\n customFilter: PropTypes.object, // optional\n // `{common: {custom: true}}` - show only objects with some custom settings\n // `{common: {custom: 'sql.0'}}` - show only objects with sql.0 custom settings (only of the specific instance)\n // `{common: {custom: '_dataSources'}}` - show only objects of adapters `influxdb' or 'sql' or 'history'\n // `{common: {custom: 'adapterName.'}}` - show only objects of custom settings of specific adapter (all instances)\n // `{type: 'channel'}` - show only channels\n // `{type: ['channel', 'device']}` - show only channels and devices\n // `{common: {type: 'number'}` - show only states of type 'number\n // `{common: {type: ['number', 'string']}` - show only states of type 'number and string\n // `{common: {role: 'switch']}` - show only states with roles starting from switch\n // `{common: {role: ['switch', 'button]}` - show only states with roles starting from `switch` and `button`\n objectBrowserValue: PropTypes.object,\n objectBrowserEditObject: PropTypes.object,\n objectBrowserEditRole: PropTypes.object, // on Edit role\n objectBrowserViewFile: PropTypes.func, // on view file state\n router: PropTypes.oneOfType([\n PropTypes.object,\n PropTypes.func,\n ]),\n types: PropTypes.array, // optional ['state', 'instance', 'channel']\n columns: PropTypes.array, // optional ['name', 'type', 'role', 'room', 'func', 'val', 'buttons']\n\n objectsWorker: PropTypes.object, // optional cache of objects\n filterFunc: PropTypes.func, // function to filter out all unnecessary objects. It cannot be used together with \"types\"\n // Example for function: `obj => obj.common && obj.common.type === 'boolean'` to show only boolean states\n\n dragSettings: PropTypes.object,\n DragWrapper: PropTypes.func,\n dragEnabled: PropTypes.bool,\n useDrag: PropTypes.func,\n};\n\n/** @type {typeof ObjectBrowser} */\nconst _export = withWidth()(withStyles(styles)(ObjectBrowser));\nexport default _export;\n"],"sourceRoot":""}