iobroker.admin 6.2.18 → 6.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/admin/jsonConfig.json5 +0 -4
- package/io-package.json +13 -13
- package/main.js +8 -2
- package/package.json +1 -1
- package/www/asset-manifest.json +15 -15
- package/www/index.html +1 -1
- package/www/static/js/1553.c291692c.chunk.js +709 -0
- package/www/static/js/1553.c291692c.chunk.js.map +1 -0
- package/www/static/js/{5710.72e95b8e.chunk.js → 5710.05cde997.chunk.js} +4 -4
- package/www/static/js/5710.05cde997.chunk.js.map +1 -0
- package/www/static/js/7228.cd98fee1.chunk.js +67 -0
- package/www/static/js/7228.cd98fee1.chunk.js.map +1 -0
- package/www/static/js/{7412.6bf54cc4.chunk.js → 7412.e4b0556a.chunk.js} +5 -5
- package/www/static/js/7412.e4b0556a.chunk.js.map +1 -0
- package/www/static/js/{7858.d768cb91.chunk.js → 7858.b16a767f.chunk.js} +10 -10
- package/www/static/js/7858.b16a767f.chunk.js.map +1 -0
- package/www/static/js/8596.62e5938c.chunk.js +3 -0
- package/www/static/js/8596.62e5938c.chunk.js.map +1 -0
- package/www/static/js/{main.1fb226a1.js → main.b9cd96c6.js} +5 -5
- package/www/static/js/{main.1fb226a1.js.map → main.b9cd96c6.js.map} +1 -1
- package/www/static/js/1553.1c221cad.chunk.js +0 -709
- package/www/static/js/1553.1c221cad.chunk.js.map +0 -1
- package/www/static/js/5710.72e95b8e.chunk.js.map +0 -1
- package/www/static/js/7228.7cff9ec6.chunk.js +0 -67
- package/www/static/js/7228.7cff9ec6.chunk.js.map +0 -1
- package/www/static/js/7412.6bf54cc4.chunk.js.map +0 -1
- package/www/static/js/7858.d768cb91.chunk.js.map +0 -1
- package/www/static/js/8596.803204cf.chunk.js +0 -3
- package/www/static/js/8596.803204cf.chunk.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["components/JsonConfigComponent/ConfigTabs.jsx","components/JsonConfigComponent/index.jsx","components/UploadImage.jsx","components/Object/ObjectCustomEditor.jsx","components/TableResize.jsx","components/Object/ObjectHistoryData.jsx","components/Object/ObjectChart.jsx","dialogs/ObjectCustomDialog.jsx","components/Object/ObjectBrowserValue.jsx","components/Object/ObjectBrowserEditObject.jsx","components/Object/ObjectBrowserEditRole.jsx","dialogs/ObjectAddNewObject.jsx","dialogs/ObjectEditOfAccessControl.jsx","dialogs/ObjectViewFileDialog.jsx","tabs/Objects.jsx"],"names":["styles","theme","ConfigTabs","ConfigGeneric","props","tab","items","Tabs","e","name","disabled","Tab","ConfigPanel","JsonConfigComponent","commandRunning","id","state","data","value","cb","saveConfig","newState","_data","attr","error","errors","a","socket","i18n","adapterName","lang","path","exists","fileName","json","obj","systemConfig","schema","_list","attrs","dep","depObj","item","LinearProgress","cropperStyles","UploadImage","style","acceptedFiles","maxSize","t","onChange","file","reader","ext","base64","byte","classes","icon","removeIconFunc","accept","crop","uploadFile","anchorEl","cropHandler","getRootProps","getInputProps","imageElement","el","URL_PREFIX","expanded","promises","adapter","ad","Utils","exist","func","customObj","instanceObj","processed","alsoDependsOn","_attr","result","_result","instance","defaultValues","ids","objects","commons","inst","custom","_default","newValues","ignoreUnderscore","i","enabled","isIndeterminate","Accordion","pos","AccordionSummary","ExpandMore","Typography","AccordionDetails","FormControlLabel","Checkbox","oldObjects","_objects","_oldObjects","keys","maxOids","ins","instances","Confirm","index","Paper","ObjectCustomEditor","withWidth","TableResize","c","width","widthNext","ths","widthsStored","tableWidth","storedWidth","w","div","gridTemplateColumns","Skeleton","Table","localeMap","fr","ru","de","es","nl","it","pt","pl","padding3","ms","padding2","num","ObjectHistoryData","values","relativeRange","start","end","selected","lastSelected","lastSelectedColumn","historyInstance","resolve","list","config","defaultHistory","supportedFeatures","instObj","listObj","alives","chart","range","lcVisible","qVisible","ackVisible","fromVisible","cVisible","now","oldest","ts","column","pps","ppls","rows","r","TableRow","TableCell","interpolated","val","selectedClass","delay","mins","day","dontSave","initialWidths","minWidths","TableContainer","TableHead","TableBody","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","Button","tasks","time","edit","TextField","LocalizationProvider","Grid","DatePicker","date","params","TimePicker","isUpdate","Toolbar","FormControl","InputLabel","Select","MenuItem","IconButton","Edit","Delete","element","lines","GRID_PADDING_LEFT","GRID_PADDING_RIGHT","ObjectChart","from","min","max","echartsJump","options","minY","maxY","b","dp","widthAxis","serie","yAxis","text","maxYLen","splitNumber","withReadData","diff","readData","zr","oldDiff","amount","move","moved","shift","touches","pageX","fingerWidth","chartWidth","height","args","Fab","EXTENSIONS","ObjectCustomDialog","MobileDialog","currentTab","location","Router","chartAvailable","progressRunning","hasChanges","update","isYes","varType","AppBar","event","newTab","Save","Close","AntSwitch","Switch","ObjectBrowserValue","type","newValue","key","Autocomplete","option","ackCheckbox","FullscreenExit","Fullscreen","Hidden","ObjectBrowserEditObject","withAlias","isWrite","jsFunc","initialType","finalType","arg","changed","selectRead","selectWrite","selectId","nameKey","Add","stateTypeArray","roleArray","checkState","checkRole","iconPath","parts","_","funcVisible","_a","_b","_c","_d","_e","_f","_g","InputAdornment","IconFx","oldId","newId","newObj","ObjectBrowserEditRole","role","stateDefValues","TYPES","onClose","onApply","open","setObject","expertMode","names","types","parentType","storedType","setType","setName","stateType","setStateType","unique","setUnique","buildId","onLocalApply","CustomModal","readWriteArray","newValueAccessControl","mask","ObjectRights","setValue","differentValues","applyToChildren","setMask","_checkDifferent","newSelected","idx","bool","extendObject","modalEmptyId","themeType","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","progress","setProgress","disabledButton","setDisabledButton","different","count","_differentState","_differentObject","idWithDot","_checkState","groups","users","_differentOwner","_differentGroup","_stateOwnerUser","_stateOwnerGroup","_valueObjectAccessControl","_valueStateAccessControl","_ids","k","userItem","groupItem","_maskState","_maskObject","newAcl","Icon","ObjectViewFileDialog","detectedMimeType","Objects","word","arg1","arg2","withChildren","Snackbar","ObjectBrowser","hasChildren","filterConfig","context","objData"],"mappings":"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,EAAe,cAAW,CAAM,EAAEA,CAAmB,C,iiBC1YrD,MAAM+B,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","file":"static/js/7412.e4b0556a.chunk.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@mui/styles';\n\nimport Tabs from '@mui/material/Tabs';\nimport Tab from '@mui/material/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 || 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\n value={this.state.tab}\n onChange={(e, tab) => {\n (window._localStorage || window.localStorage).setItem((this.props.dialogName || 'App') + '.' + this.props.adapterName, tab);\n this.setState({tab});\n }}>\n {Object.keys(items).map(name => {\n let disabled;\n if (this.props.custom) {\n const hidden = this.executeCustom(items[name].hidden, this.props.data, this.props.customObj, this.props.instanceObj);\n if (hidden) {\n return null;\n }\n disabled = this.executeCustom(items[name].disabled, this.props.data, this.props.customObj, this.props.instanceObj);\n } else {\n const hidden = this.execute(items[name].hidden, false);\n if (hidden) {\n return null;\n }\n disabled = this.execute(items[name].disabled, false);\n }\n return <Tab wrapped disabled={disabled} key={name} value={name} label={this.getText(items[name].label)} />\n })}\n </Tabs>\n {<ConfigPanel\n isParentTab={true}\n key={this.state.tab}\n index={1001}\n arrayIndex={this.props.arrayIndex}\n globalData={this.props.globalData}\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 dateFormat={this.props.dateFormat}\n isFloatComma={this.props.isFloatComma}\n // disabled={disabled}\n imagePrefix={this.props.imagePrefix}\n\n changeLanguage={this.props.changeLanguage}\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 imagePrefix: PropTypes.string,\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 changeLanguage: PropTypes.func,\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 '@mui/styles';\n\nimport LinearProgress from '@mui/material/LinearProgress';\n\nimport I18n from '@iobroker/adapter-react-v5/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\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 schema: JSON.parse(JSON.stringify(this.props.schema))\n };\n\n this.forceUpdateHandlers = {};\n\n this.buildDependencies(this.state.schema);\n\n this.readData();\n }\n\n static getDerivedStateFromProps(props, state) {\n if (props.updateData !== state.updateData) {\n return {\n updateData: props.updateData,\n originalData: JSON.stringify(props.data),\n schema: JSON.parse(JSON.stringify(props.schema)),\n };\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, saveConfig) => {\n if (this.props.onValueChange) {\n this.props.onValueChange(data, value, saveConfig);\n cb && cb();\n } else {\n if (data) {\n const newState = { 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 newState.changed = JSON.stringify(_data) !== this.state.originalData;\n\n this.setState(newState, () => {\n this.props.onChange(_data, newState.changed, saveConfig);\n cb && cb();\n });\n } else if (saveConfig) {\n this.props.onChange(null, null, saveConfig);\n }\n }\n }\n\n onError = (attr, error) => {\n this.errorChached = this.errorChached || JSON.parse(JSON.stringify(this.state.errors));\n const errors = this.errorChached;\n if (error) {\n errors[attr] = error;\n } else {\n delete errors[attr];\n }\n\n if (JSON.stringify(errors) !== JSON.stringify(this.state.errors)) {\n this.errorTimeout && clearTimeout(this.errorTimeout);\n this.errorTimeout = setTimeout(() => this.setState({ errors: this.errorChached }, () => {\n this.errorTimeout = null;\n this.errorChached = null;\n this.props.onError(!!Object.keys(this.state.errors).length);\n }), 50);\n } else {\n this.errorChached = null;\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 imagePrefix={this.props.imagePrefix}\n\n custom={this.props.custom}\n customObj={this.props.customObj}\n instanceObj={this.props.instanceObj}\n\n changeLanguage={this.changeLanguage}\n forceUpdate={this.forceAttrUpdate}\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 index={1000}\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 imagePrefix={this.props.imagePrefix}\n\n custom={this.props.custom}\n customObj={this.props.customObj}\n instanceObj={this.props.instanceObj}\n\n changeLanguage={this.changeLanguage}\n forceUpdate={this.forceAttrUpdate}\n registerOnForceUpdate={this.registerOnForceUpdate}\n\n onChange={this.onChange}\n onError={(attr, error) => this.onError(attr, error)}\n />;\n }\n }\n\n changeLanguage = () => {\n this.forceUpdate();\n }\n\n forceAttrUpdate = (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.state.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 imagePrefix: PropTypes.string,\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 { Component, createRef } from 'react';\nimport PropTypes from 'prop-types';\nimport Dropzone from 'react-dropzone';\nimport { Cropper } from 'react-cropper';\n\nimport { withStyles } from '@mui/styles';\nimport { Menu, MenuItem, Tooltip } from '@mui/material';\nimport IconButton from '@mui/material/IconButton';\n\nimport IconClose from '@mui/icons-material/Close';\nimport CropIcon from '@mui/icons-material/Crop';\nimport { FaFileUpload as UploadIcon } from 'react-icons/fa';\n\nimport Utils from '@iobroker/adapter-react-v5/Components/Utils';\n\n// import 'cropperjs/dist/cropper.css';\nconst cropperStyles = `\n/*!\n * Cropper.js v1.5.12\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2021-06-12T08:00:11.623Z\n */\n\n.cropper-container {\n direction: ltr;\n font-size: 0;\n line-height: 0;\n position: relative;\n -ms-touch-action: none;\n touch-action: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.cropper-container img {\n display: block;\n height: 100%;\n image-orientation: 0deg;\n max-height: none !important;\n max-width: none !important;\n min-height: 0 !important;\n min-width: 0 !important;\n width: 100%;\n}\n\n.cropper-wrap-box,\n.cropper-canvas,\n.cropper-drag-box,\n.cropper-crop-box,\n.cropper-modal {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.cropper-wrap-box,\n.cropper-canvas {\n overflow: hidden;\n}\n\n.cropper-drag-box {\n background-color: #fff;\n opacity: 0;\n}\n\n.cropper-modal {\n background-color: #000;\n opacity: 0.5;\n}\n\n.cropper-view-box {\n display: block;\n height: 100%;\n outline: 1px solid #39f;\n outline-color: rgba(51, 153, 255, 0.75);\n overflow: hidden;\n width: 100%;\n}\n\n.cropper-dashed {\n border: 0 dashed #eee;\n display: block;\n opacity: 0.5;\n position: absolute;\n}\n\n.cropper-dashed.dashed-h {\n border-bottom-width: 1px;\n border-top-width: 1px;\n height: calc(100% / 3);\n left: 0;\n top: calc(100% / 3);\n width: 100%;\n}\n\n.cropper-dashed.dashed-v {\n border-left-width: 1px;\n border-right-width: 1px;\n height: 100%;\n left: calc(100% / 3);\n top: 0;\n width: calc(100% / 3);\n}\n\n.cropper-center {\n display: block;\n height: 0;\n left: 50%;\n opacity: 0.75;\n position: absolute;\n top: 50%;\n width: 0;\n}\n\n.cropper-center::before,\n.cropper-center::after {\n background-color: #eee;\n content: ' ';\n display: block;\n position: absolute;\n}\n\n.cropper-center::before {\n height: 1px;\n left: -3px;\n top: 0;\n width: 7px;\n}\n\n.cropper-center::after {\n height: 7px;\n left: 0;\n top: -3px;\n width: 1px;\n}\n\n.cropper-face,\n.cropper-line,\n.cropper-point {\n display: block;\n height: 100%;\n opacity: 0.1;\n position: absolute;\n width: 100%;\n}\n\n.cropper-face {\n background-color: #fff;\n left: 0;\n top: 0;\n}\n\n.cropper-line {\n background-color: #39f;\n}\n\n.cropper-line.line-e {\n cursor: ew-resize;\n right: -3px;\n top: 0;\n width: 5px;\n}\n\n.cropper-line.line-n {\n cursor: ns-resize;\n height: 5px;\n left: 0;\n top: -3px;\n}\n\n.cropper-line.line-w {\n cursor: ew-resize;\n left: -3px;\n top: 0;\n width: 5px;\n}\n\n.cropper-line.line-s {\n bottom: -3px;\n cursor: ns-resize;\n height: 5px;\n left: 0;\n}\n\n.cropper-point {\n background-color: #39f;\n height: 5px;\n opacity: 0.75;\n width: 5px;\n}\n\n.cropper-point.point-e {\n cursor: ew-resize;\n margin-top: -3px;\n right: -3px;\n top: 50%;\n}\n\n.cropper-point.point-n {\n cursor: ns-resize;\n left: 50%;\n margin-left: -3px;\n top: -3px;\n}\n\n.cropper-point.point-w {\n cursor: ew-resize;\n left: -3px;\n margin-top: -3px;\n top: 50%;\n}\n\n.cropper-point.point-s {\n bottom: -3px;\n cursor: s-resize;\n left: 50%;\n margin-left: -3px;\n}\n\n.cropper-point.point-ne {\n cursor: nesw-resize;\n right: -3px;\n top: -3px;\n}\n\n.cropper-point.point-nw {\n cursor: nwse-resize;\n left: -3px;\n top: -3px;\n}\n\n.cropper-point.point-sw {\n bottom: -3px;\n cursor: nesw-resize;\n left: -3px;\n}\n\n.cropper-point.point-se {\n bottom: -3px;\n cursor: nwse-resize;\n height: 20px;\n opacity: 1;\n right: -3px;\n width: 20px;\n}\n\n@media (min-width: 768px) {\n .cropper-point.point-se {\n height: 15px;\n width: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .cropper-point.point-se {\n height: 10px;\n width: 10px;\n }\n}\n\n@media (min-width: 1200px) {\n .cropper-point.point-se {\n height: 5px;\n opacity: 0.75;\n width: 5px;\n }\n}\n\n.cropper-point.point-se::before {\n background-color: #39f;\n bottom: -50%;\n content: ' ';\n display: block;\n height: 200%;\n opacity: 0;\n position: absolute;\n right: -50%;\n width: 200%;\n}\n\n.cropper-invisible {\n opacity: 0;\n}\n\n.cropper-bg {\n background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC');\n}\n\n.cropper-hide {\n display: block;\n height: 0;\n position: absolute;\n width: 0;\n}\n\n.cropper-hidden {\n display: none !important;\n}\n\n.cropper-move {\n cursor: move;\n}\n\n.cropper-crop {\n cursor: crosshair;\n}\n\n.cropper-disabled .cropper-drag-box,\n.cropper-disabled .cropper-face,\n.cropper-disabled .cropper-line,\n.cropper-disabled .cropper-point {\n cursor: not-allowed;\n}\n`;\n\nconst styles = theme => ({\n dropZone: {\n width: '100%',\n height: 100,\n position: 'relative',\n },\n dropZoneEmpty: {\n\n },\n image: {\n objectFit: 'contain',\n margin: 'auto',\n display: 'flex',\n width: '100%',\n height: '100%',\n },\n\n uploadDiv: {\n position: 'relative',\n width: '100%',\n height: 300,\n opacity: 0.9,\n marginTop: 30,\n cursor: 'pointer',\n outline: 'none'\n },\n uploadDivDragging: {\n opacity: 1,\n background: 'rgba(128,255,128,0.1)'\n },\n\n uploadCenterDiv: {\n margin: 5,\n border: '3px dashed grey',\n borderRadius: 5,\n width: 'calc(100% - 10px)',\n height: 'calc(100% - 10px)',\n position: 'relative',\n display: 'flex'\n },\n uploadCenterIcon: {\n paddingTop: 10,\n width: 48,\n height: 48,\n },\n uploadCenterText: {\n fontSize: 16,\n },\n uploadCenterTextAndIcon: {\n textAlign: 'center',\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center'\n\n },\n disabledOpacity: {\n opacity: 0.3,\n cursor: 'default'\n },\n buttonRemoveWrapper: {\n position: 'absolute',\n zIndex: 222,\n right: 0\n },\n buttonCropWrapper: {\n position: 'absolute',\n zIndex: 222,\n right: 0,\n top: 50\n },\n error: {\n border: '2px solid red'\n }\n});\n\nclass UploadImage extends Component {\n constructor(props) {\n super(props);\n this.state = {\n uploadFile: false,\n anchorEl: null,\n cropHandler: false,\n };\n this.cropperRef = createRef();\n\n if (!window.document.getElementById('cropper-style-json-component')) {\n const style = window.document.createElement('style');\n style.setAttribute('id', 'cropper-style-json-component');\n style.innerHTML = cropperStyles;\n window.document.head.appendChild(style);\n }\n }\n\n onDrop(acceptedFiles) {\n const { maxSize, t, onChange } = this.props;\n\n const file = acceptedFiles[0];\n const reader = new FileReader();\n\n reader.onabort = () => console.log('file reading was aborted');\n reader.onerror = () => console.log('file reading has failed');\n reader.onload = () => {\n let ext = 'image/' + file.name.split('.').pop().toLowerCase();\n if (ext === 'image/jpg') {\n ext = 'image/jpeg';\n } else if (ext.includes('svg')) {\n ext = 'image/svg+xml';\n }\n if (file.size > maxSize) {\n return window.alert(t('ra_File is too big. Max %sk allowed. Try use SVG.', Math.round(maxSize / 1024)));\n }\n const base64 = `data:${ext};base64,${btoa(\n new Uint8Array(reader.result)\n .reduce((data, byte) => data + String.fromCharCode(byte), ''))}`;\n\n onChange(base64);\n };\n reader.readAsArrayBuffer(file);\n }\n\n render() {\n const { disabled, maxSize, classes, icon, t, removeIconFunc, accept, error, crop, onChange } = this.props;\n const { uploadFile, anchorEl, cropHandler } = this.state;\n return <Dropzone\n disabled={disabled || cropHandler}\n key=\"dropzone\"\n multiple={false}\n accept={accept}\n maxSize={maxSize}\n onDragEnter={() => this.setState({ uploadFile: 'dragging' })}\n onDragLeave={() => this.setState({ uploadFile: true })}\n onDrop={(acceptedFiles, errors) => {\n this.setState({ uploadFile: false });\n if (!acceptedFiles.length) {\n window.alert((errors && errors[0] && errors[0].errors && errors[0].errors[0] && errors[0].errors[0].message) || t('ra_Cannot upload'));\n } else {\n return this.onDrop(acceptedFiles);\n }\n }}\n >\n {({ getRootProps, getInputProps }) => <div\n className={Utils.clsx(\n classes.uploadDiv,\n uploadFile === 'dragging' && classes.uploadDivDragging,\n classes.dropZone,\n disabled && classes.disabledOpacity,\n !icon && classes.dropZoneEmpty\n )}\n {...getRootProps()}>\n <input {...getInputProps()} />\n <div className={Utils.clsx(classes.uploadCenterDiv, error && classes.error)}>\n {!icon ? <div className={classes.uploadCenterTextAndIcon}>\n <UploadIcon className={classes.uploadCenterIcon} />\n <div className={classes.uploadCenterText}>{\n uploadFile === 'dragging' ? t('ra_Drop file here') :\n t('ra_Place your files here or click here to open the browse dialog')}</div>\n </div>\n :\n removeIconFunc && !cropHandler && <div className={classes.buttonRemoveWrapper}>\n <Tooltip title={t('ra_Clear')}>\n <IconButton size=\"large\" onClick={e => {\n removeIconFunc && removeIconFunc();\n e.stopPropagation();\n }}><IconClose />\n </IconButton>\n </Tooltip>\n </div>\n }\n {icon && crop && <div className={classes.buttonCropWrapper}>\n <Tooltip title={t('ra_Crop')}>\n <IconButton size=\"large\" onClick={e => {\n if (!cropHandler) {\n this.setState({ cropHandler: true });\n } else {\n this.setState({ anchorEl: e.currentTarget });\n }\n e.stopPropagation();\n }}><CropIcon color={cropHandler ? 'primary' : 'inherit'} />\n </IconButton>\n </Tooltip>\n <Menu\n anchorEl={anchorEl}\n keepMounted\n open={Boolean(anchorEl)}\n onClose={() => this.setState({ anchorEl: null })}\n >\n <MenuItem onClick={() => this.setState({ anchorEl: null, cropHandler: false }, () => {\n const imageElement = this.cropperRef?.current?.cropper;\n onChange(imageElement.getCroppedCanvas().toDataURL());\n })}>{t('ra_Save')}</MenuItem>\n <MenuItem onClick={() => this.setState({ anchorEl: null, cropHandler: false })}>{t('ra_Close')}</MenuItem>\n </Menu>\n </div>}\n {icon && !cropHandler ? <img src={icon} className={classes.image} alt=\"icon\" /> : null}\n\n {icon && crop && cropHandler ? <Cropper\n ref={this.cropperRef}\n className={classes.image}\n src={icon}\n initialAspectRatio={1}\n viewMode={1}\n guides={false}\n minCropBoxHeight={10}\n minCropBoxWidth={10}\n background={false}\n checkOrientation={false}\n /> : null}\n </div>\n </div>}\n </Dropzone>;\n }\n}\n\nUploadImage.defaultProps = {\n disabled: false,\n maxSize: 10 * 1024,\n icon: null,\n removeIconFunc: null,\n accept: { 'image/*': [] },\n error: false,\n onChange: base64 => console.log(base64),\n t: el => el,\n crop: false,\n};\n\nUploadImage.propTypes = {\n classes: PropTypes.object,\n maxSize: PropTypes.number,\n disabled: PropTypes.bool,\n crop: PropTypes.bool,\n error: PropTypes.bool,\n onChange: PropTypes.func,\n accept: PropTypes.object,\n t: PropTypes.func,\n};\n\nexport default withStyles(styles)(UploadImage);\n","import React, { createRef, Component } from 'react';\nimport {withStyles} from '@mui/styles';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport JSON5 from 'json5';\n\nimport LinearProgress from '@mui/material/LinearProgress';\nimport Accordion from '@mui/material/Accordion';\nimport AccordionSummary from '@mui/material/AccordionSummary';\nimport AccordionDetails from '@mui/material/AccordionDetails';\nimport Typography from '@mui/material/Typography';\nimport Paper from '@mui/material/Paper';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Checkbox from '@mui/material/Checkbox';\n\n// Icons\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\n\nimport DialogError from '@iobroker/adapter-react-v5/Dialogs/Error';\nimport ConfirmDialog from '@iobroker/adapter-react-v5/Dialogs/Confirm';\nimport withWidth from '@iobroker/adapter-react-v5/Components/withWidth';\n\nimport JsonConfigComponent from '../JsonConfigComponent';\nimport ConfigGeneric from '../JsonConfigComponent/ConfigGeneric';\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 paddingTop: 16,\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 || 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 || 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 _id: 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 Utils.fixAdminUI(ad);\n\n if (ad.common?.adminUI.custom === 'json') {\n return this.props.socket.fileExists(adapter + '.admin', 'jsonCustom.json5')\n .then(exist => {\n if (exist) {\n return this.props.socket.readFile(adapter + '.admin', 'jsonCustom.json5');\n } else {\n return this.props.socket.readFile(adapter + '.admin', 'jsonCustom.json')\n }\n })\n .then(json => {\n if (json.file !== undefined) {\n json = json.file;\n }\n try {\n json = JSON5.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 || window.localStorage).setItem('App.customsExpanded', JSON.stringify(expanded));\n pos === -1 && (window._localStorage || window.localStorage).setItem('App.customsLastExpanded', instance);\n this.setState({ expanded });\n }}\n >\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n data-id={instance}\n className={i % 2 ?\n (enabled ? this.props.classes.accordionHeaderEnabledOdd : this.props.classes.accordionHeaderOdd)\n :\n (enabled ? this.props.classes.accordionHeaderEnabledEven : this.props.classes.accordionHeaderEven)\n }\n >\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 this.cachedNewValues = this.cachedNewValues || this.state.newValues;\n const newValues = JSON.parse(JSON.stringify(this.cachedNewValues));\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.cachedNewValues = newValues;\n this.setState({ newValues, hasChanges: this.isChanged(newValues) }, () => {\n this.cachedNewValues = null;\n this.props.onChange && this.props.onChange(this.state.hasChanges);\n });\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 this.cachedNewValues = this.cachedNewValues || this.state.newValues;\n console.log(`${attr} => ${value}`);\n const newValues = JSON.parse(JSON.stringify(this.cachedNewValues));\n newValues[instance] = newValues[instance] || {};\n if (JSON.stringify(ConfigGeneric.getValue(this.commonConfig[instance], attr)) === JSON.stringify(value)) {\n ConfigGeneric.setValue(newValues[instance], attr, null);\n if (!Object.keys(newValues[instance]).length) {\n delete newValues[instance];\n }\n } else {\n ConfigGeneric.setValue(newValues[instance], attr, value);\n }\n this.cachedNewValues = newValues;\n this.setState({ newValues, hasChanges: this.isChanged(newValues) }, () => {\n this.cachedNewValues = null;\n this.props.onChange && this.props.onChange(this.state.hasChanges);\n });\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]) || (newValues[attr][0] && typeof newValues[attr][0] === 'object')) {\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.cachedNewValues = {};\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","/**\n * Copyright 2022, bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n **/\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles} from '@mui/styles';\n\nimport Table from '@mui/material/Table';\nimport Skeleton from '@mui/material/Skeleton';\n\nconst styles = theme => ({\n table: {\n display: 'grid',\n '& tr': {\n display: 'contents',\n },\n '& thead': {\n display: 'contents',\n },\n '& tbody': {\n display: 'contents',\n },\n '& th': { // resizer\n position: 'sticky',\n userSelect: 'none',\n },\n '& .resize-handle': { // resizer\n display: 'block',\n position: 'absolute',\n cursor: 'col-resize',\n width: 7,\n right: 0,\n top: 2,\n bottom: 2,\n zIndex: 1,\n borderRight: '2px dotted #888',\n '&:hover': {\n borderColor: '#ccc',\n borderRightStyle: 'solid',\n }\n , '&.active': {\n borderColor: '#517ea5',\n borderRightStyle: 'solid',\n }\n }\n },\n});\n\nclass TableResize extends Component {\n constructor(props) {\n super(props);\n this.resizerRefTable = React.createRef();\n this.resizerActiveIndex = null;\n this.resizerActiveDiv = null;\n this.resizerCurrentWidths = [];\n }\n\n componentDidMount() {\n this.resizerInstall();\n }\n\n componentWillUnmount() {\n this.resizerUninstall();\n }\n\n resizerInstall() {\n if (this.resizerRefTable.current && !this.resizerRefTable.current._installed) {\n this.resizerRefTable.current._installed = true;\n const ths = this.resizerRefTable.current.querySelectorAll('th');\n\n const widthsStored = (window._localStorage || window.localStorage).getItem(`App.${this.props.name || 'history'}.table`);\n this.widthFilled = false;\n\n if (widthsStored) {\n try {\n this.resizerCurrentWidths = JSON.parse(widthsStored);\n this.widthFilled = true;\n } catch (e) {\n // ignore\n }\n }\n if (this.widthFilled) {\n if (this.resizerCurrentWidths.length !== ths.length) {\n this.resizerCurrentWidths = [];\n this.widthFilled = false;\n } else {\n const tableWidth = this.resizerRefTable.current.offsetWidth;\n let storedWidth = 0;\n for (let w = 0; w < this.resizerCurrentWidths.length; w++) {\n if (isFinite(this.resizerCurrentWidths[w])) {\n storedWidth += this.resizerCurrentWidths[w];\n } else {\n storedWidth = null;\n break;\n }\n }\n if (storedWidth !== null && Math.abs(storedWidth - tableWidth) > 20) {\n this.resizerCurrentWidths = [];\n this.widthFilled = false;\n }\n }\n }\n\n for (let i = 0; i < ths.length; i++) {\n !this.widthFilled && this.resizerCurrentWidths.push(ths[i].offsetWidth);\n\n // last column does need handle\n if (i < ths.length - 1) {\n const div = window.document.createElement('div');\n div.dataset.index = i.toString();\n div.onmousedown = this.resizerMouseDown;\n div.ondblclick = this.resizerReset;\n div.title = this.props.dblTitle || 'Double click to reset table layout';\n div.className = 'resize-handle';\n ths[i].appendChild(div);\n }\n }\n if (this.widthFilled) {\n this.resizerApplyWidths();\n }\n } else {\n this.installTimeout = setTimeout(() => {\n this.installTimeout = null;\n this.resizerInstall()\n }, 100);\n }\n }\n\n resizerReset = () => {\n for (let c = 0; c < this.resizerCurrentWidths.length; c++) {\n this.resizerCurrentWidths[c] = (this.props.initialWidths || [])[c] || 'auto';\n }\n\n (window._localStorage || window.localStorage).setItem(`App.${this.props.name || 'history'}.table`, JSON.stringify(this.resizerCurrentWidths));\n this.resizerApplyWidths();\n }\n\n resizerUninstall() {\n this.installTimeout && clearTimeout(this.installTimeout);\n\n // resizer\n if (this.resizerRefTable.current && this.resizerRefTable.current._installed) {\n this.resizerRefTable.current._installed = true;\n const ths = this.resizerRefTable.current.querySelectorAll('th');\n for (let i = 0; i < ths.length; i++) {\n const div = ths[i].querySelector('.resize-handle');\n if (div) {\n div.onmousedown = null;\n div.remove();\n }\n }\n }\n }\n\n resizerApplyWidths() {\n const gridTemplateColumns = [];\n if (this.resizerCurrentWidths.length) {\n for (let c = 0; c < this.resizerCurrentWidths.length; c++) {\n if (this.resizerCurrentWidths[c]) {\n gridTemplateColumns.push(this.resizerCurrentWidths[c] !== 'auto' ? this.resizerCurrentWidths[c] + 'px' : 'auto');\n } else if (this.props.initialWidths && this.props.initialWidths[c]) {\n gridTemplateColumns.push(this.props.initialWidths[c] !== 'auto' ? this.props.initialWidths[c] + 'px' : 'auto');\n } else {\n gridTemplateColumns.push('auto');\n }\n }\n } else if (this.props.initialWidths) {\n for (let c = 0; c < this.props.initialWidths.length; c++) {\n if (this.props.initialWidths[c]) {\n gridTemplateColumns.push(this.props.initialWidths[c] !== 'auto' ? this.props.initialWidths[c] + 'px' : 'auto');\n } else {\n gridTemplateColumns.push('auto');\n }\n }\n }\n\n if (this.resizerRefTable.current && gridTemplateColumns.length) {\n this.resizerRefTable.current.style.gridTemplateColumns = gridTemplateColumns.join(' ');\n }\n\n return gridTemplateColumns.length ? gridTemplateColumns.join(' ') : undefined;\n }\n\n resizerMouseMove = e => {\n if (this.resizerActiveDiv) {\n const width = this.resizerOldWidth + e.clientX - this.resizerPosition;\n const widthNext = this.resizerOldWidthNext - e.clientX + this.resizerPosition;\n if ((!this.resizerMin || width > this.resizerMin) &&\n (!this.resizerMinNext || widthNext > this.resizerMinNext)) {\n this.resizerCurrentWidths[this.resizerActiveIndex] = width;\n this.resizerCurrentWidths[this.resizerActiveIndex + 1] = widthNext;\n this.resizerApplyWidths();\n }\n }\n }\n\n resizerMouseUp = () => {\n (window._localStorage || window.localStorage).setItem(`App.${this.props.name || 'history'}.table`, JSON.stringify(this.resizerCurrentWidths));\n\n this.resizerActiveIndex = null;\n this.resizerActiveDiv = null;\n window.removeEventListener('mousemove', this.resizerMouseMove);\n window.removeEventListener('mouseup', this.resizerMouseUp);\n }\n\n resizerMouseDown = e => {\n if (this.resizerActiveIndex === null || this.resizerActiveIndex === undefined) {\n console.log('Mouse down ' + e.target.dataset.index);\n this.resizerActiveIndex = parseInt(e.target.dataset.index, 10);\n this.resizerActiveDiv = e.target;\n this.resizerMin = this.props.minWidths ? this.props.minWidths[this.resizerActiveIndex] : 0;\n this.resizerMinNext = this.props.minWidths ? this.props.minWidths[this.resizerActiveIndex + 1] : 0;\n this.resizerPosition = e.clientX;\n let ths;\n if (this.resizerCurrentWidths[this.resizerActiveIndex] === 'auto') {\n ths = ths || this.resizerRefTable.current.querySelectorAll('th');\n this.resizerCurrentWidths[this.resizerActiveIndex] = ths[this.resizerActiveIndex].offsetWidth;\n }\n if (this.resizerCurrentWidths[this.resizerActiveIndex + 1] === 'auto') {\n ths = ths || this.resizerRefTable.current.querySelectorAll('th');\n this.resizerCurrentWidths[this.resizerActiveIndex + 1] = ths[this.resizerActiveIndex + 1].offsetWidth;\n }\n\n this.resizerOldWidth = this.resizerCurrentWidths[this.resizerActiveIndex];\n this.resizerOldWidthNext = this.resizerCurrentWidths[this.resizerActiveIndex + 1];\n\n window.addEventListener('mousemove', this.resizerMouseMove);\n window.addEventListener('mouseup', this.resizerMouseUp);\n }\n };\n\n render() {\n if (this.props.ready === false) {\n return <Skeleton />;\n }\n\n const style = { gridTemplateColumns: this.resizerApplyWidths() };\n\n return <Table\n stickyHeader={this.props.stickyHeader}\n size={this.props.size || 'small'}\n className={ this.props.classes.table + (this.props.className ? ' ' + this.props.className : '')}\n ref={ this.resizerRefTable }\n style={ Object.assign({}, this.props.style || {}, style) }\n >\n { this.props.children }\n </Table>;\n }\n}\n\nTableResize.propTypes = {\n name: PropTypes.string,\n ready: PropTypes.bool,\n stickyHeader: PropTypes.bool,\n size: PropTypes.string,\n className: PropTypes.string,\n style: PropTypes.object,\n initialWidths: PropTypes.array,\n minWidths: PropTypes.array,\n dblTitle: PropTypes.string,\n};\n\nexport default withStyles(styles)(TableResize);","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@mui/styles';\nimport clsx from 'clsx';\n\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';\nimport { LocalizationProvider, TimePicker, DatePicker } from '@mui/x-date-pickers';\nimport Paper from '@mui/material/Paper';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport InputLabel from '@mui/material/InputLabel';\nimport MenuItem from '@mui/material/MenuItem';\nimport FormControl from '@mui/material/FormControl';\nimport Select from '@mui/material/Select';\nimport Toolbar from '@mui/material/Toolbar';\nimport IconButton from '@mui/material/IconButton';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogContentText from '@mui/material/DialogContentText';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport Button from '@mui/material/Button';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Checkbox from '@mui/material/Checkbox';\nimport Grid from '@mui/material/Grid';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport TextField from '@mui/material/TextField';\nimport TableBody from '@mui/material/TableBody';\nimport TableContainer from '@mui/material/TableContainer';\n\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-v5/Components/Utils';\nimport withWidth from '@iobroker/adapter-react-v5/Components/withWidth';\n// import TableResize from '@iobroker/adapter-react-v5/Components/TableResize';\nimport TableResize from '../TableResize';\n\n// icons\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport EditIcon from '@mui/icons-material/Edit';\nimport { FaPlusSquare as InsertIcon} from 'react-icons/fa';\nimport { FaDownload as ExportIcon} from 'react-icons/fa';\nimport IconDelete from '@mui/icons-material/Delete';\nimport IconClose from '@mui/icons-material/Close';\n\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 + parseInt(theme.spacing(1), 10)}px)`,\n overflow: 'hidden',\n width: '100%',\n },\n container: {\n height: '100%'\n },\n table: {\n //tableLayout: 'fixed',\n minWidth: 960,\n width: '100%',\n '& td:nth-of-type(5)': {\n overflow: 'hidden',\n whiteSpace: 'nowrap'\n },\n '& tr:nth-child(even)': {\n backgroundColor: theme.palette.mode === 'dark' ? '#383838' : '#b2b2b2',\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 color: theme.palette.secondary.contrastText,\n '& td': {\n color: theme.palette.secondary.contrastText,\n background: theme.palette.secondary.main,\n }\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: theme.palette.mode === 'dark' ? '#66ff7f' : '#04a821',\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 paddingTop: theme.spacing(0.5),\n paddingBottom: theme.spacing(0.5),\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 dateInput: {\n width: 140,\n marginRight: theme.spacing(1)\n },\n timeInput: {\n width: 100,\n }\n});\n\nclass ObjectHistoryData extends Component {\n constructor(props) {\n super(props);\n\n let relativeRange = (window._localStorage || window.localStorage).getItem('App.relativeRange') || 'absolute';\n let start = parseInt((window._localStorage || window.localStorage).getItem('App.absoluteStart'), 10) || 0;\n let end = parseInt((window._localStorage || window.localStorage).getItem('App.absoluteEnd'), 10) || 0;\n let selected = (window._localStorage || window.localStorage).getItem('App.historySelected') || '';\n let lastSelected = parseInt((window._localStorage || window.localStorage).getItem('App.historyLastSelected'), 10) || null;\n let lastSelectedColumn = (window._localStorage || 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 || 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\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 returnNewestEntries: true,\n })\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 // this is a code which makes problems. It is no good idea doing this!\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 limit: 1, // is that a way to make it faster?\n from: false,\n ack: false,\n q: false,\n addID: false,\n aggregate: 'none'\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 || window.localStorage).setItem('App.historyLastSelected', ts.toString());\n (window._localStorage || window.localStorage).setItem('App.historyLastSelectedColumn', column);\n (window._localStorage || 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 const selectedClass = this.state.selected.includes(ts);\n\n rows.push(<TableRow\n className={ clsx(\n classes.row, classes.updatedRow,\n interpolated && classes.rowInterpolated,\n selectedClass && classes.rowSelected\n ) }\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 now.setSeconds(0);\n start = now.getTime();\n } else if (mins === 'week') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(0);\n now.setMilliseconds(0);\n // find week start\n const day = now.getDay() || 7;\n if (day !== 1) {\n now.setHours(-24 * (day - 1));\n }\n start = now.getTime();\n } else if (mins === '2weeks') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(0);\n now.setDate(now.getDate() - 7); // 1 week earlier\n\n const day = now.getDay() || 7;\n if (day !== 1) {\n now.setHours(-24 * (day - 1));\n }\n start = now.getTime();\n } else if (mins === 'month') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(0);\n now.setDate(1);\n start = now.getTime();\n } else if (mins === 'year') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(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.setSeconds(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 || 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 || window.localStorage).removeItem('App.absoluteStart');\n (window._localStorage || 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 now.setSeconds(0);\n start = now.getTime();\n } else if (mins === 'week') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(0);\n\n const day = now.getDay() || 7;\n if (day !== 1) {\n now.setHours(-24 * (day - 1));\n }\n\n start = now.getTime();\n } else if (mins === '2weeks') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(0);\n now.setDate(now.getDate() - 7); // 1 week earlier\n\n const day = now.getDay() || 7;\n if (day !== 1) {\n now.setHours(-24 * (day - 1));\n }\n\n start = now.getTime();\n } else if (mins === 'month') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(0);\n now.setDate(1);\n start = now.getTime();\n } else if (mins === 'year') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(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.setSeconds(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 const initialWidths = [200, 'auto'];\n const minWidths = [190, 100];\n if (this.state.ackVisible) {\n initialWidths.push(50);\n minWidths.push(50);\n }\n if (this.state.fromVisible) {\n initialWidths.push(150);\n minWidths.push(150);\n }\n if (this.state.lcVisible) {\n initialWidths.push(200);\n minWidths.push(190);\n }\n\n return <TableContainer className={ classes.container }>\n <TableResize\n stickyHeader\n className={classes.table}\n initialWidths={initialWidths}\n minWidths={minWidths}\n dblTitle={this.props.t('ra_Double click to reset table layout')}\n >\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 {this.state.lcVisible ? <TableCell className={ classes.colLastChange }>\n { this.props.t('lc') }\n </TableCell> : null}\n </TableRow>\n </TableHead>\n <TableBody>{ this.getTableRows(classes) }</TableBody>\n </TableResize>\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 variant=\"standard\"\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 <LocalizationProvider dateAdapter={AdapterDateFns} adapterLocale={localeMap[this.props.lang]}>\n <Grid container justifyContent=\"space-around\">\n <DatePicker\n className={ this.props.classes.editorDatePicker}\n margin=\"normal\"\n label={this.props.t('Date')}\n //format=\"fullDate\"\n inputFormat={this.state.dateFormat}\n value={ this.state.edit.date }\n onChange={date =>\n this.updateEdit('date', date)}\n renderInput={params => <TextField className={this.props.classes.timeInput} variant=\"standard\" {...params} />}\n />\n {/*<TextField\n variant=\"standard\"\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 <TimePicker\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 renderInput={params => <TextField className={this.props.classes.timeInput} variant=\"standard\" {...params} />}\n />\n {/*<TextField\n variant=\"standard\"\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 variant=\"standard\"\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 </LocalizationProvider>\n : null }\n </form>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={ () => {\n const isUpdate = this.state.updateOpened;\n this.setState({ updateOpened: false, insertOpened: false }, () =>\n isUpdate ? this.onUpdate() : this.onInsert());\n }}\n color=\"primary\"\n autoFocus\n >{ this.state.updateOpened ? this.props.t('Update') : this.props.t('Add') }</Button>\n <Button variant=\"contained\" onClick={() => this.setState({ updateOpened: false, insertOpened: false })} color=\"grey\">{ 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 || window.localStorage).setItem('App.relativeRange', 'absolute');\n (window._localStorage || window.localStorage).setItem('App.absoluteStart', start);\n (window._localStorage || 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 || window.localStorage).setItem('App.relativeRange', 'absolute');\n (window._localStorage || window.localStorage).setItem('App.absoluteStart', this.state.start);\n (window._localStorage || 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 variant=\"standard\" className={ classes.selectHistoryControl }>\n <InputLabel>{ this.props.t('History instance') }</InputLabel>\n <Select\n variant=\"standard\"\n value={ this.state.historyInstance || ''}\n onChange={ e => {\n const historyInstance = e.target.value;\n (window._localStorage || 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 variant=\"standard\" className={ classes.selectRelativeTime }>\n <InputLabel>{ this.props.t('Relative') }</InputLabel>\n <Select\n variant=\"standard\"\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 <LocalizationProvider dateAdapter={AdapterDateFns} adapterLocale={localeMap[this.props.lang]}>\n <div className={ classes.toolbarTimeGrid }>\n <DatePicker\n className={ classes.toolbarDate }\n disabled={ this.state.relativeRange !== 'absolute' }\n disableToolbar\n variant=\"inline\"\n margin=\"normal\"\n inputFormat={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 renderInput={params => <TextField className={this.props.classes.dateInput} variant=\"standard\" {...params} />}\n />\n <TimePicker\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 renderInput={params => <TextField className={this.props.classes.timeInput} variant=\"standard\" {...params} />}\n />\n </div>\n <div className={ classes.toolbarTimeGrid }>\n <DatePicker\n disabled={ this.state.relativeRange !== 'absolute' }\n className={ classes.toolbarDate }\n disableToolbar\n inputFormat={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 renderInput={params => <TextField className={this.props.classes.dateInput} variant=\"standard\" {...params} />}\n />\n <TimePicker\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 renderInput={params => <TextField className={this.props.classes.timeInput} variant=\"standard\" {...params} />}\n />\n </div>\n </LocalizationProvider>\n <div className={classes.grow} />\n\n { this.state.values && this.state.values.length ? <IconButton size=\"large\" 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 size=\"large\" 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 size=\"large\" 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 size=\"large\" 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 </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));\n","import { createRef, Component } from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from '@mui/styles';\nimport clsx from 'clsx';\n\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';\nimport { LocalizationProvider, TimePicker, DatePicker } from '@mui/x-date-pickers';\nimport Paper from '@mui/material/Paper';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport InputLabel from '@mui/material/InputLabel';\nimport MenuItem from '@mui/material/MenuItem';\nimport FormControl from '@mui/material/FormControl';\nimport Select from '@mui/material/Select';\nimport Toolbar from '@mui/material/Toolbar';\nimport Fab from '@mui/material/Fab';\nimport TextField from '@mui/material/TextField';\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 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-v5/Components/Utils';\nimport withWidth from '@iobroker/adapter-react-v5/Components/withWidth';\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 + parseInt(theme.spacing(1), 10)}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 paddingTop: theme.spacing(0.5),\n paddingBottom: theme.spacing(0.5),\n border: '1px dotted #AAAAAA',\n borderRadius: theme.spacing(1),\n display: 'flex'\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 dateInput: {\n width: 140,\n marginRight: theme.spacing(1)\n },\n timeInput: {\n width: 80,\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 if (!this.props.from) {\n const from = new Date();\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 || window.localStorage).getItem('App.relativeRange') || '30';\n let min = parseInt((window._localStorage || window.localStorage).getItem('App.absoluteStart'), 10) || 0;\n let max = parseInt((window._localStorage || 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 || 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 if (!this.state.max || state.ts - this.state.max < 120000) {\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\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', true)\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 || 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 limit: 1,\n from: false,\n ack: false,\n q: false,\n addID: false,\n aggregate: 'none'\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 returnNewestEntries: true,\n };\n\n // if more than 24 hours => aggregate\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 const dp = {value: [values[i].ts, values[i].val]};\n if (values[i].i) {\n dp.exact = false;\n }\n data.push(dp);\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 const splitNumber = this.chart.withSeconds ?\n Math.round((this.state.chartWidth - GRID_PADDING_RIGHT - GRID_PADDING_LEFT) / 100)\n :\n Math.round((this.state.chartWidth - GRID_PADDING_RIGHT - GRID_PADDING_LEFT) / 60);\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 `${params.exact === false ? 'i' : ''}${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,\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 // stop shift timer\n this.timeTimer && clearTimeout(this.timeTimer);\n this.timeTimer = null;\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 now.setSeconds(0);\n min = now.getTime();\n } else if (mins === 'week') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(0);\n\n const day = now.getDay() || 7;\n if (day !== 1) {\n now.setHours(-24 * (day - 1));\n }\n\n min = now.getTime();\n } else if (mins === '2weeks') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(0);\n now.setDate(now.getDate() - 7); // 1 week earlier\n\n const day = now.getDay() || 7;\n if (day !== 1) {\n now.setHours(-24 * (day - 1));\n }\n\n min = now.getTime();\n } else if (mins === 'month') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(0);\n now.setDate(1);\n min = now.getTime();\n } else if (mins === 'year') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(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.setSeconds(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 || 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 this.updateChart(this.chart.min, this.chart.max, true, cb);\n return;\n } else {\n (window._localStorage || window.localStorage).removeItem('App.absoluteStart');\n (window._localStorage || 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 now.setSeconds(0);\n this.chart.min = now.getTime();\n } else if (mins === 'week') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(0);\n\n const day = now.getDay() || 7;\n if (day !== 1) {\n now.setHours(-24 * (day - 1));\n }\n\n this.chart.min = now.getTime();\n } else if (mins === '2weeks') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(0);\n now.setDate(now.getDate() - 7); // 1 week earlier\n\n const day = now.getDay() || 7;\n if (day !== 1) {\n now.setHours(-24 * (day - 1));\n }\n\n this.chart.min = now.getTime();\n } else if (mins === 'month') {\n now.setHours(0);\n now.setMinutes(0);\n now.setSeconds(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.setSeconds(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.setSeconds(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 || window.localStorage).setItem('App.relativeRange', 'absolute');\n (window._localStorage || window.localStorage).setItem('App.absoluteStart', min);\n (window._localStorage || window.localStorage).setItem('App.absoluteEnd', this.state.max);\n\n this.chart.min = min;\n\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 || window.localStorage).setItem('App.relativeRange', 'absolute');\n (window._localStorage || window.localStorage).setItem('App.absoluteStart', this.state.min);\n (window._localStorage || 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 variant=\"standard\" className={ classes.selectHistoryControl }>\n <InputLabel>{ this.props.t('History instance') }</InputLabel>\n <Select\n variant=\"standard\"\n value={ this.state.historyInstance }\n onChange={ e => {\n (window._localStorage || 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 variant=\"standard\" className={ classes.selectRelativeTime }>\n <InputLabel>{ this.props.t('Relative') }</InputLabel>\n <Select\n variant=\"standard\"\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 <LocalizationProvider dateAdapter={AdapterDateFns} adapterLocale={localeMap[this.props.lang]}>\n <div className={ classes.toolbarTimeGrid }>\n <DatePicker\n className={ classes.toolbarDate }\n disabled={ this.state.relativeRange !== 'absolute' }\n disableToolbar\n variant=\"inline\"\n margin=\"normal\"\n inputFormat={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 renderInput={params => <TextField className={this.props.classes.dateInput} variant=\"standard\" {...params} />}\n />\n <TimePicker\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 renderInput={params => <TextField className={this.props.classes.timeInput} variant=\"standard\" {...params} />}\n />\n </div>\n <div className={ classes.toolbarTimeGrid }>\n <DatePicker\n disabled={ this.state.relativeRange !== 'absolute' }\n className={ classes.toolbarDate }\n disableToolbar\n inputFormat={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 renderInput={params => <TextField className={this.props.classes.dateInput} variant=\"standard\" {...params} />}\n />\n <TimePicker\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 renderInput={params => <TextField className={this.props.classes.timeInput} variant=\"standard\" {...params} />}\n />\n </div>\n </LocalizationProvider>\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 || 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));\n","import React from 'react';\nimport { withStyles } from '@mui/styles';\nimport PropTypes from 'prop-types';\n\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport AppBar from '@mui/material/AppBar';\nimport Tabs from '@mui/material/Tabs';\nimport Tab from '@mui/material/Tab';\n\nimport Router from '@iobroker/adapter-react-v5/Components/Router';\nimport ConfirmDialog from '@iobroker/adapter-react-v5/Dialogs/Confirm';\nimport I18n from '@iobroker/adapter-react-v5/i18n';\n\n// Icons\nimport CloseIcon from '@mui/icons-material/Close';\nimport SaveIcon from '@mui/icons-material/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 tabSelected: {\n color: theme.palette.mode === 'dark' ? theme.palette.secondary.contrastText : '#FFFFFF !important',\n },\n tabsIndicator: {\n backgroundColor: theme.palette.secondary.main,\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 || 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\n value={this.state.currentTab}\n onChange={(event, newTab) => {\n Router.doNavigate(null, null, null, newTab === 1 ? 'table' : (newTab === 2 ? 'chart' : 'config'));\n this.setState({ currentTab: newTab });\n (window._localStorage || window.localStorage).setItem('App.objectCustomTab', newTab);\n }}\n classes={{ indicator: this.props.classes.tabsIndicator }}\n indicatorColor=\"secondary\"\n >\n <Tab\n disabled={this.state.progressRunning}\n label={this.props.t('Custom settings')}\n id={'custom-settings-tab'}\n aria-controls={'simple-tabpanel-0'}\n classes={{ selected: this.props.classes.tabSelected }}\n />\n {this.props.objectIDs.length === 1 && this.chartAvailable ? <Tab\n disabled={this.state.progressRunning}\n label={this.props.t('History data')}\n id={'history-data-tab'}\n aria-controls={'simple-tabpanel-1'}\n classes={{ selected: this.props.classes.tabSelected }}\n /> : null}\n {(varType === 'number' || varType === 'boolean') && this.props.objectIDs.length === 1 && this.chartAvailable ? <Tab\n disabled={this.state.progressRunning}\n label={this.props.t('Chart')}\n id={'chart-tab'}\n aria-controls={'simple-tabpanel-2'}\n classes={{ selected: this.props.classes.tabSelected }}\n /> : 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 color=\"grey\"\n >\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 '@mui/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 '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Checkbox from '@mui/material/Checkbox';\nimport TextField from '@mui/material/TextField';\nimport DialogActions from '@mui/material/DialogActions';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport InputLabel from '@mui/material/InputLabel';\nimport MenuItem from '@mui/material/MenuItem';\nimport FormControl from '@mui/material/FormControl';\nimport Select from '@mui/material/Select';\nimport Grid from '@mui/material/Grid';\nimport Hidden from '@mui/material/Hidden';\nimport Fab from '@mui/material/Fab';\nimport Typography from '@mui/material/Typography';\nimport Switch from '@mui/material/Switch';\nimport Autocomplete from '@mui/material/Autocomplete';\n\nimport ChartIcon from '@mui/icons-material/ShowChart';\nimport IconCancel from '@mui/icons-material/Close';\nimport IconCheck from '@mui/icons-material/Check';\nimport FullscreenIcon from '@mui/icons-material/Fullscreen';\nimport FullscreenExitIcon from '@mui/icons-material/FullscreenExit';\n\nimport Utils from '@iobroker/adapter-react-v5/Components/Utils';\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 minHeight: 200,\n },\n jsonNoError: {\n border: '1px solid #00000000',\n minHeight: 200,\n },\n wrapperButton: {\n },\n readOnly: {\n backgroundColor: '#b74848',\n },\n readOnlyText: {\n color: '#b74848',\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 ackCheckbox: {\n marginLeft: 4,\n },\n dialog: {\n minHeight: window.clientHeight - 50 > 500 ? 500 : window.clientHeight - 50,\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\n }\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\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 } else if (type === 'number') {\n this.value = parseFloat(this.propsValue) || 0;\n }\n\n this.state = {\n type,\n chart: false,\n chartEnabled: (window._localStorage || window.localStorage).getItem('App.chartSetValue') !== 'false',\n fullScreen: (window._localStorage || window.localStorage).getItem('App.fullScreen') === 'true',\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(e) {\n e && e.stopPropagation();\n e && e.preventDefault();\n\n let value = this.value;\n if (this.state.type === 'states') {\n if (value === 'null') {\n value = null;\n } else {\n let type = this.props.type || typeof this.props.value;\n value = typeof value === 'object' ? value.value : value;\n\n if (type === 'number') {\n if (typeof value === 'string') {\n value = parseFloat(value.replace(',', '.')) || 0;\n }\n } else if (type === 'boolean') {\n value = value === true || value === 'true' || value === '1' || value === 'ON' || value === 'on';\n }\n }\n } else\n if (this.state.type === 'number') {\n if (value === 'null') {\n value = null;\n } else\n if (typeof value === 'string') {\n value = parseFloat(value.replace(',', '.')) || 0;\n }\n } else if (this.state.type === 'boolean') {\n if (value === 'null') {\n value = null;\n } else {\n value = value === true || value === 'true' || value === '1' || value === 'ON' || value === 'on';\n }\n }\n\n this.props.onClose({val: 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=\"100%\"\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 if (this.props.type === 'number' && this.props.object.common.max !== undefined && this.props.object.common.min !== undefined) {\n const options = Object.keys(this.props.states).map(key => ({label: this.props.states[key], value: key}));\n\n return <Autocomplete\n className={ this.props.classes.formControl }\n disablePortal\n defaultValue={ this.props.states[this.propsValue] !== undefined ? this.props.states[this.propsValue] : this.propsValue}\n options={options}\n noOptionsText=\"\"\n freeSolo\n getOptionLabel={option => option.label || (option !== undefined && option !== null ? option.toString() : '')}\n onChange={(e, value) => this.value = value}\n onInputChange={(e, value) => this.value = value}\n onKeyUp={e => e.keyCode === 13 && this.onUpdate(e)}\n renderInput={params => <TextField\n {...params}\n label={this.props.t('Value')}\n variant=\"standard\"\n />}\n />\n } else {\n return <FormControl variant=\"standard\" className={ this.props.classes.formControl }>\n <InputLabel>{ this.props.t('Value') }</InputLabel>\n <Select\n variant=\"standard\"\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\n render() {\n const ackCheckbox = <FormControlLabel\n className={Utils.clsx(this.props.classes.formControl, !this.props.expertMode ? this.props.classes.ackCheckbox : '')}\n control={ <Checkbox\n defaultChecked={ false }\n onChange={ e => this.ack = e.target.checked }/> }\n label={ this.props.t('Acknowledged') }\n />;\n\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 === 'json' && this.state.fullScreen) || (this.state.type !== 'number' && this.state.type !== 'boolean' && this.state.type !== 'states') || (this.state.chart && this.state.chartEnabled)}\n fullScreen={ this.state.type === 'json' && this.state.fullScreen }\n onClose={ () => this.props.onClose() }\n aria-labelledby=\"edit-value-dialog-title\"\n aria-describedby=\"edit-value-dialog-description\"\n classes={{ root: this.state.type === 'json' ? this.props.classes.dialog : '' }}\n >\n <DialogTitle id=\"edit-value-dialog-title\">\n { this.props.t('Write value') }\n { this.props.object.common?.write === false ? <span className={this.props.classes.readOnlyText}>({this.props.t('read only')})</span> : null }\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 || window.localStorage).setItem('App.chartSetValue', this.state.chartEnabled ? 'false' : 'true');\n this.setState({ chartEnabled: !this.state.chartEnabled });\n }}><ChartIcon /></Fab> : null }\n { this.state.type === 'json' ?\n <IconButton\n style={{ float: 'right' }}\n onClick={() => {\n (window._localStorage || window.localStorage).setItem('App.fullScreen', this.state.fullScreen ? 'false' : 'true');\n this.setState({ fullScreen: !this.state.fullScreen })\n }}\n >{\n this.state.fullScreen ? <FullscreenExitIcon/> : <FullscreenIcon/>\n }\n </IconButton> : null}\n </DialogTitle>\n <DialogContent>\n <form className={ this.props.classes.dialogForm } noValidate autoComplete=\"off\" onSubmit={() => false} style={{height: '100%'}}>\n <Grid container direction=\"row\" spacing={2} style={{ height: '100%' }}>\n <Grid item xs={this.state.chart && this.state.chartEnabled ? 6 : 12} style={{ height: '100%' }}>\n <Grid container direction=\"column\" spacing={2} style={{ marginTop: 0, height: '100%' }}>\n {this.props.expertMode ? <Grid item>\n <Grid container direction=\"row\" spacing={2} style={{ marginTop: 0 }}>\n { this.props.expertMode ? <Grid item><FormControl className={ this.props.classes.formControl }>\n <InputLabel>{ this.props.t('Value type') }</InputLabel>\n <Select\n variant=\"standard\"\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 { this.state.type === 'json' ? <Grid item flex={1}></Grid> : null}\n </Grid>\n </Grid> : null}\n <Grid item flex={this.state.type === 'json' && this.state.fullScreen ? 1 : undefined} style={{ paddingTop: 0 }}>\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(e) }\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 variant=\"standard\"\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 => {\n e.keyCode === 13 && this.onUpdate(e);\n } }\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 variant=\"standard\"\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 onKeyDown={e => e.ctrlKey && e.keyCode === 13 && this.onUpdate(e) }\n defaultValue={ this.propsValue.toString() }\n onChange={ e => this.value = e.target.value }/>\n )\n )\n )\n }\n </Grid >\n\n {this.props.expertMode ?\n <Grid item>{ackCheckbox}</Grid> : null}\n\n { this.props.expertMode ? <Grid item><FormControl variant=\"standard\" className={ this.props.classes.quality }>\n <InputLabel>{ this.props.t('Quality') }</InputLabel>\n <Select\n variant=\"standard\"\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 variant=\"standard\"\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 && this.state.type !== 'json' ? <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 {!this.props.expertMode ? ackCheckbox : null}\n {!this.props.expertMode ? <div style={{ flexGrow: 1 }} /> : null}\n <Button\n variant=\"contained\"\n onClick={ e => this.onUpdate(e) }\n color=\"primary\"\n startIcon={<IconCheck />}\n className={this.props.object.common?.write === false ? this.props.classes.readOnly : ''}\n >{ this.props.t('Set value') }</Button>\n <Button variant=\"contained\" onClick={ () => this.props.onClose() } color=\"grey\" 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 '@mui/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 '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogActions from '@mui/material/DialogActions';\nimport Button from '@mui/material/Button';\nimport Tabs from '@mui/material/Tabs';\nimport Tab from '@mui/material/Tab';\nimport TextField from '@mui/material/TextField';\nimport Grid from '@mui/material/Grid';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Checkbox from '@mui/material/Checkbox';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Fab from '@mui/material/Fab';\nimport IconButton from '@mui/material/IconButton';\n\nimport IconClose from '@mui/icons-material/Close';\nimport IconCheck from '@mui/icons-material/Check';\nimport AddIcon from '@mui/icons-material/Add';\nimport {FaClipboard as IconCopyClipboard} from 'react-icons/fa';\nimport IconCopy from '@mui/icons-material/FileCopy';\nimport IconFx from '@iobroker/adapter-react-v5/icons/IconFx';\n\nimport DialogSelectID from '@iobroker/adapter-react-v5/Dialogs/SelectID';\nimport Utils from '@iobroker/adapter-react-v5/Components/Utils';\nimport I18n from '@iobroker/adapter-react-v5/i18n';\nimport copy from '@iobroker/adapter-react-v5/Components/copy-to-clipboard';\nimport {FormControl, InputLabel, MenuItem, Select, Tooltip, Autocomplete} from '@mui/material';\nimport UploadImage from '../UploadImage';\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 '& > div': {\n marginRight: theme.spacing(1)\n },\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 const withAlias = this.props.obj._id.startsWith('alias.0') && this.props.obj.type === 'state';\n let tab = (window._localStorage || window.localStorage).getItem((this.props.dialogName || 'App') + '.editTab') || 'object';\n\n // select another tab if alias not present\n if (tab === 'alias' && !withAlias) {\n tab = 'common';\n }\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,\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 if (func.includes('JSON.parse(')) {\n // Unable to validate (result is unknown)\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\n if (obj.common?.min !== undefined && typeof obj.common.min !== 'number') {\n obj.common.min = parseFloat(obj.common.min);\n }\n if (obj.common?.max !== undefined && typeof obj.common.max !== 'number') {\n obj.common.max = parseFloat(obj.common.max);\n }\n if (obj.common?.step !== undefined && typeof obj.common.step !== 'number') {\n obj.common.step = parseFloat(obj.common.step);\n }\n\n return obj;\n } catch (e) {\n return null;\n }\n }\n\n onChange(value, cb) {\n const json = this.prepareObject(value);\n const newState = { text: 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 try {\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 if (obj.common?.min !== undefined && typeof obj.common.min !== 'number') {\n obj.common.min = parseFloat(obj.common.min);\n }\n if (obj.common?.max !== undefined && typeof obj.common.max !== 'number') {\n obj.common.max = parseFloat(obj.common.max);\n }\n if (obj.common?.step !== undefined && typeof obj.common.step !== 'number') {\n obj.common.step = parseFloat(obj.common.step);\n }\n\n this.props.onClose(obj);\n } catch (error) {\n console.log.error(`Cannot parse: ${this.state.text}`);\n }\n }\n\n renderTabs() {\n return <Tabs\n className={this.props.classes.tabsPadding}\n value={this.state.tab}\n onChange={(e, tab) => {\n (window._localStorage || window.localStorage).setItem((this.props.dialogName || 'App') + '.editTab', tab);\n\n if (tab === 'object') {\n try {\n const obj = JSON.parse(this.state.text);\n let changed = false;\n if (obj.common?.min !== undefined && typeof obj.common.min !== 'number') {\n obj.common.min = parseFloat(obj.common.min);\n changed = true;\n }\n if (obj.common?.max !== undefined && typeof obj.common.max !== 'number') {\n obj.common.max = parseFloat(obj.common.max);\n changed = true;\n }\n if (obj.common?.step !== undefined && typeof obj.common.step !== 'number') {\n obj.common.step = parseFloat(obj.common.step);\n changed = true;\n }\n changed && this.setState({text: JSON.stringify(obj, null, 2)});\n } catch (e) {\n // ignore\n }\n }\n\n this.setState({ tab });\n }}\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' &&\n <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 let id = '';\n let json;\n try {\n json = JSON.parse(this.state.text);\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 } catch (error) {\n console.error('Cannot parse ' + this.state.text);\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 { classes } = this.props;\n return <div className={classes.marginBlock}>\n <Button\n className={classes.buttonAdd}\n variant=\"contained\"\n color=\"secondary\"\n startIcon={<AddIcon/>}\n onClick={cb}\n >\n {nameKey}\n </Button>\n </div>;\n }\n\n buttonRemoveKey(nameKey, cb) {\n const { t, classes } = this.props;\n return <Tooltip title={t('Remove attribute %s', nameKey)}>\n <div className={classes.close} onClick={cb}/>\n </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\n let iconPath;\n if (typeof json.common.icon !== 'undefined') {\n iconPath = json.type === 'instance' || json.type === 'adapter' ? `./adapter/${json.common.name}/${json.common.icon}` : json.common.icon;\n if (!iconPath.startsWith('.') && !iconPath.startsWith('/') && !iconPath.startsWith('data:')) {\n const parts = obj._id.split('.');\n if (parts[0] === 'system') {\n iconPath = `adapter/${parts[2]}${iconPath.startsWith('/') ? '' : '/'}${iconPath}`;\n } else {\n iconPath = `adapter/${parts[0]}${iconPath.startsWith('/') ? '' : '/'}${iconPath}`;\n }\n }\n }\n return <div className={classes.commonTabWrapper}>\n <div className={classes.commonWrapper}>\n {typeof json.common.name !== 'undefined' ?\n <TextField\n variant=\"standard\"\n disabled={disabled}\n label={t('Name')}\n className={clsx(classes.marginBlock, classes.textField)}\n fullWidth\n value={Utils.getObjectNameFromObj(json, I18n.getLanguage(), null, false, true)}\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 >\n <InputLabel>{t('State type')}</InputLabel>\n <Select\n variant=\"standard\"\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 }\n <div className={classes.flex}>\n {checkState ? (typeof json.common.read !== 'undefined' ?\n <div className={classes.flex}>\n <FormControlLabel\n className={classes.marginBlock}\n control={<Checkbox\n disabled={disabled}\n checked={json.common.read}\n onClick={el => this.setCommonItem(json, 'read', el.target.checked)}\n />}\n label={t('Readable')}\n />\n {this.buttonRemoveKey('read', () => this.removeCommonItem(json, 'read'))}\n </div>\n :\n this.buttonAddKey('read', () => this.setCommonItem(json, 'read', true)))\n :\n null\n }\n {checkState ? (typeof json.common.write !== 'undefined' ?\n <div className={classes.flex}>\n <FormControlLabel\n className={classes.marginBlock}\n control={<Checkbox\n disabled={disabled}\n checked={json.common.write}\n onClick={el => this.setCommonItem(json, 'write', el.target.checked)}\n />}\n label={t('Writeable')}\n />\n {this.buttonRemoveKey('write', () => this.removeCommonItem(json, 'write'))}\n </div>\n :\n this.buttonAddKey('write', () => this.setCommonItem(json, 'write', true)))\n :\n null\n }\n </div>\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 onChange={(_, e) => this.setCommonItem(json, 'role', e)}\n options={roleArray}\n renderInput={params => <TextField variant=\"standard\" {...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 }\n {typeof json.common.color !== 'undefined' ?\n <div className={classes.flex}>\n <TextField\n variant=\"standard\"\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 className={classes.flex}>\n {json.common.type === 'number' ? (typeof json.common.min !== 'undefined' ?\n <div className={classes.flex}>\n <TextField\n variant=\"standard\"\n disabled={disabled}\n className={clsx(classes.marginBlock, classes.color)}\n label={t('Min')}\n value={json.common.min}\n onChange={el => this.setCommonItem(json, 'min', el.target.value)}/>\n {this.buttonRemoveKey('min', () => this.removeCommonItem(json, 'min'))}\n </div> :\n <div className={classes.flex}>\n {this.buttonAddKey('min', () => this.setCommonItem(json, 'min', 0))}\n </div>) : null\n }\n {json.common.type === 'number' ? (typeof json.common.max !== 'undefined' ?\n <div className={classes.flex}>\n <TextField\n variant=\"standard\"\n disabled={disabled}\n className={clsx(classes.marginBlock, classes.color)}\n label={t('Max')}\n value={json.common.max}\n onChange={el => this.setCommonItem(json, 'max', el.target.value)}/>\n {this.buttonRemoveKey('max', () => this.removeCommonItem(json, 'max'))}\n </div> :\n <div className={classes.flex}>\n {this.buttonAddKey('max', () => this.setCommonItem(json, 'max', 100))}\n </div>) : null\n }\n {json.common.type === 'number' ? (typeof json.common.step !== 'undefined' ?\n <div className={classes.flex}>\n <TextField\n variant=\"standard\"\n disabled={disabled}\n className={clsx(classes.marginBlock, classes.color)}\n label={t('Step')}\n value={json.common.step}\n onChange={el => this.setCommonItem(json, 'step', el.target.value)}/>\n {this.buttonRemoveKey('step', () => this.removeCommonItem(json, 'step'))}\n </div> :\n <div className={classes.flex}>\n {this.buttonAddKey('step', () => this.setCommonItem(json, 'step', 1))}\n </div>) : null\n }\n </div>\n {json.common.type === 'number' ? (typeof json.common.unit !== 'undefined' ?\n <div className={classes.flex}>\n <TextField\n variant=\"standard\"\n disabled={disabled}\n className={clsx(classes.marginBlock, classes.color)}\n label={t('Unit')}\n value={json.common.unit}\n onChange={el => this.setCommonItem(json, 'unit', el.target.value)}/>\n {this.buttonRemoveKey('unit', () => this.removeCommonItem(json, 'unit'))}\n </div> :\n <div className={classes.flexDrop}>\n {this.buttonAddKey('unit', () => this.setCommonItem(json, 'unit', ''))}\n </div>) : null\n }\n </div>\n {typeof json.common.icon !== 'undefined' ?\n <div className={classes.flex} style={{ flexGrow: 1 }}>\n <UploadImage\n disabled={disabled}\n maxSize={10 * 1024}\n icon={iconPath}\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.flex}>\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\n renderAliasEdit() {\n try {\n const json = JSON.parse(this.state.text);\n const funcVisible = json.common?.alias?.read !== undefined || json.common?.alias?.write !== undefined;\n\n return <Grid container direction=\"column\" className={this.props.classes.marginTop}>\n <Grid item>\n <FormControlLabel\n control={<Checkbox\n checked={typeof json.common?.alias?.id === 'object'}\n 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 }\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 variant=\"standard\"\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 ?\n <InputAdornment position=\"end\"><IconButton size=\"large\"\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 variant=\"standard\"\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 ?\n <InputAdornment position=\"end\"><IconButton size=\"large\"\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 variant=\"standard\"\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 ?\n <InputAdornment position=\"end\"><IconButton size=\"large\"\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 || json.common?.alias?.write !== 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 variant=\"standard\"\n label={this.props.t('Read converter')}\n value={json.common?.alias?.read || 'val'}\n className={this.props.classes.funcEdit}\n error={!!this.state.readError}\n InputProps={{\n endAdornment: json.common?.alias?.read ?\n <InputAdornment position=\"end\"><IconButton size=\"large\"\n onClick={() => this.setAliasItem(json, 'read', '')}><IconClose/></IconButton></InputAdornment> : null,\n startAdornment: <InputAdornment position=\"start\"><IconFx\n 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 variant=\"standard\"\n label={this.props.t('Write converter')}\n error={!!this.state.writeError}\n value={json.common?.alias?.write || 'val'}\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 ?\n <InputAdornment position=\"end\"><IconButton size=\"large\"\n onClick={() => this.setAliasItem(json, 'write', '')}><IconClose/></IconButton></InputAdornment> : null,\n startAdornment: <InputAdornment position=\"start\"><IconFx\n 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 variant=\"standard\"\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 color=\"grey\"\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\">\n {this.props.t('Edit object:')} <span className={this.props.classes.id}>{this.props.obj._id}</span>\n </DialogTitle>\n\n {this.renderTabs()}\n {this.renderCopyDialog()}\n\n <DialogContent>\n {this.state.tab === 'object' ?\n <div\n 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 color=\"grey\"\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 color=\"grey\"\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 color=\"grey\"\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 '@mui/styles';\nimport PropTypes from 'prop-types';\n\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport TextField from '@mui/material/TextField';\nimport DialogActions from '@mui/material/DialogActions';\nimport Button from '@mui/material/Button';\nimport Autocomplete from '@mui/material/Autocomplete';\n\nimport IconCancel from '@mui/icons-material/Close';\nimport IconCheck from '@mui/icons-material/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=\"grey\" 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 '@mui/material';\n\nimport AddIcon from '@mui/icons-material/AddBox';\n\nimport I18n from '@iobroker/adapter-react-v5/i18n';\nimport Utils from '../components/Utils'; // @iobroker/adapter-react-v5/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\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 storedType = (window._localStorage || window.localStorage).getItem('App.lastObjectType');\n if (storedType && types.find(item => item.value === storedType)) {\n initialType = storedType;\n }\n\n const [type, setType] = useState(initialType);\n const [name, setName] = useState(names[initialType]);\n const [stateType, setStateType] = useState((window._localStorage || window.localStorage).getItem('App.lastStateType') || 'string');\n const [unique, setUnique] = useState(!objects[buildId(names.state)]);\n\n function buildId(name) {\n return selected + '.' + 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 newObj.native = {};\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 open ? <CustomModal\n 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={{ margin: 10, fontSize: 20 }}><AddIcon/>\n {I18n.t('Add new object:')}\n <span style={{ fontStyle: 'italic' }}>{selected}.{name}</span>\n </div>\n <TextField\n variant=\"standard\"\n label={I18n.t('Parent')}\n style={{ margin: '5px 0' }}\n disabled\n value={selected}\n />\n <FormControl variant=\"standard\" style={{ marginTop: 10, marginBottom: 16 }}>\n <InputLabel>{I18n.t('Type')}</InputLabel>\n <Select\n variant=\"standard\"\n value={type}\n onChange={(el) => {\n (window._localStorage || window.localStorage).setItem('App.lastObjectType', el.target.value);\n\n if (name === names[type]) {\n setName(names[el.target.value]);\n setUnique(objects[buildId(names[el.target.value])]);\n }\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>\n {type === 'state' && <FormControl style={{ marginTop: 10, marginBottom: 16 }}>\n <InputLabel style={{ left: -14 }}>{I18n.t('State type')}</InputLabel>\n <Select\n style={{ marginTop: 6 }}\n variant=\"standard\"\n value={stateType}\n onChange={el => {\n (window._localStorage || window.localStorage).setItem('App.lastStateType', el.target.value);\n setStateType(el.target.value);\n }}\n >\n {stateTypeArray.map(el => <MenuItem key={el} value={el}>{el}</MenuItem>)}\n </Select>\n </FormControl>}\n <TextField\n variant=\"standard\"\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> : null;\n}\n\nexport default ObjectAddNewObject;\n","import React, { useEffect, useState } from 'react';\nimport { Checkbox, FormControl, InputLabel, LinearProgress, MenuItem, Select, Switch } from '@mui/material';\n\nimport Icon from '@iobroker/adapter-react-v5/Components/Icon';\nimport I18n from '@iobroker/adapter-react-v5/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 || 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, 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 ? stateOwnerUser.value : 'system.user.admin';\n newAcl.ownerGroup = stateOwnerGroup ? stateOwnerGroup.value : 'system.group.administrator';\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 && stateOwnerUser.value !== 'different') {\n newAcl.owner = stateOwnerUser.value;\n }\n if (stateOwnerGroup && 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 variant=\"standard\" fullWidth style={{ marginRight: 10 }}>\n <InputLabel>{t('Owner user')}</InputLabel>\n <Select\n variant=\"standard\"\n disabled={progress}\n value={stateOwnerUser ? stateOwnerUser.value : ''}\n renderValue={value => <span>{stateOwnerUser?.icon ? <Icon src={stateOwnerUser.icon} style={{ width: 16, height: 16, marginRight: 8 }} /> : null}{stateOwnerUser ? 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 variant=\"standard\" fullWidth>\n <InputLabel>{t('Owner group')}</InputLabel>\n <Select\n variant=\"standard\"\n disabled={progress}\n value={stateOwnerGroup ? stateOwnerGroup.value : ''}\n renderValue={value => <span>{stateOwnerGroup?.icon ? <Icon src={stateOwnerGroup.icon} style={{ width: 16, height: 16, marginRight: 8 }} /> : null}{stateOwnerGroup ? 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 React, { Component } from 'react';\nimport { withStyles } from '@mui/styles';\nimport PropTypes from 'prop-types';\n\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport Fab from '@mui/material/Fab';\n\n// Icons\nimport CloseIcon from '@mui/icons-material/Close';\nimport PlayIcon from '@mui/icons-material/PlayArrow';\nimport DownloadIcon from '@mui/icons-material/GetApp';\n\nimport withWidth from '@iobroker/adapter-react-v5/Components/withWidth';\n\nimport Utils from '../components/Utils';\n\nconst styles = theme => ({\n dialog: {\n height: '100%',\n maxHeight: '100%',\n maxWidth: '100%',\n },\n content: {\n textAlign: 'center',\n },\n tabPanel: {\n width: '100%',\n overflow: 'hidden',\n height: 'calc(100% - ' + theme.mixins.toolbar.minHeight + 'px)',\n },\n error: {\n color: theme.palette.mode === 'dark' ? '#ff7777' : '#c20000'\n },\n image: {\n height: '100%',\n width: 'auto'\n },\n text: {\n fontFamily: 'Lucida Console, Courier, monospace',\n width: '100%'\n },\n download: {\n textDecoration: 'none',\n textTransform: 'uppercase',\n fontSize: 14,\n color: 'white',\n border: '1px solid white',\n borderRadius: 5,\n padding: '8px 16px',\n marginRight: theme.spacing(1),\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 ObjectViewFileDialog extends Component {\n constructor(props) {\n super(props);\n\n const parts = this.props.obj._id.split('.');\n\n this.state = {\n error: '',\n sound: null,\n image: null,\n text: null,\n binary: null,\n fileName: parts[parts.length - 2] + '.' + parts[parts.length - 1]\n };\n\n this.audioRef = React.createRef();\n }\n\n componentDidMount() {\n this.props.socket.getBinaryState(this.props.obj._id)\n .then(data => {\n let ext = this.props.obj._id.toLowerCase().split('.').pop();\n\n const detectedMimeType = Utils.detectMimeType(data);\n if (detectedMimeType) {\n ext = detectedMimeType;\n }\n\n if (ext === 'jpg') {\n this.setState({image: true, binary: data, mime: 'image/jpeg'});\n } else if (ext === 'svg') {\n this.setState({image: true, binary: data, mime: 'image/svg+xml'});\n } else if (ext === 'png' || ext === 'bmp') {\n this.setState({image: true, binary: data, mime: 'image/' + ext});\n } else if (ext === 'mp3') {\n this.setState({audio: true, binary: data, mime: 'audio/mpeg'});\n } else if (ext === 'ogg') {\n this.setState({audio: true, binary: data, mime: 'audio/ogg'});\n } else if (ext === 'txt' || ext === 'log') {\n try {\n const text = btoa(data);\n this.setState({text, binary: data, mime: 'text/plain'});\n } catch (error) {\n }\n }\n })\n .catch(error => this.setState({error}));\n }\n\n render() {\n return <Dialog\n className={this.props.classes.dialog}\n open={true}\n maxWidth={ this.state.audio ? 'sm' : 'md'}\n onClose={() => this.props.onClose()}\n fullWidth={true}\n aria-labelledby=\"object-view-dialog-title\"\n >\n <DialogTitle id=\"object-view-dialog-title\">{\n this.props.t('View file in state: %s', this.props.obj._id)\n }</DialogTitle>\n <DialogContent className={this.props.classes.content}>\n { this.state.error ? <div className={this.props.classes.error}>{this.state.error === 'State is not binary' ? this.props.t('No file stored yet') : this.props.t(this.state.error)}</div> : null}\n { this.state.audio ? <audio ref={this.audioRef} src={ `data:${this.state.mime};base64,${this.state.binary}` }/> : null }\n { this.state.audio ? <Fab color=\"primary\" onClick={() => this.audioRef.current && this.audioRef.current.play()}>\n <PlayIcon />\n </Fab> : null }\n { this.state.image ? <img src={`data:${this.state.mime};base64,${this.state.binary}`} alt={this.props.obj._id} className={this.props.classes.image}/> : null}\n { this.state.text !== null ? <pre className={this.props.classes.text}>{this.state.text}</pre> : null}\n </DialogContent>\n <DialogActions>\n <a className={this.props.classes.download} download={this.state.fileName} href={ `data:${this.state.mime};base64,${this.state.binary}` }>\n <DownloadIcon style={{paddingRight: 8, height: 12}}/>\n <span >{this.props.t('Download')}</span>\n </a>\n <Button\n variant=\"contained\"\n onClick={() => this.props.onClose()}\n startIcon={<CloseIcon />}\n color=\"grey\"\n >\n {this.props.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>;\n }\n}\n\nObjectViewFileDialog.propTypes = {\n t: PropTypes.func,\n lang: PropTypes.string,\n expertMode: PropTypes.bool,\n socket: PropTypes.object,\n themeType: PropTypes.string,\n obj: PropTypes.object,\n onClose: PropTypes.func.isRequired,\n};\n\nexport default withWidth()(withStyles(styles)(ObjectViewFileDialog));\n","\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@mui/styles';\n\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContentText from '@mui/material/DialogContentText';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport Snackbar from '@mui/material/Snackbar';\n\n// icons\nimport IconCancel from '@mui/icons-material/Close';\nimport IconDeleteOne from '@mui/icons-material/Delete';\nimport IconDeleteAll from '@mui/icons-material/Delete';\n\nimport withWidth from '@iobroker/adapter-react-v5/Components/withWidth';\n\nimport ObjectBrowser from '../components/ObjectBrowser';\nimport ObjectCustomDialog from '../dialogs/ObjectCustomDialog';\nimport Router from '@iobroker/adapter-react-v5/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';\nimport ObjectViewFileDialog from '../dialogs/ObjectViewFileDialog';\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 || 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 || 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\" color=\"grey\" 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\" color=\"grey\" 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 objectBrowserViewFile={ObjectViewFileDialog}\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 || window.localStorage).setItem(`${this.dialogName || 'App'}.filters`, JSON.stringify(filterConfig));\n }}\n onSelect={selected =>\n (window._localStorage || 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":""}
|