iobroker.admin 5.2.0 → 5.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["components/JsonConfigComponent/ConfigTabs.js","components/JsonConfigComponent/index.js","components/Object/ObjectCustomEditor.js","components/Object/ObjectHistoryData.js","components/Object/ObjectChart.js","dialogs/ObjectCustomDialog.js","components/Object/ObjectBrowserValue.js","components/Object/ObjectBrowserEditObject.js","components/Object/ObjectBrowserEditRole.js","dialogs/ObjectAddNewObject.js","dialogs/ObjectEditOfAccessControl.js","tabs/Objects.js"],"names":["ConfigTabs","props","tab","window","localStorage","getItem","dialogName","adapterName","Object","keys","schema","items","includes","state","this","className","classes","tabs","Tabs","value","onChange","e","setItem","setState","map","name","disabled","execute","Tab","wrapped","label","getText","ConfigPanel","isParentTab","onCommandRunning","commandRunning","panel","socket","instance","common","customs","alive","themeType","themeName","data","originalData","systemConfig","onError","multiEdit","forceUpdate","registerOnForceUpdate","customObj","instanceObj","custom","ConfigGeneric","propTypes","PropTypes","object","isRequired","string","style","func","number","bool","dateFormat","isFloatComma","withStyles","theme","height","width","display","I18n","extendTranslations","words","lang","translations","console","warn","forEach","word","error","JsonConfigComponent","onAlive","id","val","cb","onValueChange","_data","attr","startsWith","changed","JSON","stringify","errors","parse","length","Array","isArray","a","forceUpdateHandlers","updateData","buildDependencies","readData","Promise","resolve","getObject","then","obj","native","readSettings","getCompactSystemConfig","getState","subscribeState","_list","flatten","attrs","confirm","alsoDependsOn","dep","confirmDependsOn","depObj","cancel","push","replace","onChangeDependsOn","hidden","hiddenDependsOn","labelDependsOn","help","helpDependsOn","item","type","root","renderItem","LinearProgress","i18n","getLanguage","path","fileExists","exists","fileName","readFile","json","undefined","file","Component","ObjectCustomEditor","onSave","objectIDs","confirmed","showConfirmation","saveOneState","changedItems","newValues","commonConfig","getCommonConfig","hasChanges","reportChangedIds","changedIds","setTimeout","expanded","loaded","progress","maxOids","scrollDone","lastExpanded","scrollDivRef","createRef","jsonConfigs","controls","refTemplate","customsInstances","objects","loadAllPromises","loadAllCustoms","registerSaveFunc","promises","adapter","getCustomTemplate","all","instanceObjs","ad","Utils","fixAdminUI","adminUI","alert","loadI18n","catch","processed","_attr","defaultFunc","result","_executeCustom","Function","f","default","defaultValues","enabled","split","flattenItems","filter","ids","commons","inst","_default","getDefaultValues","sort","find","ignoreUnderscore","assign","i","icon","isIndeterminate","combineNewAndOld","Accordion","accordionOdd","accordionEven","ref","pos","indexOf","splice","AccordionSummary","expandIcon","accordionHeaderEnabledOdd","accordionHeaderOdd","accordionHeaderEnabledEven","accordionHeaderEven","src","headingIcon","alt","Typography","heading","t","clsx","titleEnabled","enabledVisible","enabledInvisible","AccordionDetails","enabledControl","FormControlLabel","formControl","control","Checkbox","indeterminate","checked","target","isChanged","customControls","parseInt","pop","log","en","title","text","onClose","oldObjects","_objects","_oldObjects","onProgress","Math","round","shift","ins","instances","setObject","ok","color","fontSize","index","Paper","paper","variant","scrollDiv","renderOneCustom","renderErrorMessage","renderConfirmationDialog","_result","AsyncFunction","getPrototypeOf","constructor","withWidth","maxHeight","maxWidth","overflow","marginRight","float","textTransform","fontWeight","paddingLeft","fullWidth","verticalAlign","backgroundColor","localeMap","enLocale","fr","frLocale","ru","ruLocale","de","deLocale","es","esLocale","br","brLocale","nl","nlLocale","it","itLocale","pt","ptLocale","pl","plLocale","cnLocale","padding3","ms","padding2","num","ObjectHistoryData","_id","values","ts","relativeRange","start","end","selected","lastSelected","lastSelectedColumn","min","max","historyInstance","updateOpened","insertOpened","historyInstances","defaultHistory","lcVisible","qVisible","ackVisible","fromVisible","supportedFeatures","edit","adminInstance","location","search","slice","supportedFeaturesPromises","unit","timeTimer","prepareData","readHistoryRange","setRelativeInterval","readHistory","readSupportedFeaturesTimeout","clearTimeout","sendTo","unsubscribeState","list","getHistoryInstances","config","readSupportedFeatures","instObj","getHistory","listObj","getForeignStates","alives","endsWith","loading","from","ack","q","addID","aggregate","chart","range","rangeValues","cVisible","Date","toISOString","c","substring","lc","noDataForPeriod","noData","now","oldest","getTime","step","column","shiftKey","pps","ppls","ctrlKey","toString","rows","r","TableRow","row","updatedRow","rowInterpolated","hover","TableCell","rowNoData","interpolated","rowSelected","onClick","onToggleSelect","toLocaleDateString","toLocaleTimeString","rowFocused","cellAckTrue","cellAckFalse","delay","getSeconds","getMilliseconds","setMilliseconds","setSeconds","mins","setHours","setMinutes","setFullYear","getFullYear","getDay","setDate","getDate","setMonth","shiftTime","dontSave","removeItem","TableContainer","container","Table","stickyHeader","size","table","TableHead","colTs","colValue","colAck","colFrom","colLastChange","TableBody","getTableRows","Dialog","open","areYouSure","DialogTitle","DialogContent","DialogContentText","suppressMessage","DialogActions","Button","onDelete","autoFocus","startIcon","tasks","parseFloat","date","time","getHours","getMinutes","getMonth","dialogForm","noValidate","autoComplete","updateEdit","TextField","utils","DateFnsUtils","locale","Grid","justify","editorDatePicker","margin","format","views","ampm","editorTimePicker","msInput","inputProps","isUpdate","onUpdate","onInsert","Toolbar","FormControl","selectHistoryControl","InputLabel","Select","MenuItem","notAliveInstance","selectRelativeTime","rangeRef","customRange","toolbarTimeGrid","toolbarDate","disableToolbar","setStartDate","toolbarTime","setEndDate","grow","IconButton","exportData","expertMode","element","document","getElementById","createElement","setAttribute","body","appendChild","lines","join","encodeURIComponent","getObjectName","language","click","removeChild","noLoadingProgress","renderToolbar","tableDiv","renderTable","renderConfirmDialog","renderEditDialog","mixins","toolbar","minHeight","spacing","tableLayout","minWidth","whiteSpace","userSelect","position","opacity","animation","marginLeft","palette","primary","main","background","secondary","pointerEvents","top","bottom","left","right","border","action","active","flexGrow","paddingTop","marginTop","paddingRight","borderRadius","echarts","TimelineComponent","ToolboxComponent","TitleComponent","TooltipComponent","GridComponent","LineChart","SVGRenderer","GRID_PADDING_LEFT","GRID_PADDING_RIGHT","ObjectChart","onResize","timerResize","componentDidUpdate","chartValues","updateChart","chartHeight","chartWidth","splitLine","maxYLen","echartsReact","readTimeout","divRef","bind","addEventListener","noToolbar","maxYLenTimeout","removeEventListener","showJumpToEchart","getAdapterInstances","echartsJump","options","states","minY","maxY","b","ceil","widthAxis","w","serie","xAxisIndex","showSymbol","hoverAnimation","convertData","lineStyle","areaStyle","yAxis","boundaryGap","show","splitNumber","axisLabel","formatter","showMaxLabel","showMinLabel","axisTick","alignWithLabel","interval","getObjectNameFromObj","padding","grid","tooltip","trigger","params","toLocaleString","axisPointer","xAxis","withSeconds","withTime","toolbox","feature","saveAsImage","series","withReadData","diff","getEchartsInstance","setOption","zr","getZr","_iobInstalled","on","mouseDown","lastX","offsetX","setNewRange","move","wheelDelta","moved","preventDefault","touches","originalEvent","pageX","lastWidth","abs","fingerWidth","amount","option","getOption","notMerge","lazyUpdate","opts","renderer","onEvents","rendered","installEventHandlers","current","offsetWidth","offsetHeight","args","protocol","host","Fab","echartsButton","openEcharts","EchartsIcon","buttonIcon","splitLineButton","splitLineButtonIcon","chartWithoutToolbar","chartWithToolbar","renderChart","ObjectCustomDialog","currentTab","chartAvailable","isChartAvailable","Router","getLocation","arg","confirmDialog","mobile","MobileDialog","isMobile","progressRunning","saveFunc","update","isYes","varType","scrollPaper","dialog","scroll","content","AppBar","event","newTab","doNavigate","tabPanel","renderCustomEditor","renderCharts","getButtonTitle","array","textAlign","AntSwitch","switchBase","grey","transform","white","borderColor","thumb","boxShadow","track","Switch","ObjectBrowserValue","propsValue","chartEnabled","expire","inputRef","React","chartFrom","el","setSelectionRange","jsonError","jsonNoError","mode","showPrintMargin","showGutter","highlightActiveLine","defaultValue","newValue","checkJsonError","setOptions","enableBasicAutocompletion","enableLiveAutocompletion","enableSnippets","showLineNumbers","tabSize","editorProps","$blockScrolling","key","direction","xs","component","alignItems","defaultChecked","onKeyUp","keyCode","textInput","helperText","renderJsonEditor","renderStates","multiline","quality","Hidden","only","wrapperButton","input","ObjectBrowserEditObject","readError","checkFunction","alias","read","writeError","write","showCopyDialog","innerWidth","originalObj","isWrite","jsFunc","initialType","finalType","newState","prepareObject","tabsPadding","selectId","selectRead","selectWrite","imagePrefix","statesOnly","onOk","setAliasItem","nameKey","marginBlock","buttonAdd","Tooltip","close","roleArray","checkState","checkRole","commonTabWrapper","commonWrapper","textField","setCommonItem","buttonAddKey","flex","buttonRemoveKey","removeCommonItem","role","Autocomplete","getOptionSelected","_","renderInput","flexDrop","UploadImage","maxSize","removeIconFunc","base64","funcVisible","aliasIdEdit","InputProps","endAdornment","InputAdornment","button","funcEdit","startAdornment","funcIcon","stopPropagation","copy","oldId","newId","newObj","user","onNewObject","onKeyDown","onClone","withAlias","fullScreen","renderTabs","renderCopyDialog","divWithoutTitle","divWithoutTitleAndTab","renderAliasEdit","renderCommonEdit","renderSelectDialog","onCopy","fontStyle","funcDivEdit","funcEditName","flexFlow","cursor","transition","buttonRemoveWrapper","zIndex","ObjectBrowserEditRole","initRole","roleInput","freeSolo","roles","onInputChange","marginBottom","inputText","stateTypeArray","stateDefValues","boolean","TYPES","ObjectAddNewObject","onApply","names","channel","device","folder","types","parentType","useState","setName","setType","stateType","setStateType","buildId","unique","setUnique","FORBIDDEN_CHARS","onLocalApply","desc","def","CustomModal","titleButtonApply","applyDisabled","flexDirection","readWriteArray","Owner","valueNum","Group","Everyone","newValueAccessControl","mask","ObjectRights","setValue","differentValues","applyToChildren","setMask","useEffect","_checkDifferent","newSelected","borderLeft","borderBottom","justifyContent","idx","borderRight","ObjectEditOfAccessControl","extendObject","modalEmptyId","stateOwnerUser","setStateOwnerUser","stateOwnerGroup","setStateOwnerGroup","ownerUsers","setOwnerUsers","ownerGroups","setOwnerGroups","setApplyToChildren","setCheckState","childrenCount","setChildrenCount","valueObjectAccessControl","setValueObjectAccessControl","valueStateAccessControl","setValueStateAccessControl","differentOwner","setDifferentOwner","differentGroup","setDifferentGroup","differentState","setDifferentState","differentObject","setDifferentObject","maskState","setMaskState","maskObject","setMaskObject","setIds","setProgress","disabledButton","setDisabledButton","different","count","_differentState","_differentObject","idWithDot","_checkState","groups","users","_differentOwner","_differentGroup","_stateOwnerUser","_stateOwnerGroup","_valueObjectAccessControl","_valueStateAccessControl","_ids","k","acl","owner","ownerGroup","defaultNewAcl","isNaN","userItem","groupItem","overflowHidden","newAcl","_maskState","_maskObject","renderValue","getInvertedColor","overflowY","Objects","translate","arg1","arg2","wordCache","filters","toast","deleteObjectShow","withChildren","delObjects","delObject","Snackbar","anchorOrigin","vertical","horizontal","autoHideDuration","message","Fragment","hasChildren","buttonText","buttonAll","ObjectBrowser","objectsWorker","prefix","defaultFilters","objectCustomDialog","objectBrowserValue","objectBrowserEditObject","objectBrowserEditRole","router","enableStateValueEdit","onObjectDelete","onFilterChanged","filterConfig","onSelect","objectEditBoolean","objectAddBoolean","objectStatesView","objectImportExport","objectEditOfAccessControl","modalNewObject","context","modalNewObj","selectedNonObject","modalEditOfAccessControl","objData","modalEditOfAccess","aclTooltip","modalEditOfAccessObjData","renderDeleteDialog","_export"],"mappings":"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","file":"static/js/15.1e46a4bb.chunk.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\n\nimport ConfigGeneric from './ConfigGeneric';\nimport ConfigPanel from './ConfigPanel';\n\nconst styles = theme => ({\n tabs: {\n height: '100%',\n width: '100%',\n },\n panel: {\n height: 'calc(100% - 48px)',\n width: '100%',\n display: 'block'\n }\n});\n\nclass ConfigTabs extends ConfigGeneric {\n constructor(props) {\n super(props);\n\n let tab = window.localStorage.getItem((this.props.dialogName || 'App') + '.' + this.props.adapterName) || Object.keys(this.props.schema.items)[0];\n if (!Object.keys(this.props.schema.items).includes(tab)) {\n tab = Object.keys(this.props.schema.items)[0];\n }\n this.state = {\n tab,\n };\n }\n\n render() {\n const items = this.props.schema.items;\n\n return <div className={this.props.classes.tabs}>\n <Tabs value={this.state.tab} onChange={(e, tab) => {\n window.localStorage.setItem((this.props.dialogName || 'App') + '.' + this.props.adapterName, tab);\n this.setState({tab});\n }}>\n {Object.keys(items).map(name => {\n const disabled = this.execute(items[name].disabled, false);\n return <Tab wrapped disabled={disabled} key={name} value={name} label={this.getText(items[name].label)} />\n })}\n </Tabs>\n {<ConfigPanel\n key={this.state.tab}\n isParentTab={true}\n onCommandRunning={this.props.onCommandRunning}\n commandRunning={this.props.commandRunning}\n className={this.props.classes.panel}\n socket={this.props.socket}\n adapterName={this.props.adapterName}\n instance={this.props.instance}\n common={this.props.common}\n customs={this.props.customs}\n alive={this.props.alive}\n themeType={this.props.themeType}\n themeName={this.props.themeName}\n data={this.props.data}\n originalData={this.props.originalData}\n systemConfig={this.props.systemConfig}\n onError={this.props.onError}\n onChange={this.props.onChange}\n multiEdit={this.props.multiEdit}\n\n forceUpdate={this.props.forceUpdate}\n registerOnForceUpdate={this.props.registerOnForceUpdate}\n\n customObj={this.props.customObj}\n instanceObj={this.props.instanceObj}\n custom={this.props.custom}\n\n schema={items[this.state.tab]}\n />}\n </div>;\n }\n}\n\nConfigTabs.propTypes = {\n socket: PropTypes.object.isRequired,\n themeType: PropTypes.string,\n themeName: PropTypes.string,\n style: PropTypes.object,\n className: PropTypes.string,\n data: PropTypes.object.isRequired,\n originalData: PropTypes.object,\n schema: PropTypes.object,\n onError: PropTypes.func,\n onChange: PropTypes.func,\n customs: PropTypes.object,\n adapterName: PropTypes.string,\n instance: PropTypes.number,\n commandRunning: PropTypes.bool,\n onCommandRunning: PropTypes.func,\n dateFormat: PropTypes.string,\n isFloatComma: PropTypes.bool,\n multiEdit: PropTypes.bool,\n\n customObj: PropTypes.object,\n instanceObj: PropTypes.object,\n custom: PropTypes.bool,\n\n registerOnForceUpdate: PropTypes.func.isRequired,\n forceUpdate: PropTypes.func.isRequired,\n systemConfig: PropTypes.object,\n alive: PropTypes.bool,\n common: PropTypes.object,\n};\n\nexport default withStyles(styles)(ConfigTabs);","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport LinearProgress from '@material-ui/core/LinearProgress';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nimport ConfigTabs from './ConfigTabs';\nimport ConfigPanel from './ConfigPanel';\n\nconst styles = theme => ({\n root: {\n width: '100%',\n height: '100%'\n }\n});\n\n// Todo: delete it after adapter-react 1.6.9\nI18n.extendTranslations = I18n.extendTranslations || ((words, lang) => {\n try {\n if (!lang) {\n Object.keys(words).forEach(word => {\n Object.keys(words[word]).forEach(lang => {\n if (!I18n.translations[lang]) {\n console.warn(`Used unknown language: ${lang}`);\n }\n if (!I18n.translations[lang][word]) {\n I18n.translations[lang][word] = words[word][lang];\n } else if (I18n.translations[lang][word] !== words[word][lang]) {\n console.warn(`Translation for word \"${word}\" in \"${lang}\" was ignored: existing = \"${I18n.translations[lang][word]}\", new = ${words[word][lang]}`);\n }\n });\n });\n } else {\n if (!I18n.translations[lang]) {\n console.warn(`Used unknown language: ${lang}`);\n }\n I18n.translations[lang] = I18n.translations[lang] || {};\n Object.keys(words)\n .forEach(word => {\n if (!I18n.translations[lang][word]) {\n I18n.translations[lang][word] = words[word];\n } else if (I18n.translations[lang][word] !== words[word]) {\n console.warn(`Translation for word \"${word}\" in \"${lang}\" was ignored: existing = \"${I18n.translations[lang][word]}\", new = ${words[word]}`);\n }\n });\n }\n } catch (e) {\n console.error(`Cannot apply translations: ${e}`);\n }\n});\n\nclass JsonConfigComponent extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n originalData: JSON.stringify(this.props.data),\n changed: false,\n errors: {\n\n },\n updateData: this.props.updateData,\n systemConfig: null,\n alive: false,\n commandRunning: false,\n };\n\n this.forceUpdateHandlers = {};\n\n this.schema = JSON.parse(JSON.stringify(this.props.schema));\n this.buildDependencies(this.schema);\n\n this.readData();\n }\n\n static getDerivedStateFromProps(props, state) {\n if (JSON.stringify(props.updateData) !== JSON.stringify(state.updateData)) {\n return {updateData: props.updateData, originalData: JSON.stringify(props.data)};\n } else {\n return null;\n }\n }\n\n static loadI18n(socket, i18n, adapterName) {\n if (i18n === true || (i18n && typeof i18n === 'string')) {\n const lang = I18n.getLanguage();\n const path = typeof i18n === 'string' ? i18n : 'i18n';\n return socket.fileExists(adapterName + '.admin', `${path}/${lang}.json`)\n .then(exists => {\n if (exists) {\n return `${path}/${lang}.json`;\n } else {\n return socket.fileExists(adapterName + '.admin', `${path}/${lang}/translations.json`)\n .then(exists =>\n exists ? `${path}/${lang}/translations.json` : '')\n }\n })\n .then(fileName => {\n if (fileName) {\n return socket.readFile(adapterName + '.admin', fileName)\n .then(json => {\n if (json.file !== undefined) {\n json = json.file;\n }\n try {\n json = JSON.parse(json);\n // apply file to I18n\n I18n.extendTranslations(json, lang);\n } catch (e) {\n console.error(`Cannot parse language file \"${adapterName}.admin/${fileName}: ${e}`);\n }\n })\n } else {\n console.warn(`Cannot find i18n for ${adapterName} / ${fileName}`);\n return Promise.resolve();\n }\n });\n } else if (i18n && typeof i18n === 'object') {\n I18n.extendTranslations(i18n);\n return Promise.resolve();\n } else {\n return Promise.resolve();\n }\n }\n\n onCommandRunning = commandRunning => this.setState( {commandRunning});\n\n readSettings() {\n if ((this.props.custom || this.props.common) && this.props.data) {\n return Promise.resolve();\n } else {\n return this.props.socket.getObject(`system.adapter.${this.props.adapterName}.${this.props.instance}`)\n .then(obj => this.setState({common: obj.common, data: this.props.data || obj.native}));\n }\n }\n\n readData() {\n this.readSettings()\n .then(() => this.props.socket.getCompactSystemConfig())\n .then(systemConfig =>\n this.props.socket.getState(`system.adapter.${this.props.adapterName}.${this.props.instance}.alive`)\n .then(state => {\n if (this.props.custom) {\n this.setState({systemConfig: systemConfig.common, alive: !!(state && state.val)});\n } else {\n this.setState({systemConfig: systemConfig.common, alive: !!(state && state.val)}, () =>\n this.props.socket.subscribeState(`system.adapter.${this.props.adapterName}.${this.props.instance}.alive`, this.onAlive));\n }\n }));\n }\n\n onAlive = (id, state) => {\n if ((state?.val || false) !== this.state.alive) {\n this.setState({alive: state?.val || false});\n }\n }\n\n onChange = (data, value, cb) => {\n if (this.props.onValueChange) {\n this.props.onValueChange(data, value);\n cb && cb();\n } else {\n const state = {data};\n\n const _data = {};\n // remove all attributes starting with \"_\"\n Object.keys(data).forEach(attr => !attr.startsWith('_') && (_data[attr] = data[attr]));\n\n state.changed = JSON.stringify(_data) !== this.state.originalData;\n\n this.setState({state}, () => {\n this.props.onChange(_data, state.changed);\n cb && cb();\n });\n }\n }\n\n onError = (attr, error) => {\n const errors = JSON.parse(JSON.stringify(this.state.errors));\n if (error) {\n errors[attr] = error;\n } else {\n delete errors[attr];\n }\n\n if (JSON.stringify(errors) !== JSON.parse(JSON.stringify(this.state.errors))) {\n this.setState({errors}, () =>\n this.props.onError(!!Object.keys(this.state.errors).length));\n }\n }\n\n flatten(schema, _list) {\n _list = _list || {};\n if (schema.items) {\n Object.keys(schema.items).forEach(attr => {\n _list[attr] = schema.items[attr];\n this.flatten(schema.items[attr], _list);\n });\n }\n\n return _list;\n }\n\n buildDependencies(schema) {\n const attrs = this.flatten(schema);\n Object.keys(attrs).forEach(attr => {\n if (attrs[attr].confirm?.alsoDependsOn) {\n attrs[attr].confirm?.alsoDependsOn.forEach(dep => {\n if (!attrs[dep]) {\n console.error(`[JsonConfigComponent] Attribute ${dep} does not exist!`);\n if (dep.startsWith('data.')) {\n console.warn(`[JsonConfigComponent] please use \"${dep.replace(/^data\\./, '')}\" instead of \"${dep}\"`);\n }\n } else {\n attrs[dep].confirmDependsOn = attrs[dep].confirmDependsOn || [];\n\n const depObj = {...attrs[attr], attr};\n if (depObj.confirm) {\n depObj.confirm.cancel = 'Undo';\n }\n\n attrs[dep].confirmDependsOn.push(depObj);\n }\n });\n }\n\n if (attrs[attr].onChange?.alsoDependsOn) {\n attrs[attr].onChange?.alsoDependsOn.forEach(dep => {\n if (!attrs[dep]) {\n console.error(`[JsonConfigComponent] Attribute ${dep} does not exist!`);\n if (dep.startsWith('data.')) {\n console.warn(`[JsonConfigComponent] please use \"${dep.replace(/^data\\./, '')}\" instead of \"${dep}\"`);\n }\n } else {\n attrs[dep].onChangeDependsOn = attrs[dep].onChangeDependsOn || [];\n\n const depObj = {...attrs[attr], attr};\n\n attrs[dep].onChangeDependsOn.push(depObj);\n }\n });\n }\n\n if (attrs[attr].hidden?.alsoDependsOn) {\n attrs[attr].hidden?.alsoDependsOn.forEach(dep => {\n if (!attrs[dep]) {\n console.error(`[JsonConfigComponent] Attribute ${dep} does not exist!`);\n if (dep.startsWith('data.')) {\n console.warn(`[JsonConfigComponent] please use \"${dep.replace(/^data\\./, '')}\" instead of \"${dep}\"`);\n }\n } else {\n attrs[dep].hiddenDependsOn = attrs[dep].hiddenDependsOn || [];\n\n const depObj = {...attrs[attr], attr};\n\n attrs[dep].hiddenDependsOn.push(depObj);\n }\n });\n }\n\n if (attrs[attr].label?.alsoDependsOn) {\n attrs[attr].label?.alsoDependsOn.forEach(dep => {\n if (!attrs[dep]) {\n console.error(`[JsonConfigComponent] Attribute ${dep} does not exist!`);\n if (dep.startsWith('data.')) {\n console.warn(`[JsonConfigComponent] please use \"${dep.replace(/^data\\./, '')}\" instead of \"${dep}\"`);\n }\n } else {\n attrs[dep].labelDependsOn = attrs[dep].labelDependsOn || [];\n\n const depObj = {...attrs[attr], attr};\n\n attrs[dep].labelDependsOn.push(depObj);\n }\n });\n }\n\n if (attrs[attr].help?.alsoDependsOn) {\n attrs[attr].help?.alsoDependsOn.forEach(dep => {\n if (!attrs[dep]) {\n console.error(`[JsonConfigComponent] Attribute ${dep} does not exist!`);\n if (dep.startsWith('data.')) {\n console.warn(`[JsonConfigComponent] please use \"${dep.replace(/^data\\./, '')}\" instead of \"${dep}\"`);\n }\n } else {\n attrs[dep].helpDependsOn = attrs[dep].helpDependsOn || [];\n\n const depObj = {...attrs[attr], attr};\n\n attrs[dep].helpDependsOn.push(depObj);\n }\n });\n }\n });\n }\n\n renderItem(item) {\n if (item.type === 'tabs') {\n return <ConfigTabs\n onCommandRunning={this.onCommandRunning}\n commandRunning={this.state.commandRunning}\n socket={this.props.socket}\n adapterName={this.props.adapterName}\n instance={this.props.instance}\n common={this.props.common}\n alive={this.state.alive}\n themeType={this.props.themeType}\n themeName={this.props.themeName}\n data={this.props.data}\n originalData={JSON.parse(this.state.originalData)}\n schema={item}\n systemConfig={this.state.systemConfig}\n customs={this.props.customs}\n dateFormat={this.props.dateFormat}\n isFloatComma={this.props.isFloatComma}\n multiEdit={this.props.multiEdit}\n\n custom={this.props.custom}\n customObj={this.props.customObj}\n instanceObj={this.props.instanceObj}\n\n forceUpdate={this.forceUpdate}\n registerOnForceUpdate={this.registerOnForceUpdate}\n\n onChange={this.onChange}\n onError={(attr, error) => this.onError(attr, error)}\n />;\n } else if (item.type === 'panel' || !item.type) {\n return <ConfigPanel\n isParentTab={true}\n onCommandRunning={this.onCommandRunning}\n commandRunning={this.state.commandRunning}\n socket={this.props.socket}\n adapterName={this.props.adapterName}\n instance={this.props.instance}\n common={this.props.common}\n alive={this.state.alive}\n themeType={this.props.themeType}\n themeName={this.props.themeName}\n data={this.props.data}\n originalData={JSON.parse(this.state.originalData)}\n schema={item}\n systemConfig={this.state.systemConfig}\n customs={this.props.customs}\n dateFormat={this.props.dateFormat}\n isFloatComma={this.props.isFloatComma}\n multiEdit={this.props.multiEdit}\n\n forceUpdate={this.forceUpdate}\n registerOnForceUpdate={this.registerOnForceUpdate}\n\n custom={this.props.custom}\n customObj={this.props.customObj}\n instanceObj={this.props.instanceObj}\n\n onChange={this.onChange}\n onError={(attr, error) => this.onError(attr, error)}\n />\n }\n }\n\n forceUpdate = (attr, data) => {\n if (Array.isArray(attr)) {\n attr.forEach(a =>\n this.forceUpdateHandlers[a] && this.forceUpdateHandlers[a](data));\n } else {\n if (this.forceUpdateHandlers[attr]) {\n this.forceUpdateHandlers[attr](data);\n }\n }\n }\n\n registerOnForceUpdate = (attr, cb) => {\n if (cb) {\n this.forceUpdateHandlers[attr] = cb;\n } else if (this.forceUpdateHandlers[attr]) {\n delete this.forceUpdateHandlers[attr];\n }\n }\n\n render() {\n if (!this.state.systemConfig) {\n return <LinearProgress />;\n }\n\n return <div className={this.props.classes.root}>\n {this.renderItem(this.schema)}\n </div>;\n }\n}\n\nJsonConfigComponent.propTypes = {\n socket: PropTypes.object.isRequired,\n\n adapterName: PropTypes.string,\n instance: PropTypes.number,\n common: PropTypes.object,\n customs: PropTypes.object, // custom components\n\n custom: PropTypes.bool, // is the customs settings must be shown\n customObj: PropTypes.object,\n multiEdit: PropTypes.bool, // set if user edits more than one object simultaneously\n instanceObj: PropTypes.object,\n dateFormat: PropTypes.string,\n isFloatComma: PropTypes.bool,\n\n themeType: PropTypes.string,\n themeName: PropTypes.string,\n style: PropTypes.object,\n className: PropTypes.string,\n data: PropTypes.object.isRequired,\n updateData: PropTypes.number,\n schema: PropTypes.object,\n onError: PropTypes.func,\n onChange: PropTypes.func,\n onValueChange: PropTypes.func,\n};\n\nexport default withStyles(styles)(JsonConfigComponent);","import React, { createRef, Component } from 'react';\nimport {withStyles} from '@material-ui/core/styles';\nimport withWidth from '@material-ui/core/withWidth';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\n\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport Typography from '@material-ui/core/Typography';\nimport Paper from '@material-ui/core/Paper';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\n\n// Icons\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\n\nimport DialogError from '@iobroker/adapter-react/Dialogs/Error';\nimport ConfirmDialog from \"@iobroker/adapter-react/Dialogs/Confirm\";\n\nimport JsonConfigComponent from '../JsonConfigComponent';\nimport Utils from '../../Utils';\n\nconst styles = theme => ({\n paper: {\n height: '100%',\n maxHeight: '100%',\n maxWidth: '100%',\n overflow: 'hidden',\n },\n headingIcon: {\n marginRight: 5,\n width: 32,\n height: 32,\n },\n titleEnabled: {\n float: 'right',\n fontSize: 16,\n color: '#7ff57f',\n textTransform: 'uppercase',\n fontWeight: 'bold',\n paddingLeft: 20,\n },\n scrollDiv: {\n width: '100%',\n height: '100%',//`calc(100% - ${theme.mixins.toolbar.minHeight}px)`,\n overflow: 'auto',\n },\n fullWidth: {\n width: '100%',\n },\n enabledControl: {\n width: 130,\n display: 'inline-block',\n verticalAlign: 'top',\n },\n customControls: {\n width: 'calc(100% - 130px)',\n maxWidth: 800,\n display: 'inline-block',\n verticalAlign: 'top',\n },\n\n accordionOdd: {\n //backgroundColor: 'rgba(128, 128, 128, 0.2)'\n },\n accordionEven: {\n backgroundColor: 'rgba(128, 128, 128, 0.1)'\n },\n\n accordionHeaderOdd: {\n backgroundColor: 'rgba(128, 128, 128, 0.2)'\n },\n accordionHeaderEven: {\n backgroundColor: 'rgba(128, 128, 128, 0.3)'\n },\n\n accordionHeaderEnabledOdd: {\n backgroundColor: 'rgba(128, 255, 128, 0.2)'\n },\n accordionHeaderEnabledEven: {\n backgroundColor: 'rgba(128, 255, 128, 0.2)'\n },\n\n\n enabledVisible: {\n display: 'inline-block'\n },\n enabledInvisible: {\n display: 'none'\n }\n});\n\nconst URL_PREFIX = '.'; // or './' or 'http://localhost:8081' for debug\n\nclass ObjectCustomEditor extends Component {\n static AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;\n\n constructor(props) {\n super(props);\n\n let expanded = window.localStorage.getItem('App.customsExpanded') || '[]';\n try {\n expanded = JSON.parse(expanded);\n } catch (e) {\n expanded = [];\n }\n\n this.changedIds = [];\n\n this.state = {\n loaded: false,\n hasChanges: false,\n expanded,\n newValues: {},\n progress: null,\n maxOids: null,\n confirmed: false,\n showConfirmation: false\n };\n\n this.scrollDone = false;\n this.lastExpanded = window.localStorage.getItem('App.customsLastExpanded') || '';\n this.scrollDivRef = createRef();\n\n this.changedItems = [];\n this.jsonConfigs = {};\n\n this.controls = {};\n this.refTemplate = {};\n this.props.customsInstances.map(id => this.refTemplate[id] = createRef());\n\n this.customObj = this.props.objectIDs.length > 1 ? {custom: {}, native: {}} : JSON.parse(JSON.stringify(this.props.objects[this.props.objectIDs[0]] || null));\n\n if (this.customObj) {\n this.loadAllPromises = this.loadAllCustoms()\n .then(() => {\n this.commonConfig = this.getCommonConfig();\n this.setState({ loaded: true, newValues: {} });\n });\n }\n }\n\n componentDidMount() {\n this.props.registerSaveFunc && this.props.registerSaveFunc(this.onSave);\n }\n\n componentWillUnmount() {\n this.props.registerSaveFunc && this.props.registerSaveFunc(null);\n }\n\n loadAllCustoms() {\n const promises = [];\n this.props.customsInstances.forEach(id => {\n const adapter = id.replace(/\\.\\d+$/, '').replace('system.adapter.', '');\n if (this.jsonConfigs[adapter] === undefined) {\n this.jsonConfigs[adapter] = false;\n promises.push(this.getCustomTemplate(adapter));\n }\n });\n\n return Promise.all(promises)\n .then(() => {\n this.props.customsInstances.forEach(id => {\n const adapter = id.replace(/\\.\\d+$/, '').replace('system.adapter.', '');\n if (this.jsonConfigs[adapter]) {\n this.jsonConfigs[adapter].instanceObjs = this.jsonConfigs[adapter].instanceObjs || {};\n this.jsonConfigs[adapter].instanceObjs[id] = {\n common: JSON.parse(JSON.stringify(this.props.objects['system.adapter.' + id]?.common)),\n native: JSON.parse(JSON.stringify(this.props.objects['system.adapter.' + id]?.native))\n }\n }\n });\n });\n }\n\n showError(error) {\n this.setState({ error });\n }\n\n getCustomTemplate(adapter) {\n const ad = this.props.objects['system.adapter.' + adapter] ? JSON.parse(JSON.stringify(this.props.objects['system.adapter.' + adapter])) : null;\n\n if (!ad) {\n console.error(`Cannot find adapter \"${ad}\"`);\n return Promise.resolve(null);\n } else {\n\n Utils.fixAdminUI(ad);\n\n if (ad.common?.adminUI.custom === 'json') {\n return this.props.socket.readFile(adapter + '.admin', 'jsonCustom.json')\n .then(json => {\n if (json.file !== undefined) {\n json = json.file;\n }\n try {\n json = JSON.parse(json);\n this.jsonConfigs[adapter] = this.jsonConfigs[adapter] || {};\n this.jsonConfigs[adapter].json = json;\n } catch (e) {\n console.error(`Cannot parse jsonConfig of ${adapter}: ${e}`);\n window.alert(`Cannot parse jsonConfig of ${adapter}: ${e}`);\n }\n\n return JsonConfigComponent.loadI18n(this.props.socket, json.i18n, adapter);\n })\n .catch(e => {\n console.error(`Cannot load jsonConfig of ${adapter}: ${e}`);\n window.alert(`Cannot load jsonConfig of ${adapter}: ${e}`);\n });\n } else {\n console.error(`Adapter ${adapter} is not yet supported by this version of admin`);\n window.alert(`Adapter ${adapter} is not yet supported by this version of admin`);\n return Promise.resolve(null);\n }\n }\n }\n\n // See configGeneric _executeCustom\n _executeCustom(func, data, customObj, instanceObj, items, attr, processed) {\n if (processed.includes(attr)) {\n return undefined;\n }\n processed.push(attr);\n\n let alsoDependsOn = [];\n if (func && typeof func === 'object') {\n alsoDependsOn = func.alsoDependsOn || [];\n if (typeof alsoDependsOn === 'string') {\n alsoDependsOn = [alsoDependsOn];\n }\n func = func.func;\n }\n\n alsoDependsOn.forEach(_attr => {\n if (!items[_attr]) {\n return console.error(`[JsonConfigComponent] attribute \"${_attr}\" does not exist!`);\n } else\n if (!items[_attr].defaultFunc) {\n return console.error(`[JsonConfigComponent] attribute \"${_attr}\" is not required to be includes in \"alsoDependsOn\" while has static value!`);\n } else {\n const result = this._executeCustom(items[_attr].defaultFunc, data, customObj, instanceObj, items, _attr, processed);\n if (result !== undefined) {\n data[_attr] = result;\n }\n }\n });\n\n if (!func) {\n data[attr] = items[attr].default === undefined ? null: items[attr].default;\n } else {\n try {\n // eslint-disable-next-line no-new-func\n const f = new Function('data', 'originalData', '_system', 'instanceObj', 'customObj', '_socket', func.includes('return') ? func : 'return ' + func);\n const result = f(data || this.props.data, this.props.originalData, this.props.systemConfig, instanceObj, customObj, this.props.socket);\n data[attr] = result;\n } catch (e) {\n console.error(`Cannot execute ${func}: ${e}`);\n data[attr] = !items[attr] || items[attr].default === undefined ? null: items[attr].default;\n }\n }\n }\n\n static flattenItems(items, _result) {\n _result = _result || {};\n items && Object.keys(items).forEach(attr => {\n if (items[attr].items) {\n ObjectCustomEditor.flattenItems(items[attr].items, _result);\n } else {\n _result[attr] = items[attr];\n }\n });\n\n return _result;\n }\n\n getDefaultValues(instance, obj) {\n const defaultValues = {enabled: false};\n const adapter = instance.split('.')[0];\n\n if (this.jsonConfigs[adapter] && !this.jsonConfigs[adapter].disabled) {\n const items = ObjectCustomEditor.flattenItems(this.jsonConfigs[adapter].json.items);\n\n if (items) {\n const processed = [];\n const attrs = Object.keys(items).filter(attr => items[attr]);\n // first init simple defaults\n attrs.forEach(attr => {\n if (!items[attr].defaultFunc && items[attr].default !== undefined) {\n defaultValues[attr] = items[attr].default;\n }\n });\n // now init default that must be calculated\n attrs.forEach(async attr => {\n if (items[attr].defaultFunc) {\n this._executeCustom(items[attr].defaultFunc, defaultValues, obj, this.jsonConfigs[adapter].instanceObjs[instance], items, attr, processed);\n }\n });\n }\n }\n\n return defaultValues;\n }\n\n getCommonConfig () {\n const ids = this.props.objectIDs || [];\n const objects = this.props.objects;\n\n const commons = {};\n\n // calculate common settings\n this.props.customsInstances.forEach(inst => {\n const adapter = inst.split('.')[0];\n if (this.jsonConfigs[adapter] && this.jsonConfigs[adapter].disabled) {\n return;\n }\n commons[inst] = {};\n ids.forEach(id => {\n const customObj = objects[id];\n const custom = customObj?.common?.custom ? customObj.common.custom[inst] || null : null;\n\n if (custom) {\n Object.keys(custom).forEach(_attr => {\n if (commons[inst][_attr] === undefined) {\n commons[inst][_attr] = custom[_attr];\n } else if (commons[inst][_attr] !== custom[_attr]) {\n // different\n if (!Array.isArray(commons[inst][_attr])) {\n commons[inst][_attr] = [commons[inst][_attr]];\n }\n\n !commons[inst][_attr].includes(custom[_attr]) && commons[inst][_attr].push(custom[_attr]);\n }\n });\n } else {\n // const adapter = inst.split('.')[0];\n // Calculate defaults for this object\n let _default = this.getDefaultValues(inst, customObj);\n _default.enabled = false;\n\n Object.keys(_default).forEach(_attr => {\n if (commons[inst][_attr] === undefined) {\n commons[inst][_attr] = _default[_attr];\n } else if (commons[inst][_attr] !== _default[_attr]) {\n // different\n if (!Array.isArray(commons[inst][_attr])) {\n commons[inst][_attr] = [commons[inst][_attr]];\n }\n\n !commons[inst][_attr].includes(_default[_attr]) && commons[inst][_attr].push(_default[_attr]);\n }\n });\n }\n });\n\n // sort all \"different\" arrays\n Object.keys(commons[inst]).forEach(attr => {\n if (Array.isArray(commons[inst][attr])) {\n commons[inst][attr].sort();\n }\n });\n });\n\n return commons;\n }\n\n isChanged(newValues) {\n newValues = newValues || this.state.newValues;\n return Object.keys(newValues)\n .find(instance => newValues[instance] === null || (newValues[instance] && Object.keys(newValues[instance])\n .find(attr => !attr.startsWith('_'))));\n }\n\n combineNewAndOld(instance, ignoreUnderscore) {\n const data = Object.assign({}, this.commonConfig[instance] || {}, this.state.newValues[instance] || {});\n\n if (ignoreUnderscore) {\n Object.keys(data).forEach(attr => {\n if (attr.startsWith('_')) {\n delete data[attr];\n }\n });\n }\n\n if (this.state.newValues[instance] === null) {\n data.enabled = false;\n }\n return data;\n }\n\n renderOneCustom(instance, instanceObj, customObj, i) {\n const adapter = instance.split('.')[0];\n\n const icon = `${URL_PREFIX}/adapter/${adapter}/${this.props.objects['system.adapter.' + adapter].common.icon}`;\n // could be: true, false, [true, false]\n const enabled = this.state.newValues[instance] !== undefined && (!this.state.newValues[instance] || this.state.newValues[instance].enabled !== undefined) ? !!(this.state.newValues[instance] && this.state.newValues[instance].enabled) : (this.state.newValues[instance] === null ? false : this.commonConfig[instance].enabled);\n const isIndeterminate = Array.isArray(enabled) && (!this.state.newValues[instance] || this.state.newValues[instance].enabled === undefined);\n\n const disabled = this.jsonConfigs[adapter] && this.jsonConfigs[adapter].json?.disabled;\n\n const data = this.combineNewAndOld(instance);\n\n if (disabled && this.jsonConfigs[adapter].json.hidden === true) {\n return null;\n }\n\n if (typeof this.jsonConfigs[adapter].json.hidden === 'string') {\n // evaluate function\n if (this._executeCustom(this.jsonConfigs[adapter].json.hidden, data, customObj, instanceObj, this.jsonConfigs[adapter].json.items, 'enabled', [])) {\n return null;\n }\n }\n\n return <Accordion\n key={ instance }\n id={ 'Accordion_' + instance }\n className={i % 2 ? this.props.classes.accordionOdd : this.props.classes.accordionEven}\n expanded={ this.state.expanded.includes(instance) }\n ref={ this.refTemplate[instance] }\n onChange={() => {\n const expanded = [...this.state.expanded];\n const pos = expanded.indexOf(instance);\n if (pos === -1) {\n expanded.push(instance);\n } else {\n expanded.splice(pos, 1);\n }\n window.localStorage.setItem('App.customsExpanded', JSON.stringify(expanded));\n pos === -1 && window.localStorage.setItem('App.customsLastExpanded', instance);\n this.setState({expanded});\n }}\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />} data-id={ instance } className={i % 2 ? (enabled ? this.props.classes.accordionHeaderEnabledOdd : this.props.classes.accordionHeaderOdd) : (enabled ? this.props.classes.accordionHeaderEnabledEven : this.props.classes.accordionHeaderEven)}>\n <img src={ icon } className={ this.props.classes.headingIcon } alt=\"\" />\n <Typography className={ this.props.classes.heading }>{ this.props.t('Settings %s', instance)}</Typography>\n <div className={ clsx(this.props.classes.titleEnabled, 'titleEnabled', enabled ? this.props.classes.enabledVisible : this.props.classes.enabledInvisible) }>{\n this.props.t('Enabled')\n }</div>\n </AccordionSummary>\n <AccordionDetails >\n <div className={this.props.classes.enabledControl}>\n <FormControlLabel\n className={ this.props.classes.formControl }\n control={<Checkbox\n indeterminate={ isIndeterminate }\n checked={ !!enabled }\n disabled={disabled}\n onChange={e => {\n const newValues = JSON.parse(JSON.stringify(this.state.newValues));\n\n newValues[instance] = newValues[instance] || {};\n if (isIndeterminate || e.target.checked) {\n newValues[instance].enabled = true;\n } else {\n if (enabled) {\n newValues[instance] = null;\n } else {\n delete newValues[instance];\n }\n }\n this.setState({newValues, hasChanges: this.isChanged(newValues)}, () =>\n this.props.onChange && this.props.onChange(this.state.hasChanges));\n }}/>}\n label={this.props.t('Enabled')}\n />\n </div>\n <div className={this.props.classes.customControls}>\n {!disabled && (enabled || isIndeterminate) ?\n <JsonConfigComponent\n instanceObj={instanceObj}\n customObj={customObj}\n custom={true}\n className={ '' }\n adapterName={adapter}\n instance={parseInt(instance.split('.').pop(), 10) || 0}\n socket={this.props.socket}\n theme={this.props.theme}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n multiEdit={this.props.objectIDs.length > 1}\n\n schema={this.jsonConfigs[adapter].json}\n data={data}\n onError={error =>\n this.setState({error}, () => this.props.onError && this.props.onError(error))}\n onValueChange={(attr, value) => {\n console.log(attr + ' => ' + value);\n const newValues = JSON.parse(JSON.stringify(this.state.newValues));\n newValues[instance] = newValues[instance] || {};\n if (this.commonConfig[instance][attr] === value) {\n delete newValues[instance][attr];\n if (!Object.keys(newValues[instance]).length) {\n delete newValues[instance];\n }\n } else {\n newValues[instance][attr] = value;\n }\n this.setState({newValues, hasChanges: this.isChanged(newValues)}, () =>\n this.props.onChange && this.props.onChange(this.state.hasChanges));\n }}\n /> : null}\n\n {disabled && this.jsonConfigs[adapter].json.help ?\n (typeof this.jsonConfigs[adapter].json.help === 'object' ?\n this.jsonConfigs[adapter].json.help[this.props.lang] ||\n this.jsonConfigs[adapter].json.help.en\n :\n this.props.t(this.jsonConfigs[adapter].json.help)) : null}\n </div>\n </AccordionDetails>\n </Accordion>;\n }\n\n isAllOk() {\n let allOk = true;\n /*Object.keys(this.refTemplate).forEach(id => {\n const adapter = id.replace(/\\.\\d+$/, '');\n // post init => add custom logic\n if (window.customPostOnSave.hasOwnProperty(adapter) && typeof window.customPostOnSave[adapter] === 'function') {\n // returns true if some problem detected\n if (window.customPostOnSave[adapter](window.$(this), id)) {\n allOk = false;\n }\n }\n });*/\n return allOk;\n }\n\n renderErrorMessage() {\n return !!this.state.error && <DialogError\n title={this.props.t('Error')}\n text={this.state.error}\n onClose={() => this.setState({ error: '' })}\n />;\n }\n\n getObject(objects, oldObjects, id) {\n if (objects[id]) {\n return Promise.resolve(objects[id]);\n } else {\n return this.props.socket.getObject(id)\n .then(obj => {\n oldObjects[id] = JSON.parse(JSON.stringify(obj));\n objects[id] = obj;\n return obj;\n });\n }\n }\n\n saveOneState(ids, cb, _objects, _oldObjects) {\n _objects = _objects || {};\n _oldObjects = _oldObjects || {};\n\n if (!ids || !ids.length) {\n // save all objects\n const keys = Object.keys(_objects);\n if (!keys.length) {\n this.setState({maxOids: null}, () =>\n this.props.onProgress(false));\n cb && cb();\n } else {\n this.setState({progress: Math.round(((this.state.maxOids - keys.length) / this.state.maxOids) * 50) + 50});\n const id = keys.shift();\n if (JSON.stringify(_objects[id].common) !== JSON.stringify(_oldObjects[id].common)) {\n !this.changedIds.includes(id) && this.changedIds.push(id);\n\n return this.props.socket.setObject(id, _objects[id])\n .then(() => {\n delete _objects[id];\n delete _oldObjects[id];\n return this.props.socket.getObject(id)\n .then(obj => {\n this.props.objects[id] = obj;\n setTimeout(() =>\n this.saveOneState(ids, cb, _objects, _oldObjects), 0);\n });\n });\n } else {\n delete _objects[id];\n delete _oldObjects[id];\n return setTimeout(() =>\n this.saveOneState(ids, cb, _objects, _oldObjects), 0);\n }\n }\n } else {\n const maxOids = this.state.maxOids || ids.length;\n if (this.state.maxOids === null) {\n this.setState({maxOids: ids.length}, () =>\n this.props.onProgress(true));\n }\n\n // 0 - 50\n this.setState({progress: Math.round(((maxOids - ids.length) / maxOids) * 50)});\n\n const id = ids.shift();\n this.getObject(_objects, _oldObjects, id)\n .then(obj => {\n if (!obj) {\n return window.alert(`Invalid object ${id}`);\n }\n\n // remove all disabled commons\n if (obj.common && obj.common.custom) {\n Object.keys(obj.common.custom).forEach(ins => {\n if (!obj.common.custom[ins] || !obj.common.custom[ins].enabled) {\n obj.common.custom[ins] = null;\n }\n });\n }\n\n const instances = Object.keys(this.state.newValues);\n\n for (let i = 0; i < instances.length; i++) {\n const instance = instances[i];\n // const adapter = instance.split('.')[0];\n const newValues = this.combineNewAndOld(instance, true);\n\n if (newValues.enabled === false) {\n if (obj.common && obj.common.custom && obj.common.custom[instance]) {\n obj.common.custom[instance] = null; // here must be null and not deleted, so controller can remove it\n }\n } else if (newValues.enabled) {\n obj.common = obj.common || {};\n if (Array.isArray(newValues.enabled)) {\n if (!obj.common.custom || !obj.common.custom[instance] || !obj.common.custom[instance].enabled) {\n // leave this object disabled\n if (obj.common.custom && obj.common.custom[instance]) {\n obj.common.custom[instance] = null;\n }\n continue; // instance disabled\n }\n }\n\n obj.common.custom = obj.common.custom || {};\n\n if (!obj.common.custom[instance] || !obj.common.custom[instance].enabled) {\n // provide defaults\n let _default = this.getDefaultValues(instance, obj);\n obj.common.custom[instance] = JSON.parse(JSON.stringify(_default || {}));\n }\n\n obj.common.custom[instance].enabled = true;\n\n Object.keys(newValues).forEach(attr => {\n // if not different\n if (!Array.isArray(newValues[attr])) {\n obj.common.custom[instance][attr] = newValues[attr];\n }\n });\n }\n }\n\n setTimeout(() =>\n this.saveOneState(ids, cb, _objects, _oldObjects), 0);\n });\n }\n }\n\n renderConfirmationDialog() {\n if (!this.state.showConfirmation) {\n return false;\n } else {\n return <ConfirmDialog\n text={this.props.t('The changes will be applied to %s states. Are you sure?', this.props.objectIDs.length)}\n ok={this.props.t('Yes')}\n onClose={result => {\n if (result) {\n this.setState({showConfirmation: false, confirmed: true}, () => {\n const cb = this.cb;\n this.cb = null;\n this.onSave(cb);\n });\n } else {\n this.cb = null;\n this.setState({showConfirmation: false});\n }\n }}\n />;\n }\n }\n\n onSave = cb => {\n if (this.props.objectIDs.length > 10 && !this.state.confirmed) {\n this.cb = cb;\n return this.setState({showConfirmation: true});\n }\n\n this.saveOneState([...this.props.objectIDs], () => {\n this.changedItems = [];\n this.newValues = {};\n this.commonConfig = this.getCommonConfig();\n this.setState({ confirmed: false, hasChanges: false, newValues: {}}, () => {\n this.props.reportChangedIds(this.changedIds);\n this.props.onChange(false, true);\n cb && setTimeout(() => cb(), 100);\n });\n });\n };\n\n render() {\n if (this.customObj === null) {\n return <div style={{color: '#F55', fontSize: 32}}>{this.props.t('Object does not exist!')}</div>;\n }\n if (!this.state.loaded) {\n return <LinearProgress />;\n }\n let index = 0;\n\n return <Paper className={ this.props.classes.paper }>\n {this.state.maxOids > 1 && <LinearProgress color=\"secondary\" variant=\"determinate\" value={this.state.progress} />}\n <div className={ this.props.classes.scrollDiv } ref={ this.scrollDivRef }>\n {this.state.maxOids === null && Object.keys(this.jsonConfigs).map(adapter => {\n if (this.jsonConfigs[adapter]) {\n return Object.keys(this.jsonConfigs[adapter].instanceObjs)\n .map(instance =>\n this.renderOneCustom(instance, this.jsonConfigs[adapter].instanceObjs[instance], this.customObj, index++));\n } else {\n return null;\n }\n })}\n </div>\n { this.renderErrorMessage() }\n { this.renderConfirmationDialog() }\n </Paper>;\n }\n}\n\nObjectCustomEditor.propTypes = {\n t: PropTypes.func,\n onChange: PropTypes.func, // function onChange(haveChanges)\n lang: PropTypes.string,\n expertMode: PropTypes.bool,\n objects: PropTypes.object,\n customsInstances: PropTypes.array,\n socket: PropTypes.object,\n objectIDs: PropTypes.array,\n theme: PropTypes.object,\n themeName: PropTypes.string,\n themeType: PropTypes.string,\n registerSaveFunc: PropTypes.func,\n onProgress: PropTypes.func,\n onError: PropTypes.func,\n};\n\nexport default withWidth()(withStyles(styles)(ObjectCustomEditor));\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport withWidth from '@material-ui/core/withWidth';\nimport {withStyles} from '@material-ui/core/styles';\nimport clsx from 'clsx';\n\nimport {\n MuiPickersUtilsProvider,\n KeyboardTimePicker,\n KeyboardDatePicker,\n} from '@material-ui/pickers';\nimport Paper from '@material-ui/core/Paper';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport IconButton from '@material-ui/core/IconButton';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Button from '@material-ui/core/Button';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport Grid from '@material-ui/core/Grid';\nimport Table from '@material-ui/core/Table';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport TableCell from '@material-ui/core/TableCell';\nimport TextField from '@material-ui/core/TextField';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableContainer from '@material-ui/core/TableContainer';\n\nimport DateFnsUtils from '@date-io/date-fns';\nimport frLocale from 'date-fns/locale/fr';\nimport ruLocale from 'date-fns/locale/ru';\nimport enLocale from 'date-fns/locale/en-US';\nimport esLocale from 'date-fns/locale/es';\nimport plLocale from 'date-fns/locale/pl';\nimport ptLocale from 'date-fns/locale/pt';\nimport itLocale from 'date-fns/locale/it';\nimport cnLocale from 'date-fns/locale/zh-CN';\nimport brLocale from 'date-fns/locale/pt-BR';\nimport deLocale from 'date-fns/locale/de';\nimport nlLocale from 'date-fns/locale/nl';\n\nimport Utils from '@iobroker/adapter-react/Components/Utils';\n\n// icons\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport { FaPlusSquare as InsertIcon} from 'react-icons/fa';\nimport { FaDownload as ExportIcon} from 'react-icons/fa';\nimport IconDelete from '@material-ui/icons/Delete';\nimport IconClose from '@material-ui/icons/Close';\n\nconst localeMap = {\n en: enLocale,\n fr: frLocale,\n ru: ruLocale,\n de: deLocale,\n es: esLocale,\n br: brLocale,\n nl: nlLocale,\n it: itLocale,\n pt: ptLocale,\n pl: plLocale,\n 'zh-cn': cnLocale,\n};\n\nfunction padding3(ms) {\n if (ms < 10) {\n return '00' + ms;\n } else if (ms < 100) {\n return '0' + ms;\n } else {\n return ms;\n }\n}\n\nfunction padding2(num) {\n if (num < 10) {\n return '0' + num;\n } else {\n return num;\n }\n}\n\nconst styles = theme => ({\n paper: {\n height: '100%',\n maxHeight: '100%',\n maxWidth: '100%',\n overflow: 'hidden',\n },\n tableDiv: {\n height: `calc(100% - ${theme.mixins.toolbar.minHeight + theme.spacing(1)}px)`,\n overflow: 'hidden',\n width: '100%',\n },\n container: {\n height: '100%'\n },\n table: {\n tableLayout: 'fixed',\n minWidth: 960,\n '& td:nth-of-type(5)': {\n overflow: 'hidden',\n whiteSpace: 'nowrap'\n }\n },\n row: {\n userSelect: 'none',\n /*'&:nth-of-type(odd)': {\n backgroundColor: theme.palette.background.default,\n },*/\n position: 'relative',\n '&:hover': {\n opacity: 0.7,\n },\n '& td': {\n position: 'relative',\n }\n },\n updatedRow: {\n animation: 'updated 1s',\n },\n rowInterpolated: {\n opacity: 0.5\n },\n selectHistoryControl: {\n width: 130,\n },\n selectRelativeTime: {\n marginLeft: 10,\n width: 200,\n },\n notAliveInstance: {\n opacity: 0.5,\n },\n customRange: {\n color: theme.palette.primary.main\n },\n rowSelected: {\n background: theme.palette.secondary.main,\n },\n rowFocused: {\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n margin: 3,\n border: '1px dotted ' + theme.palette.action.active,\n },\n grow: {\n flexGrow: 1,\n },\n editorTimePicker: {\n marginLeft: theme.spacing(1),\n width: 120,\n },\n editorDatePicker: {\n marginLeft: theme.spacing(1),\n width: 150,\n },\n msInput: {\n width: 50,\n paddingTop: 16,\n marginLeft: 5,\n '& label': {\n marginTop: 15\n }\n },\n cellAckTrue: {\n color: '#66ff7f',\n },\n cellAckFalse: {\n color: '#FF6666',\n },\n toolbarTime: {\n width: 100,\n marginTop: 9,\n marginLeft: theme.spacing(1),\n },\n toolbarDate: {\n width: 160,\n marginTop: 9,\n },\n toolbarTimeGrid: {\n marginLeft: theme.spacing(1),\n paddingLeft: theme.spacing(1),\n paddingRight: theme.spacing(1),\n border: '1px dotted #AAAAAA',\n borderRadius: theme.spacing(1),\n },\n noLoadingProgress: {\n width: '100%',\n height: 4,\n },\n\n colValue: {\n\n },\n colAck: {\n width: 50,\n },\n colFrom: {\n width: 150,\n },\n colLastChange: {\n width: 200,\n },\n colTs: {\n width: 200,\n },\n});\n\nclass ObjectHistoryData extends Component {\n constructor(props) {\n super(props);\n\n let relativeRange = window.localStorage.getItem('App.relativeRange') || 'absolute';\n let start = parseInt(window.localStorage.getItem('App.absoluteStart'), 10) || 0;\n let end = parseInt(window.localStorage.getItem('App.absoluteEnd'), 10) || 0;\n let selected = window.localStorage.getItem('App.historySelected') || '';\n let lastSelected = parseInt(window.localStorage.getItem('App.historyLastSelected'), 10) || null;\n let lastSelectedColumn = window.localStorage.getItem('App.historyLastSelectedColumn') || null;\n\n if ((!start || !end) && (!relativeRange || relativeRange === 'absolute')) {\n relativeRange = '30';\n }\n\n if (start && end) {\n relativeRange = 'absolute';\n }\n\n try {\n selected = JSON.parse(selected);\n } catch (e) {\n selected = [];\n }\n\n this.state = {\n loaded: false,\n min: null,\n max: null,\n start,\n end,\n values: null,\n relativeRange,\n selected,\n lastSelected,\n lastSelectedColumn,\n historyInstance: '',\n updateOpened: false,\n insertOpened: false,\n historyInstances: null,\n defaultHistory: '',\n lcVisible: true,\n qVisible: true,\n ackVisible: true,\n fromVisible: true,\n supportedFeatures: [],\n dateFormat: 'dd.MM.yyyy',\n edit: {}\n };\n this.adminInstance = parseInt(window.location.search.slice(1), 10) || 0;\n\n this.supportedFeaturesPromises = {};\n\n this.unit = this.props.obj.common && this.props.obj.common.unit ? ' ' + this.props.obj.common.unit : '';\n\n this.timeTimer = null;\n\n this.prepareData()\n .then(() => this.readHistoryRange())\n .then(() => {\n if (relativeRange !== 'absolute') {\n this.setRelativeInterval(this.state.relativeRange, true);\n } else {\n this.readHistory();\n }\n });\n }\n\n readSupportedFeatures(historyInstance) {\n historyInstance = historyInstance || this.state.historyInstance;\n if (!historyInstance) {\n return Promise.resolve([]);\n } else\n if (this.supportedFeaturesPromises[historyInstance]) {\n return this.supportedFeaturesPromises[historyInstance];\n }\n\n this.supportedFeaturesPromises[historyInstance] = new Promise(resolve => {\n this.readSupportedFeaturesTimeout && clearTimeout(this.readSupportedFeaturesTimeout);\n this.readSupportedFeaturesTimeout = setTimeout(() => {\n this.readSupportedFeaturesTimeout = null;\n resolve([]);\n }, 2000);\n\n this.props.socket.sendTo(historyInstance, 'features', null)\n .then(result => {\n if (this.readSupportedFeaturesTimeout) {\n this.readSupportedFeaturesTimeout && clearTimeout(this.readSupportedFeaturesTimeout);\n this.readSupportedFeaturesTimeout = null;\n resolve(result ? result.supportedFeatures || [] : []);\n } else {\n this.setState({ supportedFeatures: result ? result.supportedFeatures || [] : [] });\n }\n });\n });\n return this.supportedFeaturesPromises[historyInstance];\n }\n\n componentDidMount() {\n this.props.socket.subscribeState(this.props.obj._id, this.onChange);\n }\n\n componentWillUnmount() {\n this.timeTimer && clearTimeout(this.timeTimer);\n this.timeTimer = null;\n\n this.props.socket.unsubscribeState(this.props.obj._id, this.onChange);\n }\n\n onChange = (id, state) => {\n if (id === this.props.obj._id &&\n state &&\n this.state.values &&\n (!this.state.values.length || this.state.values[this.state.values.length - 1].ts < state.ts)) {\n const values = [...this.state.values, state];\n this.setState({ values });\n }\n }\n\n prepareData() {\n let list;\n return this.getHistoryInstances()\n .then(_list => {\n list = _list;\n // read default history\n return this.props.socket.getCompactSystemConfig();\n })\n .then(config => {\n const defaultHistory = config && config.common && config.common.defaultHistory;\n\n // find current history\n // first read from localstorage\n let historyInstance = window.localStorage.getItem('App.historyInstance') || '';\n if (!historyInstance || !list.find(it => it.id === historyInstance && it.alive)) {\n // try default history\n historyInstance = defaultHistory;\n }\n if (!historyInstance || !list.find(it => it.id === historyInstance && it.alive)) {\n // find first alive history\n historyInstance = list.find(it => it.alive);\n if (historyInstance) {\n historyInstance = historyInstance.id;\n }\n }\n // get first entry\n if (!historyInstance && list.length) {\n historyInstance = defaultHistory;\n }\n return this.readSupportedFeatures(historyInstance)\n .then(supportedFeatures => new Promise(resolve => {\n // supportedFeatures = ['insert', 'update', 'delete'];\n\n this.setState({\n historyInstances: list,\n defaultHistory,\n historyInstance,\n supportedFeatures,\n dateFormat: (config.common.dateFormat || 'dd.MM.yyyy').replace(/D/g, 'd').replace(/Y/g, 'y')\n }, () => resolve());\n }));\n });\n }\n\n getHistoryInstances() {\n const list = [];\n const ids = [];\n this.props.customsInstances.forEach(instance => {\n const instObj = this.props.objects['system.adapter.' + instance];\n if (instObj && instObj.common && instObj.common.getHistory) {\n let listObj = {id: instance, alive: false};\n list.push(listObj);\n ids.push(`system.adapter.${instance}.alive`);\n }\n });\n\n if (ids.length) {\n return this.props.socket.getForeignStates(ids)\n .then(alives => {\n Object.keys(alives).forEach(id => {\n const item = list.find(it => id.endsWith(it.id + '.alive'));\n if (item) {\n item.alive = alives[id] && alives[id].val;\n }\n });\n return list;\n });\n } else {\n return Promise.resolve(list);\n }\n }\n\n readHistory(start, end) {\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 start = start || this.state.start;\n end = end || this.state.end;\n\n if (!this.state.historyInstance) {\n return null;\n }\n\n this.setState({ loading: true });\n return this.props.socket.getHistory(this.props.obj._id, {\n instance: this.state.historyInstance,\n start,\n end,\n from: true,\n ack: true,\n q: true,\n addID: false,\n aggregate: 'none'\n }).then(values => {\n // merge range and chart\n let chart = [];\n let range = this.rangeValues;\n let lcVisible = false;\n let qVisible = false;\n let ackVisible = false;\n let fromVisible = false;\n let cVisible = false;\n\n // get the very first item\n if (range && range.length && (!values || !values.length || range[0].ts < values[0].ts)) {\n chart.push(range[0]);\n chart.push({ts: range[0].ts + 1, e: true});\n console.log(`add ${new Date(range[0].ts).toISOString()}: ${range[0].val}`);\n if (!qVisible && range[0].q !== undefined) {\n qVisible = true;\n }\n if (!ackVisible && range[0].ack !== undefined) {\n ackVisible = true;\n }\n if (!fromVisible && range[0].from) {\n fromVisible = true;\n }\n if (!cVisible && range[0].c) {\n cVisible = true;\n }\n }\n\n if (values && values.length) {\n for (let t = 0; t < values.length; t++) {\n // if range and details are not equal\n if (values[t] && (!chart.length || chart[chart.length - 1].ts < values[t].ts)) {\n chart.push(values[t]);\n if (values[t].from) {\n if (values[t].from.startsWith('system.adapter.')) {\n values[t].from = values[t].from.substring(15);\n } else if (values[t].from.startsWith('system.host.')) {\n values[t].from = values[t].from.substring(7);\n }\n }\n if (!lcVisible && values[t].lc) {\n lcVisible = true;\n }\n if (!qVisible && values[t].q !== undefined) {\n qVisible = true;\n }\n if (!ackVisible && values[t].ack !== undefined) {\n ackVisible = true;\n }\n if (!fromVisible && values[t].from) {\n fromVisible = true;\n }\n if (!cVisible && values[t].c) {\n cVisible = true;\n }\n console.log(`add value ${new Date(values[t].ts).toISOString()}: ${values[t].val}`)\n } else if (chart[chart.length - 1].ts === values[t].ts && chart[chart.length - 1].val !== values[t].ts) {\n console.error('Strange data!');\n }\n }\n } else {\n chart.push({noDataForPeriod: true});\n }\n\n if (!chart.length) {\n chart.push({noData: true});\n }\n\n this.setState( {loading: false, values: chart, lcVisible, fromVisible, qVisible, ackVisible, cVisible});\n });\n }\n\n readHistoryRange() {\n const now = new Date();\n const oldest = new Date(2000, 0, 1);\n\n this.setState({ loading: true });\n return this.props.socket.getHistory(this.props.obj._id, {\n instance: this.state.historyInstance,\n start: oldest.getTime(),\n end: now.getTime(),\n step: 3600000 * 24 * 30, // monthly\n from: false,\n ack: false,\n q: false,\n addID: false,\n aggregate: 'minmax'\n })\n .then(values => {\n if (values.length) {\n // remove interpolated first value\n if (values[0].val === null || values[0].ts === oldest.getTime()) {\n values.shift();\n }\n // mark interpolated\n values.forEach(it => it.i = true);\n this.rangeValues = values;\n this.setState({ min: values[0].ts, max: values[values.length - 1].ts, loading: false, });\n } else {\n this.rangeValues = [];\n this.setState({ loading: false, });\n }\n });\n }\n\n onToggleSelect(e, ts, column) {\n let selected = [...this.state.selected];\n const pos = selected.indexOf(ts);\n if (e.shiftKey && this.state.lastSelected) {\n let pps = -1;\n let ppls = -1;\n selected = [];\n for (let i = 0; i < this.state.values.length; i++) {\n if (this.state.values[i].ts === ts) {\n pps = i;\n ppls !== pps && selected.push(this.state.values[i].ts);\n if (pps !== -1 && ppls !== -1) {\n break;\n }\n }\n if (this.state.values[i].ts === this.state.lastSelected) {\n ppls = i;\n ppls !== pps && selected.push(this.state.values[i].ts);\n if (pps !== -1 && ppls !== -1) {\n break;\n }\n }\n if (pps !== -1 || ppls !== -1) {\n selected.push(this.state.values[i].ts);\n }\n }\n } else\n if (e.ctrlKey) {\n if (pos !== -1) {\n selected.splice(pos, 1);\n } else {\n selected.push(ts);\n }\n selected.sort();\n } else {\n selected = [ts];\n }\n\n window.localStorage.setItem('App.historyLastSelected', ts.toString());\n window.localStorage.setItem('App.historyLastSelectedColumn', column);\n window.localStorage.setItem('App.historySelected', JSON.stringify(selected));\n this.setState({selected, lastSelected: ts, lastSelectedColumn: column});\n }\n\n getTableRows(classes) {\n const rows = [];\n for (let r = this.state.values.length - 1; r >= 0; r--) {\n const state = this.state.values[r];\n const ts = state.ts;\n if (state.e) {\n rows.push(<TableRow\n className={ clsx(classes.row, classes.updatedRow, classes.rowInterpolated) }\n key={ ts }\n hover\n >\n <TableCell/>\n <TableCell>...</TableCell>\n {this.state.ackVisible ? <TableCell/> : null}\n {this.state.fromVisible ? <TableCell/> : null}\n { this.state.lcVisible ? <TableCell/> : null }\n </TableRow>);\n } else\n if (state.noData || state.noDataForPeriod) {\n rows.push(<TableRow\n className={ clsx(classes.row, classes.updatedRow, classes.rowNoData) }\n key={ state.noData ? 'nodata' : ''}\n hover\n >\n <TableCell/>\n <TableCell>{ state.noData ? this.props.t('No data in history') : this.props.t('No data in history for selected period')}</TableCell>\n {this.state.ackVisible ? <TableCell/> : null}\n {this.state.fromVisible ? <TableCell/> : null}\n { this.state.lcVisible ? <TableCell/> : null }\n </TableRow>);\n } else {\n const interpolated = state.i;\n const selected = this.state.lastSelected === ts;\n let val = state.val;\n if (this.props.isFloatComma && this.props.obj.common.type === 'number' && val) {\n val = val.toString().replace('.', ',');\n }\n if (val === null) {\n val = 'null'\n }\n if (val === undefined) {\n val = '_'\n }\n\n rows.push(<TableRow\n className={ clsx(\n classes.row, classes.updatedRow,\n interpolated && classes.rowInterpolated,\n this.state.selected.includes(ts) && classes.rowSelected) }\n key={ ts + (state.val || '') }\n >\n <TableCell onClick={ e => !interpolated && this.onToggleSelect(e, ts, 'ts') }>\n { `${new Date(state.ts).toLocaleDateString()} ${new Date(state.ts).toLocaleTimeString()}.${padding3(state.ts % 1000)}` }\n { selected && this.state.lastSelectedColumn === 'ts' ? <div className={ classes.rowFocused } /> : ''}\n </TableCell>\n <TableCell onClick={ e => !interpolated && this.onToggleSelect(e, ts, 'val') }>\n { val + this.unit }\n { selected && this.state.lastSelectedColumn === 'val' ? <div className={ classes.rowFocused } /> : ''}\n </TableCell>\n { this.state.ackVisible ? <TableCell onClick={ e => !interpolated && this.onToggleSelect(e, ts, 'ack') } className={ state.ack ? classes.cellAckTrue : classes.cellAckFalse}>\n { state.ack ? 'true' : 'false' }\n { selected && this.state.lastSelectedColumn === 'ack' ? <div className={ classes.rowFocused } /> : ''}\n </TableCell> : null }\n { this.state.fromVisible ? <TableCell onClick={ e => !interpolated && this.onToggleSelect(e, ts, 'from') }>\n { state.from || '' }\n { selected && this.state.lastSelectedColumn === 'from' ? <div className={ classes.rowFocused } /> : ''}\n </TableCell> : null }\n { this.state.lcVisible ? <TableCell onClick={ e => !interpolated && this.onToggleSelect(e, ts, 'lc') }>\n { state.lc ? `${new Date(state.lc).toLocaleDateString()} ${new Date(state.lc).toLocaleTimeString()}.${padding3(state.ts % 1000)}` : '' }\n { selected && this.state.lastSelectedColumn === 'lc' ? <div className={ classes.rowFocused } /> : ''}\n </TableCell> : null }\n </TableRow>);\n }\n }\n\n return rows;\n }\n\n shiftTime() {\n const now = new Date();\n const delay = 60000 - now.getSeconds() - (1000 - now.getMilliseconds());\n\n if (now.getMilliseconds()) {\n now.setMilliseconds(1000);\n }\n if (now.getSeconds()) {\n now.setSeconds(60);\n }\n\n const end = now.getTime();\n let start;\n let mins = this.state.relativeRange;\n\n if (mins === 'day') {\n now.setHours(0);\n now.setMinutes(0);\n start = now.getTime();\n } else if (mins === 'week') {\n now.setHours(0);\n now.setMinutes(0);\n now.setFullYear(now.getFullYear() - 1);\n // find week start\n if (now.getDay()) { // if not sunday\n now.setDate(now.getDate() - now.getDay() - 1);\n } else {\n now.setDate(now.getDate() - 6);\n }\n\n } else if (mins === '2weeks') {\n now.setHours(0);\n now.setMinutes(0);\n now.setFullYear(now.getFullYear() - 1);\n // find week start\n if (now.getDay()) { // if not sunday\n now.setDate(now.getDate() - now.getDay() - 8);\n } else {\n now.setDate(now.getDate() - 13);\n }\n } else if (mins === 'month') {\n now.setHours(0);\n now.setMinutes(0);\n now.setDate(1);\n start = now.getTime();\n } else if (mins === 'year') {\n now.setHours(0);\n now.setMinutes(0);\n now.setDate(1);\n now.setMonth(0);\n start = now.getTime();\n } else if (mins === '12months') {\n now.setHours(0);\n now.setMinutes(0);\n now.setFullYear(now.getFullYear() - 1);\n start = now.getTime();\n } else {\n mins = parseInt(mins, 10);\n start = end - mins * 60000;\n }\n\n this.setState({ start, end }, () => this.readHistory());\n\n this.timeTimer = setTimeout(() => {\n this.timeTimer = null;\n this.shiftTime();\n }, delay || 60000);\n }\n\n setRelativeInterval(mins, dontSave) {\n if (!dontSave) {\n window.localStorage.setItem('App.relativeRange', mins);\n this.setState({ relativeRange: mins });\n }\n if (mins === 'absolute') {\n this.timeTimer && clearTimeout(this.timeTimer);\n this.timeTimer = null;\n return;\n } else {\n window.localStorage.removeItem('App.absoluteStart');\n window.localStorage.removeItem('App.absolute');\n }\n\n const now = new Date();\n\n if (!this.timeTimer) {\n const delay = 60000 - now.getSeconds() - (1000 - now.getMilliseconds());\n this.timeTimer = setTimeout(() => {\n this.timeTimer = null;\n this.shiftTime();\n }, delay || 60000);\n }\n\n if (now.getMilliseconds()) {\n now.setMilliseconds(1000);\n }\n if (now.getSeconds()) {\n now.setSeconds(60);\n }\n\n const end = now.getTime();\n let start;\n\n if (mins === 'day') {\n now.setHours(0);\n now.setMinutes(0);\n start = now.getTime();\n } else if (mins === 'week') {\n now.setHours(0);\n now.setMinutes(0);\n now.setFullYear(now.getFullYear() - 1);\n // find week start\n if (now.getDay()) { // if not sunday\n now.setDate(now.getDate() - now.getDay() - 1);\n } else {\n now.setDate(now.getDate() - 6);\n }\n\n } else if (mins === '2weeks') {\n now.setHours(0);\n now.setMinutes(0);\n now.setFullYear(now.getFullYear() - 1);\n // find week start\n if (now.getDay()) { // if not sunday\n now.setDate(now.getDate() - now.getDay() - 8);\n } else {\n now.setDate(now.getDate() - 13);\n }\n } else if (mins === 'month') {\n now.setHours(0);\n now.setMinutes(0);\n now.setDate(1);\n start = now.getTime();\n } else if (mins === 'year') {\n now.setHours(0);\n now.setMinutes(0);\n now.setDate(1);\n now.setMonth(0);\n start = now.getTime();\n } else if (mins === '12months') {\n now.setHours(0);\n now.setMinutes(0);\n now.setFullYear(now.getFullYear() - 1);\n start = now.getTime();\n } else {\n mins = parseInt(mins, 10);\n start = end - mins * 60000;\n }\n\n this.setState({ start, end }, () =>\n this.readHistory());\n }\n\n renderTable() {\n if (this.state.values) {\n const { classes } = this.props;\n\n return <TableContainer className={ classes.container }>\n <Table stickyHeader size=\"small\" className={ classes.table }>\n <TableHead>\n <TableRow>\n <TableCell className={ classes.colTs }>\n { this.props.t('Timestamp') }\n </TableCell>\n <TableCell className={ classes.colValue }>\n { this.props.t('Value') }\n </TableCell>\n {this.state.ackVisible ? <TableCell className={ classes.colAck }>\n { this.props.t('Ack') }\n </TableCell> : null}\n {this.state.fromVisible ? <TableCell className={ classes.colFrom }>\n { this.props.t('From') }\n </TableCell> : null}\n\n {this.state.lcVisible ? <TableCell className={ classes.colLastChange }>\n { this.props.t('Last change') }\n </TableCell> : null}\n </TableRow>\n </TableHead>\n <TableBody>{ this.getTableRows(classes) }</TableBody>\n </Table>\n </TableContainer>;\n } else {\n return <LinearProgress/>;\n }\n }\n\n renderConfirmDialog() {\n return <Dialog\n open={ !!this.state.areYouSure }\n onClose={ () => this.setState({ areYouSure: false }) }\n aria-labelledby=\"alert-dialog-title\"\n aria-describedby=\"alert-dialog-description\"\n >\n\n <DialogTitle id=\"alert-dialog-title\">{ }</DialogTitle>\n <DialogContent>\n <DialogContentText id=\"alert-dialog-description\">\n { this.props.t('Are you sure?') }\n </DialogContentText>\n <FormControlLabel\n control={<Checkbox value={ this.state.suppressMessage } onChange={() => this.setState({ suppressMessage: true }) }/>}\n label={ this.props.t('Suppress for 5 minutes') }\n />\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={ () => this.setState({ areYouSure: false, suppressMessage: this.state.suppressMessage && Date.now() }, () => this.onDelete())}\n color=\"primary\"\n autoFocus\n startIcon={<IconDelete />}\n >{ this.props.t('Delete') }</Button>\n <Button variant=\"contained\" onClick={ () => this.setState({ areYouSure: false }) } color=\"secondary\" startIcon={<IconClose />}>{ this.props.t('Cancel') }</Button>\n </DialogActions>\n </Dialog>;\n }\n\n onDelete() {\n const tasks = this.state.selected.map(ts => ({state: {ts}, id: this.props.obj._id}));\n this.props.socket.sendTo(this.state.historyInstance, 'delete', tasks)\n .then(() =>\n this.readHistory());\n }\n\n onUpdate() {\n let val = this.state.edit.val;\n\n if (this.props.obj.common) {\n if (this.props.obj.common.type === 'number') {\n if (typeof val !== 'number') {\n val = parseFloat(val.replace(',', '.'));\n }\n } else if (this.props.obj.common.type === 'boolean') {\n val = val === 'true' || val === 'TRUE' || val === true || val === '1' || val === 1;\n }\n }\n\n const state = {\n val,\n ack: this.state.edit.ack,\n ts: this.state.selected[0],\n from: 'system.adapter.admin.' + this.adminInstance,\n q: this.state.edit.q,\n };\n Object.keys(state).forEach(attr => {\n if (state[attr] === undefined) {\n delete state[attr];\n }\n });\n if (!this.state.lcVisible && state.lc) {\n delete state.lc;\n }\n this.props.socket.sendTo(this.state.historyInstance, 'update', [{id: this.props.obj._id, state}])\n .then(() =>\n this.readHistory());\n }\n\n onInsert() {\n let val = this.state.edit.val;\n\n if (this.props.obj.common) {\n if (this.props.obj.common.type === 'number') {\n val = parseFloat(val.replace(',', '.'));\n } else if (this.props.obj.common.type === 'boolean') {\n val = val === 'true' || val === 'TRUE' || val === true || val === '1' || val === 1;\n }\n }\n\n const ts = this.state.edit.date;\n ts.setHours(this.state.edit.time.getHours());\n ts.setMinutes(this.state.edit.time.getMinutes());\n ts.setSeconds(this.state.edit.time.getSeconds());\n ts.setMilliseconds(parseInt(this.state.edit.ms, 10));\n\n const state = {\n ts: ts.getTime(),\n val,\n ack: this.state.edit.ack,\n from: 'system.adapter.admin.' + this.adminInstance,\n q: this.state.edit.q || 0,\n };\n\n if (!this.state.lcVisible && state.lc) {\n delete state.lc;\n }\n\n Object.keys(state).forEach(attr => {\n if (state[attr] === undefined) {\n delete state[attr];\n }\n });\n this.props.socket.sendTo(this.state.historyInstance, 'insert', [{id: this.props.obj._id, state}])\n .then(() =>\n this.readHistory());\n }\n\n formatTime(ms) {\n const time = new Date(ms);\n return `${padding2(time.getHours())}:${padding2(time.getMinutes())}:${padding2(time.getSeconds())}.${padding3(time.getMilliseconds())}`;\n }\n\n formatDate(ms) {\n const time = new Date(ms);\n return `${padding2(time.getDate())}.${padding2(time.getMonth() + 1)}.${time.getFullYear()}`;\n }\n\n updateEdit(name, value) {\n const edit = JSON.parse(JSON.stringify(this.state.edit));\n edit.time = new Date(edit.time);\n edit.date = new Date(edit.date);\n edit[name] = value;\n\n this.setState({edit});\n }\n\n renderEditDialog() {\n return <Dialog\n open={ this.state.updateOpened || this.state.insertOpened }\n onClose={ () => this.setState({ updateOpened: false, insertOpened: false }) }\n aria-labelledby=\"edit-dialog-title\"\n aria-describedby=\"edit-dialog-description\"\n >\n <DialogTitle id=\"edit-dialog-title\">{ this.state.updateOpened ? this.props.t('Update entry') : this.props.t('Insert entry') }</DialogTitle>\n <DialogContent>\n <form className={ this.props.classes.dialogForm } noValidate autoComplete=\"off\">\n {typeof this.state.edit.val === 'boolean' ?\n <FormControlLabel\n control={<Checkbox\n checked={this.state.edit.val}\n onChange={e => this.updateEdit('val', e.target.checked)}\n />}\n label={this.props.t('Value')}\n />\n :\n <TextField\n label={this.props.t('Value')}\n value={this.state.edit.val}\n onChange={e => this.updateEdit('val', e.target.value)}\n />\n }\n <br/>\n <FormControlLabel\n control={<Checkbox\n checked={ this.state.edit.ack }\n onChange={e => this.updateEdit('ack', e.target.checked)}/>}\n label={ this.props.t('Acknowledged') }\n />\n\n {this.state.insertOpened ?\n <MuiPickersUtilsProvider utils={DateFnsUtils} locale={localeMap[this.props.lang]}>\n <Grid container justify=\"space-around\">\n <KeyboardDatePicker\n className={ this.props.classes.editorDatePicker}\n margin=\"normal\"\n label={this.props.t('Date')}\n //format=\"fullDate\"\n format={this.state.dateFormat}\n value={ this.state.edit.date }\n onChange={date =>\n this.updateEdit('date', date)}\n />\n {/*<TextField\n label=this.props.t('Date')\n defaultValue={ this.edit.date }\n InputLabelProps={{\n shrink: true,\n }}\n onChange={e => this.edit.date = e.target.value}\n />*/}\n <KeyboardTimePicker\n margin=\"normal\"\n views={['hours', 'minutes', 'seconds']}\n label={this.props.t('Time')}\n ampm={false}\n format=\"HH:mm:ss\"\n className={ this.props.classes.editorTimePicker}\n value={ this.state.edit.time }\n onChange={time =>\n this.updateEdit('time', time)}\n />\n {/*<TextField\n className={ this.props.classes.editorTimePicker}\n label={ this.props.t('Value') }\n defaultValue={ this.edit.time }\n onChange={e => this.edit.time = e.target.value}\n />*/}\n <TextField\n classes={{root: this.props.classes.msInput}}\n label={ this.props.t('ms') }\n type=\"number\"\n inputProps={{max: 999, min: 0}}\n value={ this.state.edit.ms }\n onChange={e => this.updateEdit('ms', e.target.value) }\n />\n </Grid>\n </MuiPickersUtilsProvider>\n : null }\n </form>\n </DialogContent>\n <DialogActions>\n <Button variant=\"contained\" onClick={ () => {\n const isUpdate = this.state.updateOpened;\n this.setState({ updateOpened: false, insertOpened: false }, () =>\n isUpdate ? this.onUpdate() : this.onInsert());\n }}\n color=\"primary\" autoFocus>{ this.state.updateOpened ? this.props.t('Update') : this.props.t('Add') }</Button>\n <Button variant=\"contained\" onClick={ () => this.setState({ updateOpened: false, insertOpened: false }) }>{ this.props.t('Cancel') }</Button>\n </DialogActions>\n </Dialog>;\n }\n\n setStartDate(start) {\n start = start.getTime();\n if (this.timeTimer) {\n clearTimeout(this.timeTimer);\n this.timeTimer = null;\n }\n window.localStorage.setItem('App.relativeRange', 'absolute');\n window.localStorage.setItem('App.absoluteStart', start);\n window.localStorage.setItem('App.absoluteEnd', this.state.end);\n this.setState({ start, relativeRange: 'absolute' }, () => this.readHistory());\n }\n\n setEndDate(end) {\n end = end.getTime();\n window.localStorage.setItem('App.relativeRange', 'absolute');\n window.localStorage.setItem('App.absoluteStart', this.state.start);\n window.localStorage.setItem('App.absoluteEnd', end);\n if (this.timeTimer) {\n clearTimeout(this.timeTimer);\n this.timeTimer = null;\n }\n this.setState({ end, relativeRange: 'absolute' }, () => this.readHistory());\n }\n\n renderToolbar() {\n const classes = this.props.classes;\n return <Toolbar>\n <FormControl className={ classes.selectHistoryControl }>\n <InputLabel>{ this.props.t('History instance') }</InputLabel>\n <Select\n value={ this.state.historyInstance}\n onChange={ e => {\n const historyInstance = e.target.value;\n window.localStorage.setItem('App.historyInstance', historyInstance);\n this.readSupportedFeatures(historyInstance)\n .then(supportedFeatures =>\n this.setState({ historyInstance, supportedFeatures }, () =>\n this.readHistory()));\n }}\n >\n { this.state.historyInstances.map(it => <MenuItem key={ it.id } value={ it.id } className={ clsx(!it.alive && classes.notAliveInstance )}>{ it.id }</MenuItem>) }\n </Select>\n </FormControl>\n <FormControl className={ classes.selectRelativeTime }>\n <InputLabel>{ this.props.t('Relative') }</InputLabel>\n <Select\n ref={ this.rangeRef }\n value={ this.state.relativeRange }\n onChange={ e => this.setRelativeInterval(e.target.value) }\n >\n <MenuItem key={ 'custom' } value={ 'absolute' } className={ classes.customRange }>{ this.props.t('custom range') }</MenuItem>\n <MenuItem key={ '1' } value={ 10 } >{ this.props.t('last 10 minutes') }</MenuItem>\n <MenuItem key={ '2' } value={ 30 } >{ this.props.t('last 30 minutes') }</MenuItem>\n <MenuItem key={ '3' } value={ 60 } >{ this.props.t('last hour') }</MenuItem>\n <MenuItem key={ '4' } value={ 'day' } >{ this.props.t('this day') }</MenuItem>\n <MenuItem key={ '5' } value={ 24 * 60 } >{ this.props.t('last 24 hours') }</MenuItem>\n <MenuItem key={ '6' } value={ 'week' } >{ this.props.t('this week') }</MenuItem>\n <MenuItem key={ '7' } value={ 24 * 60 * 7 } >{ this.props.t('last week') }</MenuItem>\n <MenuItem key={ '8' } value={ '2weeks' } >{ this.props.t('this 2 weeks') }</MenuItem>\n <MenuItem key={ '9' } value={ 24 * 60 * 14 } >{ this.props.t('last 2 weeks') }</MenuItem>\n <MenuItem key={ '10' } value={ 'month' } >{ this.props.t('this month') }</MenuItem>\n <MenuItem key={ '11' } value={ 30 * 24 * 60 } >{ this.props.t('last 30 days') }</MenuItem>\n <MenuItem key={ '12' } value={ 'year' } >{ this.props.t('this year') }</MenuItem>\n <MenuItem key={ '13' } value={ '12months' } >{ this.props.t('last 12 months') }</MenuItem>\n </Select>\n </FormControl>\n\n <MuiPickersUtilsProvider utils={DateFnsUtils} locale={localeMap[this.props.lang]}>\n <div className={ classes.toolbarTimeGrid }>\n <KeyboardDatePicker\n className={ classes.toolbarDate }\n disabled={ this.state.relativeRange !== 'absolute' }\n disableToolbar\n variant=\"inline\"\n margin=\"normal\"\n format={this.state.dateFormat}\n //format=\"fullDate\"\n label={ this.props.t('Start date') }\n value={ new Date(this.state.start) }\n onChange={date => this.setStartDate(date)}\n />\n <KeyboardTimePicker\n disabled={ this.state.relativeRange !== 'absolute' }\n className={ classes.toolbarTime }\n margin=\"normal\"\n //format=\"fullTime24h\"\n ampm={ false }\n label={ this.props.t('Start time') }\n value={ new Date(this.state.start) }\n onChange={date => this.setStartDate(date)}\n />\n </div>\n <div className={ classes.toolbarTimeGrid }>\n <KeyboardDatePicker\n disabled={ this.state.relativeRange !== 'absolute' }\n className={ classes.toolbarDate }\n disableToolbar\n format={this.state.dateFormat}\n variant=\"inline\"\n //format=\"fullDate\"\n margin=\"normal\"\n label={ this.props.t('End date') }\n value={ new Date(this.state.end) }\n onChange={date => this.setEndDate(date)}\n />\n <KeyboardTimePicker\n disabled={ this.state.relativeRange !== 'absolute' }\n className={ classes.toolbarTime }\n margin=\"normal\"\n //format=\"fullTime24h\"\n ampm={ false }\n label={ this.props.t('End time') }\n value={ new Date(this.state.end) }\n onChange={date => this.setEndDate(date)}\n />\n </div>\n </MuiPickersUtilsProvider>\n <div className={classes.grow} />\n\n { this.state.values && this.state.values.length ? <IconButton onClick={ () => this.exportData() } title={this.props.t('Save data as csv')}>\n <ExportIcon />\n </IconButton> : null }\n\n { this.state.supportedFeatures.includes('insert') && this.props.expertMode ? <IconButton onClick={ () => {\n const time = new Date();\n //const date = `${time.getFullYear()}.${padding2(time.getMonth() + 1)}.${padding2(time.getDate())}`;\n //const tm = `${padding2(time.getHours())}:${padding2(time.getMinutes())}:${padding2(time.getSeconds())}.${padding3(time.getMilliseconds())}`;\n\n const edit = {\n ack: this.state.values[this.state.values.length - 1].ack,\n val: this.state.values[this.state.values.length - 1].val,\n ts: time,\n date: new Date(time),\n ms: 0,\n time: new Date(time),\n q: 0\n };\n\n this.setState( {\n edit,\n insertOpened: true })\n }}>\n <InsertIcon />\n </IconButton> : null }\n { this.state.supportedFeatures.includes('update') && this.props.expertMode ? <IconButton disabled={ this.state.selected.length !== 1 }\n onClick={ () => {\n const state = JSON.parse(JSON.stringify(this.state.values.find(it => it.ts === this.state.lastSelected)));\n const time = new Date(state.ts);\n state.date = new Date(time);//time.getFullYear() + '.' + padding2(time.getMonth() + 1) + '.' + padding2(time.getDate());\n state.time = new Date(time);//padding2(time.getHours()) + ':' + padding2(time.getMinutes()) + ':' + padding2(time.getSeconds()) + '.' + padding3(time.getMilliseconds());\n\n this.setState( {\n edit: state,\n updateOpened: true });\n }}>\n <EditIcon />\n </IconButton> : null }\n { this.state.supportedFeatures.includes('delete') && this.props.expertMode ? <IconButton disabled={ !this.state.selected.length } onClick={() => {\n if (this.state.suppressMessage && Date.now() - this.state.suppressMessage < 300000) {\n this.onDelete();\n } else {\n this.setState({ areYouSure: true });\n }\n }} >\n <DeleteIcon />\n </IconButton> : null }\n\n </Toolbar>;\n }\n\n exportData() {\n let element = window.document.getElementById('export-file');\n if (!element) {\n element = document.createElement('a');\n element.setAttribute('id', 'export-file');\n element.style.display = 'none';\n document.body.appendChild(element);\n }\n\n let lines = ['timestamp;value;acknowledged;from;'];\n\n this.state.values.forEach(state => !state.i && !state.e &&\n lines.push([\n new Date(state.ts).toISOString(),\n state.val === null || state.val === undefined ? 'null' : state.val.toString(),\n state.ack ? 'true' : 'false',\n state.from || ''\n ].join(';')));\n\n element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(lines.join('\\n')));\n element.setAttribute('download', Utils.getObjectName({[this.props.obj._id]: this.props.obj}, this.props.obj._id, { language: this.props.lang }) + '.csv');\n\n element.click();\n\n document.body.removeChild(element);\n }\n\n render() {\n if (!this.state.historyInstances) {\n return <LinearProgress/>;\n }\n\n return <Paper className={ this.props.classes.paper }>\n { this.state.loading ? <LinearProgress /> : <div className={ this.props.classes.noLoadingProgress} /> }\n { this.renderToolbar() }\n <div className={ this.props.classes.tableDiv }>\n { this.renderTable() }\n </div>\n { this.renderConfirmDialog() }\n { this.renderEditDialog() }\n </Paper>;\n }\n}\n\nObjectHistoryData.propTypes = {\n t: PropTypes.func,\n lang: PropTypes.string,\n expertMode: PropTypes.bool,\n socket: PropTypes.object,\n obj: PropTypes.object,\n customsInstances: PropTypes.array,\n themeName: PropTypes.string,\n objects: PropTypes.object,\n isFloatComma: PropTypes.bool,\n};\n\nexport default withWidth()(withStyles(styles)(ObjectHistoryData));","import { createRef, Component } from 'react';\nimport PropTypes from 'prop-types';\nimport withWidth from '@material-ui/core/withWidth';\nimport {withStyles} from '@material-ui/core/styles';\nimport clsx from 'clsx';\n\nimport {MuiPickersUtilsProvider, KeyboardTimePicker, KeyboardDatePicker} from '@material-ui/pickers';\nimport Paper from '@material-ui/core/Paper';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport Fab from '@material-ui/core/Fab';\n\nimport ReactEchartsCore from 'echarts-for-react/lib/core';\n\nimport * as echarts from 'echarts/core';\nimport { LineChart } from 'echarts/charts';\nimport {\n GridComponent,\n ToolboxComponent,\n TooltipComponent,\n TitleComponent,\n TimelineComponent,\n} from 'echarts/components';\nimport {SVGRenderer} from 'echarts/renderers';\n\nimport DateFnsUtils from '@date-io/date-fns';\nimport frLocale from 'date-fns/locale/fr';\nimport ruLocale from 'date-fns/locale/ru';\nimport enLocale from 'date-fns/locale/en-US';\nimport esLocale from 'date-fns/locale/es';\nimport plLocale from 'date-fns/locale/pl';\nimport ptLocale from 'date-fns/locale/pt';\nimport itLocale from 'date-fns/locale/it';\nimport cnLocale from 'date-fns/locale/zh-CN';\nimport brLocale from 'date-fns/locale/pt-BR';\nimport deLocale from 'date-fns/locale/de';\nimport nlLocale from 'date-fns/locale/nl';\n\nimport Utils from '@iobroker/adapter-react/Components/Utils';\n\n// icons\nimport {FaChartLine as SplitLineIcon} from 'react-icons/fa';\nimport EchartsIcon from '../../assets/echarts.png';\n\necharts.use([TimelineComponent, ToolboxComponent, TitleComponent, TooltipComponent, GridComponent, LineChart, SVGRenderer]);\n\nconst localeMap = {\n en: enLocale,\n fr: frLocale,\n ru: ruLocale,\n de: deLocale,\n es: esLocale,\n br: brLocale,\n nl: nlLocale,\n it: itLocale,\n pt: ptLocale,\n pl: plLocale,\n 'zh-cn': cnLocale,\n};\n\nfunction padding3(ms) {\n if (ms < 10) {\n return '00' + ms;\n } else if (ms < 100) {\n return '0' + ms;\n } else {\n return ms;\n }\n}\n\nfunction padding2(num) {\n if (num < 10) {\n return '0' + num;\n } else {\n return num;\n }\n}\n\nconst styles = theme => ({\n paper: {\n height: '100%',\n maxHeight: '100%',\n maxWidth: '100%',\n overflow: 'hidden',\n width: '100%'\n },\n chart: {\n width: '100%',\n overflow: 'hidden',\n },\n chartWithToolbar: {\n height: `calc(100% - ${theme.mixins.toolbar.minHeight + theme.spacing(1)}px)`,\n },\n chartWithoutToolbar: {\n height: `100%`,\n },\n selectHistoryControl: {\n width: 130,\n },\n selectRelativeTime: {\n marginLeft: 10,\n width: 200,\n },\n notAliveInstance: {\n opacity: 0.5,\n },\n customRange: {\n color: theme.palette.primary.main\n },\n splitLineButtonIcon: {\n marginRight: theme.spacing(1),\n },\n splitLineButton: {\n float: 'right',\n },\n grow: {\n flexGrow: 1,\n },\n\n toolbarTime: {\n width: 100,\n marginTop: 9,\n marginLeft: theme.spacing(1),\n },\n toolbarDate: {\n width: 160,\n marginTop: 9,\n },\n toolbarTimeGrid: {\n marginLeft: theme.spacing(1),\n paddingLeft: theme.spacing(1),\n paddingRight: theme.spacing(1),\n border: '1px dotted #AAAAAA',\n borderRadius: theme.spacing(1),\n },\n buttonIcon: {\n width: 24,\n height: 24\n },\n echartsButton: {\n marginRight: theme.spacing(1),\n height: 34,\n width: 34,\n }\n});\n\nconst GRID_PADDING_LEFT = 80;\nconst GRID_PADDING_RIGHT = 25;\n\nclass ObjectChart extends Component {\n constructor(props) {\n super(props);\n let from;\n if (!this.props.from) {\n from = new Date(this.props.from);\n from.setHours(from.getHours() - 24 * 7);\n this.start = from.getTime();\n } else {\n this.start = this.props.from\n }\n if (!this.props.end) {\n this.end = Date.now();\n } else {\n this.end = this.props.end;\n }\n let relativeRange = window.localStorage.getItem('App.relativeRange') || '30';\n let min = parseInt(window.localStorage.getItem('App.absoluteStart'), 10) || 0;\n let max = parseInt(window.localStorage.getItem('App.absoluteEnd'), 10) || 0;\n\n if ((!min || !max) && (!relativeRange || relativeRange === 'absolute')) {\n relativeRange = '30';\n }\n\n if (max && min) {\n relativeRange = 'absolute';\n }\n\n this.state = {\n loaded: false,\n historyInstance: this.props.historyInstance || '',\n historyInstances: null,\n defaultHistory: '',\n chartHeight: 300,\n chartWidth: 500,\n relativeRange,\n splitLine: window.localStorage.getItem('App.splitLine') === 'true',\n dateFormat: 'dd.MM.yyyy',\n min,\n max,\n maxYLen: 0,\n };\n\n this.echartsReact = createRef();\n this.rangeRef = createRef();\n this.readTimeout = null;\n this.chartValues = null;\n this.rangeValues = null;\n\n this.unit = this.props.obj.common && this.props.obj.common.unit ? ' ' + this.props.obj.common.unit : '';\n\n this.divRef = createRef();\n\n this.chart = {};\n\n this.onChange = this.onChange.bind(this);\n this.onResize = this.onResize.bind(this);\n }\n\n componentDidMount() {\n this.props.socket.subscribeState(this.props.obj._id, this.onChange);\n window.addEventListener('resize', this.onResize);\n this.prepareData()\n .then(() => !this.props.noToolbar && this.readHistoryRange())\n .then(() => this.setRelativeInterval(this.state.relativeRange, true, () =>\n this.forceUpdate()));\n }\n\n componentWillUnmount() {\n this.readTimeout && clearTimeout(this.readTimeout);\n this.readTimeout = null;\n\n this.timeTimer && clearTimeout(this.timeTimer);\n this.timeTimer = null;\n\n this.maxYLenTimeout && clearTimeout(this.maxYLenTimeout);\n this.maxYLenTimeout = null;\n\n this.props.socket.unsubscribeState(this.props.obj._id, this.onChange);\n window.removeEventListener('resize', this.onResize);\n }\n\n onResize = () => {\n this.timerResize && clearTimeout(this.timerResize);\n this.timerResize = setTimeout(() => {\n this.timerResize = null;\n this.componentDidUpdate();\n });\n }\n\n onChange = (id, state) => {\n if (id === this.props.obj._id &&\n state &&\n this.rangeValues &&\n (!this.rangeValues.length || this.rangeValues[this.rangeValues.length - 1].ts < state.ts)) {\n\n this.chartValues && this.chartValues.push({val: state.val, ts: state.ts});\n this.rangeValues.push({val: state.val, ts: state.ts});\n\n // update only if end is near to now\n if (state.ts >= this.chart.min && state.ts <= this.chart.max + 300000) {\n this.updateChart();\n }\n }\n }\n\n prepareData() {\n let list;\n\n if (this.props.noToolbar) {\n return new Promise(resolve =>\n this.setState( {\n dateFormat: this.props.dateFormat.replace(/D/g, 'd').replace(/Y/g, 'y'),\n defaultHistory: this.props.defaultHistory,\n historyInstance: this.props.defaultHistory,\n }, () => resolve()));\n } else {\n return this.getHistoryInstances()\n .then(_list => {\n list = _list;\n // read default history\n return this.props.socket.getCompactSystemConfig();\n })\n .then(config => {\n return !this.props.showJumpToEchart ? Promise.resolve([]) : this.props.socket.getAdapterInstances('echarts')\n .then(instances => {\n // collect all echarts instances\n const echartsJump = !!instances.find(item => item._id.startsWith('system.adapter.echarts.'));\n\n const defaultHistory = config && config.common && config.common.defaultHistory;\n\n // find current history\n // first read from localstorage\n let historyInstance = window.localStorage.getItem('App.historyInstance') || '';\n if (!historyInstance || !list.find(it => it.id === historyInstance && it.alive)) {\n // try default history\n historyInstance = defaultHistory;\n }\n if (!historyInstance || !list.find(it => it.id === historyInstance && it.alive)) {\n // find first alive history\n historyInstance = list.find(it => it.alive);\n if (historyInstance) {\n historyInstance = historyInstance.id;\n }\n }\n // get first entry\n if (!historyInstance && list.length) {\n historyInstance = defaultHistory;\n }\n\n this.setState( {\n dateFormat: (config.common.dateFormat || 'dd.MM.yyyy').replace(/D/g, 'd').replace(/Y/g, 'y'),\n historyInstances: list,\n defaultHistory,\n historyInstance,\n echartsJump,\n });\n });\n });\n\n }\n }\n\n getHistoryInstances() {\n const list = [];\n const ids = [];\n\n if (this.props.historyInstance) {\n return Promise.resolve(list);\n }\n\n this.props.customsInstances.forEach(instance => {\n const instObj = this.props.objects['system.adapter.' + instance];\n if (instObj && instObj.common && instObj.common.getHistory) {\n let listObj = {id: instance, alive: false};\n list.push(listObj);\n ids.push(`system.adapter.${instance}.alive`);\n }\n });\n\n if (ids.length) {\n return this.props.socket.getForeignStates(ids)\n .then(alives => {\n Object.keys(alives).forEach(id => {\n const item = list.find(it => id.endsWith(it.id + '.alive'));\n if (item) {\n item.alive = alives[id] && alives[id].val;\n }\n });\n return list;\n });\n } else {\n return Promise.resolve(list);\n }\n }\n\n readHistoryRange() {\n const now = new Date();\n const oldest = new Date(2000, 0, 1);\n\n return this.props.socket.getHistory(this.props.obj._id, {\n instance: this.state.historyInstance,\n start: oldest.getTime(),\n end: now.getTime(),\n step: 3600000, // hourly\n from: false,\n ack: false,\n q: false,\n addID: false,\n aggregate: 'minmax'\n })\n .then(values => {\n // remove interpolated first value\n if (values && values[0]?.val === null) {\n values.shift();\n }\n this.rangeValues = values;\n });\n }\n\n readHistory(start, end) {\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 const options = {\n instance: this.state.historyInstance,\n start,\n end,\n from: false,\n ack: false,\n q: false,\n addID: false,\n aggregate: 'none'\n };\n\n if (end - start > 60000 * 24 &&\n !(this.props.obj.common.type === 'boolean' || (this.props.obj.common.type === 'number' && this.props.obj.common.states))) {\n options.aggregate = 'minmax';\n //options.step = 60000;\n }\n\n return this.props.socket.getHistory(this.props.obj._id, options)\n .then(values => {\n // merge range and chart\n let chart = [];\n let r = 0;\n let range = this.rangeValues;\n let minY = null;\n let maxY = null;\n\n for (let t = 0; t < values.length; t++) {\n if (range) {\n while (r < range.length && range[r].ts < values[t].ts) {\n chart.push(range[r]);\n //console.log(`add ${new Date(range[r].ts).toISOString()}: ${range[r].val}`);\n r++;\n }\n }\n // if range and details are not equal\n if (!chart.length || chart[chart.length - 1].ts < values[t].ts) {\n chart.push(values[t]);\n //console.log(`add value ${new Date(values[t].ts).toISOString()}: ${values[t].val}`)\n } else if (chart[chart.length - 1].ts === values[t].ts && chart[chart.length - 1].val !== values[t].ts) {\n console.error('Strange data!');\n }\n if (minY === null || values[t].val < minY) {\n minY = values[t].val;\n }\n if (maxY === null || values[t].val > maxY) {\n maxY = values[t].val;\n }\n }\n\n if (range) {\n while (r < range.length) {\n chart.push(range[r]);\n console.log(`add range ${new Date(range[r].ts).toISOString()}: ${range[r].val}`);\n r++;\n }\n }\n\n // sort\n chart.sort((a, b) => a.ts > b.ts ? 1 : (a.ts < b.ts ? -1 : 0));\n\n this.chartValues = chart;\n this.minY = minY;\n this.maxY = maxY;\n\n if (this.minY < 10) {\n this.minY = Math.round(this.minY * 10) / 10;\n } else {\n this.minY = Math.ceil(this.minY);\n }\n if (this.maxY < 10) {\n this.maxY = Math.round(this.maxY * 10) / 10;\n } else {\n this.maxY = Math.ceil(this.maxY);\n }\n return chart;\n });\n }\n\n convertData(values) {\n values = values || this.chartValues;\n const data = [];\n if (!values.length) {\n return data;\n }\n for (let i = 0; i < values.length; i++) {\n data.push({value: [values[i].ts, values[i].val]});\n }\n if (!this.chart.min) {\n this.chart.min = values[0].ts;\n this.chart.max = values[values.length - 1].ts;\n }\n\n return data;\n }\n\n getOption() {\n let widthAxis;\n if (this.minY !== null && this.minY !== undefined) {\n widthAxis = (this.minY.toString() + this.unit).length * 9 + 12;\n }\n if (this.maxY !== null && this.maxY !== undefined) {\n const w = (this.maxY.toString() + this.unit).length * 9 + 12;\n if (w > widthAxis) {\n widthAxis = w;\n }\n }\n\n if (this.state.maxYLen) {\n const w = this.state.maxYLen * 9 + 12;\n if (w > widthAxis) {\n widthAxis = w;\n }\n }\n\n const serie = {\n xAxisIndex: 0,\n type: 'line',\n showSymbol: false,\n hoverAnimation: true,\n animation: false,\n data: this.convertData(),\n lineStyle: {\n color: '#4dabf5',\n },\n areaStyle: {}\n };\n\n const yAxis = {\n type: 'value',\n boundaryGap: [0, '100%'],\n splitLine: {\n show: this.props.noToolbar || !!this.state.splitLine\n },\n splitNumber: Math.round(this.state.chartHeight / 50),\n axisLabel: {\n formatter: (value, index) => {\n let text;\n if (this.props.isFloatComma) {\n text = value.toString().replace(',', '.') + this.unit;\n } else {\n text = value + this.unit;\n }\n\n if (this.state.maxYLen < text.length) {\n this.maxYLenTimeout && clearTimeout(this.maxYLenTimeout);\n this.maxYLenTimeout = setTimeout(maxYLen => this.setState({maxYLen}), 200, text.length);\n }\n return text;\n },\n showMaxLabel: true,\n showMinLabel: true,\n },\n axisTick: {\n alignWithLabel: true,\n }\n };\n\n if (this.props.obj.common.type === 'boolean') {\n serie.step = 'end';\n yAxis.axisLabel.showMaxLabel = false;\n yAxis.axisLabel.formatter = value => value === 1 ? 'TRUE' : 'FALSE';\n yAxis.max = 1.5;\n yAxis.interval = 1;\n widthAxis = 50;\n } else\n if (this.props.obj.common.type === 'number' &&\n this.props.obj.common.states) {\n serie.step = 'end';\n yAxis.axisLabel.showMaxLabel = false;\n yAxis.axisLabel.formatter = value => this.props.obj.common.states[value] !== undefined ? this.props.obj.common.states[value] : value;\n const keys = Object.keys(this.props.obj.common.states);\n keys.sort();\n yAxis.max = parseFloat(keys[keys.length - 1]) + 0.5;\n yAxis.interval = 1;\n let max = '';\n for (let i = 0; i < keys.length; i++) {\n if (typeof this.props.obj.common.states[keys[i]] === 'string' && this.props.obj.common.states[keys[i]].length > max.length) {\n max = this.props.obj.common.states[keys[i]];\n }\n }\n widthAxis = ((max.length * 9) || 50) + 12;\n }\n\n return {\n backgroundColor: 'transparent',\n title: {\n text: this.props.noToolbar ? '' : Utils.getObjectNameFromObj(this.props.obj, this.props.lang),\n padding: [\n 10, // up\n 0, // right\n 0, // down\n widthAxis ? widthAxis + 10 : GRID_PADDING_LEFT + 10, // left\n ]\n },\n grid: {\n left: widthAxis || GRID_PADDING_LEFT,\n top: 8,\n right: this.props.noToolbar ? 5: GRID_PADDING_RIGHT,\n bottom: 40,\n },\n tooltip: {\n trigger: 'axis',\n formatter: params => {\n params = params[0];\n const date = new Date(params.value[0]);\n let value = params.value[1];\n if (value !== null && this.props.isFloatComma) {\n value = value.toString().replace('.', ',');\n }\n return `${date.toLocaleString()}.${padding3(date.getMilliseconds())}: ${value}${this.unit}`;\n },\n axisPointer: {\n animation: true\n }\n },\n xAxis: {\n type: 'time',\n splitLine: {\n show: false\n },\n splitNumber: this.chart.withSeconds ?\n Math.round((this.state.chartWidth - GRID_PADDING_RIGHT - GRID_PADDING_LEFT) / 70)\n :\n Math.round((this.state.chartWidth - GRID_PADDING_RIGHT - GRID_PADDING_LEFT) / 50),\n min: this.chart.min,\n max: this.chart.max,\n axisTick: {alignWithLabel: true,},\n axisLabel: {\n formatter: (value, index) => {\n const date = new Date(value);\n if (this.chart.withSeconds) {\n return padding2(date.getHours()) + ':' + padding2(date.getMinutes()) + ':' + padding2(date.getSeconds());\n } else if (this.chart.withTime) {\n return padding2(date.getHours()) + ':' + padding2(date.getMinutes()) + '\\n' + padding2(date.getDate()) + '.' + padding2(date.getMonth() + 1);\n } else {\n return padding2(date.getDate()) + '.' + padding2(date.getMonth() + 1) + '\\n' + date.getFullYear();\n }\n }\n }\n },\n yAxis,\n toolbox: {\n left: 'right',\n feature: this.props.noToolbar ? undefined : {\n saveAsImage: {\n title: this.props.t('Save as image'),\n show: true,\n }\n }\n },\n series: [serie]\n };\n }\n\n static getDerivedStateFromProps(props, state) {\n return null;\n }\n\n updateChart(start, end, withReadData, cb) {\n if (start) {\n this.start = start;\n }\n if (end) {\n this.end = end;\n }\n start = start || this.start;\n end = end || this.end;\n\n this.readTimeout && clearTimeout(this.readTimeout);\n\n this.readTimeout = setTimeout(() => {\n this.readTimeout = null;\n\n const diff = this.chart.max - this.chart.min;\n if (diff !== this.chart.diff) {\n this.chart.diff = diff;\n this.chart.withTime = this.chart.diff < 3600000 * 24 * 7;\n this.chart.withSeconds = this.chart.diff < 60000 * 30;\n }\n\n if (withReadData) {\n this.readHistory(start, end)\n .then(values => {\n this.echartsReact && typeof this.echartsReact.getEchartsInstance === 'function' && this.echartsReact.getEchartsInstance().setOption({\n series: [{data: this.convertData(values)}],\n xAxis: {\n min: this.chart.min,\n max: this.chart.max,\n }\n });\n cb && cb();\n });\n } else {\n this.echartsReact && typeof this.echartsReact.getEchartsInstance === 'function' && this.echartsReact.getEchartsInstance().setOption({\n series: [{data: this.convertData()}],\n xAxis: {\n min: this.chart.min,\n max: this.chart.max,\n }\n });\n cb && cb();\n }\n }, 400);\n }\n\n setNewRange(readData) {\n /*if (this.rangeRef.current &&\n this.rangeRef.current.childNodes[1] &&\n this.rangeRef.current.childNodes[1].value) {\n this.rangeRef.current.childNodes[0].innerHTML = '';\n this.rangeRef.current.childNodes[1].value = '';\n }*/\n this.chart.diff = this.chart.max - this.chart.min;\n this.chart.withTime = this.chart.diff < 3600000 * 24 * 7;\n this.chart.withSeconds = this.chart.diff < 60000 * 30;\n\n if (this.state.relativeRange !== 'absolute') {\n this.setState({ relativeRange: 'absolute' });\n } else if (this.echartsReact && typeof this.echartsReact.getEchartsInstance === 'function') {\n this.echartsReact.getEchartsInstance().setOption({\n xAxis: {\n min: this.chart.min,\n max: this.chart.max,\n }\n });\n\n readData && this.updateChart(this.chart.min, this.chart.max, true);\n }\n }\n\n shiftTime() {\n const now = new Date();\n const delay = 60000 - now.getSeconds() - (1000 - now.getMilliseconds());\n\n if (now.getMilliseconds()) {\n now.setMilliseconds(1000);\n }\n if (now.getSeconds()) {\n now.setSeconds(60);\n }\n\n const max = now.getTime();\n let min;\n let mins = this.state.relativeRange;\n\n if (mins === 'day') {\n now.setHours(0);\n now.setMinutes(0);\n min = now.getTime();\n } else if (mins === 'week') {\n now.setHours(0);\n now.setMinutes(0);\n now.setFullYear(now.getFullYear() - 1);\n // find week start\n if (now.getDay()) { // if not sunday\n now.setDate(now.getDate() - now.getDay() - 1);\n } else {\n now.setDate(now.getDate() - 6);\n }\n\n this.chart.min = now.getTime();\n } else if (mins === '2weeks') {\n now.setHours(0);\n now.setMinutes(0);\n now.setFullYear(now.getFullYear() - 1);\n // find week start\n if (now.getDay()) { // if not sunday\n now.setDate(now.getDate() - now.getDay() - 8);\n } else {\n now.setDate(now.getDate() - 13);\n }\n this.chart.min = now.getTime();\n } else if (mins === 'month') {\n now.setHours(0);\n now.setMinutes(0);\n now.setDate(1);\n min = now.getTime();\n } else if (mins === 'year') {\n now.setHours(0);\n now.setMinutes(0);\n now.setDate(1);\n now.setMonth(0);\n min = now.getTime();\n } else if (mins === '12months') {\n now.setHours(0);\n now.setMinutes(0);\n now.setFullYear(now.getFullYear() - 1);\n min = now.getTime();\n } else {\n mins = parseInt(mins, 10);\n min = max - mins * 60000;\n }\n\n this.chart.min = min;\n this.chart.max = max;\n\n this.setState({ min, max }, () =>\n this.updateChart(this.chart.min, this.chart.max, true));\n\n this.timeTimer = setTimeout(() => {\n this.timeTimer = null;\n this.shiftTime();\n }, delay || 60000);\n }\n\n setRelativeInterval(mins, dontSave, cb) {\n if (!dontSave) {\n window.localStorage.setItem('App.relativeRange', mins);\n this.setState({ relativeRange: mins });\n }\n if (mins === 'absolute') {\n this.timeTimer && clearTimeout(this.timeTimer);\n this.timeTimer = null;\n return;\n } else {\n window.localStorage.removeItem('App.absoluteStart');\n window.localStorage.removeItem('App.absoluteEnd');\n }\n\n const now = new Date();\n\n if (!this.timeTimer) {\n const delay = 60000 - now.getSeconds() - (1000 - now.getMilliseconds());\n this.timeTimer = setTimeout(() => {\n this.timeTimer = null;\n this.shiftTime();\n }, delay || 60000);\n }\n\n if (now.getMilliseconds()) {\n now.setMilliseconds(1000);\n }\n if (now.getSeconds()) {\n now.setSeconds(60);\n }\n\n this.chart.max = now.getTime();\n\n if (mins === 'day') {\n now.setHours(0);\n now.setMinutes(0);\n this.chart.min = now.getTime();\n } else if (mins === 'week') {\n now.setHours(0);\n now.setMinutes(0);\n now.setFullYear(now.getFullYear() - 1);\n // find week start\n if (now.getDay()) { // if not sunday\n now.setDate(now.getDate() - now.getDay() - 1);\n } else {\n now.setDate(now.getDate() - 6);\n }\n\n this.chart.min = now.getTime();\n } else if (mins === '2weeks') {\n now.setHours(0);\n now.setMinutes(0);\n now.setFullYear(now.getFullYear() - 1);\n // find week start\n if (now.getDay()) { // if not sunday\n now.setDate(now.getDate() - now.getDay() - 8);\n } else {\n now.setDate(now.getDate() - 13);\n }\n this.chart.min = now.getTime();\n } else if (mins === 'month') {\n now.setHours(0);\n now.setMinutes(0);\n now.setDate(1);\n this.chart.min = now.getTime();\n } else if (mins === 'year') {\n now.setHours(0);\n now.setMinutes(0);\n now.setDate(1);\n now.setMonth(0);\n this.chart.min = now.getTime();\n } else if (mins === '12months') {\n now.setHours(0);\n now.setMinutes(0);\n now.setFullYear(now.getFullYear() - 1);\n this.chart.min = now.getTime();\n } else {\n mins = parseInt(mins, 10);\n this.chart.min = this.chart.max - mins * 60000;\n }\n\n this.setState({min: this.chart.min, max: this.chart.max}, () =>\n this.updateChart(this.chart.min, this.chart.max, true, cb));\n }\n\n installEventHandlers() {\n if (!this.echartsReact || typeof this.echartsReact.getEchartsInstance !== 'function') {\n return;\n }\n\n const zr = this.echartsReact.getEchartsInstance().getZr();\n if (!zr._iobInstalled) {\n zr._iobInstalled = true;\n zr.on('mousedown', e => {\n console.log('mouse down');\n this.mouseDown = true;\n this.chart.lastX = e.offsetX;\n });\n zr.on('mouseup', () => {\n console.log('mouse up');\n this.mouseDown = false;\n this.setNewRange(true);\n });\n zr.on('mousewheel', e => {\n let diff = this.chart.max - this.chart.min;\n const width = this.state.chartWidth - GRID_PADDING_RIGHT - GRID_PADDING_LEFT;\n const x = e.offsetX - GRID_PADDING_LEFT;\n const pos = x / width;\n\n const oldDiff = diff;\n const amount = e.wheelDelta > 0 ? 1.1 : 0.9;\n diff = diff * amount;\n const move = oldDiff - diff;\n this.chart.max += move * (1 - pos);\n this.chart.min -= move * pos;\n\n this.setNewRange();\n });\n zr.on('mousemove', e => {\n if (this.mouseDown) {\n const moved = this.chart.lastX - (e.offsetX - GRID_PADDING_LEFT);\n this.chart.lastX = e.offsetX - GRID_PADDING_LEFT;\n const diff = this.chart.max - this.chart.min;\n const width = this.state.chartWidth - GRID_PADDING_RIGHT - GRID_PADDING_LEFT;\n\n const shift = Math.round(moved * diff / width);\n this.chart.min += shift;\n this.chart.max += shift;\n this.setNewRange();\n }\n });\n\n zr.on('touchstart', e => {\n e.preventDefault();\n this.mouseDown = true;\n const touches = e.touches || e.originalEvent.touches;\n if (touches) {\n this.chart.lastX = touches[touches.length - 1].pageX;\n if (touches.length > 1) {\n this.chart.lastWidth = Math.abs(touches[0].pageX - touches[1].pageX);\n } else {\n this.chart.lastWidth = null;\n }\n }\n });\n zr.on('touchend', e => {\n e.preventDefault();\n this.mouseDown = false;\n this.setNewRange(true);\n });\n zr.on('touchmove', e => {\n e.preventDefault();\n const touches = e.touches || e.originalEvent.touches;\n if (!touches) {\n return;\n }\n const pageX = touches[touches.length - 1].pageX - GRID_PADDING_LEFT;\n if (this.mouseDown) {\n if (touches.length > 1) {\n // zoom\n const fingerWidth = Math.abs(touches[0].pageX - touches[1].pageX);\n if (this.chart.lastWidth !== null && fingerWidth !== this.chart.lastWidth) {\n let diff = this.chart.max - this.chart.min;\n const chartWidth = this.state.chartWidth - GRID_PADDING_RIGHT - GRID_PADDING_LEFT;\n\n const amount = fingerWidth > this.chart.lastWidth ? 1.1 : 0.9;\n const positionX = touches[0].pageX > touches[1].pageX ?\n touches[1].pageX - GRID_PADDING_LEFT + fingerWidth / 2 :\n touches[0].pageX - GRID_PADDING_LEFT + fingerWidth / 2;\n\n const pos = positionX / chartWidth;\n\n const oldDiff = diff;\n diff = diff * amount;\n const move = oldDiff - diff;\n\n this.chart.max += move * (1 - pos);\n this.chart.min -= move * pos;\n\n this.setNewRange();\n }\n this.chart.lastWidth = fingerWidth;\n } else {\n // swipe\n const moved = this.chart.lastX - pageX;\n const diff = this.chart.max - this.chart.min;\n const chartWidth = this.state.chartWidth - GRID_PADDING_RIGHT - GRID_PADDING_LEFT;\n\n const shift = Math.round(moved * diff / chartWidth);\n this.chart.min += shift;\n this.chart.max += shift;\n\n this.setNewRange();\n }\n }\n this.chart.lastX = pageX;\n });\n }\n }\n\n renderChart() {\n if (this.chartValues) {\n return <ReactEchartsCore\n ref={e => this.echartsReact = e}\n echarts={ echarts }\n option={ this.getOption() }\n notMerge={ true }\n lazyUpdate={ true }\n theme={ this.props.themeType === 'dark' ? 'dark' : '' }\n style={{ height: this.state.chartHeight + 'px', width: '100%' }}\n opts={{ renderer: 'svg' }}\n onEvents={ {\n rendered: e => {\n this.installEventHandlers();\n }\n }}\n />;\n } else {\n return <LinearProgress/>;\n }\n }\n\n componentDidUpdate() {\n if (this.divRef.current) {\n const width = this.divRef.current.offsetWidth;\n const height = this.divRef.current.offsetHeight;\n if (this.state.chartHeight !== height) {// || this.state.chartHeight !== height) {\n setTimeout(() => this.setState({ chartHeight: height, chartWidth: width }), 100);\n }\n }\n }\n\n setStartDate(min) {\n min = min.getTime();\n if (this.timeTimer) {\n clearTimeout(this.timeTimer);\n this.timeTimer = null;\n }\n window.localStorage.setItem('App.relativeRange', 'absolute');\n window.localStorage.setItem('App.absoluteStart', min);\n window.localStorage.setItem('App.absoluteEnd', this.state.max);\n\n this.chart.min = min;\n this.setState({ min, relativeRange: 'absolute' }, () =>\n this.updateChart(this.chart.min, this.chart.max, true));\n }\n\n setEndDate(max) {\n max = max.getTime();\n window.localStorage.setItem('App.relativeRange', 'absolute');\n window.localStorage.setItem('App.absoluteStart', this.state.min);\n window.localStorage.setItem('App.absoluteEnd', max);\n if (this.timeTimer) {\n clearTimeout(this.timeTimer);\n this.timeTimer = null;\n }\n this.chart.max = max;\n this.setState({ max, relativeRange: 'absolute' }, () =>\n this.updateChart(this.chart.min, this.chart.max, true));\n }\n\n openEcharts() {\n const args = [\n 'id=' + window.encodeURIComponent(this.props.obj._id),\n 'instance=' + window.encodeURIComponent(this.state.historyInstance),\n 'menuOpened=false',\n ];\n\n if (this.state.relativeRange === 'absolute') {\n args.push('start=' + this.chart.min);\n args.push('end=' + this.chart.max);\n } else {\n args.push('range=' + this.state.relativeRange);\n }\n\n window.open(`${window.location.protocol}//${window.location.host}/adapter/echarts/tab.html#${args.join('&')}`, 'echarts');\n }\n\n renderToolbar() {\n if (this.props.noToolbar) {\n return null;\n }\n\n const classes = this.props.classes;\n\n return <Toolbar>\n {!this.props.historyInstance && <FormControl className={ classes.selectHistoryControl }>\n <InputLabel>{ this.props.t('History instance') }</InputLabel>\n <Select\n value={ this.state.historyInstance }\n onChange={ e => {\n window.localStorage.setItem('App.historyInstance', e.target.value);\n this.setState({ historyInstance: e.target.value });\n }}\n >\n { this.state.historyInstances.map(it => <MenuItem key={ it.id } value={ it.id } className={ clsx(!it.alive && classes.notAliveInstance )}>{ it.id }</MenuItem>) }\n </Select>\n </FormControl>}\n <FormControl className={ classes.selectRelativeTime }>\n <InputLabel>{ this.props.t('Relative') }</InputLabel>\n <Select\n ref={ this.rangeRef }\n value={ this.state.relativeRange }\n onChange={ e => this.setRelativeInterval(e.target.value) }\n >\n <MenuItem key={ 'custom' } value={ 'absolute' } className={ classes.customRange }>{ this.props.t('custom range') }</MenuItem>\n <MenuItem key={ '1' } value={ 10 } >{ this.props.t('last 10 minutes') }</MenuItem>\n <MenuItem key={ '2' } value={ 30 } >{ this.props.t('last 30 minutes') }</MenuItem>\n <MenuItem key={ '3' } value={ 60 } >{ this.props.t('last hour') }</MenuItem>\n <MenuItem key={ '4' } value={ 'day' } >{ this.props.t('this day') }</MenuItem>\n <MenuItem key={ '5' } value={ 24 * 60 } >{ this.props.t('last 24 hours') }</MenuItem>\n <MenuItem key={ '6' } value={ 'week' } >{ this.props.t('this week') }</MenuItem>\n <MenuItem key={ '7' } value={ 24 * 60 * 7 } >{ this.props.t('last week') }</MenuItem>\n <MenuItem key={ '8' } value={ '2weeks' } >{ this.props.t('this 2 weeks') }</MenuItem>\n <MenuItem key={ '9' } value={ 24 * 60 * 14 } >{ this.props.t('last 2 weeks') }</MenuItem>\n <MenuItem key={ '10' } value={ 'month' } >{ this.props.t('this month') }</MenuItem>\n <MenuItem key={ '11' } value={ 30 * 24 * 60 } >{ this.props.t('last 30 days') }</MenuItem>\n <MenuItem key={ '12' } value={ 'year' } >{ this.props.t('this year') }</MenuItem>\n <MenuItem key={ '13' } value={ '12months' } >{ this.props.t('last 12 months') }</MenuItem>\n </Select>\n </FormControl>\n <MuiPickersUtilsProvider utils={DateFnsUtils} locale={localeMap[this.props.lang]}>\n <div className={ classes.toolbarTimeGrid }>\n <KeyboardDatePicker\n className={ classes.toolbarDate }\n disabled={ this.state.relativeRange !== 'absolute' }\n disableToolbar\n variant=\"inline\"\n margin=\"normal\"\n format={this.state.dateFormat}\n //format=\"fullDate\"\n label={ this.props.t('Start date') }\n value={ new Date(this.state.min) }\n onChange={date => this.setStartDate(date)}\n />\n <KeyboardTimePicker\n disabled={ this.state.relativeRange !== 'absolute' }\n className={ classes.toolbarTime }\n margin=\"normal\"\n //format=\"fullTime24h\"\n ampm={ false }\n label={ this.props.t('Start time') }\n value={ new Date(this.state.min) }\n onChange={date => this.setStartDate(date)}\n />\n </div>\n <div className={ classes.toolbarTimeGrid }>\n <KeyboardDatePicker\n disabled={ this.state.relativeRange !== 'absolute' }\n className={ classes.toolbarDate }\n disableToolbar\n format={this.state.dateFormat}\n variant=\"inline\"\n //format=\"fullDate\"\n margin=\"normal\"\n label={ this.props.t('End date') }\n value={ new Date(this.state.max) }\n onChange={date => this.setEndDate(date)}\n />\n <KeyboardTimePicker\n disabled={ this.state.relativeRange !== 'absolute' }\n className={ classes.toolbarTime }\n margin=\"normal\"\n //format=\"fullTime24h\"\n ampm={ false }\n label={ this.props.t('End time') }\n value={ new Date(this.state.max) }\n onChange={date => this.setEndDate(date)}\n />\n </div>\n </MuiPickersUtilsProvider>\n <div className={classes.grow} />\n {this.props.showJumpToEchart && this.state.echartsJump && <Fab\n className={classes.echartsButton}\n size=\"small\"\n onClick={() => this.openEcharts()}\n title={this.props.t('Open charts in new window')}\n >\n <img src={EchartsIcon} alt=\"echarts\" className={classes.buttonIcon}/>\n </Fab>}\n <Fab\n variant=\"extended\"\n size=\"small\"\n color={ this.state.splitLine ? 'primary' : 'inherit' }\n aria-label=\"show lines\"\n onClick={() => {\n window.localStorage.setItem('App.splitLine', this.state.splitLine ? 'false' : 'true');\n this.setState({splitLine: !this.state.splitLine});\n }}\n className={ classes.splitLineButton }\n >\n <SplitLineIcon className={ classes.splitLineButtonIcon } />\n { this.props.t('Show lines') }\n </Fab>\n </Toolbar>;\n }\n\n render() {\n if (!this.state.historyInstances && !this.state.defaultHistory) {\n return <LinearProgress/>;\n }\n\n return <Paper className={ this.props.classes.paper }>\n { this.renderToolbar() }\n <div ref={ this.divRef } className={clsx(this.props.classes.chart, this.props.noToolbar ? this.props.classes.chartWithoutToolbar : this.props.classes.chartWithToolbar) }>\n { this.renderChart() }\n </div>\n </Paper>;\n }\n}\n\nObjectChart.propTypes = {\n t: PropTypes.func,\n lang: PropTypes.string,\n expertMode: PropTypes.bool,\n socket: PropTypes.object,\n obj: PropTypes.object,\n customsInstances: PropTypes.array,\n themeType: PropTypes.string,\n objects: PropTypes.object,\n from: PropTypes.number,\n end: PropTypes.number,\n noToolbar: PropTypes.bool,\n defaultHistory: PropTypes.string,\n historyInstance: PropTypes.string,\n showJumpToEchart: PropTypes.bool,\n isFloatComma: PropTypes.bool,\n};\n\nexport default withWidth()(withStyles(styles)(ObjectChart));","import React from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\n\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport AppBar from '@material-ui/core/AppBar';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\n\nimport Router from '@iobroker/adapter-react/Components/Router';\nimport ConfirmDialog from '@iobroker/adapter-react/Dialogs/Confirm';\nimport I18n from '@iobroker/adapter-react/i18n';\n\n// Icons\nimport CloseIcon from '@material-ui/icons/Close';\nimport SaveIcon from '@material-ui/icons/Save';\n\n\nimport ObjectCustomEditor from '../components/Object/ObjectCustomEditor';\nimport ObjectHistoryData from '../components/Object/ObjectHistoryData';\nimport ObjectChart from '../components/Object/ObjectChart';\nimport MobileDialog from '../helpers/MobileDialog';\n\nconst styles = theme => ({\n dialog: {\n height: '100%',\n },\n paper: {\n height: 'calc(100% - 64px)',\n },\n content: {\n textAlign: 'center',\n overflow: 'hidden',\n },\n tabPanel: {\n width: '100%',\n overflow: 'hidden',\n height: 'calc(100% - ' + theme.mixins.toolbar.minHeight + 'px)',\n }\n});\n\nexport const EXTENSIONS = {\n images: ['png', 'jpg', 'svg', 'jpeg'],\n code: ['js', 'json'],\n txt: ['log', 'txt', 'html', 'css', 'xml'],\n};\n\nclass ObjectCustomDialog extends MobileDialog {\n constructor(props) {\n super(props);\n\n let currentTab = parseInt(window.localStorage.getItem('App.objectCustomTab') || 0, 10);\n this.chartAvailable = this.isChartAvailable();\n\n if (this.chartAvailable) {\n const location = Router.getLocation();\n if (location.arg === 'chart') {\n currentTab = 2;\n } else if (location.arg === 'table') {\n currentTab = 1;\n }\n } else {\n currentTab = 0;\n }\n\n this.state = {\n hasChanges: false,\n currentTab,\n confirmDialog: false,\n mobile: MobileDialog.isMobile(),\n progressRunning: false,\n };\n\n this.saveFunc = null;\n }\n\n isChartAvailable() {\n let chartAvailable = this.props.objectIDs.length === 1;\n if (chartAvailable) {\n const id = this.props.objectIDs[0];\n if (this.props.objects[id] && this.props.objects[id].common && this.props.objects[id].common.custom && this.props.objects[id].common.custom) {\n chartAvailable = Object.keys(this.props.objects[id].common.custom).find(inst => {\n const obj = this.props.objects['system.adapter.' + inst];\n return obj && obj.common && obj.common.getHistory;\n });\n } else {\n chartAvailable = false;\n }\n }\n return chartAvailable;\n }\n\n renderCharts() {\n return <ObjectChart\n id={'chart-tabpanel'}\n isFloatComma={this.props.isFloatComma}\n showJumpToEchart={true}\n t={this.props.t}\n lang={this.props.lang}\n expertMode={this.props.expertMode}\n socket={this.props.socket}\n obj={this.props.objects[this.props.objectIDs[0]]}\n customsInstances={this.props.customsInstances}\n themeType={this.props.themeType}\n objects={this.props.objects}\n />;\n }\n\n renderTable() {\n return <ObjectHistoryData\n id={'table-tabpanel'}\n t={this.props.t}\n isFloatComma={this.props.isFloatComma}\n lang={this.props.lang}\n expertMode={this.props.expertMode}\n socket={this.props.socket}\n obj={this.props.objects[this.props.objectIDs[0]]}\n customsInstances={this.props.customsInstances}\n themeName={this.props.themeName}\n objects={this.props.objects}\n />;\n }\n\n renderCustomEditor() {\n return <ObjectCustomEditor\n id={'custom-settings-tabpanel'}\n registerSaveFunc={func => this.saveFunc = func }\n t={this.props.t}\n lang={this.props.lang}\n expertMode={this.props.expertMode}\n socket={this.props.socket}\n objectIDs={this.props.objectIDs}\n customsInstances={this.props.customsInstances}\n objects={this.props.objects}\n onProgress={progressRunning => this.setState({progressRunning})}\n reportChangedIds={this.props.reportChangedIds}\n onChange={(hasChanges, update) => {\n this.setState({ hasChanges }, () => {\n if (update) {\n const chartAvailable = this.isChartAvailable();\n if (chartAvailable !== this.chartAvailable) {\n this.chartAvailable = chartAvailable;\n this.forceUpdate();\n }\n }\n });\n }}\n theme={this.props.theme}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n />;\n }\n\n renderConfirmDialog() {\n if (!this.state.confirmDialog) {\n return null;\n }\n return <ConfirmDialog\n title={ I18n.t('You have unsaved changes') }\n text={ I18n.t('Discard?') }\n ok={ I18n.t('Yes') }\n cancel={ I18n.t('Cancel') }\n onClose={isYes =>\n this.setState({ confirmDialog: false}, () => isYes && this.props.onClose())}\n />;\n }\n\n onClose() {\n if (this.state.hasChanges) {\n this.setState({confirmDialog: true});\n } else {\n this.props.onClose();\n }\n }\n\n render() {\n const varType = this.props.objects[this.props.objectIDs[0]]?.common?.type;\n\n return <Dialog\n classes={{scrollPaper: this.props.classes.dialog, paper: this.props.classes.paper}}\n scroll=\"paper\"\n open={true}\n onClose={() => this.props.onClose()}\n fullWidth={true}\n maxWidth=\"xl\"\n aria-labelledby=\"form-dialog-title\"\n >\n {this.renderConfirmDialog()}\n <DialogTitle>{\n this.props.objectIDs.length > 1 ?\n this.props.t('Edit config for %s states', this.props.objectIDs.length) :\n this.props.t('Edit config: %s', this.props.objectIDs[0])\n }</DialogTitle>\n <DialogContent className={this.props.classes.content}>\n <AppBar position=\"static\">\n <Tabs value={this.state.currentTab} onChange={(event, newTab) => {\n Router.doNavigate(null, null, null, newTab === 1 ? 'table' : (newTab === 2 ? 'chart' : 'config'));\n this.setState({ currentTab: newTab });\n window.localStorage.setItem('App.objectCustomTab', newTab);\n }}>\n <Tab disabled={this.state.progressRunning} label={this.props.t('Custom settings')} id={'custom-settings-tab'} aria-controls={'simple-tabpanel-0'} />\n {this.props.objectIDs.length === 1 && this.chartAvailable ? <Tab disabled={this.state.progressRunning} label={this.props.t('History data')} id={'history-data-tab'} aria-controls={'simple-tabpanel-1'} /> : null}\n {(varType === 'number' || varType === 'boolean') && this.props.objectIDs.length === 1 && this.chartAvailable ? <Tab disabled={this.state.progressRunning} label={this.props.t('Chart')} id={'chart-tab'} aria-controls={'simple-tabpanel-2'} /> : null}\n </Tabs>\n </AppBar>\n {this.state.currentTab === 0 ? <div className={this.props.classes.tabPanel}>{this.renderCustomEditor()}</div> : null}\n {this.props.objectIDs.length === 1 && this.chartAvailable && this.state.currentTab === 1 ? <div className={this.props.classes.tabPanel}>{this.renderTable()}</div> : null}\n {(varType === 'number' || varType === 'boolean') && this.props.objectIDs.length === 1 && this.chartAvailable && this.state.currentTab === 2 ? <div className={this.props.classes.tabPanel}>{this.renderCharts()}</div> : null}\n </DialogContent>\n <DialogActions>\n {this.state.currentTab === 0 && <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={!this.state.hasChanges || this.state.progressRunning}\n onClick={() => this.saveFunc && this.saveFunc()}\n >\n {this.getButtonTitle(<SaveIcon />, this.props.t('Save'))}\n </Button>}\n {this.state.currentTab === 0 && <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={!this.state.hasChanges || this.state.progressRunning}\n onClick={() => {\n if (this.saveFunc) {\n this.saveFunc(error => !error && this.onClose());\n } else {\n this.onClose();\n }\n }}\n >\n {this.getButtonTitle(<SaveIcon />, this.props.t('Save & close'), <CloseIcon />)}\n </Button>}\n <Button\n disabled={this.state.progressRunning}\n variant=\"contained\"\n onClick={() => this.onClose()} >\n {this.getButtonTitle(<CloseIcon />, this.props.t('Close'))}\n </Button>\n </DialogActions>\n </Dialog>;\n }\n}\n\nObjectCustomDialog.propTypes = {\n t: PropTypes.func,\n lang: PropTypes.string,\n expertMode: PropTypes.bool,\n objects: PropTypes.object,\n socket: PropTypes.object,\n theme: PropTypes.object,\n themeName: PropTypes.string,\n themeType: PropTypes.string,\n customsInstances: PropTypes.array,\n objectIDs: PropTypes.array,\n onClose: PropTypes.func,\n reportChangedIds: PropTypes.func,\n isFloatComma: PropTypes.bool,\n};\n\nexport default withStyles(styles)(ObjectCustomDialog);\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from '@material-ui/core/styles';\n\nimport AceEditor from 'react-ace';\nimport 'ace-builds/webpack-resolver';\nimport 'ace-builds/src-noconflict/mode-json';\nimport 'ace-builds/src-noconflict/theme-clouds_midnight';\nimport 'ace-builds/src-noconflict/theme-chrome';\nimport 'ace-builds/src-noconflict/ext-language_tools'\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport TextField from '@material-ui/core/TextField';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport Grid from '@material-ui/core/Grid';\nimport Hidden from '@material-ui/core/Hidden';\nimport Fab from '@material-ui/core/Fab';\nimport Typography from '@material-ui/core/Typography';\nimport Switch from '@material-ui/core/Switch';\n\nimport ChartIcon from '@material-ui/icons/ShowChart';\nimport IconCancel from '@material-ui/icons/Close';\nimport IconCheck from '@material-ui/icons/Check';\n\nimport ObjectChart from './ObjectChart';\n\nconst styles = theme => ({\n input: {\n width: '100%'\n },\n textInput: {\n width: '100%'\n },\n formControl: {\n minWidth: 150,\n },\n quality: {\n width: 'calc(100% - 88px)'\n },\n expire: {\n marginLeft: 8,\n width: 80\n },\n jsonError: {\n border: '1px solid red'\n },\n jsonNoError: {\n border: '1px solid #00000000'\n },\n wrapperButton: {\n },\n '@media screen and (max-width: 465px)': {\n wrapperButton: {\n '& *': {\n fontSize: 12\n }\n },\n },\n '@media screen and (max-width: 380px)': {\n wrapperButton: {\n '& *': {\n fontSize: 11\n }\n },\n },\n});\n\nconst AntSwitch = withStyles((theme) => ({\n root: {\n width: 28,\n height: 16,\n padding: 0,\n display: 'flex',\n },\n switchBase: {\n padding: 2,\n color: theme.palette.grey[500],\n '&$checked': {\n transform: 'translateX(12px)',\n color: theme.palette.common.white,\n '& + $track': {\n opacity: 1,\n backgroundColor: theme.palette.primary.main,\n borderColor: theme.palette.primary.main,\n },\n },\n },\n thumb: {\n width: 12,\n height: 12,\n boxShadow: 'none',\n },\n track: {\n border: `1px solid ${theme.palette.grey[500]}`,\n borderRadius: 16 / 2,\n opacity: 1,\n backgroundColor: theme.palette.common.white,\n },\n checked: {},\n}))(Switch);\n\nclass ObjectBrowserValue extends Component {\n constructor(props) {\n super(props);\n\n let type = this.props.type || typeof this.props.value;\n\n this.value = this.props.value;\n this.propsValue = this.value;\n if (this.propsValue === null) {\n this.propsValue = 'null';\n } else if (this.propsValue === undefined) {\n this.propsValue = 'undefined';\n }\n\n if (this.props.states) {\n type = 'states';\n } else\n if (type === 'string' || type === 'json') {\n if (this.value && typeof this.value === 'string' &&\n ((this.value.startsWith('[') && this.value.endsWith(']')) ||\n (this.value.startsWith('{') && this.value.endsWith('}')))\n ) {\n try {\n this.value = JSON.parse(this.value);\n this.value = JSON.stringify(this.value, null, 2);\n this.propsValue = this.value;\n type = 'json';\n } catch (e) {\n\n }\n }\n }\n\n this.state = {\n type,\n chart: false,\n chartEnabled: window.localStorage.getItem('App.chartSetValue') !== 'false',\n };\n\n this.ack = false;\n this.q = 0;\n this.expire = 0;\n\n this.inputRef = React.createRef();\n\n this.chartFrom = Date.now() - 3600000 * 2;\n }\n\n componentDidMount() {\n if (this.props.defaultHistory &&\n this.props.object?.common?.custom &&\n this.props.object.common.custom[this.props.defaultHistory]?.enabled) {\n this.props.socket.getState('system.adapter.' + this.props.defaultHistory + '.alive')\n .then(state => this.setState({chart: state && !!state.val}));\n }\n\n setTimeout(() => {\n if (this.inputRef && this.inputRef.current) {\n const el = this.inputRef.current;\n const value = el.value || '';\n el.setSelectionRange(0, value.length);\n }\n }, 200);\n }\n\n onUpdate() {\n if (this.state.type === 'states') {\n let type = this.props.type || typeof this.props.value;\n\n if (type === 'number') {\n if (typeof this.value === 'string') {\n this.value = parseFloat(this.value.replace(',', '.')) || 0;\n }\n } else if (type === 'boolean') {\n this.value = this.value === true || this.value === 'true' || this.value === '1' || this.value === 'ON' || this.value === 'on';\n }\n } else\n if (this.state.type === 'number') {\n if (typeof this.value === 'string') {\n this.value = parseFloat(this.value.replace(',', '.')) || 0;\n }\n } else if (this.state.type === 'boolean') {\n this.value = this.value === true || this.value === 'true' || this.value === '1' || this.value === 'ON' || this.value === 'on';\n }\n\n this.props.onClose({val: this.value, ack: this.ack, q: this.q, expire: parseInt(this.expire, 10) || undefined});\n }\n\n renderChart() {\n return <ObjectChart\n t={this.props.t}\n isFloatComma={this.props.isFloatComma}\n showJumpToEchart={false}\n lang={this.props.lang}\n socket={this.props.socket}\n obj={this.props.object}\n themeType={this.props.themeType}\n from={this.chartFrom}\n end={Date.now()}\n noToolbar={true}\n dateFormat={this.props.dateFormat}\n defaultHistory={this.props.defaultHistory}\n />;\n }\n\n checkJsonError() {\n try {\n JSON.parse(this.value);\n this.setState({jsonError: false});\n } catch (e) {\n this.setState({jsonError: true});\n }\n }\n\n renderJsonEditor() {\n return <AceEditor\n className={this.state.jsonError ? this.props.classes.jsonError : this.props.classes.jsonNoError}\n mode=\"json\"\n width=\"100%\"\n height=\"200px\"\n showPrintMargin={true}\n showGutter={true}\n highlightActiveLine={true}\n theme={this.props.themeType === 'dark' ? 'clouds_midnight' : 'chrome'}\n defaultValue={(this.propsValue || '').toString()}\n onChange={newValue => {\n this.value = newValue;\n this.checkJsonError();\n }}\n name=\"UNIQUE_ID_OF_DIV1\"\n fontSize={14}\n setOptions={{\n enableBasicAutocompletion: true,\n enableLiveAutocompletion: true,\n enableSnippets: true,\n showLineNumbers: true,\n tabSize: 2,\n }}\n editorProps={{$blockScrolling: true}}\n />;\n }\n\n renderStates() {\n if (!this.props.states) {\n return null;\n } else {\n return <FormControl className={ this.props.classes.formControl }>\n <InputLabel>{ this.props.t('Value') }</InputLabel>\n <Select\n defaultValue={ this.propsValue }\n onChange={ e => this.value = e.target.value }\n >\n {Object.keys(this.props.states).map((key, i) => <MenuItem key={i} value={key}>{this.props.states[key]}</MenuItem>)}\n </Select>\n </FormControl>;\n }\n }\n\n render() {\n return <Dialog\n open={ true }\n maxWidth={ this.state.type === 'number' || this.state.type === 'boolean' || this.state.type === 'states' ? (this.state.chart && this.state.chartEnabled ? 'lg' : null) : 'md'}\n fullWidth={ (this.state.type !== 'number' && this.state.type !== 'boolean' && this.state.type !== 'states') || (this.state.chart && this.state.chartEnabled)}\n onClose={ () => this.props.onClose() }\n aria-labelledby=\"edit-value-dialog-title\"\n aria-describedby=\"edit-value-dialog-description\"\n >\n <DialogTitle id=\"edit-value-dialog-title\">\n { this.props.t('Write value') }\n {/*this.state.chart ? <div style={{flexGrow: 1}}/> : null*/}\n {this.state.chart ? <Fab\n style={{float: 'right'}}\n size=\"small\"\n color={this.state.chartEnabled ? 'primary' : 'default'}\n onClick={() => {\n window.localStorage.setItem('App.chartSetValue', this.state.chartEnabled ? 'false' : 'true');\n this.setState({chartEnabled: !this.state.chartEnabled});\n }}><ChartIcon /></Fab> : null}\n </DialogTitle>\n <DialogContent>\n <form className={ this.props.classes.dialogForm } noValidate autoComplete=\"off\">\n <Grid container direction=\"row\" spacing={2}>\n <Grid item xs={this.state.chart && this.state.chartEnabled ? 6 : 12}>\n <Grid container direction=\"column\" spacing={2}>\n { this.props.expertMode ? <Grid item><FormControl className={ this.props.classes.formControl }>\n <InputLabel>{ this.props.t('Value type') }</InputLabel>\n <Select\n value={ this.state.type }\n onChange={ e => {\n if (e.target.value === 'json') {\n this.value = (this.value || '').toString();\n this.checkJsonError();\n }\n\n this.setState({ type: e.target.value })\n }}\n >\n <MenuItem value=\"string\">String</MenuItem>\n <MenuItem value=\"number\">Number</MenuItem>\n <MenuItem value=\"boolean\">Boolean</MenuItem>\n <MenuItem value=\"json\">JSON</MenuItem>\n {this.props.states ? <MenuItem value=\"states\">States</MenuItem> : null}\n </Select>\n </FormControl></Grid> : null }\n\n <Grid item>\n { this.state.type === 'boolean' ?\n /*<FormControl component=\"fieldset\" className={ this.props.classes.formControl }>\n <FormControlLabel\n className={ this.props.classes.formControl }\n control={<Checkbox\n autoFocus\n defaultChecked={ !!this.propsValue }\n onKeyUp={e => e.keyCode === 13 && this.onUpdate() }\n onChange={e => this.value = e.target.checked}/>}\n label={this.props.t('Value')}\n />\n <FormHelperText>{this.props.t('Press ENTER to write the value, when focused')}</FormHelperText>\n </FormControl>*/\n <Typography component=\"div\">\n <Grid component=\"label\" container alignItems=\"center\" spacing={1}>\n <Grid item style={{marginRight: 10}}>{this.props.t('Value')}:</Grid>\n <Grid item>FALSE</Grid>\n <Grid item>\n <AntSwitch\n autoFocus\n defaultChecked={ !!this.propsValue }\n onKeyUp={e => e.keyCode === 13 && this.onUpdate() }\n onChange={e => this.value = e.target.checked}\n />\n </Grid>\n <Grid item>TRUE</Grid>\n </Grid>\n </Typography>\n :\n (this.state.type === 'number' ?\n <TextField\n classes={{ root: this.props.classes.textInput }}\n autoFocus\n inputRef={this.inputRef}\n helperText={ this.props.t('Press ENTER to write the value, when focused') }\n label={ this.props.t('Value') }\n defaultValue={ parseFloat(this.propsValue) || 0 }\n onKeyUp={ e => e.keyCode === 13 && this.onUpdate() }\n onChange={ e => this.value = e.target.value }/>\n :\n (this.state.type === 'json' ?\n this.renderJsonEditor()\n :\n (this.state.type === 'states' ?\n this.renderStates()\n :\n <TextField\n classes={{ root: this.props.classes.textInput }}\n inputRef={this.inputRef}\n autoFocus\n helperText={ this.props.t('Press CTRL+ENTER to write the value, when focused')}\n label={ this.props.t('Value') }\n fullWidth={ true }\n multiline\n onKeyUp={e => e.ctrlKey && e.keyCode === 13 && this.onUpdate() }\n defaultValue={ this.propsValue.toString() }\n onChange={ e => this.value = e.target.value }/>\n )\n )\n )\n }\n </Grid>\n <Grid item>\n <FormControlLabel\n className={ this.props.classes.formControl }\n control={ <Checkbox\n defaultChecked={ false }\n onChange={ e => this.ack = e.target.checked }/> }\n label={ this.props.t('Acknowledged') }\n />\n </Grid>\n\n { this.props.expertMode ? <Grid item><FormControl className={ this.props.classes.quality }>\n <InputLabel>{ this.props.t('Quality') }</InputLabel>\n <Select\n defaultValue={ 0 }\n onChange={ e => this.q = parseInt(e.target.value, 10) }\n >\n <MenuItem value={ 0x00 }>0x00 - good</MenuItem>\n\n <MenuItem value={ 0x01 }>0x01 - general problem</MenuItem>\n <MenuItem value={ 0x02 }>0x02 - no connection problem</MenuItem>\n\n <MenuItem value={ 0x10 }>0x10 - substitute value from controller</MenuItem>\n <MenuItem value={ 0x20 }>0x20 - substitute initial value</MenuItem>\n <MenuItem value={ 0x40 }>0x40 - substitute value from device or instance</MenuItem>\n <MenuItem value={ 0x80 }>0x80 - substitute value from sensor</MenuItem>\n\n <MenuItem value={ 0x11 }>0x11 - general problem by instance</MenuItem>\n <MenuItem value={ 0x41 }>0x41 - general problem by device</MenuItem>\n <MenuItem value={ 0x81 }>0x81 - general problem by sensor</MenuItem>\n\n <MenuItem value={ 0x12 }>0x12 - instance not connected</MenuItem>\n <MenuItem value={ 0x42 }>0x42 - device not connected</MenuItem>\n <MenuItem value={ 0x82 }>0x82 - sensor not connected</MenuItem>\n\n <MenuItem value={ 0x44 }>0x44 - device reports error</MenuItem>\n <MenuItem value={ 0x84 }>0x84 - sensor reports error</MenuItem>\n </Select>\n </FormControl>\n <TextField\n title={this.props.t('0 - no expiration')}\n classes={{root: this.props.classes.expire}}\n label={this.props.t('Expire')}\n type=\"number\"\n inputProps={{min: 0}}\n helperText={this.props.t('in seconds')}\n defaultValue={this.expire}\n onChange={e => this.expire = e.target.value}\n />\n </Grid> : null }\n </Grid>\n </Grid>\n {this.state.chart && this.state.chartEnabled ? <Hidden only={['sm', 'xs']}><Grid item xs={6} style={{minHeight: 300}}>\n {this.renderChart()}\n </Grid></Hidden>: null}\n </Grid>\n </form>\n </DialogContent>\n <DialogActions className={this.props.classes.wrapperButton}>\n <Button variant=\"contained\" onClick={ () => this.onUpdate() } color=\"primary\" startIcon={<IconCheck />}>{ this.props.t('Set value') }</Button>\n <Button variant=\"contained\" onClick={ () => this.props.onClose() } startIcon={<IconCancel />}>{ this.props.t('Cancel') }</Button>\n </DialogActions>\n </Dialog>;\n }\n}\n\nObjectBrowserValue.propTypes = {\n classes: PropTypes.object,\n type: PropTypes.string,\n states: PropTypes.object,\n value: PropTypes.any,\n expertMode: PropTypes.bool,\n onClose: PropTypes.func.isRequired,\n themeType: PropTypes.string,\n socket: PropTypes.object,\n defaultHistory: PropTypes.string,\n dateFormat: PropTypes.string,\n object: PropTypes.object,\n isFloatComma: PropTypes.bool,\n\n t: PropTypes.func,\n lang: PropTypes.string,\n};\n\nexport default withStyles(styles)(ObjectBrowserValue);\n","import React, { Component } from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport AceEditor from 'react-ace';\nimport 'ace-builds/webpack-resolver';\nimport 'ace-builds/src-noconflict/mode-json';\nimport 'ace-builds/src-noconflict/theme-clouds_midnight';\nimport 'ace-builds/src-noconflict/theme-chrome';\nimport 'ace-builds/src-noconflict/ext-language_tools'\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport TextField from '@material-ui/core/TextField';\nimport Grid from '@material-ui/core/Grid';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Fab from '@material-ui/core/Fab';\nimport IconButton from '@material-ui/core/IconButton';\n\nimport IconClose from '@material-ui/icons/Close';\nimport IconCheck from '@material-ui/icons/Check';\nimport AddIcon from '@material-ui/icons/Add';\nimport {FaClipboard as IconCopyClipboard} from 'react-icons/fa';\nimport IconCopy from '@material-ui/icons/FileCopy';\nimport IconFx from '@iobroker/adapter-react/icons/IconFx';\n\nimport DialogSelectID from '@iobroker/adapter-react/Dialogs/SelectID';\nimport Utils from '@iobroker/adapter-react/Components/Utils';\nimport I18n from '@iobroker/adapter-react/i18n';\nimport copy from \"@iobroker/adapter-react/Components/copy-to-clipboard\";\nimport { FormControl, InputLabel, MenuItem, Select, Tooltip } from '@material-ui/core';\nimport { Autocomplete } from '@material-ui/lab';\nimport UploadImage from '../UploadImage';\n\n\nconst styles = theme => ({\n divWithoutTitle: {\n width: '100%',\n height: '100%',\n border: '2px solid #00000000',\n },\n divWithoutTitleAndTab: {\n height: 'calc(100% - 48px)',\n },\n error: {\n border: '2px solid #FF0000',\n },\n id: {\n fontStyle: 'italic',\n },\n dialog: {\n height: 'calc(100% - 64px)'\n },\n aliasIdEdit: {\n width: 400 - 32,\n },\n button: {\n marginTop: 20,\n marginLeft: theme.spacing(1),\n },\n funcDivEdit: {\n width: '100%'\n },\n funcEditName: {\n display: 'inline-block',\n width: 85\n },\n funcEdit: {\n width: 400,\n },\n funcIcon: {\n width: 16,\n height: 16,\n },\n marginTop: {\n marginTop: 20,\n },\n commonTabWrapper: {\n flexFlow: 'wrap',\n display: 'flex'\n },\n commonWrapper: {\n width: 500,\n minWidth: 300\n },\n flexDrop: {\n width: '100%',\n maxWidth: 500,\n margin: 'auto',\n display: 'flex'\n },\n marginBlock: {\n marginTop: 20\n },\n buttonAdd: {\n minWidth: 150\n },\n textField: {\n width: '100%'\n },\n flex: {\n display: 'flex'\n },\n close: {\n width: '20px',\n height: '20px',\n opacity: '0.9',\n cursor: 'pointer',\n position: 'relative',\n top: 20,\n transition: 'all 0.6s ease',\n '&:hover': {\n transform: 'rotate(90deg)'\n },\n '&:before': {\n position: 'absolute',\n left: '9px',\n content: '\"\"',\n height: '20px',\n width: '3px',\n backgroundColor: '#ff4f4f',\n transform: 'rotate(45deg)'\n },\n '&:after': {\n position: 'absolute',\n left: '9px',\n content: '\"\"',\n height: '20px',\n width: '3px',\n backgroundColor: '#ff4f4f',\n transform: 'rotate(-45deg)'\n },\n },\n color: {\n width: 70\n },\n buttonRemoveWrapper: {\n position: 'absolute',\n zIndex: 222,\n right: 0\n },\n tabsPadding: {\n padding: '0px 24px'\n },\n '@media screen and (max-width: 465px)': {\n wrapperButton: {\n '& *':{\n fontSize:10\n }\n },\n },\n '@media screen and (max-width: 380px)': {\n wrapperButton: {\n '& *':{\n fontSize:9\n }\n },\n },\n});\n\nclass ObjectBrowserEditObject extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n text: JSON.stringify(this.props.obj, null, 2),\n error: false,\n changed: false,\n readError: this.checkFunction(this.props.obj.common?.alias?.read, false),\n writeError: this.checkFunction(this.props.obj.common?.alias?.write, true),\n tab: window.localStorage.getItem((this.props.dialogName || 'App') + '.editTab') || 'object',\n showCopyDialog: false,\n };\n\n this.isMobile = window.innerWidth < 850;\n\n this.originalObj = JSON.stringify(this.props.obj, null, 2);\n }\n\n checkFunction(func, isWrite) {\n if (!func) {\n return '';\n } else {\n let json;\n try {\n json = JSON.parse(this.state.text);\n } catch (e) {\n\n }\n\n let jsFunc;\n try {\n // eslint-disable-next-line no-new-func\n jsFunc = new Function('val', func.includes('return') ? func : 'return ' + func);\n } catch (e) {\n return this.props.t('Cannot parse code!');\n }\n\n if (json?.common?.type && this.props.objects[json.common?.alias?.id]?.common?.type) {\n const initialType = isWrite ? json.common.type : this.props.objects[json.common.alias.id].common.type;\n const finalType = isWrite ? this.props.objects[json.common.alias.id].common.type : json.common.type;\n if (initialType && finalType) {\n let arg = null;\n if (initialType === 'boolean') {\n arg = true;\n } else if (initialType === 'number') {\n arg = 1;\n } else if (initialType === 'string') {\n arg = 'string';\n }\n if (arg !== null) {\n try {\n const result = jsFunc(arg);\n return result !== null && typeof result !== finalType ?\n this.props.t('Type of result is not as expected: %s', finalType) : '';\n } catch (e) {\n return this.props.t('Cannot execute function') + ': ' + e.toString();\n }\n }\n }\n }\n\n return '';\n }\n }\n\n prepareObject(value) {\n value = value || this.state.text;\n try {\n const obj = JSON.parse(value);\n obj._id = this.props.obj._id; // do not allow change of id\n\n // check aliases\n if (obj.common?.alias) {\n if (!obj.common.alias.id) {\n delete obj.common.alias.id;\n }\n if ((!obj.common.alias.read && obj.common.alias.read !== undefined) || obj.common.alias.read === 'val') {\n delete obj.common.alias.read;\n }\n if ((!obj.common.alias.write && obj.common.alias.write !== undefined) || obj.common.alias.write === 'val') {\n delete obj.common.alias.write;\n }\n if (!obj.common.alias.id && !obj.common.alias.read && !obj.common.alias.write) {\n delete obj.common.alias;\n }\n }\n return obj;\n } catch (e) {\n return null;\n }\n }\n\n onChange(value, cb) {\n const newState = { text: value };\n const json = this.prepareObject(value);\n if (json) {\n newState.changed = this.originalObj !== JSON.stringify(json, null, 2);\n if (this.state.error) {\n newState.error = false;\n }\n newState.readError = this.checkFunction(json.common?.alias?.read, false);\n newState.writeError = this.checkFunction(json.common?.alias?.write, true);\n } else {\n newState.error = true;\n }\n this.setState(newState, () => cb && cb());\n }\n\n onUpdate() {\n const obj = JSON.parse(this.state.text);\n obj._id = this.props.obj._id; // do not allow change of id\n\n // check aliases\n if (obj.common?.alias) {\n if (!obj.common.alias.id) {\n delete obj.common.alias.id;\n }\n if ((!obj.common.alias.read && obj.common.alias.read !== undefined) || obj.common.alias.read === 'val') {\n delete obj.common.alias.read;\n }\n if ((!obj.common.alias.write && obj.common.alias.write !== undefined) || obj.common.alias.write === 'val') {\n delete obj.common.alias.write;\n }\n if (!obj.common.alias.id && !obj.common.alias.read && !obj.common.alias.write) {\n delete obj.common.alias;\n }\n }\n\n this.props.onClose(obj);\n }\n\n renderTabs() {\n return <Tabs className={this.props.classes.tabsPadding} value={this.state.tab} onChange={(e, tab) => {\n window.localStorage.setItem((this.props.dialogName || 'App') + '.editTab', tab);\n this.setState({ tab });\n }}>\n <Tab value=\"common\" label={this.props.t('Common')} />\n <Tab value=\"object\" label={this.props.t('Object data')} />\n {this.props.obj._id.startsWith('alias.0') && this.props.obj.type === 'state' && <Tab value=\"alias\" label={this.props.t('Alias')} />}\n </Tabs>;\n }\n\n renderSelectDialog() {\n if (!this.state.selectId && !this.state.selectRead && !this.state.selectWrite) {\n return null;\n }\n\n const json = JSON.parse(this.state.text);\n\n let id;\n\n if (this.state.selectId) {\n id = json.common?.alias?.id || '';\n } else if (this.state.selectRead) {\n id = json.common?.alias?.id?.read || '';\n } else if (this.state.selectWrite) {\n id = json.common?.alias?.id?.write || '';\n }\n\n return <DialogSelectID\n key=\"selectDialog\"\n imagePrefix=\".\"\n dateFormat={this.props.dateFormat}\n isFloatComma={this.props.isFloatComma}\n socket={this.props.socket}\n dialogName=\"aliasesEdit\"\n title={`${this.props.t('Select for')} ${this.props.obj._id}`}\n selected={id}\n statesOnly={true}\n onOk={id => {\n const selectRead = this.state.selectRead;\n const selectWrite = this.state.selectWrite;\n const selectId = this.state.selectId;\n this.setState({ selectId: false, selectRead: false, selectWrite: false }, () => {\n if (selectRead) {\n this.setAliasItem(json, 'id.read', id);\n } else if (selectWrite) {\n this.setAliasItem(json, 'id.write', id);\n } else if (selectId) {\n this.setAliasItem(json, 'id', id);\n }\n });\n }}\n onClose={() => this.setState({ selectId: false, selectRead: false, selectWrite: false })}\n />;\n }\n\n setAliasItem(json, name, value, cb) {\n json.common = json.common || {};\n json.common.alias = json.common.alias || {};\n\n if (name === 'id.read') {\n if (json.common.alias.id && typeof json.common.alias.id === 'object') {\n json.common.alias.id.read = value;\n } else {\n json.common.alias.id = {read: value, write: value};\n }\n } else if (name === 'id.write') {\n if (json.common.alias.id && typeof json.common.alias.id === 'object') {\n json.common.alias.id.write = value;\n } else {\n json.common.alias.id = {read: value, write: value};\n }\n } else {\n json.common.alias[name] = value;\n }\n\n this.onChange(JSON.stringify(json, null, 2), cb);\n }\n\n setCommonItem(json, name, value) {\n json.common[name] = value;\n this.onChange(JSON.stringify(json, null, 2));\n }\n\n removeCommonItem(json, name) {\n delete json.common[name]\n this.onChange(JSON.stringify(json, null, 2));\n }\n\n buttonAddKey(nameKey, cb) {\n const { t, classes } = this.props;\n return <div\n className={classes.marginBlock}>\n <Button\n className={classes.buttonAdd}\n variant=\"contained\"\n color=\"secondary\"\n startIcon={<AddIcon />}\n onClick={cb}>{t('add %s', nameKey)}</Button>\n </div>;\n }\n\n buttonRemoveKey(nameKey, cb) {\n const { t, classes } = this.props;\n return <Tooltip title={t('Remove %s', nameKey)}><div className={classes.close} onClick={cb} /></Tooltip>;\n }\n\n renderCommonEdit() {\n try {\n const json = JSON.parse(this.state.text);\n const stateTypeArray = [\n 'boolean',\n 'json',\n 'string',\n 'number',\n 'multistate',\n 'file',\n 'object',\n 'mixed'\n ];\n const disabled = false;\n const { classes, t, roleArray, obj } = this.props;\n const checkState = obj.type === 'state';\n const checkRole = obj.type === 'channel' || obj.type === 'device' || checkState;\n return <div className={classes.commonTabWrapper}>\n <div className={classes.commonWrapper}>\n {typeof json.common.name !== 'undefined' ?\n <TextField\n disabled={disabled}\n label={t('Name')}\n className={clsx(classes.marginBlock, classes.textField)}\n fullWidth\n value={Utils.getObjectNameFromObj(json, I18n.getLanguage())}\n onChange={(el) => this.setCommonItem(json, 'name', el.target.value)}\n /> :\n this.buttonAddKey('name', () => this.setCommonItem(json, 'name', ''))\n }\n {checkState ? typeof json.common.type !== 'undefined' ?\n <div className={classes.flex}>\n <FormControl\n className={classes.marginBlock}\n fullWidth>\n <InputLabel >{t('State type')}</InputLabel>\n <Select\n disabled={disabled}\n value={json.common.type}\n onChange={(el) => this.setCommonItem(json, 'type', el.target.value)}\n >\n {stateTypeArray.map(el => <MenuItem key={el} value={el}>{t(el)}</MenuItem>)}\n </Select>\n </FormControl>\n {this.buttonRemoveKey('type', () => this.removeCommonItem(json, 'type'))}\n </div>\n :\n this.buttonAddKey('type', () => this.setCommonItem(json, 'type', 'string'))\n : null}\n {checkRole ? typeof json.common.role !== 'undefined' ?\n <div className={classes.flex}>\n <Autocomplete\n className={classes.marginBlock}\n fullWidth\n disabled={disabled}\n value={json.common.role}\n getOptionSelected={(option, value) => option.name === value.name}\n onChange={(_, e) => this.setCommonItem(json, 'role', e)}\n options={roleArray}\n renderInput={(params) => <TextField {...params} label={t('Role')} />}\n />\n {this.buttonRemoveKey('role', () => this.removeCommonItem(json, 'role'))}\n </div> :\n this.buttonAddKey('role', () => this.setCommonItem(json, 'role', ''))\n : null}\n {typeof json.common.color !== 'undefined' ?\n <div className={classes.flex}>\n <TextField\n disabled={disabled}\n className={clsx(classes.marginBlock, classes.color)}\n label={t('Color')}\n type=\"color\"\n value={json.common.color}\n onChange={el => this.setCommonItem(json, 'color', el.target.value)} />\n {this.buttonRemoveKey('color', () => this.removeCommonItem(json, 'color'))}\n </div> :\n this.buttonAddKey('color', () => this.setCommonItem(json, 'color', ''))\n }\n </div>\n {typeof json.common.icon !== 'undefined' ?\n <div className={classes.flexDrop}>\n <UploadImage\n disabled={disabled}\n maxSize={10 * 1024}\n icon={json.common.icon}\n removeIconFunc={() => this.setCommonItem(json, 'icon', '')}\n onChange={(base64) => this.setCommonItem(json, 'icon', base64)}\n t={t}\n />\n {this.buttonRemoveKey('icon', () => this.removeCommonItem(json, 'icon'))}\n </div> :\n <div className={classes.flexDrop}>\n {this.buttonAddKey('icon', () => this.setCommonItem(json, 'icon', ''))}\n </div>\n }\n </div>\n } catch (e) {\n return <div>{this.props.t('Cannot parse JSON!')}</div>;\n }\n }\n renderAliasEdit() {\n try {\n const json = JSON.parse(this.state.text);\n const funcVisible = json.common?.alias?.read !== undefined;\n\n return <Grid container direction=\"column\" className={this.props.classes.marginTop}>\n <Grid item>\n <FormControlLabel\n control={<Checkbox checked={typeof json.common?.alias?.id === 'object'} onChange={() => {\n if (typeof json.common?.alias?.id === 'object') {\n this.setAliasItem(json, 'id', json.common?.alias?.id?.read || '');\n } else {\n this.setAliasItem(json, 'id.read', json.common?.alias?.id || '');\n }\n }} />}\n label={this.props.t('Different IDs for read and write')}\n />\n </Grid>\n {typeof json.common?.alias?.id !== 'object' ? <Grid item>\n <TextField\n label={this.props.t('Alias state')}\n value={json.common?.alias?.id || ''}\n className={this.props.classes.aliasIdEdit}\n InputProps={{\n endAdornment: json.common?.alias?.id ? <InputAdornment position=\"end\"><IconButton\n onClick={() => this.setAliasItem(json, 'id', '')}><IconClose/></IconButton></InputAdornment> : null,\n }}\n onChange={e => this.setAliasItem(json, 'id', e.target.value)}\n margin=\"normal\"\n />\n <Fab\n className={this.props.classes.button}\n size=\"small\"\n onClick={() => this.setState({selectId: true, selectRead: false, selectWrite: false})}>...</Fab>\n </Grid> : null}\n\n {typeof json.common?.alias?.id === 'object' ? <Grid item>\n <TextField\n label={this.props.t('Alias read state')}\n value={json.common?.alias?.id?.read || ''}\n className={this.props.classes.aliasIdEdit}\n InputProps={{\n endAdornment: json.common?.alias?.id?.read ? <InputAdornment position=\"end\"><IconButton\n onClick={() => this.setAliasItem(json, 'id.read', '')}><IconClose/></IconButton></InputAdornment> : null,\n }}\n onChange={e => this.setAliasItem(json, 'id.read', e.target.value)}\n margin=\"normal\"\n />\n <Fab\n className={this.props.classes.button}\n size=\"small\"\n onClick={() => this.setState({selectId: false, selectRead: true, selectWrite: false})}>...</Fab>\n </Grid> : null}\n\n {typeof json.common?.alias?.id === 'object' ? <Grid item>\n <TextField\n label={this.props.t('Alias write state')}\n value={json.common?.alias?.id?.write || ''}\n className={this.props.classes.aliasIdEdit}\n InputProps={{\n endAdornment: json.common?.alias?.id?.write ? <InputAdornment position=\"end\"><IconButton\n onClick={() => this.setAliasItem(json, 'id.write', '')}><IconClose/></IconButton></InputAdornment> : null,\n }}\n onChange={e => this.setAliasItem(json, 'id.write', e.target.value)}\n margin=\"normal\"\n />\n <Fab\n className={this.props.classes.button}\n size=\"small\"\n onClick={() => this.setState({selectId: false, selectRead: false, selectWrite: true})}>...</Fab>\n </Grid> : null}\n <Grid item className={this.props.classes.marginTop}>\n <FormControlLabel\n control={\n <Checkbox\n checked={json.common?.alias?.read !== undefined}\n onChange={() => {\n if (funcVisible) {\n delete json.common.alias.read;\n delete json.common.alias.write;\n } else {\n json.common = json.common || {};\n json.common.alias = json.common.alias || {};\n json.common.alias.read = 'val';\n json.common.alias.write = 'val';\n }\n this.onChange(JSON.stringify(json, null, 2));\n }}\n />\n }\n label={this.props.t('Use convert functions')}\n />\n </Grid>\n {funcVisible ?\n <Grid item>\n <TextField\n label={this.props.t('Read converter')}\n value={json.common?.alias?.read || ''}\n className={this.props.classes.funcEdit}\n error={!!this.state.readError}\n InputProps={{\n endAdornment: json.common?.alias?.read ? <InputAdornment position=\"end\"><IconButton onClick={() => this.setAliasItem(json, 'read', '')}><IconClose /></IconButton></InputAdornment> : null,\n startAdornment: <InputAdornment position=\"start\"><IconFx className={this.props.classes.funcIcon}/></InputAdornment>,\n }}\n onChange={e => this.setAliasItem(json, 'read', e.target.value)}\n helperText={this.state.readError || (this.props.t('JS function like') + ' \"val / 5 + 21\"')}\n margin=\"normal\"\n />\n </Grid> : null}\n {funcVisible ?\n <Grid item>\n <TextField\n label={this.props.t('Write converter')}\n error={!!this.state.writeError}\n value={json.common?.alias?.write || ''}\n helperText={this.state.writeError || (this.props.t('JS function like') + ' \"(val - 21) * 5\"')}\n className={this.props.classes.funcEdit}\n InputProps={{\n endAdornment: json.common?.alias?.write ? <InputAdornment position=\"end\"><IconButton onClick={() => this.setAliasItem(json, 'write', '')}><IconClose /></IconButton></InputAdornment> : null,\n startAdornment: <InputAdornment position=\"start\"><IconFx className={this.props.classes.funcIcon}/></InputAdornment>,\n }}\n onChange={e => this.setAliasItem(json, 'write', e.target.value)}\n margin=\"normal\"\n />\n </Grid> : null}\n </Grid>;\n } catch (e) {\n return <div>{this.props.t('Cannot parse JSON!')}</div>;\n }\n }\n\n onCopy(e) {\n e.stopPropagation();\n e.preventDefault();\n copy(this.state.text);\n window.alert(this.props.t('ra_Copied'));\n }\n\n onClone(oldId, newId, cb) {\n const newObj = JSON.parse(JSON.stringify(this.props.objects[oldId]));\n delete newObj.from;\n delete newObj.ts;\n delete newObj.user;\n newObj._id = newId;\n this.props.objects[newObj._id] = newObj; // bad practise, but no time to wait till this object will be created\n this.props.onNewObject(newObj);\n }\n\n renderCopyDialog() {\n if (!this.state.showCopyDialog) {\n return null;\n } else {\n return <Dialog\n open={true}\n maxWidth=\"md\"\n fullWidth\n onClose={() => this.setState({showCopyDialog: false})}\n >\n <DialogTitle>{this.props.t('Enter new ID for this object')}</DialogTitle>\n <DialogContent>\n <TextField\n autoFocus\n fullWidth\n label={this.props.t('New object ID')}\n value={this.state.newId}\n onKeyDown={e => {\n if (e.keyCode === 13 && !this.props.objects[this.state.newId]) {\n this.setState({showCopyDialog: ''});\n this.onClone(this.state.showCopyDialog, this.state.newId);\n }\n }}\n onChange={e => this.setState({newId: e.target.value})}\n />\n </DialogContent>\n <DialogActions>\n <Button\n disabled={!!this.props.objects[this.state.newId]}\n onClick={() => {\n this.setState({showCopyDialog: ''});\n this.onClone(this.state.showCopyDialog, this.state.newId);\n }}\n color=\"primary\"\n startIcon={<IconCopy />}\n >\n {this.props.t('Clone')}\n </Button>\n <Button\n onClick={() => this.setState({showCopyDialog: ''})}\n startIcon={<IconClose />}\n >\n {this.props.t('Cancel')}\n </Button>\n </DialogActions>\n </Dialog>;\n }\n }\n\n render() {\n const withAlias = this.props.obj._id.startsWith('alias.0') && this.props.obj.type === 'state';\n\n return <Dialog\n classes={{ paper: this.props.classes.dialog }}\n open={true}\n maxWidth=\"lg\"\n fullWidth={this.state.type !== 'number' && this.state.type !== 'boolean'}\n fullScreen={false}\n onClose={() => this.props.onClose()}\n aria-labelledby=\"edit-value-dialog-title\"\n aria-describedby=\"edit-value-dialog-description\"\n >\n <DialogTitle id=\"edit-value-dialog-title\">{this.props.t('Edit object:')} <span className={this.props.classes.id}>{this.props.obj._id}</span></DialogTitle>\n\n {this.renderTabs()}\n {this.renderCopyDialog()}\n <DialogContent>\n {this.state.tab === 'object' ?\n <div className={clsx(this.props.classes.divWithoutTitle, withAlias && this.props.classes.divWithoutTitleAndTab, this.state.error && this.props.classes.error)}>\n <AceEditor\n mode=\"json\"\n width=\"100%\"\n height=\"100%\"\n theme={this.props.themeName === 'dark' ? 'clouds_midnight' : 'chrome'}\n value={this.state.text}\n onChange={newValue => this.onChange(newValue)}\n name=\"UNIQUE_ID_OF_DIV\"\n fontSize={14}\n setOptions={{\n enableBasicAutocompletion: true,\n enableLiveAutocompletion: true,\n enableSnippets: true\n }}\n editorProps={{ $blockScrolling: true }}\n />\n </div>\n : null\n }\n {this.state.tab === 'alias' && this.props.obj._id.startsWith('alias.0') && this.props.obj.type === 'state' ?\n this.renderAliasEdit() : null\n }\n {this.state.tab === 'common' ? this.renderCommonEdit() : null}\n {this.renderSelectDialog()}\n </DialogContent>\n <DialogActions className={this.props.classes.wrapperButton}>\n {<Button\n onClick={() => this.setState({showCopyDialog: this.props.obj._id, newId: this.props.obj._id})}\n disabled={this.state.error || this.state.changed}\n title={this.props.t('Create a copy of this object')}\n ><IconCopy/></Button>}\n <div style={{flexGrow: 1}}/>\n {this.state.tab === 'object' && <Button\n onClick={e => this.onCopy(e)}\n disabled={this.state.error}\n title={this.isMobile ? this.props.t('Copy into clipboard') : ''}\n startIcon={<IconCopyClipboard />}\n >{this.isMobile ? null : this.props.t('Copy into clipboard')}</Button>}\n <Button\n variant=\"contained\"\n disabled={this.state.error || !this.state.changed}\n onClick={() => this.onUpdate()}\n startIcon={<IconCheck />}\n color=\"primary\">{this.props.t('Write')}</Button>\n <Button\n variant=\"contained\"\n onClick={() => this.props.onClose()}\n startIcon={<IconClose />}\n >{this.props.t('Cancel')}</Button>\n </DialogActions>\n </Dialog>;\n }\n}\n\nObjectBrowserEditObject.propTypes = {\n classes: PropTypes.object,\n socket: PropTypes.object,\n obj: PropTypes.object,\n expertMode: PropTypes.bool,\n themeName: PropTypes.string,\n onClose: PropTypes.func.isRequired,\n dialogName: PropTypes.string,\n objects: PropTypes.object,\n dateFormat: PropTypes.string,\n isFloatComma: PropTypes.bool,\n onNewObject: PropTypes.func,\n\n t: PropTypes.func,\n};\n\nexport default withStyles(styles)(ObjectBrowserEditObject);\n","import React, { Component } from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport TextField from '@material-ui/core/TextField';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\n\nimport IconCancel from '@material-ui/icons/Close';\nimport IconCheck from '@material-ui/icons/Check';\n\nconst styles = theme => ({\n input: {\n marginBottom: theme.spacing(2),\n },\n inputText: {\n width: 400,\n height: 300,\n marginBottom: theme.spacing(2),\n },\n formControl: {\n marginBottom: theme.spacing(2),\n minWidth: 150,\n },\n quality: {\n width: '100%'\n }\n});\n\nclass ObjectBrowserEditRole extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n role: null,\n initRole: null,\n roleInput: null\n };\n }\n\n componentDidMount() {\n this.props.socket.getObject(this.props.id)\n .then(obj => {\n this.object = obj;\n const value = obj?.common?.role || null;\n this.setState({ role: value, initRole: value, roleInput: value });\n })\n .catch(e => console.error(e));\n }\n\n onUpdate() {\n this.object.common = this.object.common || {};\n this.object.common.role = this.state.roleInput;\n this.props.socket.setObject(this.object._id, this.object)\n .then(() => this.props.onClose(this.object));\n }\n\n render() {\n return <Dialog\n key=\"objectBrowserEditRole\"\n open={true}\n maxWidth=\"sm\"\n fullWidth={true}\n onClose={() => this.props.onClose()}\n aria-labelledby=\"edit-role-dialog-title\"\n aria-describedby=\"edit-role-dialog-description\"\n >\n <DialogTitle id=\"edit-role-dialog-title\">{this.object ? this.props.t('Update role for %s', this.object._id) : null}</DialogTitle>\n <DialogContent>\n <Autocomplete\n freeSolo\n options={this.props.roles}\n style={{ width: '100%' }}\n value={this.state.role}\n onChange={(event, role) => this.setState({ role, roleInput: role })}\n onInputChange={(event, role) => this.setState({ roleInput: role })}\n renderInput={params => <TextField\n {...params}\n label={this.props.t('Role')}\n variant=\"outlined\"\n />}\n />\n </DialogContent>\n <DialogActions>\n <Button disabled={this.state.initRole === this.state.roleInput} variant=\"contained\" onClick={() => this.onUpdate()} color=\"primary\" startIcon={<IconCheck />}>{this.props.t('Apply')}</Button>\n <Button variant=\"contained\" onClick={() => this.props.onClose()} color=\"default\" startIcon={<IconCancel />}>{this.props.t('Cancel')}</Button>\n </DialogActions>\n </Dialog>;\n }\n}\n\nObjectBrowserEditRole.propTypes = {\n classes: PropTypes.object,\n roles: PropTypes.array,\n id: PropTypes.string,\n socket: PropTypes.object,\n onClose: PropTypes.func.isRequired,\n\n t: PropTypes.func,\n};\n\nexport default withStyles(styles)(ObjectBrowserEditRole);\n","import React, {useState} from 'react';\n\nimport { FormControl, InputLabel, MenuItem, Select, TextField } from '@material-ui/core';\n\nimport AddIcon from '@material-ui/icons/AddBox';\n\nimport I18n from '@iobroker/adapter-react/i18n';\nimport Utils from '../components/Utils'; // @iobroker/adapter-react/i18n\n\nimport CustomModal from '../components/CustomModal';\n\nconst stateTypeArray = [\n 'boolean',\n 'string',\n 'number',\n 'array',\n 'json',\n 'object',\n 'mixed'\n];\n\nconst stateDefValues = {\n boolean: false,\n string: '',\n number: 0,\n};\n\nconst TYPES = {\n state: {name: 'Datapoint', value: 'state'},\n channel: {name: 'Channel', value: 'channel'},\n device: {name: 'Device', value: 'device'},\n folder: {name: 'Folder', value: 'folder'}\n};\n\nconst ObjectAddNewObject = ({ onClose, onApply, open, selected, setObject, objects, expertMode }) => {\n const names = {\n state: I18n.t('New state'),\n channel: I18n.t('New channel'),\n device: I18n.t('New device'),\n folder: I18n.t('New folder'),\n };\n\n const types = [];\n\n // analyse possible types\n const parentType = objects[selected]?.type;\n let initialType = '';\n if (objects[selected]) {\n if (parentType === 'channel') {\n types.push(TYPES.state);\n initialType = 'state';\n } else if (parentType === 'device') {\n initialType = 'channel';\n types.push(TYPES.state);\n types.push(TYPES.channel);\n } else if (parentType === 'state') {\n initialType = '';\n } else {\n types.push(TYPES.state);\n types.push(TYPES.channel);\n types.push(TYPES.device);\n\n if (selected.startsWith('0_userdata.') ||\n selected.startsWith('alias.0.') ||\n selected === '0_userdata' ||\n selected === 'alias.0') {\n types.push(TYPES.folder);\n initialType = 'folder';\n } else {\n initialType = 'state';\n }\n }\n } else {\n types.push(TYPES.folder);\n initialType = 'folder';\n if (expertMode && (selected.startsWith('mqtt.') || selected.startsWith('javascript.'))) {\n types.push(TYPES.state);\n types.push(TYPES.channel);\n types.push(TYPES.device);\n }\n }\n\n const [name, setName] = useState(names[initialType]);\n const [type, setType] = useState(initialType);\n const [stateType, setStateType] = useState('string');\n const [unique, setUnique] = useState(!objects[buildId(names.state)]);\n\n function buildId(name) {\n return name.toString().replace(Utils.FORBIDDEN_CHARS, '_').replace(/\\s/g, '_').replace(/\\./g, '_');\n }\n\n const onLocalApply = () => {\n const newObj = {\n common: {\n name,\n desc: I18n.t('Manually created'),\n },\n type\n };\n\n if (type === 'state') {\n newObj.common = {\n ...newObj.common,\n role: 'state',\n type: stateType,\n read: true,\n write: true,\n def: stateDefValues[stateType]\n };\n } else if (type !== 'folder') {\n newObj.common = {\n ...newObj.common,\n role: '',\n icon: '',\n };\n } else {\n delete newObj.common.desc;\n }\n\n setObject(`${selected}.${name.split(' ').join('_')}`, newObj)\n .then(() => onApply());\n }\n\n return <CustomModal\n open={open}\n fullWidth\n maxWidth=\"lg\"\n titleButtonApply=\"add\"\n applyDisabled={!name || !unique || !types.length}\n onClose={onClose}\n onApply={() => onLocalApply()}>\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <div style={{\n margin: 10,\n fontSize: 20\n }}><AddIcon/> {I18n.t('Add new object:')} <span style={{fontStyle: 'italic'}}>{selected}.{name}</span></div>\n <TextField\n label={I18n.t('Parent')}\n style={{ margin: '5px 0' }}\n disabled\n value={selected}\n />\n <FormControl style={{ marginTop: 10, marginBottom: 10 }}>\n <InputLabel>{I18n.t('Type')}</InputLabel>\n <Select\n value={type}\n onChange={(el) => {\n if (name === names[type]) {\n setName(names[el.target.value]);\n setUnique(objects[buildId(names[el.target.value])]);\n }\n setType(el.target.value);\n }}\n >\n {types.map(el => <MenuItem key={el.value} value={el.value}>{I18n.t(el.name)}</MenuItem>)}\n </Select>\n </FormControl> {type === 'state' && <FormControl >\n <InputLabel>{I18n.t('State type')}</InputLabel>\n <Select\n value={stateType}\n onChange={el => setStateType(el.target.value)}\n >\n {stateTypeArray.map(el => <MenuItem key={el} value={el}>{el}</MenuItem>)}\n </Select>\n </FormControl>}\n <TextField\n label={I18n.t('Name')}\n style={{ margin: '5px 0' }}\n autoFocus\n value={name}\n onKeyDown={e => {\n if (e.keyCode === 13) {\n e.preventDefault();\n name && onLocalApply();\n }\n }}\n onChange={el => {\n setUnique(!objects[buildId(el.target.value)]);\n setName(el.target.value);\n }}\n />\n </div>\n </CustomModal>;\n}\n\nexport default ObjectAddNewObject;\n","import React, { useEffect, useState } from 'react';\nimport { Checkbox, FormControl, InputLabel, LinearProgress, MenuItem, Select, Switch } from '@material-ui/core';\n\nimport Icon from '@iobroker/adapter-react/Components/Icon';\nimport I18n from '@iobroker/adapter-react/i18n';\n\nimport Utils from '../components/Utils';\nimport CustomModal from '../components/CustomModal';\n\nconst readWriteArray = [\n {\n Owner: [\n { name: 'read', valueNum: 0x400, title: 'read owner' },\n { name: 'write', valueNum: 0x200, title: 'write owner' }\n ]\n },\n {\n Group: [\n { name: 'read', valueNum: 0x40, title: 'read group' },\n { name: 'write', valueNum: 0x20, title: 'write group' }\n ]\n },\n {\n Everyone: [\n { name: 'read', valueNum: 0x4, title: 'read everyone' },\n { name: 'write', valueNum: 0x2, title: 'write everyone' }\n ]\n },\n];\n\nconst newValueAccessControl = (value, newValue, mask) => {\n value |= newValue & mask;\n value &= newValue | (~mask & 0xFFFF);\n return value;\n}\n\nconst ObjectRights = ({ value, disabled, setValue, t, differentValues, applyToChildren, mask, setMask }) => {\n useEffect(() => {\n if (applyToChildren) {\n let _checkDifferent = 0;\n for (let e = 0; e < differentValues.length; e++) {\n _checkDifferent |= value ^ differentValues[e];\n }\n setMask(_checkDifferent);\n } else {\n setMask(0);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [differentValues, applyToChildren]);\n\n let newSelected = value;\n\n return <div style={{\n display: 'flex',\n width: 'fit-content',\n margin: 20,\n border: '1px solid',\n borderLeft: 0\n }}>\n {readWriteArray.map(el => {\n const name = Object.keys(el)[0];\n return <div style={{\n width: 150,\n height: 150,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n borderLeft: '1px solid'\n }} key={name} >\n <div style={{\n height: 50,\n display: 'flex',\n alignItems: 'center',\n fontSize: 18,\n borderBottom: '1px solid silver',\n width: '100%',\n justifyContent: 'center'\n }}>{t(name)}</div>\n <div style={{\n display: 'flex',\n width: '100%'\n }}>\n {el[name].map((obj, idx) => {\n let bool = false;\n if (newSelected - obj.valueNum >= 0) {\n newSelected = newSelected - obj.valueNum;\n bool = true;\n }\n return <div style={{\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n alignItems: 'center',\n borderRight: idx === 0 ? '1px solid' : 0\n }} key={obj.valueNum}>\n <div style={{\n height: 50,\n borderBottom: '1px solid',\n width: '100%',\n justifyContent: 'center',\n display: 'flex',\n alignItems: 'center',\n color: 'silver'\n }}>{t(obj.name)}</div>\n <div style={{ height: 50, display: 'flex' }}>\n <Checkbox\n disabled={disabled}\n checked={bool}\n color={mask & obj.valueNum ? 'primary' : 'secondary'}\n indeterminate={!!(mask & obj.valueNum)}\n style={mask & obj.valueNum ? { opacity: 0.5 } : null}\n onChange={e => {\n if (mask & obj.valueNum) {\n mask &= (~obj.valueNum) & 0xFFFF;\n setMask(mask);\n }\n let newValue = value;\n if (!e.target.checked) {\n newValue &= (~obj.valueNum) & 0xFFFF;\n } else {\n newValue |= obj.valueNum;\n }\n setValue(newValue);\n }}\n />\n </div>\n </div>\n })}\n </div>\n </div>\n })}\n </div>;\n}\n\nconst ObjectEditOfAccessControl = ({ onClose, onApply, open, selected, extendObject, objects, t, modalEmptyId, themeType }) => {\n const [stateOwnerUser, setStateOwnerUser] = useState(null);\n const [stateOwnerGroup, setStateOwnerGroup] = useState(null);\n const [ownerUsers, setOwnerUsers] = useState([]);\n const [ownerGroups, setOwnerGroups] = useState([]);\n const [applyToChildren, setApplyToChildren] = useState(false);\n const [checkState, setCheckState] = useState(false);\n const [childrenCount, setChildrenCount] = useState(0);\n const [valueObjectAccessControl, setValueObjectAccessControl] = useState(null);\n const [valueStateAccessControl, setValueStateAccessControl] = useState(null);\n const [differentOwner, setDifferentOwner] = useState(false);\n const [differentGroup, setDifferentGroup] = useState(false);\n const [differentState, setDifferentState] = useState([]);\n const [differentObject, setDifferentObject] = useState([]);\n const [maskState, setMaskState] = useState(0);\n const [maskObject, setMaskObject] = useState(0);\n const [ids, setIds] = useState([]);\n const [progress, setProgress] = useState(false);\n\n const [disabledButton, setDisabledButton] = useState(true);\n\n const different = t('different');\n\n useEffect(() => {\n let count = 0\n let _differentState = [];\n let _differentObject = [];\n\n let id = selected || modalEmptyId;\n let idWithDot = id + '.';\n const keys = Object.keys(objects).sort();\n let _checkState = false;\n let groups = [];\n let users = [];\n const lang = I18n.getLanguage();\n\n let _differentOwner = false;\n let _differentGroup = false;\n let _stateOwnerUser = null;\n let _stateOwnerGroup = null;\n let _valueObjectAccessControl = null;\n let _valueStateAccessControl = null;\n const _ids = [];\n\n for (let k = 0; k < keys.length; k++) {\n const key = keys[k];\n const obj = objects[key];\n if (obj && (key === id || key.startsWith(idWithDot))) {\n count++;\n _ids.push(key);\n if (!obj.acl) {\n continue;\n }\n\n if (_valueObjectAccessControl === null && obj.acl.object !== undefined) {\n _valueObjectAccessControl = obj.acl.object;\n }\n if (_valueStateAccessControl === null && obj.acl.state !== undefined) {\n _valueStateAccessControl = obj.acl.state;\n }\n if (_stateOwnerUser === null && obj.acl.owner !== undefined) {\n _stateOwnerUser = obj.acl.owner;\n }\n if (_stateOwnerGroup === null && obj.acl.ownerGroup !== undefined) {\n _stateOwnerGroup = obj.acl.ownerGroup;\n }\n\n if (!differentOwner && _stateOwnerUser !== obj.acl.owner && obj.acl.owner !== undefined) {\n _differentOwner = true;\n }\n if (!differentGroup && _stateOwnerGroup !== obj.acl.ownerGroup && obj.acl.ownerGroup !== undefined) {\n _differentGroup = true;\n }\n if (obj.acl.state !== undefined && _valueStateAccessControl !== obj.acl.state && !_differentState.includes(obj.acl.state)) {\n _differentState.push(obj.acl.state);\n }\n if (obj.acl.object !== undefined && _valueObjectAccessControl !== obj.acl.object && !_differentObject.includes(obj.acl.object)) {\n _differentObject.push(obj.acl.object);\n }\n if (obj.type === 'state') {\n _checkState = true;\n }\n }\n\n if (key.startsWith('system.group.') && obj?.type === 'group') {\n groups.push({\n name: Utils.getObjectNameFromObj(obj, lang).replace('system.group.', ''),\n value: key,\n icon: obj.common?.icon,\n color: obj.common?.color,\n });\n } else\n if (key.startsWith('system.user.') && obj?.type === 'user') {\n users.push({\n name: Utils.getObjectNameFromObj(obj, lang).replace('system.user.', ''),\n value: key,\n icon: obj.common?.icon,\n color: obj.common?.color,\n });\n }\n }\n\n _stateOwnerUser = _stateOwnerUser || objects['system.config'].common.defaultNewAcl.owner;\n _stateOwnerGroup = _stateOwnerGroup || objects['system.config'].common.defaultNewAcl.ownerGroup;\n _valueObjectAccessControl = _valueObjectAccessControl || objects['system.config'].common.defaultNewAcl.object;\n setValueObjectAccessControl(isNaN(_valueObjectAccessControl) ? objects['system.config'].common.defaultNewAcl.object : _valueObjectAccessControl);\n\n if (_checkState) {\n _valueStateAccessControl = _valueStateAccessControl || objects['system.config'].common.defaultNewAcl.state;\n setValueStateAccessControl(isNaN(_valueStateAccessControl) ? objects['system.config'].common.defaultNewAcl.state : _valueStateAccessControl);\n }\n\n const userItem = users.find(item => item.value === _stateOwnerUser);\n const groupItem = groups.find(item => item.value === _stateOwnerGroup);\n\n setStateOwnerUser(userItem);\n setStateOwnerGroup(groupItem);\n\n setDifferentOwner(_differentOwner);\n setDifferentGroup(_differentGroup);\n\n setOwnerUsers(users);\n setOwnerGroups(groups);\n\n _checkState && setCheckState(true);\n modalEmptyId && setApplyToChildren(true);\n setChildrenCount(count);\n\n setDifferentState(_differentState);\n setDifferentObject(_differentObject);\n\n setIds(_ids);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [objects, selected]);\n\n useEffect(() => {\n if (applyToChildren) {\n if (differentGroup) {\n stateOwnerGroup.value !== 'different' && setStateOwnerGroup({ name: different, value: 'different' });\n if (!ownerGroups.find(item => item.value === 'different')) {\n setOwnerGroups(el => ([{\n name: different,\n value: 'different'\n }, ...el]));\n }\n }\n\n if (differentOwner) {\n stateOwnerUser.value !== 'different' && setStateOwnerUser({ name: different, value: 'different' });\n if (!ownerUsers.find(item => item.value === 'different')) {\n setOwnerUsers(el => ([{\n name: different,\n value: 'different'\n }, ...el]));\n }\n }\n } else {\n if (stateOwnerUser && stateOwnerUser.value === 'different') {\n setStateOwnerUser(objects[selected].acl.owner);\n }\n if (stateOwnerGroup && stateOwnerGroup.value === 'different') {\n setStateOwnerGroup(objects[selected].acl.ownerGroup);\n }\n // remove different from list\n setOwnerGroups(el => el.filter(({ value }) => value !== 'different'));\n setOwnerUsers(el => el.filter(({ value }) => value !== 'different'));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applyToChildren, /*stateOwnerUser, stateOwnerGroup,*/ differentOwner, differentGroup]);\n\n if (!ids.length) {\n return <LinearProgress />;\n } else {\n return <CustomModal\n open={open}\n titleButtonApply=\"apply\"\n overflowHidden\n applyDisabled={disabledButton}\n progress={progress}\n onClose={onClose}\n onApply={() => {\n setProgress(true);\n setTimeout(async () => {\n if (!applyToChildren) {\n let newAcl = JSON.parse(JSON.stringify(objects[selected].acl || {}));\n newAcl.object = valueObjectAccessControl;\n newAcl.owner = stateOwnerUser.value;\n newAcl.ownerGroup = stateOwnerGroup.value;\n\n if (objects[selected].type === 'state') {\n newAcl.state = valueStateAccessControl;\n }\n extendObject(selected, { acl: newAcl });\n }\n else {\n //let maskState = Object.keys(differentHexState).reduce((sum, key) => sum | (differentHexState[key] ? parseInt(key, 16) : 0), 0);\n let _maskState = ~maskState & 0xFFFF;\n\n //let maskObject = Object.keys(differentHexObject).reduce((sum, key) => sum | (differentHexObject[key] ? parseInt(key, 16) : 0), 0);\n let _maskObject = ~maskObject & 0xFFFF;\n\n for (let i = 0; i < ids.length; i++) {\n const key = ids[i];\n const obj = objects[key];\n let newAcl = JSON.parse(JSON.stringify(obj.acl || {}));\n newAcl.object = newValueAccessControl(obj.acl.object, valueObjectAccessControl, _maskState);\n if (stateOwnerUser.value !== 'different') {\n newAcl.owner = stateOwnerUser.value;\n }\n if (stateOwnerGroup.value !== 'different') {\n newAcl.ownerGroup = stateOwnerGroup.value;\n }\n if (obj.type === 'state') {\n newAcl.state = newValueAccessControl(obj.acl.state, valueStateAccessControl, _maskObject);\n }\n await extendObject(key, { acl: newAcl });\n }\n }\n\n setProgress(false);\n onApply();\n }, 200);\n }}>\n\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <div style={{\n margin: 10,\n fontSize: 20\n }}>{t('Access control list: %s', selected || modalEmptyId)}</div>\n <div style={{ display: 'flex' }}>\n <FormControl fullWidth style={{ marginRight: 10 }}>\n <InputLabel>{t('Owner user')}</InputLabel>\n <Select\n disabled={progress}\n value={stateOwnerUser.value}\n renderValue={value => <span>{stateOwnerUser.icon ? <Icon src={stateOwnerUser.icon} style={{ width: 16, height: 16, marginRight: 8 }} /> : null}{stateOwnerUser.name}</span>}\n style={stateOwnerUser.value === 'different' ? { opacity: 0.5 } : { color: stateOwnerUser.color || undefined, backgroundColor: Utils.getInvertedColor(stateOwnerUser.color, themeType) }}\n onChange={el => {\n const userItem = ownerUsers.find(item => item.value === el.target.value);\n setStateOwnerUser(userItem);\n setDisabledButton(false);\n }}\n >\n {ownerUsers.map(el => <MenuItem style={el.value === 'different' ? { opacity: 0.5 } : { color: el.color || undefined, backgroundColor: Utils.getInvertedColor(el.color, themeType) }} key={el.value} value={el.value}>\n {el.icon ? <Icon src={el.icon} style={{ width: 16, height: 16, marginRight: 8 }} /> : null}\n {el.name}\n </MenuItem>)}\n </Select>\n </FormControl>\n <FormControl fullWidth>\n <InputLabel>{t('Owner group')}</InputLabel>\n <Select\n disabled={progress}\n value={stateOwnerGroup.value}\n renderValue={value => <span>{stateOwnerGroup.icon ? <Icon src={stateOwnerGroup.icon} style={{ width: 16, height: 16, marginRight: 8 }} /> : null}{stateOwnerGroup.name}</span>}\n style={stateOwnerGroup.value === 'different' ? { opacity: 0.5 } : { color: stateOwnerGroup.color || undefined, backgroundColor: Utils.getInvertedColor(stateOwnerGroup.color, themeType) }}\n onChange={el => {\n const groupItem = ownerGroups.find(item => item.value === el.target.value);\n setStateOwnerGroup(groupItem);\n setDisabledButton(false);\n }}\n >\n {ownerGroups.map(el => <MenuItem key={el.value} value={el.value} style={el.value === 'different' ? { opacity: 0.5 } : { color: el.color || undefined, backgroundColor: Utils.getInvertedColor(el.color, themeType) }}>\n {el.icon ? <Icon src={el.icon} style={{ width: 16, height: 16, marginRight: 8 }} /> : null}\n {el.name}\n </MenuItem>)}\n </Select>\n </FormControl>\n </div>\n\n <div style={{\n display: 'flex',\n margin: 10,\n alignItems: 'center',\n fontSize: 10,\n marginLeft: 0,\n color: 'silver'\n }}>\n <div style={!applyToChildren ? { color: 'green' } : null}>{t('to apply one item')}</div>\n <Switch\n disabled={progress || !!modalEmptyId || childrenCount === 1}\n checked={!!modalEmptyId || applyToChildren}\n onChange={e => {\n setApplyToChildren(e.target.checked);\n setDisabledButton(false);\n }}\n color=\"primary\"\n />\n <div style={applyToChildren ? { color: 'green' } : null}>{t('to apply with children')} {(modalEmptyId || childrenCount > 1) ? `(${childrenCount} ${t('object(s)')})` : ''}</div>\n </div>\n\n {progress && <LinearProgress />}\n\n <div style={{ overflowY: 'auto' }}>\n <div>\n <h2>{t('Object rights')}</h2>\n <ObjectRights\n mask={maskObject}\n disabled={progress}\n setMask={setMaskObject}\n applyToChildren={applyToChildren}\n differentValues={differentObject}\n t={t}\n setValue={e => {\n setValueObjectAccessControl(e);\n setDisabledButton(false);\n }}\n value={valueObjectAccessControl} />\n </div>\n {checkState && <div>\n <h2>{t('States rights')}</h2>\n <ObjectRights\n mask={maskState}\n disabled={progress}\n setMask={setMaskState}\n applyToChildren={applyToChildren}\n differentValues={applyToChildren ? differentState : []}\n t={t}\n setValue={e => {\n setValueStateAccessControl(e);\n setDisabledButton(false);\n }}\n value={valueStateAccessControl} />\n </div>}\n </div>\n </div>\n </CustomModal>;\n }\n}\n\nexport default ObjectEditOfAccessControl;","import withWidth from '@material-ui/core/withWidth';\n\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport Snackbar from '@material-ui/core/Snackbar';\n\n// icons\nimport IconCancel from '@material-ui/icons/Close';\nimport IconDeleteOne from '@material-ui/icons/Delete';\nimport IconDeleteAll from '@material-ui/icons/Delete';\n\nimport ObjectBrowser from '../components/ObjectBrowser';\nimport ObjectCustomDialog from '../dialogs/ObjectCustomDialog';\nimport Router from '@iobroker/adapter-react/Components/Router';\nimport ObjectBrowserValue from '../components/Object/ObjectBrowserValue';\nimport ObjectBrowserEditObject from '../components/Object/ObjectBrowserEditObject';\nimport ObjectBrowserEditRole from '../components/Object/ObjectBrowserEditRole';\nimport ObjectAddNewObject from '../dialogs/ObjectAddNewObject';\nimport ObjectEditOfAccessControl from '../dialogs/ObjectEditOfAccessControl';\n\nconst styles = theme => ({\n buttonIcon: {\n marginRight: 4,\n },\n buttonAll: {\n color: '#FF0000',\n },\n id: {\n fontStyle: 'italic',\n },\n buttonText: {\n whiteSpace: 'nowrap'\n }\n});\nclass Objects extends Component {\n\n constructor(props) {\n\n super(props);\n\n this.dialogName = 'AdminObjects';\n\n this.filters = window.localStorage.getItem(`${this.dialogName || 'App'}.filters`) || '{}';\n\n try {\n this.filters = JSON.parse(this.filters);\n } catch (e) {\n this.filters = {};\n }\n\n let selected = window.localStorage.getItem(`${this.dialogName || 'App'}.selected`) || '';\n\n this.state = {\n selected: this.props.selected === undefined ? selected : '',\n name: '',\n toast: '',\n deleteObjectShow: null,\n //suppressDeleteConfirm: false,\n };\n this.t = this.translate;\n this.wordCache = {};\n }\n\n translate = (word, arg1, arg2) => {\n if (arg1 !== undefined) {\n return this.props.t(word, arg1, arg2);\n }\n\n if (!this.wordCache[word]) {\n this.wordCache[word] = this.props.t(word);\n }\n\n return this.wordCache[word];\n }\n\n onDelete(withChildren) {\n const id = this.state.deleteObjectShow.id;\n if (withChildren) {\n this.props.socket.delObjects(id, true)\n .then(() => this.setState({ toast: this.t('All deleted') }))\n .catch(e => window.alert('Cannot delete object: ' + e));\n\n this.setState({ deleteObjectShow: null });\n } else {\n this.props.socket.delObject(id, false)\n .catch(e => window.alert('Cannot delete object: ' + e));\n this.setState({ deleteObjectShow: null })\n }\n }\n\n renderToast() {\n return <Snackbar\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n open={!!this.state.toast}\n autoHideDuration={3000}\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 <IconCancel fontSize=\"small\" />\n </IconButton>\n </React.Fragment>\n }\n />;\n }\n\n renderDeleteDialog() {\n if (!this.state.deleteObjectShow) {\n return null;\n } else {\n return <Dialog\n key=\"delete\"\n maxWidth=\"md\"\n open={true}\n onClose={() => this.setState({ deleteObjectShow: null })}\n aria-labelledby=\"delete-object-dialog-title\"\n aria-describedby=\"delete-object-dialog-description\"\n >\n <DialogTitle id=\"delete-object-dialog-title\">{this.state.deleteObjectShow.hasChildren ? this.t('Delete object(s)') : this.t('Delete object')}: <span className={this.props.classes.id}>{this.state.deleteObjectShow.id}</span></DialogTitle>\n <DialogContent>\n <DialogContentText>\n {this.t('Are you sure?')}\n {/*<FormControlLabel\n control={<Checkbox\n checked={this.state.suppressDeleteConfirm}\n onChange={() => {\n this.setState({suppressDeleteConfirm: true});\n\n }}\n name=\"checkedA\" />\n }\n label=\"Secondary\"\n />*/}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n {this.state.deleteObjectShow.hasChildren ? <Button variant=\"contained\" classes={{label: this.props.classes.buttonText}} onClick={() => this.onDelete(true)} startIcon={<IconDeleteAll className={this.props.classes.buttonAll} />}>{this.t('Delete with children')}</Button> : null}\n {this.state.deleteObjectShow.exists ? <Button variant=\"contained\" classes={{label: this.props.classes.buttonText}} onClick={() => this.onDelete(false)} color=\"primary\" startIcon={<IconDeleteOne />} autoFocus>{this.t('Delete one item')}</Button> : null}\n <Button variant=\"contained\" onClick={() => this.setState({ deleteObjectShow: null })} startIcon={<IconCancel />}>{this.t('ra_Cancel')}</Button>\n </DialogActions>\n </Dialog>;\n }\n }\n\n render() {\n return [\n <ObjectBrowser\n key=\"browser\"\n dialogName=\"admin\"\n objectsWorker={this.props.objectsWorker}\n prefix={this.props.prefix}\n defaultFilters={this.filters}\n statesOnly={this.props.statesOnly}\n style={{ width: '100%', height: '100%' }}\n socket={this.props.socket}\n selected={this.state.selected}\n name={this.state.name}\n expertMode={this.props.expertMode}\n isFloatComma={this.props.isFloatComma}\n dateFormat={this.props.dateFormat}\n t={this.t}\n lang={this.props.lang}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n objectCustomDialog={ObjectCustomDialog}\n objectBrowserValue={ObjectBrowserValue}\n objectBrowserEditObject={ObjectBrowserEditObject}\n objectBrowserEditRole={ObjectBrowserEditRole}\n router={Router}\n enableStateValueEdit={true}\n onObjectDelete={(id, hasChildren, exists) =>\n this.setState({ deleteObjectShow: { id, hasChildren, exists } })}\n onFilterChanged={filterConfig => {\n this.filters = filterConfig;\n window.localStorage.setItem(`${this.dialogName || 'App'}.filters`, JSON.stringify(filterConfig));\n }}\n onSelect={selected =>\n window.localStorage.setItem(`${this.dialogName || 'App'}.selected`, selected[0] || '')}\n objectEditBoolean\n objectAddBoolean\n objectStatesView\n objectImportExport\n objectEditOfAccessControl\n modalNewObject={context =>\n <ObjectAddNewObject\n objects={context.objects}\n expertMode={this.props.expertMode}\n open={context.state.modalNewObj}\n setObject={(id, data) => context.setObject(id, data)}\n selected={context.state.selected[0] || context.state.selectedNonObject}\n onClose={() => context.setState({ modalNewObj: false })}\n onApply={() => context.setState({ modalNewObj: false })} />\n }\n modalEditOfAccessControl={(context, objData) =>\n <ObjectEditOfAccessControl\n themeType={this.props.themeType}\n open={context.state.modalEditOfAccess}\n extendObject={(id, data) => {\n context.extendObject(id, data);\n objData.aclTooltip = null;\n }}\n selected={context.state.selected[0]}\n modalEmptyId={context.state.modalEmptyId}\n objects={context.objects}\n t={this.t}\n onClose={() => context.setState({ modalEditOfAccess: false, modalEditOfAccessObjData: null, modalEmptyId: null })}\n onApply={() => context.setState({ modalEditOfAccess: false, modalEditOfAccessObjData: null, modalEmptyId: null })} />\n }\n />,\n this.renderDeleteDialog()\n ];\n }\n}\n\nObjects.propTypes = {\n t: PropTypes.func,\n lang: PropTypes.string,\n socket: PropTypes.object,\n themeName: PropTypes.string,\n themeType: PropTypes.string,\n theme: PropTypes.object,\n expertMode: PropTypes.bool,\n isFloatComma: PropTypes.bool,\n dateFormat: PropTypes.string,\n objectsWorker: PropTypes.object,\n};\n\n/** @type {typeof Objects} */\nconst _export = withWidth()(withStyles(styles)(Objects));\nexport default _export;\n"],"sourceRoot":""}