iobroker.admin 5.4.7 → 5.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/io-package.json +13 -13
- package/package.json +1 -1
- package/www-react/asset-manifest.json +9 -9
- package/www-react/index.html +1 -1
- package/www-react/static/js/{3.c50e5980.chunk.js → 3.b8a6b63b.chunk.js} +2 -2
- package/www-react/static/js/3.b8a6b63b.chunk.js.map +1 -0
- package/www-react/static/js/{main.288467e0.chunk.js → main.782985c1.chunk.js} +3 -3
- package/www-react/static/js/{main.288467e0.chunk.js.LICENSE.txt → main.782985c1.chunk.js.LICENSE.txt} +0 -0
- package/www-react/static/js/{main.288467e0.chunk.js.map → main.782985c1.chunk.js.map} +1 -1
- package/www-react/static/js/{runtime-main.453d8ff8.js → runtime-main.85c5a265.js} +2 -2
- package/www-react/static/js/{runtime-main.453d8ff8.js.map → runtime-main.85c5a265.js.map} +1 -1
- package/www-react/static/js/3.c50e5980.chunk.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["components/ObjectBrowser.js","assets/echarts.png"],"names":["ICON_SIZE","ROW_HEIGHT","SMALL_BUTTON_SIZE","COLOR_NAME_ERROR_DARK","COLOR_NAME_ERROR_LIGHT","COLOR_NAME_CONNECTED_DARK","COLOR_NAME_CONNECTED_LIGHT","COLOR_NAME_DISCONNECTED_DARK","COLOR_NAME_DISCONNECTED_LIGHT","generateFile","filename","obj","el","document","createElement","setAttribute","encodeURIComponent","JSON","stringify","style","display","body","appendChild","click","removeChild","binarySearch","list","find","_start","_end","undefined","length","middle","Math","floor","applyFilter","item","filters","lang","objects","context","counter","customFilter","selectedTypes","filteredOut","id","toLowerCase","name","type","custom","role","room","common","members","func","data","expertMode","startsWith","expert","fID","indexOf","fName","getName","includes","visible","hasVisibleChildren","children","forEach","_item","sumVisibility","hasVisibleParent","count","getVisibleItems","_result","push","getSystemIcon","k","imagePrefix","icon","className","endsWith","getSelectIdIcon","buildTree","options","ids","Object","keys","sort","a","b","replace","currentPathArr","currentPath","currentPathLen","root","info","funcEnums","roomEnums","roles","types","customs","enums","hasSomeCustoms","croot","i","parts","split","supportCustoms","adminUI","substring","repeat","curPath","_croot","parent","level","generated","title","hasCustoms","button","write","u","move","splice","join","aName","pop","bName","findNode","_parts","_path","_level","found","_id","en","toString","findRoomsForObject","withParentInfo","rooms","per","origin","ownEnums","findEnumsForObjectAsIds","enumName","funcs","findFunctionsForObject","pef","src","_id_","aIcon","width","height","cIcon","instance","prepareSparkData","values","from","time","v","ts","val","DEFAULT_FILTER","ITEM_IMAGES","state","channel","device","adapter","meta","color","enum","chart","config","group","user","host","schedule","script","folder","StyledBadge","withStyles","theme","badge","right","top","border","palette","background","paper","padding","Badge","SCREEN_WIDTHS","xs","idWidth","fields","widths","sm","md","buttons","lg","changedFrom","qualityCode","timestamp","lastChange","xl","objectsAlreadyLoaded","ObjectBrowser","props","onStateChange","console","log","states","findItem","pausedSubscribes","statesUpdateTimer","clearTimeout","setTimeout","forceUpdate","onObjectChange","oldObj","newState","Array","isArray","event","filterFunc","columnsForAdmin","parse","parseObjectForAdmins","setState","objectsUpdateTimer","lastAppliedFilter","getEnumsForId","result","native","mobile","_createAllEnums","objId","e","_enObj","enObj","socket","setObject","loadObjects","objs","hasOwnProperty","getState","def","window","alert","handleJsonUpload","evt","f","target","files","r","FileReader","onload","contents","json","len","t","readAsText","toolTipObjectCreating","value","selected","selectedNonObject","renderTooltipAccessControl","acl","check","valueNum","arrayTooltipText","funcRenderStateObject","rights","texts","classes","rightsObject","rightsState","ownerGroup","ownerUser","owner","tooltipAccessControl","map","extendObject","catch","error","lastSelectedItems","localStorage","getItem","dialogName","filter","expanded","defaultFilters","assign","sessionStorage","tableRef","createRef","filterRefs","selectedFound","subscribes","visibleCols","columns","pos","possibleCols","customDialog","router","location","getLocation","dialog","pauseSubscribe","columnsWidths","foldersFirst","statesView","objectStatesView","loaded","filterKey","depth","expandAllVisible","toast","scrollBarWidth","editObjectDialog","viewFileDialog","enumDialog","roleDialog","modalEmptyId","columnsSelectorShow","columnsAuto","columnsDialogTransparent","columnsEditCustomDialog","customColumnDialogValueChanged","showExportDialog","linesEnabled","edit","ack","lc","quality","editObject","deleteObject","customConfig","copyState","editState","close","filter_id","filter_name","filter_type","filter_role","filter_room","filter_func","filter_custom","objectChangedByUser","objectChangedBy","objectChangedFrom","stateChangedBy","stateChangedFrom","deviceError","deviceDisconnected","deviceConnected","aclOwner_read_object","aclOwner_read_state","aclOwner_write_object","aclOwner_write_state","aclGroup_read_object","aclGroup_read_state","aclGroup_write_object","aclGroup_write_state","aclEveryone_read_object","aclEveryone_read_state","aclEveryone_write_object","aclEveryone_write_state","levelPadding","calculateColumnsVisibility","update","this","Promise","resolve","updating","then","objectsWorker","getObjects","systemConfig","defaultNewAcl","object","defaultHistory","getAdditionalColumns","node","expandAllSelected","onAfterSelect","showError","cb","changed","path","setItem","isDouble","Utils","getObjectName","language","onSelect","loadAllObjects","registerHandler","subscribeObject","unregisterHandler","unsubscribeObject","pattern","unsubscribeState","open","maxWidth","fullWidth","onClose","variant","onClick","autoFocus","startIcon","toggleItem","multiSelect","removeItem","isLast","cols","unshift","edge","disabled","checked","disableRipple","primary","columnsDialogInputWidth","marginTop","marginBottom","margin","underline","placeholder","onChange","autoComplete","clsx","dialogColumns","fontSizeTitle","switchColumnAuto","control","label","dialogColumnsLabel","width100","min","max","step","newValue","_renderDefinedList","column","getAdapters","instances","recordStates","unsubscribe","_root","_partyId","shift","adminColumns","objTypes","warn","subscribeState","isPause","filterTimer","current","tagName","onFilterChanged","childNodes","attr","headerCellInput","filterInput","ref","defaultValue","onFilter","firstChild","position","size","hasIcons","inputProps","displayEmpty","selectNone","headerCellSelectItem","selectClearButton","newFilter","getFilterSelect","selectIcon","onExpandAll","expandDepth","collapseDepth","idDot","idLen","key","isAll","_getSelectedIdsForExport","_exportObjects","allowObjectCreation","alignItems","refreshComponent","showExpertButton","disableColumnSelector","onCollapseAll","onExpandVisible","badgeContent","onCollapseVisible","onStatesViewVisible","objectAddBoolean","modalNewObj","objectImportExport","input","addEventListener","transform","objectBrowserEditObject","whiteSpace","objectEditBoolean","doNavigate","text","stopPropagation","preventDefault","copy","onObjectDelete","objectEditOfAccessControl","buttonDiv","cellButtonsButton","cellButtonsEmptyButton","cellButtonMinWidth","modalEditOfAccess","modalEditOfAccessObjData","cellButtonsButtonAlone","cellButtonsButtonIcon","aclTooltip","aclSystemConfig","aclText","isNaN","Number","dontDelete","objectCustomDialog","cellButtonsButtonWithCustoms","sparkline","now","Date","setHours","getHours","setMinutes","setSeconds","setMilliseconds","nowMs","getTime","getHistory","start","end","q","addID","aggregate","sparks","getElementsByClassName","s","dataset","cellValueText","cellValueFile","subscribe","dateFormat","isFloatComma","valFull","getStates","isCommon","valText","match","parseInt","round","unit","formatDate","quality2text","nbr","formatValue","cellValueTooltipBoth","cellValueTooltipTitle","cellValueTooltipValue","fill","strokeWidth","copyText","cellValueTextUnit","cellValueTextState","cellButtonsValueButton","cellButtonsValueButtonCopy","onCopy","cellValueButton","cellValueButtonFalse","tooltip","cellValueTooltip","popper","cellValueTooltipBox","onOpen","readHistory","enumIds","newArray","enumId","promises","all","_syncEnum","toCheck","itemEnums","enumDialogEnums","enumsOriginal","enumIconDiv","enumIcon","alt","enumButton","syncEnum","enumList","labelId","enumCheckbox","tabIndex","objectBrowserEditRole","ObjectBrowserEditRole","isSave","customColumnDialog","parseFloat","getObject","setCustomValue","it","Error","getCustomValue","initValue","onKeyUp","keyCode","onColumnsEditCustomDialogClose","defaultChecked","pathText","p","notEditable","columnCustom","align","columnCustomEditable","isExpanded","iconFolder","itemType","cellIdIconFolder","toggleExpanded","cellIdIconDocument","iconItem","cellIdIconOwn","typeImg","paddingLeft","checkbox","checkBox","valueEditable","objectBrowserViewFile","enumEditable","checkVisibleObjectType","newValueTitle","readWriteAlias","alias","cellIdAliasReadWriteDiv","read","scrollToItem","cellIdAlias","cellIdAliasReadWrite","cellIdAliasAlone","checkColor","invertBackground","invertColor","icons","statusStates","colorSet","errorId","themeType","iconDeviceError","onlineId","iconDeviceConnected","iconDeviceDisconnected","offlineId","container","direction","wrap","tableRow","tableRowLines","dragEnabled","tableRowNoDragging","tableRowAlias","tableRowAliasReadWrite","filteredParentOut","itemSelected","onDoubleClick","cellId","columnsVisibility","cellIdSpan","grow","cellCopyButton","cellName","cellRole","cellType","cursor","cellRoom","cellEnumParent","cellFunc","adapterColumns","cellAdapter","renderCustomValue","cellValue","updateOpened","renderColumnValue","cellButtons","renderColumnButtons","items","leaf","renderLeaf","DragWrapper","draggable","nonDraggable","renderItem","WIDTHS","widthSum","nameHeader","newWidth","reduce","accumulator","filterClearInValue","isFilterEmpty","clearFilter","buttonClearFilter","buttonClearFilterIcon","headerRow","headerCell","getFilterInput","getFilterSelectType","getFilterSelectRole","getFilterSelectRoom","getFilterSelectFunction","headerCellValue","getFilterSelectCustoms","autoHideDuration","message","action","Fragment","fontSize","offsetWidth","clientWidth","getElementById","scrollIntoView","behavior","block","inline","ObjectCustomDialog","reportChangedIds","changedIds","objectIDs","themeName","customsInstances","valAck","expire","ObjectBrowserEditObject","roleArray","onNewObject","ObjectBrowserViewFile","objectBrowserValue","ObjectBrowserValue","res","onUpdate","unsubscribeTimer","jsonFilter","checkUnsubscribes","getToolbar","renderHeader","tableDiv","renderToast","renderColumnsEditCustomDialog","renderColumnsSelectorDialog","renderCustomDialog","renderEditValueDialog","renderEditObjectDialog","renderViewObjectFileDialog","renderEditRoleDialog","renderEnumDialog","renderErrorDialog","renderExportDialog","modalNewObject","modalEditOfAccessControl","Component","defaultProps","_export","withWidth","toolbar","minHeight","toolbarButtons","marginLeft","spacing","transition","paddingTop","columnCustomCenter","textAlign","columnCustomLeft","columnCustomRight","transparent_10","opacity","transparent_20","transparent_30","transparent_40","transparent_50","transparent_60","transparent_70","transparent_80","transparent_90","transparent_100","float","zIndex","left","overflow","lineHeight","verticalAlign","userSelect","dark","light","main","flexWrap","borderBottom","textOverflow","marginRight","secondary","cellEditButton","fontStyle","animation","cellValueTooltipCopy","bottom","cellValueTooltipEdit","minWidth","active","cellButtonsValueButtonEdit","header","visibleButtons","flexGrow","borderRadius","textCenter","flexDirection","backgroundColor","default"],"mappings":"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","file":"static/js/3.b8a6b63b.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 copy from '@iobroker/adapter-react/Components/copy-to-clipboard';\nimport withStyles from '@material-ui/core/styles/withStyles';\nimport SVG from 'react-inlinesvg';\n\nimport IconButton from '@material-ui/core/IconButton';\nimport withWidth from '@material-ui/core/withWidth';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport FormControl from '@material-ui/core/FormControl';\nimport Input from '@material-ui/core/Input';\nimport Grid from '@material-ui/core/Grid';\nimport Badge from '@material-ui/core/Badge';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport Fab from '@material-ui/core/Fab';\nimport TextField from '@material-ui/core/TextField';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Switch from '@material-ui/core/Switch';\nimport Slider from '@material-ui/core/Slider';\nimport Typography from '@material-ui/core/Typography';\n\n// Icons\nimport IconEdit from '@material-ui/icons/Edit';\nimport IconDelete from '@material-ui/icons/Delete';\nimport IconConfig from '@material-ui/icons/Settings';\nimport IconSystem from '@material-ui/icons/SettingsApplications';\nimport IconPhoto from '@material-ui/icons/Photo';\nimport IconGroup from '@material-ui/icons/SupervisedUserCircle';\nimport IconSchedule from '@material-ui/icons/CalendarToday';\nimport IconUser from '@material-ui/icons/PersonOutlined';\nimport IconHost from '@material-ui/icons/Router';\nimport IconConnection from '@material-ui/icons/Wifi';\nimport IconInfo from '@material-ui/icons/Info';\nimport IconMeta from '@material-ui/icons/Description';\nimport IconScript from '@material-ui/icons/Code';\nimport IconChart from '@material-ui/icons/ShowChart';\nimport IconEnum from '@material-ui/icons/ListAlt';\nimport IconColumns from '@material-ui/icons/ViewColumn';\nimport IconClose from '@material-ui/icons/Close';\nimport IconCheck from '@material-ui/icons/Check';\nimport BuildIcon from '@material-ui/icons/Build';\nimport PublishIcon from '@material-ui/icons/Publish';\nimport AddIcon from '@material-ui/icons/Add';\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport LooksOneIcon from '@material-ui/icons/LooksOne';\nimport PressButtonIcon from '@material-ui/icons/RoomService';\nimport IconError from '@material-ui/icons/Error';\nimport IconDisconnected from '@material-ui/icons/WifiOff';\n\nimport IconExpert from '@iobroker/adapter-react/icons/IconExpert';\nimport IconAdapter from '@iobroker/adapter-react/icons/IconAdapter';\nimport IconAlias from '@iobroker/adapter-react/icons/IconAlias';\nimport IconChannel from '@iobroker/adapter-react/icons/IconChannel';\nimport IconCopy from '@iobroker/adapter-react/icons/IconCopy';\nimport IconDevice from '@iobroker/adapter-react/icons/IconDevice';\nimport IconDocument from '@iobroker/adapter-react/icons/IconDocument';\nimport IconInstance from '@iobroker/adapter-react/icons/IconInstance';\nimport IconState from '@iobroker/adapter-react/icons/IconState';\nimport IconClosed from '@iobroker/adapter-react/icons/IconClosed';\nimport IconOpen from '@iobroker/adapter-react/icons/IconOpen';\nimport IconClearFilter from '@iobroker/adapter-react/icons/IconClearFilter';\n\n// own\nimport Icon from '@iobroker/adapter-react/Components/Icon';\nimport Utils from './Utils'; // @iobroker/adapter-react/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 },\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)}px)`,\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.type === '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.type === 'dark' ? '#8888882e' : '#8888882e'}`,\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 cellCopyButton: {\n // color: 'white',\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.type === '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.type === '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 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 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 + theme.spacing(2),\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.type === '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.type === '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.type === '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});\n\nfunction generateFile(filename, obj) {\n let 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}\n\nfunction applyFilter(item, filters, lang, objects, context, counter, customFilter, selectedTypes) {\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 && data.obj.common;\n\n if (customFilter) {\n if (customFilter.type && customFilter.type !== data.obj.type) {\n filteredOut = true;\n } else\n if (customFilter.common && customFilter.common.custom) {\n if (!common || !common.custom || (customFilter.common.custom !== true && !common.custom[customFilter.common.custom])) {\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 (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.indexOf(context.id) === -1;\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 data.visible = !filteredOut;\n data.hasVisibleChildren = false;\n if (item.children) {\n item.children.forEach(_item => {\n const visible = applyFilter(_item, filters, lang, objects, context, counter, customFilter, selectedTypes);\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 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 let root = {\n data: {\n name: '',\n id: ''\n },\n children: []\n };\n\n let 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 } else if (aName < bName) {\n return -1;\n } else {\n return 0;\n }\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 } else if (aName < bName) {\n return -1;\n } else {\n return 0;\n }\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 } else {\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 } else {\n return null;\n }\n }\n}\n\nfunction getName(name, lang) {\n if (name && typeof name === 'object') {\n return (name[lang] || name.en || '').toString();\n } else {\n return (name || '').toString();\n }\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: 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: 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/*function 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\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 // 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 valText.s = v;\n v = states[v];\n }\n\n let valFull;\n if (isCommon && isCommon.unit) {\n valText.u = isCommon.unit;\n }\n valFull = [{ t: texts.value, v }];\n\n if (state) {\n if (state.ack !== undefined && state.ack !== null) {\n valFull.push({ t: texts.ack, v: state.ack.toString() });\n }\n if (state.ts) {\n valFull.push({ t: texts.ts, v: state.ts ? Utils.formatDate(new Date(state.ts), dateFormat) : '' });\n }\n if (state.lc) {\n valFull.push({ t: texts.lc, v: state.lc ? Utils.formatDate(new Date(state.lc), dateFormat) : '' });\n }\n if (state.from) {\n let from = (state.from || '');\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 || '');\n if (user.startsWith('system.user.')) {\n user = user.substring(12);\n }\n valFull.push({ t: texts.user, v: user });\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 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 } else {\n if (aIcon.startsWith('data:image/svg')) {\n src = <SVG src={aIcon} width={28} height={28} />;\n } else {\n src = aIcon;\n }\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 {\n // base 64 image\n if (cIcon.startsWith('data:image/svg')) {\n src = <SVG src={cIcon} width={28} height={28} />;\n } else {\n src = cIcon;\n }\n }\n }\n }\n }\n\n return src || null;\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 let 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: { idWidth: 300, fields: ['room', 'func', 'val', 'buttons'], widths: { name: 200, room: 150, func: 150, val: 120, buttons: 120 } },\n // large: 1280px\n lg: {\n idWidth: 300, 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: 650, 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.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\n }\n\n let expanded = 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.getItem(`${props.dialogName || 'App'}.objectFilter`) ||\n Object.assign({}, DEFAULT_FILTER);\n\n if (typeof filter === 'string') {\n try {\n filter = JSON.parse(filter);\n } catch (e) {\n filter = Object.assign({}, DEFAULT_FILTER);\n }\n }\n\n filter.expertMode = props.expertMode !== undefined ? props.expertMode : (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 = 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 = 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.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 const statesView = this.props.objectStatesView ? JSON.parse(window.localStorage.getItem((props.dialogName || 'App') + '.objectStatesView')) || false : false;\n this.state = {\n loaded: false,\n foldersFirst,\n selected,\n selectedNonObject: 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 modalEmptyId: null,\n statesView,\n columns,\n columnsForAdmin: null,\n columnsSelectorShow: false,\n columnsAuto: 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.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 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 this.calculateColumnsVisibility();\n }\n\n loadAllObjects(update) {\n const props = this.props;\n\n return new Promise(resolve => this.setState({updating: true}, () => resolve()))\n .then(() => this.props.objectsWorker ?\n this.props.objectsWorker.getObjects(update) :\n props.socket.getObjects(update, true))\n .then(objects => {\n this.systemConfig = objects['system.config'] || {};\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 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 let 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: Object.assign({}, 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 let expanded = [...this.state.expanded];\n let changed = false;\n this.state.selected.forEach(id => {\n const parts = id.split('.');\n let 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.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.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.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 = Object.assign({}, 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 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={true}\n maxWidth=\"sm\"\n fullWidth={true}\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 >{this.props.t('ra_Ok')}</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.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.setItem(`${this.props.dialogName || 'App'}.selectedNonObject`, toggleItem);\n this.setState({ selected: [], selectedNonObject: toggleItem }, () =>\n this.onAfterSelect());\n }\n } else {\n if (this.objects[toggleItem] && (!this.props.types || this.props.types.includes(this.objects[toggleItem].type))) {\n 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 /**\n * @private\n * @param {boolean} isLast\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 <ListItem button 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.setItem((this.props.dialogName || 'App') + '.columns', JSON.stringify(columns));\n this.calculateColumnsVisibility(null, columns);\n this.setState({ columns });\n }\n }} key={id}>\n {/* <ListItemIcon> */}\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 {/* </ListItemIcon> */}\n <ListItemText primary={this.texts['filter_' + id] || this.props.t('ra_' + id)} />\n <ListItemSecondaryAction>\n <FormControl className={this.props.classes.columnsDialogInputWidth} style={{ marginTop: 0, marginBottom: 0 }} margin=\"dense\">\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.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 </ListItem>\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 } else {\n return <Dialog\n onClose={() => this.setState({ columnsSelectorShow: false })}\n open={true}\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 visible columns')}</DialogTitle>\n <DialogContent className={this.props.classes.fontSizeTitle}>\n <FormControlLabel\n className={this.props.classes.switchColumnAuto}\n control={<Switch checked={this.state.columnsAuto} onChange={() => {\n 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 <FormControlLabel\n className={this.props.classes.switchColumnAuto}\n control={<Switch checked={this.state.foldersFirst} onChange={() => {\n window.localStorage.setItem((this.props.dialogName || 'App') + '.foldersFirst', this.state.foldersFirst ? 'false' : 'true');\n this.setState({ foldersFirst: !this.state.foldersFirst });\n }} />}\n label={this.props.t('ra_Folders always first')}\n />\n <FormControlLabel\n className={this.props.classes.switchColumnAuto}\n control={<Switch checked={this.state.linesEnabled} onChange={() => {\n window.localStorage.setItem((this.props.dialogName || 'App') + '.lines', this.state.linesEnabled ? 'false' : 'true');\n this.setState({ linesEnabled: !this.state.linesEnabled });\n }} />}\n label={this.props.t('ra_Show lines between rows')}\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 <ListItem button 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.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 className={this.props.classes.columnsDialogInputWidth} style={{ marginTop: 0, marginBottom: 0 }} margin=\"dense\">\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.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 </ListItem>\n )\n )}\n {this._renderDefinedList(true)}\n </List>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({ columnsSelectorShow: false })}\n color=\"primary\"\n startIcon={<IconClose />}\n >{this.texts['close']}</Button>\n </DialogActions>\n </Dialog>\n }\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(e => {\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 } else if (_parts.length) {\n return this.findItem(id, _parts, item, _partyId);\n }\n } else {\n return null;\n }\n } else {\n return null;\n }\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 {\n if (this.statesUpdateTimer) {\n clearTimeout(this.statesUpdateTimer);\n this.statesUpdateTimer = null;\n }\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 { path: item.path, name: item.path.split('.').pop(), width: item.width, edit: !!item.edit, type: item.type, objTypes: item.objTypes };\n }\n if (typeof item.name !== 'object' && item.path) {\n return { path: item.path, name: item.name, width: item.width, edit: !!item.edit, type: item.type, objTypes: item.objTypes };\n }\n if (!item.path) {\n console.warn(`Admin columns for ${obj._id} ignored, because path not found`);\n return null;\n } else {\n return { path: item.path, name: item.name[this.props.lang] || item.name.en, width: item.width, edit: !!item.edit, type: item.type, 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 * @param {import('./types').OldObject} oldObj\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 let 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 } else if (this.objects[event.id]) {\n delete this.objects[event.id];\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 let 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 } else if (this.objects[id]) {\n delete this.objects[id];\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 let 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.setItem('App.expertMode', value ? 'true' : 'false');\n }\n }\n\n filter = Object.assign({}, this.state.filter, filter);\n\n if (JSON.stringify(this.state.filter) !== JSON.stringify(filter)) {\n 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 let 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 filter = Object.assign({}, this.state.filter, filter);\n\n if (JSON.stringify(this.state.filter) !== JSON.stringify(filter)) {\n 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={e => {\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 style={{\n position: 'absolute',\n right: 0\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 key={name + '_' + this.state.filterKey}\n ref={this.filterRefs[name]}\n className={this.props.classes.headerCellInput + ' no-underline'}\n onChange={e => {\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={true}\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 ? 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.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 } else {\n return null;\n }\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.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.setItem((this.props.dialogName || 'App') + '.objectExpanded', JSON.stringify([]));\n this.setState({ expanded: [], depth: 0 });\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 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.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.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 = this.collapseDepth(depth, this.state.expanded);\n 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 let 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} callback\n */\n loadObjects = async objs => {\n if (objs) {\n for (let id in objs) {\n if (!objs.hasOwnProperty(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 } else {\n return [];\n }\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 } else {\n return <Dialog open={true}>\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 variant=\"outlined\" onClick={() => this.setState({showExportDialog: false}, () => this._exportObjects(true))}>{this.props.t('All objects')}</Button>\n <Button variant=\"contained\" autoFocus color=\"primary\" onClick={() => this.setState({showExportDialog: false}, () => this._exportObjects(false))}>{this.props.t('Only selected')}</Button>\n <Button variant=\"contained\" onClick={() => this.setState({showExportDialog: false})} startIcon={<IconClose/>}>{this.props.t('Cancel')}</Button>\n </DialogActions>\n </Dialog>;\n }\n }\n\n /**\n * @private\n * @param {object} evt\n */\n handleJsonUpload = evt => {\n let f = evt.target.files[0];\n if (f) {\n let r = new FileReader();\n r.onload = async e => {\n let contents = e.target.result;\n try {\n let json = JSON.parse(contents);\n let len = Object.keys(json).length;\n let 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 };\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 } else {\n if (this.props.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 ];\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 ];\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 ];\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={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 {\n if (this.props.expertMode) {\n allowObjectCreation = true;\n } else if (id.startsWith('alias.0') || id.startsWith('0_userdata')) {\n allowObjectCreation = true;\n }\n }\n }\n\n return <div style={{\n display: 'flex',\n width: '100%',\n alignItems: 'center'\n }}>\n <div style={{\n display: 'flex',\n width: '100%',\n alignItems: 'center'\n }}>\n\n <Tooltip title={this.props.t('ra_Refresh tree')}>\n <div>\n <IconButton onClick={() => this.refreshComponent()} disabled={this.state.updating}>\n <RefreshIcon />\n </IconButton>\n </div>\n </Tooltip>\n {this.props.showExpertButton &&\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 >\n <IconExpert />\n </IconButton>\n </Tooltip>\n }\n {!this.props.disableColumnSelector &&\n <Tooltip title={this.props.t('ra_Configure visible columns')}>\n <IconButton\n key=\"columnSelector\"\n color={this.state.columnsAuto ? 'primary' : 'default'}\n onClick={() => this.setState({ columnsSelectorShow: true })}\n >\n <IconColumns />\n </IconButton>\n </Tooltip>\n }\n {this.state.expandAllVisible &&\n <Tooltip title={this.props.t('ra_Expand all nodes')}>\n <IconButton\n key=\"expandAll\"\n onClick={() => this.onExpandAll()}\n >\n <IconOpen />\n </IconButton>\n </Tooltip>\n }\n <Tooltip title={this.props.t('ra_Collapse all nodes')}>\n <IconButton\n key=\"collapseAll\"\n onClick={() => this.onCollapseAll()}\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 >\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 >\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 onClick={() => this.onStatesViewVisible()}>\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 disabled={!allowObjectCreation} onClick={() =>\n this.setState({ modalNewObj: true })}\n >\n <AddIcon />\n </IconButton>\n </div>\n </Tooltip>\n : null\n }\n\n {this.props.objectImportExport &&\n <Tooltip title={this.props.t('ra_Add objects tree from JSON file')}>\n <IconButton 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 <PublishIcon />\n </IconButton>\n </Tooltip>\n }\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 onClick={() => this.setState({showExportDialog: this._getSelectedIdsForExport().length})}>\n <PublishIcon style={{ transform: 'rotate(180deg)' }} />\n </IconButton>\n </Tooltip>\n }\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 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.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 <BuildIcon />\n </IconButton>\n </Tooltip>\n }\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.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 copy(text);\n if (text.length < 50) {\n this.setState({ toast: this.props.t('ra_Copied %s', text) });\n } else {\n this.setState({ toast: this.props.t('ra_Copied') });\n }\n }\n\n renderTooltipAccessControl = acl => {\n // acl ={object,state,owner,ownerGroup}\n if (!acl) {\n return null;\n }\n const check = [\n { value: '0x400', valueNum: 0x400, title: 'read', group: 'Owner' },\n { value: '0x200', valueNum: 0x200, title: 'write', group: 'Owner' },\n { value: '0x40', valueNum: 0x40, title: 'read', group: 'Group' },\n { value: '0x20', valueNum: 0x20, title: 'write', group: 'Group' },\n { value: '0x4', valueNum: 0x4, title: 'read', group: 'Everyone' },\n { value: '0x2', valueNum: 0x2, title: 'write', group: 'Everyone' }\n ];\n const arrayTooltipText = [];\n const funcRenderStateObject = (value = 'object') => {\n let rights = acl[value];\n check.forEach((el, i) => {\n if (rights & el.valueNum) {\n arrayTooltipText.push(<span key={value + i}>{this.texts['acl' + el.group + '_' + el.title + '_' + value]},\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.props.expertMode && this.props.objectEditOfAccessControl ? <IconButton\n className={Utils.clsx(classes.cellButtonsButton, classes.cellButtonsEmptyButton, classes.cellButtonMinWidth)}\n onClick={() =>\n this.setState({ modalEditOfAccess: true, modalEmptyId: id, modalEditOfAccessObjData: item.data })}\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={() => this.props.onObjectDelete(id, !!(item.children && item.children.length), false)}\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.props.expertMode && this.props.objectEditOfAccessControl ? <Tooltip key=\"acl\" title={item.data.aclTooltip}><IconButton className={classes.cellButtonMinWidth} onClick={() =>\n this.setState({ modalEditOfAccess: true, modalEditOfAccessObjData: item.data })}\n >\n <div className={classes.aclText}>{isNaN(Number(acl).toString(16)) ? Number(aclSystemConfig).toString(16) : Number(acl).toString(16)}</div>\n </IconButton></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.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={() => this.props.onObjectDelete(id, !!item.children?.length, !item.data.obj.common?.dontDelete)}\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)}\n key=\"custom\"\n size=\"small\"\n aria-label=\"config\"\n title={this.texts.customConfig}\n onClick={() => {\n 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 let 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 => this.showError(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 if (!item.data.obj || !this.states) {\n return null;\n }\n\n if (item.data.obj.common?.type === 'file') {\n return <div className={Utils.clsx(classes.cellValueText, classes.cellValueFile)}>[file]</div>;\n } else\n if (!this.states[id]) {\n if (item.data.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 } else {\n !this.recordStates.includes(id) && this.recordStates.push(id);\n }\n\n const state = this.states[id];\n let info = item.data.state;\n if (!info) {\n info = item.data.state = item.data.state || formatValue(id, state, item.data.obj, this.texts, this.props.dateFormat, this.props.isFloatComma);\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}>{item.t}: {item.v}</div>,\n //<div className={classes.cellValueTooltipValue} key={item.t + '_v'}>{item.v}</div>,\n !item.nbr ? <br key={item.t + '_br'} /> : null\n ];\n } else {\n return [\n <div className={classes.cellValueTooltipTitle} key={item.t}>{item.t}:</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\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 || 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`}>({info.valText.s})</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.props.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 return cb && cb();\n } else {\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\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\n Promise.all(promises)\n .then(() => setTimeout(() =>\n this._syncEnum(id, enumIds, newArray, cb), 0));\n }\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 => this._syncEnum(id, toCheck, newArray, error => {\n error && this.showError(error);\n // force update of object\n resolve();\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\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 className={this.props.classes.enumDialog} onClose={() => this.setState({ enumDialog: null })} aria-labelledby=\"enum-dialog-title\" open={true}>\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 } else {\n return null;\n }\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 } else {\n return null;\n }\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 (this.setCustomValue(obj, this.state.columnsEditCustomDialog.it, value)) {\n return this.props.socket.setObject(obj._id, obj);\n } else {\n throw new Error(this.props.t('ra_Cannot update attribute, because not found in the object'))\n }\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 = this.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\" open={true}>\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 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 }\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 variant=\"contained\"\n onClick={() => this.onColumnsEditCustomDialogClose()}\n startIcon={<IconClose />}\n >{this.props.t('Cancel')}</Button>\n </DialogActions>\n </Dialog>;\n } else {\n return null;\n }\n }\n\n /**\n * @private\n * @param {any} obj\n * @param {any} it\n */\n 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 } else {\n return value;\n }\n }\n } else {\n return null;\n }\n }\n\n /**\n * @private\n * @param {any} obj\n * @param {any} it\n * @param {any} value\n */\n 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 } else 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 let text = this.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 })}>{text}</div>;\n } else {\n return <div\n className={Utils.clsx(this.props.classes.columnCustom, this.props.classes['columnCustom_' + it.align])}>{text}</div>;\n }\n } else {\n return null;\n }\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 let 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 {\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.props.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.props.expertMode || itemType === 'state' || itemType === 'channel' || itemType === 'device');\n const checkVisibleObjectType = this.state.statesView && (itemType === 'state' || itemType === 'channel' || itemType === 'device');\n let newValue = '';\n let newValueTitle = [];\n if (checkVisibleObjectType) {\n newValue = this.states[id]?.from;\n if (newValue === undefined) {\n newValue = ' ';\n } else {\n newValue = newValue ? newValue.replace(/^system\\.adapter\\.|^system\\./, '') : '';\n newValueTitle.push(`${this.texts.stateChangedFrom} ${newValue}`);\n }\n if (obj.user) {\n const user = obj.user.replace('system.user.', '');\n newValue += `/${user}`;\n newValueTitle.push(`${this.texts.stateChangedBy} ${user}`);\n }\n }\n 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 >←{common.alias.id.read}</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 >→{common.alias.id.write}</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 >→{common.alias.id}</div>\n ) : null;\n\n let checkColor = common?.color;\n let invertBackground = 'none';\n if (checkColor && !this.state.selected.includes(id)) {\n invertBackground = Utils.invertColor(checkColor, true);\n }\n if (!checkColor || this.state.selected.includes(id)) {\n checkColor = 'inherit';\n }\n const icons = [];\n\n if (common?.statusStates) {\n let 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 title={id}\n className={classes.cellIdSpan}\n style={{\n background: invertBackground,\n color: id === 'system' ?\n COLOR_NAME_SYSTEM : (id === 'system.adapter' ? COLOR_NAME_SYSTEM_ADAPTER :\n checkColor)\n }}\n >\n {item.data.name}\n {alias}\n {icons}\n </Grid>\n <div\n style={{\n color: checkColor,\n background: invertBackground\n }} className={classes.grow} />\n <Grid\n item\n container\n alignItems=\"center\"\n >\n {iconItem}\n </Grid>\n <div style={{ color: checkColor }}>\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 }}>{typeImg} {obj && obj.type}</div> : null}\n {this.columnsVisibility.role ? <div className={classes.cellRole} style={{ width: this.columnsVisibility.role, cursor: this.props.expertMode && enumEditable && this.props.objectBrowserEditRole ? 'text' : 'default' }} onClick={this.props.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 }\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 className={classes.cellValue} style={{ width: this.columnsVisibility.val, cursor: valueEditable ? (common?.type === 'file' ? 'zoom-in' : (item.data.button ? 'grab' : 'text')) : 'default' }} onClick={valueEditable ? () => {\n if (!obj || !this.states) {\n return null;\n }\n\n if (common?.type === 'file') {\n return this.setState({viewFileDialog: id});\n }\n\n // in non-expert mode control button directly\n if (!this.props.expertMode && item.data.button) {\n return this.props.socket.setState(id, true)\n .catch(e => window.alert(`Cannot write state \"${id}\": ${e}`));\n }\n\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 } : undefined}>{this.renderColumnValue(id, item, classes)}</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 let 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\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 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) {\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 {\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((accumulator, name) => {\n if (name === 'id' || typeof this.columnsVisibility[name] === 'string' || !this.columnsVisibility[name]) {\n return accumulator;\n } else {\n return accumulator + this.columnsVisibility[name];\n }},\n 0);\n this.columnsVisibility.id = `calc(100% - ${newWidth}px)`;\n }\n }\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 onClick={() => this.clearFilter()} className={classes.buttonClearFilter} title={this.props.t('ra_Clear filter')}>\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 }}>{this.getFilterInput('id')}</div>\n {this.columnsVisibility.name ? <div className={classes.headerCell} style={{ width: this.columnsVisibility.nameHeader }}>{this.getFilterInput('name')}</div> : null}\n {!this.state.statesView && <>\n {this.columnsVisibility.type ? <div className={classes.headerCell} style={{ width: this.columnsVisibility.type }}>{this.getFilterSelectType()}</div> : null}\n {this.columnsVisibility.role ? <div className={classes.headerCell} style={{ width: this.columnsVisibility.role }}>{this.getFilterSelectRole()}</div> : null}\n {this.columnsVisibility.room ? <div className={classes.headerCell} style={{ width: this.columnsVisibility.room }}>{this.getFilterSelectRoom()}</div> : null}\n {this.columnsVisibility.func ? <div className={classes.headerCell} style={{ width: this.columnsVisibility.func }}>{this.getFilterSelectFunction()}</div> : null}\n </>}\n {this.state.statesView && <>\n <div className={Utils.clsx(classes.headerCell, classes.headerCellValue)} style={{ width: this.columnsVisibility.changedFrom }}>{this.props.t('ra_Changed from')}</div>\n <div className={Utils.clsx(classes.headerCell, classes.headerCellValue)} style={{ width: this.columnsVisibility.qualityCode }}>{this.props.t('ra_Quality code')}</div>\n <div className={Utils.clsx(classes.headerCell, classes.headerCellValue)} style={{ width: this.columnsVisibility.timestamp }}>{this.props.t('ra_Timestamp')}</div>\n <div className={Utils.clsx(classes.headerCell, classes.headerCellValue)} style={{ width: this.columnsVisibility.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}>{item.name}</div>)}\n {this.columnsVisibility.val ? <div className={Utils.clsx(classes.headerCell, classes.headerCellValue)} style={{ width: this.columnsVisibility.val }}>{this.props.t('ra_Value')}{filterClearInValue}</div> : null}\n {this.columnsVisibility.buttons ? <div className={classes.headerCell} style={{ width: this.columnsVisibility.buttons }}> {this.getFilterSelectCustoms()}</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 <React.Fragment>\n <IconButton size=\"small\" aria-label=\"close\" color=\"inherit\" onClick={() => this.setState({ toast: '' })}>\n <IconClose fontSize=\"small\" />\n </IconButton>\n </React.Fragment>\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 {\n 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\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 } else {\n return null;\n }\n }\n\n /**\n * @private\n * @param {Partial<ioBroker.State>} valAck\n */\n onUpdate(valAck) {\n this.props.socket.setState(this.edit.id, { val: valAck.val, ack: valAck.ack, q: valAck.q || 0, expire: valAck.expire || undefined })\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 this.setState({ editObjectDialog: '' });\n if (obj) {\n this.props.socket.setObject(obj._id, obj)\n .catch(e => this.showError('Cannot write object: ' + e));\n }\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 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 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 } else {\n const classes = this.props.classes;\n const items = this.renderItem(this.root, undefined, classes);\n\n return <TabContainer key={this.props.dialogName}>\n <TabHeader>\n {this.getToolbar()}\n </TabHeader>\n <TabContent>\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}\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) { }\n customFilter: PropTypes.object, // optional {common: {custom: true}} or {common: {custom: 'sql.0'}}\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;","export default \"data:image/png;base64,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\""],"sourceRoot":""}
|