iobroker.iot 1.8.21 → 1.8.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["Tabs/Options.js","Tabs/Extended.js","Tabs/Services.js","Tabs/Enums.js","Tabs/AlexaSmartNames.js","Tabs/AlisaSmartNames.js","Components/TreeTable.js","Tabs/GoogleSmartNames.js","App.js","serviceWorker.js","index.js"],"names":["Options","props","onAliveChanged","id","state","adapterName","instance","setState","isInstanceAlive","val","inAction","toast","errorWithPercent","socket","getState","then","this","subscribeState","unsubscribeState","pass","length","match","I18n","t","title","attr","type","error","checkPassword","native","TextField","label","className","classes","input","value","helperText","onChange","e","target","margin","Card","card","CardActionArea","CardMedia","media","image","CardContent","Utils","renderTextWithA","CardActions","style","textAlign","Button","variant","size","color","onClick","window","open","focus","amazonAlexa","onDebug","opacity","debugVisible","onMouseEnter","onMouseLeave","sendTo","data","file","Blob","JSON","stringify","navigator","msSaveOrOpenBlob","a","document","createElement","url","URL","createObjectURL","href","download","body","appendChild","click","setTimeout","removeChild","revokeObjectURL","forceUserCreate","ack","Promise","resolve","getObject","obj","common","enabled","setObject","catch","err","onError","Snackbar","anchorOrigin","vertical","horizontal","autoHideDuration","onClose","ContentProps","message","action","IconButton","aria-label","close","FormControlLabel","Object","assign","paddingTop","controlElement","control","Checkbox","checked","tab","text","errorText","onLoad","clsx","column","columnSettings","renderInput","renderCheckbox","marginTop","googleHome","newVal","changed","hintUnsaved","button","disabled","resetCerts","startIcon","fontWeight","columnLogo","renderCard","renderToast","Component","withStyles","theme","width","minHeight","minWidth","marginRight","marginBottom","maxWidth","height","display","verticalAlign","cannotUse","fontSize","fontStyle","ExtendedOptions","showSelectId","options","FormControl","Select","Input","name","map","item","MenuItem","noTranslation","FormHelperText","imagePrefix","selected","types","onOk","renderSelect","Fab","marginLeft","getSelectIdDialog","Services","running","text2commandList","nightscoutList","addValue","onKeyChangedBound","onKeyChanged","bind","getAdapterInstances","list","nsList","_id","replace","key","showError","chips","split","filter","pos","indexOf","splice","join","push","email","login","secret","nightscoutPass","chipsDiv","onKeyUp","keyCode","onChipsAdd","trim","word","Chip","onDelete","onChipsDelete","chip","reissueUrlKey","fullSize","encodeURIComponent","readOnly","copyToClipboard","renderChips","text2command","nightscout","normalSize","calcNightscoutSecret","amazonAlexaBlood","paddingLeft","amazonAlexaBloodShortAnswer","border","borderRadius","padding","Enums","editId","editedSmartName","funcs","rooms","loading","onEnumUpdateBound","onEnumUpdate","getEnums","res","keys","forEach","subscribeObject","unsubscribeObject","removeChanged","updateObjInState","parse","i","find","smartName","getSmartNameFromObj","noCommon","disableSmartName","removeSmartName","addChanged","informInstance","getLanguage","en","getObjectNameFromObj","language","enumLine","background","enumLineName","enumLineSubName","enumLineId","Switch","enumLineEnabled","onToggleEnum","enumLineEdit","onEdit","renderEnum","startsWith","newObj","updateSmartName","undefined","Dialog","fullWidth","aria-labelledby","aria-describedby","DialogTitle","DialogContent","autoFocus","DialogActions","changeSmartName","CircularProgress","columnHeader","columnDiv","renderEnums","renderMessage","renderEditDialog","overflow","position","right","top","palette","primary","light","contrastText","colorOn","colorOff","colorSet","colorRead","CHANGED_COLOR","DEFAULT_CHANNEL_COLOR_DARK","DEFAULT_CHANNEL_COLOR_LIGHT","LAST_CHANGED_COLOR_DARK","LAST_CHANGED_COLOR_LIGHT","actionsMapping","turnOn","icon","IconOn","desc","turnOff","setTargetTemperature","IconTemperature","incrementTargetTemperature","IconUp","decrementTargetTemperature","IconDown","setPercentage","IconPercentage","incrementPercentage","decrementPercentage","setColor","IconColor","setColorTemperature","IconBulb","incrementColorTemperature","decrementColorTemperature","getTargetTemperature","IconThermometer","getTemperatureReading","setLockState","IconLock","getLockState","SMARTTYPES","AlexaSmartNames","translated","editedSmartType","editObjectName","deleteId","showListOfDevices","showConfirmation","devices","browse","expanded","lastChanged","timerChanged","browseTimer","browseTimerCount","waitForUpdateID","onReadyUpdateBound","onReadyUpdate","onResultUpdateBound","onResultUpdate","isIndicate","Date","now","lastBrowse","console","log","clearTimeout","devTimer","cb","device","dev","additionalApplianceDetails","friendlyNames","friendlyName","group","smartType","actions","sort","b","Icon","actionIcon","lineNum","items","toString","devSubLineByOn","devSubLineByOnSelect","onParamsChange","devSubLineTypeTitle","byON","renderSelectTypeSelector","result","channels","names","byONs","smarttypes","smartTypes","c","chan","hasOwnProperty","themeType","devSubLine","devLineActions","channelLineActions","renderActions","devSubLineName","devSubSubLineName","renderSelectType","renderSelectByOn","devSubLineDelete","onAskDelete","nameModified","devModified","devCount","ch","el","devLine","devLineNumber","devLineExpand","onExpand","Badge","badgeContent","devLineNameBlock","devLineName","devLineDescription","friendlyDescription","devLineProgress","devLineEdit","devLineDelete","renderChannels","preventDefault","editedId","onKeyDown","defaultValue","toLowerCase","renderDevice","role","headerRow","headerCell","tableDiv","tableCell","lines","copy","placeholder","InputProps","endAdornment","renderDevices","renderConfirmDialog","renderListOfDevices","devLineEnabled","left","devSubLineEdit","spacing","main","OnOff","Brightness","RGB","getActualTemperature","getActualHumidity","IconHumidity","getMotion","IconMotion","getContact","IconContact","AlisaDevices","includes","iobID","getId","func","toUpperCase","devSubSubLine","setId","devSubLineSetId","attributes","description","getAttr","lookup","shift","setAttr","descendingComparator","orderBy","_a","_b","TreeTable","opened","localStorage","getItem","Array","isArray","editMode","deleteMode","editData","order","columns","field","col","level","editable","TableCell","cell","cellSecondary","cellStyle","component","v","parentId","children","it","TableRow","row","rowSecondary","rowMainWithChildren","rowMainWithoutChildren","rowNoEdit","cellExpand","scope","ii","renderCell","cellButton","newData","onUpdate","renderLine","property","isAsc","TableHead","cellHeader","sortDirection","TableSortLabel","active","direction","handleRequestSort","visuallyHidden","table","array","comparator","stabilizedThis","index","stableSort","getComparator","tableContainer","Table","stickyHeader","renderHead","TableBody","React","paddingBottom","paddingRight","wordBreak","whiteSpace","width_name_nicknames","width_ioType","width_type","width_displayTraits","width_roomHint","clip","GoogleSmartNames","myTableRef","createRef","expertMode","helpHidden","searchText","helpHeight","editComponent","rows","resize","helpRef","oldData","displayTraits","ghTraits","ghType","displayAttributes","ghAttributes","conv2GH","ghConv2GH","displayConv2GH","conv2iob","ghConv2iob","displayConv2iob","nicknames","n","roomHint","desktop","innerHeight","innerWidth","smallDisplay","manualModeHint","ref","flex","Toolbar","hideHelp","setItem","prevProps","prevState","snapshot","current","h","clientHeight","defaultNames","renderToolbar","renderInstructions","onGHParamsChange","smartEnum","useMediaQuery","App","extendedProps","encryptedFields","translations","require","sentryDSN","showAckTempPasswordDialog","selectedTab","yandexAlisa","DialogContentText","loaded","default","AppBar","Tabs","getSelectedTab","selectTab","parentNode","dataset","scrollButtons","Tab","data-name","isIFrame","tabContentIFrame","tabContent","onLoadConfig","updateNativeValue","onShowError","renderError","renderSaveCloseButtons","renderAckTempPasswordDialog","GenericApp","root","Boolean","location","hostname","themeName","getThemeName","version","build","ReactDOM","render","onThemeChange","_theme","getElementById","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.3c6ad20e.chunk.js","sourcesContent":["import React, {Component} from 'react';\nimport {withStyles} from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\n\nimport TextField from '@material-ui/core/TextField';\nimport Button from '@material-ui/core/Button';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport Card from '@material-ui/core/Card';\nimport CardActionArea from '@material-ui/core/CardActionArea';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardMedia from '@material-ui/core/CardMedia';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport IconButton from '@material-ui/core/IconButton';\nimport Utils from '@iobroker/adapter-react/Components/Utils'\n\nimport {MdRefresh as IconReload} from 'react-icons/md';\nimport {MdClose as IconClose} from 'react-icons/md';\n\nimport I18n from '@iobroker/adapter-react/i18n';\nimport Logo from '@iobroker/adapter-react/Components/Logo';\n\nconst styles = theme => ({\n tab: {\n width: '100%',\n minHeight: '100%'\n },\n input: {\n minWidth: 300\n },\n button: {\n marginRight: 20,\n marginBottom: 40,\n },\n card: {\n maxWidth: 345,\n textAlign: 'center'\n },\n media: {\n height: 180,\n },\n column: {\n display: 'inline-block',\n verticalAlign: 'top',\n marginRight: 20\n },\n columnLogo: {\n width: 350,\n marginRight: 0\n },\n columnSettings: {\n width: 'calc(100% - 370px)',\n },\n cannotUse: {\n color: 'red',\n fontWeight: 'bold',\n },\n hintUnsaved: {\n fontSize: 12,\n color: 'red',\n fontStyle: 'italic',\n }\n});\n\nclass Options extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n inAction: false,\n toast: '',\n isInstanceAlive: false,\n errorWithPercent: false,\n };\n\n this.props.socket.getState(`system.adapter.${this.props.adapterName}.${this.props.instance}.alive`).then(state =>\n this.setState({isInstanceAlive: state && state.val}));\n }\n\n componentDidMount() {\n this.props.socket.subscribeState(`system.adapter.${this.props.adapterName}.${this.props.instance}.alive`, this.onAliveChanged);\n }\n\n componentWillUnmount() {\n this.props.socket.unsubscribeState(`system.adapter.${this.props.adapterName}.${this.props.instance}.alive`, this.onAliveChanged);\n }\n\n onAliveChanged = (id, state) => {\n if (id === `system.adapter.${this.props.adapterName}.${this.props.instance}.alive`) {\n this.setState({isInstanceAlive: state && state.val});\n }\n };\n\n checkPassword(pass) {\n if (pass.length < 8 || !pass.match(/[a-z]/) || !pass.match(/[A-Z]/) || !pass.match(/\\d/)) {\n return I18n.t('invalid_password_warning');\n } else {\n return false;\n }\n }\n\n renderInput(title, attr, type) {\n const error = attr === 'pass' && this.checkPassword(this.props.native[attr]);\n return <TextField\n label={ I18n.t(title) }\n error={ !!error }\n className={ this.props.classes.input }\n value={ this.props.native[attr] }\n type={ type || 'text' }\n helperText={ error || '' }\n onChange={ e => this.props.onChange(attr, e.target.value) }\n margin=\"normal\"\n />;\n }\n\n renderCard() {\n return <Card className={this.props.classes.card}>\n <CardActionArea>\n <CardMedia\n className={this.props.classes.media}\n image=\"alexalogo.png\"\n title=\"Alexa logo\"\n />\n <CardContent>{Utils.renderTextWithA(I18n.t('amazon link'))}</CardContent>\n </CardActionArea>\n <CardActions style={{textAlign: 'center'}} >\n <Button variant=\"outlined\" size=\"small\" color=\"primary\" style={{textAlign: 'center'}} onClick={() => {\n const win = window.open('https://alexa.amazon.de/spa/index.html#skills/dp/B07L66BFF9/reviews', '_blank');\n win.focus();\n }}>{I18n.t('Review')}</Button>\n {this.props.native.amazonAlexa ?\n <Button\n title=\"Debug\"\n onClick={() => this.onDebug()}\n style={{opacity: this.state.debugVisible ? 1 : 0}}\n onMouseEnter={() => this.setState({debugVisible: true})}\n onMouseLeave={() => this.setState({debugVisible: false})}\n >Debug</Button> : null}\n </CardActions>\n </Card>;\n }\n\n onDebug() {\n this.props.socket.sendTo(this.props.adapterName + '.' + this.props.instance, 'debug', null)\n .then(data => {\n const file = new Blob([JSON.stringify(data, null, 2)], {type: 'application/json'});\n if (window.navigator.msSaveOrOpenBlob) // IE10+\n window.navigator.msSaveOrOpenBlob(file, 'debug.json');\n else { // Others\n const a = document.createElement('a');\n const url = URL.createObjectURL(file);\n a.href = url;\n a.download = 'debug.json';\n document.body.appendChild(a);\n a.click();\n\n setTimeout(() => {\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n }, 0);\n }\n });\n }\n\n resetCerts(forceUserCreate) {\n this.setState({ inAction: true });\n\n this.props.socket.setState('iot.' + this.props.instance + '.certs.private', {val: '', ack: true})\n .then(() => this.props.socket.setState('iot.' + this.props.instance + '.certs.id', {val: '', ack: true}))\n .then(() => this.props.socket.setState('iot.' + this.props.instance + '.certs.public', {val: '', ack: true}))\n .then(() => this.props.socket.setState('iot.' + this.props.instance + '.certs.certificate', {val: '', ack: true}))\n .then(() => {\n if (forceUserCreate) {\n return this.props.socket.setState('iot.' + this.props.instance + '.certs.forceUserCreate', {val: true, ack: true});\n } else {\n return Promise.resolve();\n }\n })\n // read actual instance object\n .then(() => this.props.socket.getObject('system.adapter.iot.' + this.props.instance))\n .then(obj => {\n if (!obj || !obj.common || !obj.common.enabled) {\n // adapter is disabled, do not restart it\n return Promise.resolve();\n } else {\n // restart adapter\n return this.props.socket.setObject('system.adapter.iot.' + this.props.instance, obj);\n }\n })\n .then(() => this.setState({toast: I18n.t('Certificates will be updated after start')}))\n .catch(err => this.props.onError(err))\n .then(() => this.setState({inAction: false}));\n }\n\n renderToast() {\n if (!this.state.toast) {\n return null;\n }\n return <Snackbar\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n open={true}\n autoHideDuration={6000}\n onClose={() => this.setState({toast: ''})}\n ContentProps={{\n 'aria-describedby': 'message-id',\n }}\n message={<span id=\"message-id\">{this.state.toast}</span>}\n action={[\n <IconButton\n key=\"close\"\n aria-label=\"Close\"\n color=\"inherit\"\n className={this.props.classes.close}\n onClick={() => this.setState({toast: ''})}\n >\n <IconClose />\n </IconButton>,\n ]}\n />;\n }\n\n renderCheckbox(title, attr, style) {\n return <FormControlLabel key={attr} style={Object.assign({paddingTop: 5}, style)} className={this.props.classes.controlElement}\n control={\n <Checkbox\n checked={this.props.native[attr]}\n onChange={() => this.props.onChange(attr, !this.props.native[attr])}\n color=\"primary\"\n />\n }\n label={I18n.t(title)}\n />;\n }\n\n render() {\n return <form className={ this.props.classes.tab }>\n <Logo\n classes={{}}\n instance={ this.props.instance }\n common={ this.props.common }\n native={ this.props.native }\n onError={ text => this.setState({errorText: text}) }\n onLoad={ this.props.onLoad }\n />\n <div className={clsx(this.props.classes.column, this.props.classes.columnSettings) }>\n { this.renderInput('ioBroker.pro Login', 'login') }<br/>\n { this.renderInput('ioBroker.pro Password', 'pass', 'password') }<br/>\n { this.renderCheckbox('Amazon Alexa', 'amazonAlexa') }\n <FormControlLabel key=\"googleHome\" className={ this.props.classes.controlElement }\n style={{ marginTop: 5 }}\n control={\n <Checkbox\n checked={this.props.native.googleHome}\n onChange={() => {\n // activate alexa if google home is on (temporary)\n const newVal = !this.props.native.googleHome;\n this.props.onChange('googleHome', newVal, () =>\n newVal && this.props.onChange('amazonAlexa', true));\n }}\n color=\"primary\"\n />\n }\n label={I18n.t('Google Home')}\n />\n {this.renderCheckbox('Yandex Алиса', 'yandexAlisa')}\n <br/>\n\n <p>{I18n.t('new_certs_tip')}</p>\n {this.props.changed ? <div className={this.props.classes.hintUnsaved}>{I18n.t('Save settings before pressing this button')}</div> : null}\n <Button variant=\"outlined\"\n className={ this.props.classes.button }\n disabled={ this.props.changed || this.state.inAction || !this.state.isInstanceAlive }\n title={ !this.state.isInstanceAlive ? I18n.t('Instance must be enabled') : '' }\n onClick={ () => this.resetCerts() }\n startIcon={<IconReload />}\n >\n { I18n.t('Get new connection certificates') }\n </Button>\n\n <p>{I18n.t('new_credentials_tip')}</p>\n {this.props.changed ?\n <div className={this.props.classes.hintUnsaved}>{I18n.t('Save settings before pressing this button')}</div> : null}\n <Button variant=\"outlined\"\n className={ this.props.classes.button }\n disabled={ this.props.changed || this.state.inAction || !this.state.isInstanceAlive }\n title={ !this.state.isInstanceAlive ? I18n.t('Instance must be enabled') : '' }\n onClick={ () => this.resetCerts(true) }\n startIcon={<IconReload />}\n >\n { I18n.t('Create IoT credentials anew') }\n </Button>\n <p>{ Utils.renderTextWithA(I18n.t('forum_tip')) }</p>\n <p style={{ fontWeight: 'bold' }}>{ Utils.renderTextWithA(I18n.t('help_tip')) }</p>\n <p style={{ fontWeight: 'bold', paddingTop: 20}}>{ Utils.renderTextWithA(I18n.t('help_link_tip1')) }</p>\n <p style={{ fontWeight: 'bold' }}>{ Utils.renderTextWithA(I18n.t('help_link_tip2')) }</p>\n <p style={{ fontWeight: 'bold', color: 'red'}}>{ Utils.renderTextWithA(I18n.t('help_link_tip3')) }</p>\n </div>\n <div className={clsx(this.props.classes.column, this.props.classes.columnLogo)}>{this.renderCard() }</div>\n { this.renderToast() }\n </form>;\n }\n}\n\nOptions.propTypes = {\n common: PropTypes.object.isRequired,\n native: PropTypes.object.isRequired,\n instance: PropTypes.number.isRequired,\n adapterName: PropTypes.string.isRequired,\n onError: PropTypes.func,\n onLoad: PropTypes.func,\n onChange: PropTypes.func,\n changed: PropTypes.bool,\n socket: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(Options);\n","import React, {Component} from 'react';\nimport {withStyles} from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\n\nimport TextField from '@material-ui/core/TextField';\nimport Input from '@material-ui/core/Input';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport Fab from '@material-ui/core/Fab';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\n\nimport {MdAdd as IconAdd} from 'react-icons/md';\n\nimport I18n from '@iobroker/adapter-react/i18n';\nimport DialogSelectID from '@iobroker/adapter-react/Dialogs/SelectID';\nimport Utils from '@iobroker/adapter-react/Components/Utils'\n\nconst styles = theme => ({\n tab: {\n width: '100%',\n minHeight: '100%'\n },\n input: {\n marginTop: 0,\n minWidth: 400\n },\n button: {\n marginRight: 20,\n },\n card: {\n maxWidth: 345,\n textAlign: 'center'\n },\n media: {\n height: 180,\n },\n column: {\n display: 'inline-block',\n verticalAlign: 'top',\n marginRight: 20\n },\n columnLogo: {\n width: 350,\n marginRight: 0\n },\n columnSettings: {\n width: 'calc(100% - 370px)',\n },\n controlElement: {\n //background: '#d2d2d2',\n marginBottom: 5\n }\n});\n\nclass ExtendedOptions extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n showSelectId: false,\n };\n\n }\n\n renderInput(title, attr, type) {\n return <TextField\n label={I18n.t(title)}\n className={clsx(this.props.classes.input, this.props.classes.controlElement)}\n value={this.props.native[attr]}\n type={type || 'text'}\n onChange={e => this.props.onChange(attr, e.target.value)}\n margin=\"normal\"\n />;\n }\n\n renderSelect(title, attr, options, style) {\n return <FormControl className={clsx(this.props.classes.input, this.props.classes.controlElement)} style={Object.assign({paddingTop: 5}, style)}>\n <Select\n value={this.props.native[attr] || '_'}\n onChange={e => this.props.onChange(attr, e.target.value === '_' ? '' : e.target.value)}\n input={<Input name={attr} id={attr + '-helper'} />}\n >\n {options.map(item => <MenuItem key={'key-' + item.value} value={item.value || '_'}>{item.noTranslation ? item.title : I18n.t(item.title)}</MenuItem>)}\n </Select>\n <FormHelperText>{I18n.t(title)}</FormHelperText>\n </FormControl>;\n }\n\n renderCheckbox(title, attr, style) {\n return <FormControlLabel key={attr} style={Object.assign({paddingTop: 5}, style)} className={this.props.classes.controlElement}\n control={\n <Checkbox\n checked={this.props.native[attr]}\n onChange={() => this.props.onChange(attr, !this.props.native[attr])}\n color=\"primary\"\n />\n }\n label={I18n.t(title)}\n />;\n }\n\n getSelectIdDialog(attr) {\n if (this.state.showSelectId) {\n return <DialogSelectID\n key=\"dialogSelectID2\"\n imagePrefix=\"../..\"\n socket={this.props.socket}\n selected={this.props.native[attr]}\n types={['state']}\n onClose={() => this.setState({showSelectId: false})}\n onOk={selected => {\n this.setState({showSelectId: false});\n this.props.onChange(attr, selected);\n }}\n />;\n } else {\n return null;\n }\n }\n\n render() {\n return (\n <form className={this.props.classes.tab}>\n {this.renderInput('Cloud URL', 'cloudUrl')}<br/>\n {this.renderSelect('Language', 'language', [\n {title: 'default', value: ''},\n {title: 'english', value: 'en', noTranslation: true},\n {title: 'Deutsch', value: 'de', noTranslation: true},\n {title: 'русский', value: 'ru', noTranslation: true}\n ], {marginTop: 10})}<br/>\n {this.renderCheckbox('Place function in names first', 'functionFirst', {marginTop: 10})}<br/>\n {this.renderInput('Concatenate words with', 'concatWord')}<br/>\n {this.renderInput('Replace in names', 'replaces')}<br/>\n <div className={this.props.classes.controlElement} style={{marginTop: 15}}>\n {this.renderInput('OFF level for switches in %', 'deviceOffLevel')}\n <FormHelperText>{I18n.t('(Set to 0 if behavior not desired)')}</FormHelperText>\n </div>\n <div className={this.props.classes.controlElement}>\n {this.renderInput('Write response to', 'responseOID')}\n <Fab size=\"small\" color=\"secondary\" onClick={() => this.setState({showSelectId: true})} aria-label=\"Add\" style={{marginLeft: 5, marginTop: 10}}><IconAdd /></Fab><br/>\n </div>\n <div className={this.props.classes.controlElement}>\n {this.renderCheckbox('Personal settings (only pro)', 'noCommon')}\n <FormHelperText>{Utils.renderTextWithA(I18n.t('help_tip'))}</FormHelperText><br/>\n </div>\n {this.renderCheckbox('Debug outputs', 'debug')}\n {this.getSelectIdDialog('responseOID')}\n </form>\n );\n }\n}\n\nExtendedOptions.propTypes = {\n common: PropTypes.object.isRequired,\n native: PropTypes.object.isRequired,\n instance: PropTypes.number.isRequired,\n onError: PropTypes.func,\n onLoad: PropTypes.func,\n onChange: PropTypes.func,\n socket: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(ExtendedOptions);\n","import React, {Component} from 'react';\nimport {withStyles} from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\n\nimport TextField from '@material-ui/core/TextField';\nimport Input from '@material-ui/core/Input';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport Fab from '@material-ui/core/Fab';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport Chip from '@material-ui/core/Chip';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\n\nimport {MdRefresh as IconRefresh} from 'react-icons/md';\nimport {MdClose as IconClose} from 'react-icons/md';\nimport {MdAdd as IconAdd} from 'react-icons/md';\n\nimport IconCopy from '@iobroker/adapter-react/icons/IconCopy';\nimport I18n from '@iobroker/adapter-react/i18n';\nimport Utils from '@iobroker/adapter-react/Components/Utils';\nimport DialogSelectID from '@iobroker/adapter-react/Dialogs/SelectID';\n\nconst styles = theme => ({\n tab: {\n width: '100%',\n minHeight: '100%'\n },\n input: {\n marginTop: 0,\n minWidth: 400\n },\n fullSize: {\n width: 'calc(100% - 64px)'\n },\n normalSize: {\n width: 'calc(30% - 64px)',\n marginLeft: 10\n },\n button: {\n marginRight: 20,\n },\n card: {\n maxWidth: 345,\n textAlign: 'center'\n },\n media: {\n height: 180,\n },\n column: {\n display: 'inline-block',\n verticalAlign: 'top',\n marginRight: 20\n },\n columnLogo: {\n width: 350,\n marginRight: 0\n },\n columnSettings: {\n width: 'calc(100% - 370px)',\n },\n controlElement: {\n //background: '#d2d2d2',\n marginBottom: 5\n },\n chips: {\n border: '1px solid #DDD',\n borderRadius: 1,\n width: 'calc(100% - 250px)',\n display: 'inline-block',\n padding: 5,\n minHeight: 32,\n marginLeft: 10,\n marginTop: 20\n },\n chip: {\n marginRight: 5\n }\n});\n\nclass Services extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n running: false,\n toast: '',\n showSelectId: false,\n text2commandList: [],\n nightscoutList: [],\n addValue: '',\n isInstanceAlive: false\n };\n this.onKeyChangedBound = this.onKeyChanged.bind(this);\n\n this.props.socket.getAdapterInstances('text2command')\n .then(list =>\n this.props.socket.getAdapterInstances('nightscout')\n .then(nsList => this.setState({\n nightscoutList: nsList.map(obj => obj._id.replace('system.adapter.nightscout.', '')),\n text2commandList: list.map(obj => obj._id.replace('system.adapter.text2command.', ''))\n })));\n }\n\n componentDidMount() {\n this.props.socket.subscribeState('iot.' + this.props.instance + '.certs.urlKey', this.onKeyChangedBound);\n\n this.props.socket.getObject(`system.adapter.${this.props.adapterName}.${this.props.instance}`).then(obj =>\n this.props.socket.getState(`system.adapter.${this.props.adapterName}.${this.props.instance}.alive`).then(state =>\n this.setState({isInstanceAlive: obj && obj.common && state && state.val})));\n }\n\n componentWillUnmount() {\n this.props.socket.unsubscribeState('iot.' + this.props.instance + '.certs.urlKey', this.onKeyChangedBound);\n }\n\n onKeyChanged(id, state) {\n state && this.setState({key: state.val});\n }\n\n renderInput(title, attr, type) {\n return <TextField\n label={I18n.t(title)}\n className={clsx(this.props.classes.input, this.props.classes.controlElement)}\n value={this.props.native[attr]}\n type={type || 'text'}\n onChange={e => this.props.onChange(attr, e.target.value)}\n margin=\"normal\"\n />;\n }\n\n reissueUrlKey() {\n this.setState({running: true});\n return this.props.socket.setState('iot.' + this.props.instance + '.certs.urlKey', {val: '', ack: true})\n .then(() => this.props.socket.getObject('system.adapter.iot.' + this.props.instance))\n .then(obj => {\n if (!obj || !obj.common || !obj.common.enabled) {\n this.setState({running: false, toast: I18n.t('Key will be updated after start')});\n } else {\n return this.props.socket.setObject('system.adapter.iot.' + this.props.instance, obj);\n }\n })\n .then(() => this.setState({running: false, toast: I18n.t('Certificates will be updated after initiated restart')}))\n .catch(err => {\n this.setState({running: false});\n this.props.showError(err);\n });\n }\n\n renderToast() {\n if (!this.state.toast) return null;\n return (\n <Snackbar\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n open={true}\n autoHideDuration={6000}\n onClose={() => this.setState({toast: ''})}\n ContentProps={{\n 'aria-describedby': 'message-id',\n }}\n message={<span id=\"message-id\">{this.state.toast}</span>}\n action={[\n <IconButton\n key=\"close\"\n aria-label=\"Close\"\n color=\"inherit\"\n className={this.props.classes.close}\n onClick={() => this.setState({toast: ''})}\n >\n <IconClose />\n </IconButton>,\n ]}\n />);\n }\n\n onChipsDelete(attr, value) {\n const chips = (this.props.native[attr] || '').split(/[,;\\s]/).filter(a => !!a);\n const pos = chips.indexOf(value);\n if (pos !== -1) {\n chips.splice(pos, 1);\n this.props.onChange(attr, chips.join(' '));\n }\n }\n\n onChipsAdd(attr) {\n const chips = (this.props.native[attr] || '').split(/[,;\\s]/).filter(a => !!a);\n const pos = chips.indexOf(this.state.addValue);\n if (pos === -1) {\n chips.push(this.state.addValue);\n this.setState({addValue: ''}, () => this.props.onChange(attr, chips.join(' ')));\n }\n }\n\n calcNightscoutSecret() {\n const email = this.props.native.login.replace(/[^\\w\\d-_]/g, '_');\n const secret = this.props.native.nightscoutPass;\n return email + (secret ? '-' + secret : '');\n }\n\n getSelectIdDialog(attr) {\n if (this.state.showSelectId) {\n return <DialogSelectID\n key=\"dialogSelectID3\"\n imagePrefix=\"../..\"\n socket={this.props.socket}\n selected={this.props.native[attr]}\n types={['state']}\n onClose={() => this.setState({showSelectId: false})}\n onOk={selected => {\n this.setState({showSelectId: false});\n this.props.onChange(attr, selected);\n }}\n />;\n } else {\n return null;\n }\n }\n\n renderChips(label, attr) {\n return <div className={this.props.classes.chipsDiv}>\n <FormHelperText>{Utils.renderTextWithA(I18n.t(label))}</FormHelperText>\n <TextField\n label={I18n.t('Add service')}\n style={{width: 150}}\n type={'text'}\n value={this.state.addValue}\n onKeyUp={e => e.keyCode === 13 && this.onChipsAdd(attr)}\n onChange={e => this.setState({addValue: e.target.value.trim()})}\n margin=\"normal\"\n />\n\n <Fab size=\"small\" color=\"secondary\" disabled={!this.state.addValue} onClick={() => this.onChipsAdd(attr)} style={{marginLeft: 5, marginTop: -15}}><IconAdd /></Fab>\n\n <div className={this.props.classes.chips}>\n {(this.props.native[attr] || '').split(/[,;\\s]/).filter(a => !!a)\n .map(word => <Chip\n key={word}\n size=\"small\"\n label={word}\n onDelete={() => this.onChipsDelete(attr, word)}\n className={this.props.classes.chip}\n />)}\n </div>\n </div>;\n }\n\n render() {\n return <form className={this.props.classes.tab}>\n <Button\n variant=\"outlined\"\n disabled={!this.state.isInstanceAlive || this.state.running}\n color=\"primary\"\n title={!this.state.isInstanceAlive ? I18n.t('Instance must be enabled') : ''}\n onClick={() => this.reissueUrlKey()}\n startIcon={<IconRefresh />}\n >\n {I18n.t('Get new service URL key')}\n </Button><br/>\n\n {this.renderInput('IFTTT key', 'iftttKey')}<br/>\n\n <TextField\n style={{marginTop: 10}}\n label={I18n.t('Use following link for IFTTT')}\n className={clsx(this.props.classes.input, this.props.classes.controlElement, this.props.classes.fullSize)}\n value={`https://service.iobroker.in/v1/iotService?service=ifttt&key=${this.state.key}&user=${encodeURIComponent(this.props.native.login)}`}\n type=\"text\"\n readOnly={true}\n margin=\"normal\"\n />\n <Fab size=\"small\" style={{marginTop: 10, marginLeft: 5}} onClick={() => Utils.copyToClipboard(`https://service.iobroker.in/v1/iotService?service=ifttt&key=${this.state.key}&user=${encodeURIComponent(this.props.native.login)}`)} ><IconCopy /></Fab><br/>\n <br/>\n\n {this.renderChips('White list for services', 'allowedServices')}<br/>\n\n <TextField\n style={{marginTop: 10}}\n label={I18n.t('Use following link for custom service')}\n className={clsx(this.props.classes.input, this.props.classes.controlElement, this.props.classes.fullSize)}\n value={`https://service.iobroker.in/v1/iotService?service=custom_<SERVICE_NAME>&key=${this.state.key}&user=${encodeURIComponent(this.props.native.login)}&data=<SOME_TEXT>`}\n type=\"text\"\n readOnly={true}\n margin=\"normal\"\n />\n <Fab size=\"small\" style={{marginTop: 10, marginLeft: 5}} onClick={() => Utils.copyToClipboard(`https://service.iobroker.in/v1/iotService?service=custom_<SERVICE_NAME>&key=${this.state.key}&user=${encodeURIComponent(this.props.native.login)}&data=<SOME_TEXT>`)}><IconCopy /></Fab><br/>\n\n <FormControl className={clsx(this.props.classes.input, this.props.classes.controlElement)} style={{paddingTop: 20}}>\n <Select\n value={this.props.native.text2command || '_'}\n onChange={e => this.props.onChange('text2command', e.target.value === '_' ? '' : e.target.value)}\n input={<Input name=\"text2command\" id=\"text2command-helper\" />}\n >\n <MenuItem key=\"key-default\" value={'_'}>{I18n.t('disabled')}</MenuItem>\n {this.state.text2commandList.map(item => <MenuItem key={'key-' + item} value={item}>text2command.{item}</MenuItem>)}\n </Select>\n <FormHelperText>{I18n.t('Use text2command instance')}</FormHelperText>\n </FormControl>\n <br/>\n <FormControl className={clsx(this.props.classes.input, this.props.classes.controlElement)} style={{paddingTop: 20}}>\n <Select\n value={this.props.native.nightscout || '_'}\n onChange={e => this.props.onChange('nightscout', e.target.value === '_' ? '' : e.target.value)}\n input={<Input name=\"nightscout\" id=\"nightscout-helper\" />}\n >\n <MenuItem key=\"key-default\" value={'_'}>{I18n.t('disabled')}</MenuItem>\n {this.state.nightscoutList.map(item => <MenuItem key={'key-' + item} value={item}>nightscout.{item}</MenuItem>)}\n </Select>\n <FormHelperText>{I18n.t('Use Nightscout instance')}</FormHelperText>\n </FormControl>\n {this.props.native.nightscout ? <TextField\n style={{marginTop: 3.5}}\n label={I18n.t('Nightscout password')}\n onChange={e => this.props.onChange('nightscoutPass', e.target.value.replace(/[^\\w\\d-_]/g, '_'))}\n className={clsx(this.props.classes.input, this.props.classes.controlElement, this.props.classes.normalSize)}\n value={this.props.native.nightscoutPass}\n type=\"text\"\n margin=\"normal\"\n /> : null}\n {this.props.native.nightscout ? <TextField\n style={{marginTop: 3.5}}\n label={I18n.t('Nightscout api-secret')}\n className={clsx(this.props.classes.input, this.props.classes.controlElement, this.props.classes.normalSize)}\n value={this.calcNightscoutSecret()}\n type=\"text\"\n readOnly={true}\n margin=\"normal\"\n /> : null}\n <br/>\n <br/>\n <div className={this.props.classes.controlElement}>\n <TextField\n label={I18n.t('Read blood sugar from')}\n className={clsx(this.props.classes.input, this.props.classes.controlElement)}\n value={this.props.native.amazonAlexaBlood || ''}\n type=\"text\"\n onChange={e => this.props.onChange('amazonAlexaBlood', e.target.value)}\n margin=\"normal\"\n />\n <Fab size=\"small\" color=\"secondary\" onClick={() => this.setState({showSelectId: true})} aria-label=\"Add\" style={{marginLeft: 5, marginTop: 10}}><IconAdd /></Fab>\n <FormControlLabel className={this.props.classes.controlElement}\n control={\n <Checkbox\n style={{paddingLeft: 30}}\n checked={this.props.native.amazonAlexaBloodShortAnswer || false}\n onChange={e => this.props.onChange('amazonAlexaBloodShortAnswer', e.target.checked)}\n color=\"primary\"\n />\n }\n label={I18n.t('Short answer for blood sugar')}\n />\n </div>\n <br/>\n {this.renderToast()}\n {this.getSelectIdDialog('amazonAlexaBlood')}\n </form>;\n }\n}\n\nServices.propTypes = {\n common: PropTypes.object.isRequired,\n native: PropTypes.object.isRequired,\n instance: PropTypes.number.isRequired,\n adapterName: PropTypes.string.isRequired,\n onError: PropTypes.func,\n onLoad: PropTypes.func,\n onChange: PropTypes.func,\n socket: PropTypes.object.isRequired,\n onShowError: PropTypes.func,\n};\n\nexport default withStyles(styles)(Services);\n","import React, {Component} from 'react';\nimport {withStyles} from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport TextField from '@material-ui/core/TextField';\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport Switch from '@material-ui/core/Switch';\nimport {MdEdit as IconEdit} from 'react-icons/md';\n\nimport Utils from '@iobroker/adapter-react/Components/Utils';\nimport I18n from '@iobroker/adapter-react/i18n';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Dialog from '@material-ui/core/Dialog';\nimport MessageDialog from '@iobroker/adapter-react/Dialogs/Message';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport IconClose from \"@material-ui/icons/Close\";\nimport IconCheck from \"@material-ui/icons/Check\";\n\nconst CHANGED_COLOR = '#e7000040';\n\nconst styles = theme => ({\n tab: {\n width: '100%',\n height: '100%'\n },\n column: {\n display: 'inline-block',\n verticalAlign: 'top',\n marginRight: 20,\n height: '100%',\n overflow: 'hidden',\n width: 'calc(50% - 20px)',\n minWidth: 300,\n maxWidth: 450\n },\n columnDiv: {\n height: 'calc(100% - 60px)',\n overflow: 'auto',\n minWidth: 300\n },\n enumLineEnabled: {\n position: 'absolute',\n right: 0,\n top: 0,\n },\n enumLineEdit: {\n //float: 'right'\n position: 'absolute',\n top: 5,\n right: 50\n },\n enumLineName: {\n\n },\n enumLineSubName:{\n fontStyle: 'italic',\n },\n enumLine: {\n height: 48,\n width: '100%',\n position: 'relative'\n },\n enumLineId: {\n display: 'block',\n fontStyle: 'italic',\n fontSize: 12\n },\n columnHeader: {\n background: theme.palette.primary.light,\n padding: 10,\n color: theme.palette.primary.contrastText\n }\n});\n\nclass Enums extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n inAction: false,\n editId: '',\n editedSmartName: '',\n funcs: [],\n rooms: [],\n changed: [],\n message: '',\n loading: true,\n };\n\n this.onEnumUpdateBound = this.onEnumUpdate.bind(this);\n\n this.props.socket.getEnums()\n .then(res => {\n const funcs = [];\n const rooms = [];\n res && Object.keys(res).forEach(id => {\n if (id.match(/^enum\\.rooms\\./)) {\n rooms.push(res[id]);\n } else\n if (id.match(/^enum\\.functions\\./)) {\n funcs.push(res[id]);\n }\n });\n\n this.setState({funcs, rooms, loading: false});\n return this.props.socket.subscribeObject('enum.*', this.onEnumUpdateBound);\n });\n }\n\n componentWillUnmount() {\n this.props.socket.unsubscribeObject('enum.*', this.onEnumUpdateBound).then(() => {});\n }\n\n onEnumUpdate(id, obj) {\n this.removeChanged(id);\n this.updateObjInState(id, obj);\n }\n\n informInstance(id) {\n this.props.socket.sendTo(this.props.adapterName + '.' + this.props.instance, 'update', id);\n }\n\n addChanged(id) {\n const changed = JSON.parse(JSON.stringify(this.state.changed));\n if (changed.indexOf(id) === -1) {\n changed.push(id);\n this.setState({changed});\n }\n }\n\n removeChanged(id) {\n const changed = JSON.parse(JSON.stringify(this.state.changed));\n const pos = changed.indexOf(id);\n\n if (pos !== -1) {\n changed.splice(pos, 1);\n this.setState({changed});\n }\n }\n\n updateObjInState(id, obj) {\n // update obj\n if (id.match(/^enum\\.functions\\./)) {\n for (let i = this.state.funcs.length - 1; i >= 0 ; i--) {\n if (this.state.funcs[i]._id === id) {\n const funcs = JSON.parse(JSON.stringify(this.state.funcs));\n if (obj) {\n funcs[i] = obj;\n } else {\n funcs.splice(i, 1);\n }\n this.setState({funcs});\n break;\n }\n }\n } else\n if (id.match(/^enum\\.rooms\\./)) {\n for (let i = this.state.rooms.length - 1; i >= 0; i--) {\n if (this.state.rooms[i]._id === id) {\n const rooms = JSON.parse(JSON.stringify(this.state.rooms));\n if (obj) {\n rooms[i] = obj;\n } else {\n rooms.splice(i, 1);\n }\n this.setState({rooms});\n break;\n }\n }\n }\n }\n\n onToggleEnum(id) {\n let obj = this.state.funcs.find(e => e._id === id) || this.state.rooms.find(e => e._id === id);\n\n let smartName = Utils.getSmartNameFromObj(obj, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\n obj = JSON.parse(JSON.stringify(obj));\n if (smartName !== false) {\n Utils.disableSmartName(obj, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\n } else {\n Utils.removeSmartName(obj, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\n }\n\n this.addChanged(id);\n\n this.props.socket.setObject(id, obj)\n .then(() => {\n // update obj\n this.updateObjInState(id, obj);\n this.informInstance(id);\n\n setTimeout(() => this.removeChanged(id), 500);\n });\n }\n\n onEdit(id) {\n const obj = this.state.funcs.find(e => e._id === id) || this.state.rooms.find(e => e._id === id);\n let smartName = Utils.getSmartNameFromObj(obj, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\n if (typeof smartName === 'object' && smartName) {\n smartName = smartName[I18n.getLanguage()] || smartName.en;\n }\n smartName = smartName || Utils.getObjectNameFromObj(obj, null, {language: I18n.getLanguage()});\n this.setState({editId: id, editedSmartName: smartName});\n }\n\n renderEnum(obj) {\n let smartName = Utils.getSmartNameFromObj(obj, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\n // convert old format\n if (smartName && typeof smartName === 'object') {\n smartName = smartName[I18n.getLanguage()] || smartName.en || '';\n }\n let name = Utils.getObjectNameFromObj(obj);\n\n return <div key={obj._id} className={this.props.classes.enumLine} style={{background: this.state.changed.indexOf(obj._id) !== -1 ? CHANGED_COLOR : 'inherit'}}>\n <span className={this.props.classes.enumLineName} style={{opacity: smartName === false ? 0.5: 1}}>{smartName || null}{smartName ? <span className={this.props.classes.enumLineSubName}> ({name})</span> : name}</span>\n <span className={this.props.classes.enumLineId} style={{opacity: smartName === false ? 0.5: 1}}>{obj._id}</span>\n <Switch\n className={this.props.classes.enumLineEnabled}\n checked={smartName !== false}\n onChange={() => this.onToggleEnum(obj._id)}\n />\n <IconButton aria-label=\"Edit\" className={this.props.classes.enumLineEdit} onClick={() => this.onEdit(obj._id)}>\n <IconEdit fontSize=\"small\" />\n </IconButton>\n\n </div>;\n }\n\n renderEnums(name) {\n return this.state[name].map(e => this.renderEnum(e));\n }\n\n renderMessage() {\n if (this.state.message) {\n return <MessageDialog text={this.state.message} onClose={() => this.setState({message: ''})}/>;\n } else {\n return null;\n }\n }\n\n changeSmartName() {\n // Check if the name is duplicate\n let enums = this.state.editId.startsWith('enum.functions.') ? this.state.funcs : this.state.rooms;\n if (enums.find(obj =>\n this.state.editId !== obj._id && (\n this.state.editedSmartName === Utils.getObjectNameFromObj(obj, null, {language: I18n.getLanguage()}) ||\n this.state.editedSmartName === Utils.getSmartNameFromObj(obj, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon)))) {\n this.setState({message: I18n.t('Duplicate name')});\n } else {\n this.addChanged(this.state.editId);\n setTimeout(() => this.removeChanged(this.state.editId), 500);\n const id = this.state.editId;\n this.setState({editId: ''});\n let newObj;\n this.props.socket.getObject(id)\n .then(obj => {\n Utils.updateSmartName(obj, this.state.editedSmartName, undefined, undefined, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\n newObj = obj;\n return this.props.socket.setObject(id, obj);\n })\n .then(() => {\n // update obj\n this.updateObjInState(id, newObj);\n this.informInstance(id);\n })\n .catch(err => this.props.onError(err));\n }\n }\n\n renderEditDialog() {\n if (this.state.editId) {\n const obj = this.state.funcs.find(e => e._id === this.state.editId) || this.state.rooms.find(e => e._id === this.state.editId);\n\n return <Dialog\n open={true}\n maxWidth=\"sm\"\n fullWidth={true}\n onClose={() => this.setState({editId: ''})}\n aria-labelledby=\"message-dialog-title\"\n aria-describedby=\"message-dialog-description\"\n >\n <DialogTitle id=\"message-dialog-title\">{this.props.title || I18n.t('Smart name for %s', Utils.getObjectNameFromObj(obj, null, {language: I18n.getLanguage()}))}</DialogTitle>\n <DialogContent>\n <TextField\n autoFocus\n style={{width: '100%'}}\n label={I18n.t('Smart name')}\n onChange={e => this.setState({editedSmartName: e.target.value})}\n value={this.state.editedSmartName}\n helperText={I18n.t('You can enter several names divided by comma')}\n margin=\"normal\"\n />\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => this.changeSmartName()}\n color=\"primary\"\n startIcon={<IconCheck/>}\n >{I18n.t('Ok')}</Button>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({editId: ''})}\n startIcon={<IconClose/>}\n >{I18n.t('Cancel')}</Button>\n </DialogActions>\n </Dialog>;\n } else {\n return null;\n }\n }\n\n render() {\n if (this.state.loading) {\n return <CircularProgress />;\n }\n return (\n <form className={this.props.classes.tab}>\n <div className={this.props.classes.column}>\n <h5 className={this.props.classes.columnHeader}>{I18n.t('Rooms')}</h5>\n <div className={this.props.classes.columnDiv}>{this.renderEnums('rooms')}</div>\n </div>\n <div className={this.props.classes.column}>\n <h5 className={this.props.classes.columnHeader}>{I18n.t('Functions')}</h5>\n <div className={this.props.classes.columnDiv}>{this.renderEnums('funcs')}</div>\n </div>\n {this.renderMessage()}\n {this.renderEditDialog()}\n </form>\n );\n }\n}\n\nEnums.propTypes = {\n common: PropTypes.object.isRequired,\n native: PropTypes.object.isRequired,\n instance: PropTypes.number.isRequired,\n adapterName: PropTypes.string.isRequired,\n onError: PropTypes.func,\n onLoad: PropTypes.func,\n onChange: PropTypes.func,\n socket: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(Enums);\n","import React, {Component} from 'react';\r\nimport {withStyles} from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport clsx from 'clsx';\r\n\r\nimport TextField from '@material-ui/core/TextField';\r\nimport Button from '@material-ui/core/Button';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Fab from '@material-ui/core/Fab';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Badge from '@material-ui/core/Badge';\r\nimport Select from '@material-ui/core/Select';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport FormHelperText from '@material-ui/core/FormHelperText';\r\nimport FormControl from '@material-ui/core/FormControl';\r\n\r\nimport {MdEdit as IconEdit} from 'react-icons/md';\r\nimport {MdAdd as IconAdd} from 'react-icons/md';\r\nimport {MdRefresh as IconRefresh} from 'react-icons/md';\r\nimport {MdClear as IconClear} from 'react-icons/md';\r\nimport {MdDelete as IconDelete} from 'react-icons/md';\r\nimport {MdFormatAlignJustify as IconExpand} from 'react-icons/md';\r\nimport {MdDragHandle as IconCollapse} from 'react-icons/md';\r\nimport {MdList as IconList} from 'react-icons/md';\r\nimport {FaPowerOff as IconOn} from 'react-icons/fa';\r\nimport {FaThermometerHalf as IconTemperature} from 'react-icons/fa';\r\nimport {FaLongArrowAltUp as IconUp} from 'react-icons/fa';\r\nimport {FaLongArrowAltDown as IconDown} from 'react-icons/fa';\r\nimport {FaPercentage as IconPercentage} from 'react-icons/fa';\r\nimport {FaPalette as IconColor} from 'react-icons/fa';\r\nimport {FaLightbulb as IconBulb} from 'react-icons/fa';\r\nimport {FaLockOpen as IconLock} from 'react-icons/fa';\r\nimport {FaThermometer as IconThermometer} from 'react-icons/fa';\r\nimport IconCopy from '@material-ui/icons/FileCopy';\r\nimport IconClose from '@material-ui/icons/Close';\r\nimport IconCheck from '@material-ui/icons/Check';\r\n\r\nimport Utils from '@iobroker/adapter-react/Components/Utils'\r\nimport I18n from '@iobroker/adapter-react/i18n';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport MessageDialog from '@iobroker/adapter-react/Dialogs/Message';\r\nimport DialogSelectID from '@iobroker/adapter-react/Dialogs/SelectID';\r\nimport copy from \"copy-to-clipboard\";\r\n\r\nconst colorOn = '#aba613';\r\nconst colorOff = '#444';\r\nconst colorSet = '#00c6ff';\r\nconst colorRead = '#00bc00';\r\nconst CHANGED_COLOR = '#e7000040';\r\nconst DEFAULT_CHANNEL_COLOR_DARK = '#4f4f4f';\r\nconst DEFAULT_CHANNEL_COLOR_LIGHT = '#e9e9e9';\r\nconst LAST_CHANGED_COLOR_DARK = '#5c8f65';\r\nconst LAST_CHANGED_COLOR_LIGHT = '#b4ffbe';\r\nconst actionsMapping = {\r\n turnOn: {color: colorOn, icon: IconOn, desc: 'Turn on'},\r\n turnOff: {color: colorOff, icon: IconOn, desc: 'Turn off'},\r\n\r\n setTargetTemperature: {color: colorSet, icon: IconTemperature, desc: 'Set target temperature'},\r\n incrementTargetTemperature: {color: colorOn, icon: IconUp, desc: 'Increment target temperature'},\r\n decrementTargetTemperature: {color: colorOff, icon: IconDown, desc: 'Decrement target temperature'},\r\n\r\n setPercentage: {color: colorSet, icon: IconPercentage, desc: 'Set percentage'},\r\n incrementPercentage: {color: colorOn, icon: IconUp, desc: 'Increment percentage'},\r\n decrementPercentage: {color: colorOff, icon: IconDown, desc: 'Decrement percentage'},\r\n\r\n setColor: {color: colorSet, icon: IconColor, desc: 'Set color'},\r\n\r\n setColorTemperature: {color: colorSet, icon: IconBulb, desc: 'Set color temperature'},\r\n incrementColorTemperature: {color: colorOn, icon: IconUp, desc: 'Increment color temperature'},\r\n decrementColorTemperature: {color: colorOff, icon: IconDown, desc: 'Decrement color temperature'},\r\n\r\n getTargetTemperature: {color: colorRead, icon: IconThermometer, desc: 'Get target temperature'},\r\n getTemperatureReading: {color: colorRead, icon: IconThermometer, desc: 'Get actual temperature'},\r\n\r\n setLockState: {color: colorSet, icon: IconLock, desc: 'Set lock state'},\r\n getLockState: {color: colorRead, icon: IconLock, desc: 'Read lock state'},\r\n};\r\n\r\nconst SMARTTYPES = ['LIGHT', 'SWITCH', 'THERMOSTAT', 'ACTIVITY_TRIGGER', 'SCENE_TRIGGER', 'SMARTPLUG', 'SMARTLOCK', 'CAMERA'];\r\n\r\nconst styles = theme => ({\r\n tab: {\r\n width: '100%',\r\n height: '100%'\r\n },\r\n column: {\r\n display: 'inline-block',\r\n verticalAlign: 'top',\r\n marginRight: 20,\r\n height: '100%',\r\n overflow: 'hidden'\r\n },\r\n columnDiv: {\r\n height: 'calc(100% - 40px)',\r\n overflow: 'auto',\r\n minWidth: 300\r\n },\r\n filter: {\r\n margin: 0\r\n },\r\n button: {\r\n marginRight: 20\r\n },\r\n devLineExpand: {\r\n marginRight: 10,\r\n },\r\n devLineEnabled: {\r\n position: 'absolute',\r\n right: 0,\r\n top: 0,\r\n },\r\n devLineEdit: {\r\n position: 'absolute',\r\n top: 5,\r\n right: 50\r\n },\r\n devLineDelete: {\r\n position: 'absolute',\r\n top: 5,\r\n right: 0\r\n },\r\n devLineName: {\r\n\r\n },\r\n devLineNumber:{\r\n display: 'inline-block',\r\n verticalAlign: 'middle',\r\n width: 15,\r\n },\r\n editedId: {\r\n fontStyle: 'italic'\r\n },\r\n enumLineSubName:{\r\n fontStyle: 'italic',\r\n },\r\n devLine: {\r\n height: 48,\r\n width: '100%',\r\n position: 'relative'\r\n },\r\n devLineDescription: {\r\n display: 'block',\r\n fontStyle: 'italic',\r\n fontSize: 12\r\n },\r\n devLineActions: {\r\n fontStyle: 'italic',\r\n fontSize: 12,\r\n paddingLeft: 50,\r\n display: 'inline-block',\r\n },\r\n devLineProgress: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n },\r\n channelLineActions: {\r\n width: 80\r\n },\r\n devLineNameBlock: {\r\n display: 'inline-block',\r\n width: 'calc(100% - 350px)'\r\n },\r\n columnHeader: {\r\n background: theme.palette.primary.light,\r\n padding: 10,\r\n color: theme.palette.primary.contrastText\r\n },\r\n devModified: {\r\n fontStyle: 'italic'\r\n },\r\n actionIcon: {\r\n width: 16\r\n },\r\n\r\n devSubLine: {\r\n position: 'relative',\r\n height: 48\r\n },\r\n devSubLineName: {\r\n marginLeft: 5,\r\n marginTop: 14,\r\n display: 'inline-block',\r\n fontSize: 13,\r\n width: 'calc(100% - 400px)'\r\n },\r\n devSubSubLineName: {\r\n fontSize: 8,\r\n fontStyle: 'italic',\r\n display: 'block'\r\n },\r\n devSubLineByOn: {\r\n marginLeft: 5\r\n },\r\n devSubLineDelete: {\r\n position: 'absolute',\r\n top: 12,\r\n right: 12,\r\n padding: 0\r\n },\r\n devSubLineEdit: {\r\n position: 'absolute',\r\n top: 12,\r\n right: 62,\r\n padding: 0\r\n },\r\n devSubLineTypeTitle: {\r\n marginTop: 0\r\n },\r\n headerRow: {\r\n paddingLeft: theme.spacing(1),\r\n background: theme.palette.primary.main,\r\n },\r\n headerCell: {\r\n display: 'inline-block',\r\n verticalAlign: 'top',\r\n width: '100%'\r\n },\r\n tableCell: {\r\n display: 'inline-block',\r\n verticalAlign: 'top',\r\n width: '100%'\r\n },\r\n});\r\n\r\nclass AlexaSmartNames extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n if (!actionsMapping.translated) {\r\n Object.keys(actionsMapping).forEach(a => actionsMapping[a].desc = I18n.t(actionsMapping[a].desc));\r\n actionsMapping.translated = true;\r\n }\r\n\r\n this.state = {\r\n editedSmartName: '',\r\n editId: '',\r\n editedSmartType: null,\r\n editObjectName: '',\r\n deleteId: '',\r\n\r\n showListOfDevices: false,\r\n showSelectId: false,\r\n showConfirmation: '',\r\n changed: [],\r\n devices: [],\r\n message: '',\r\n filter: '',\r\n loading: true,\r\n browse: false,\r\n expanded: [],\r\n lastChanged: ''\r\n };\r\n\r\n this.timerChanged = null;\r\n this.browseTimer = null;\r\n this.browseTimerCount = 0;\r\n this.editedSmartName = '';\r\n\r\n this.waitForUpdateID = null;\r\n this.onReadyUpdateBound = this.onReadyUpdate.bind(this);\r\n this.onResultUpdateBound = this.onResultUpdate.bind(this);\r\n\r\n this.props.socket.getObject(`system.adapter.${this.props.adapterName}.${this.props.instance}`).then(obj => {\r\n this.props.socket.getState(`system.adapter.${this.props.adapterName}.${this.props.instance}.alive`).then(state => {\r\n if (!obj || !obj.common || (!obj.common.enabled && (!state || !state.val))) {\r\n this.setState({message: I18n.t('Instance must be enabled'), loading: false, devices: []});\r\n } else {\r\n this.browse();\r\n }\r\n });\r\n });\r\n }\r\n\r\n browse(isIndicate) {\r\n if (Date.now() - this.lastBrowse < 500) {\r\n return;\r\n }\r\n this.lastBrowse = Date.now();\r\n if (isIndicate) {\r\n this.setState({loading: true, browse: true});\r\n } else {\r\n this.setState({browse: true});\r\n }\r\n console.log('Send BROWSE!');\r\n this.browseTimer = setTimeout(() => {\r\n console.log('Browse timeout!');\r\n this.browseTimer = null;\r\n this.browseTimerCount++;\r\n if (this.browseTimerCount < 5) {\r\n this.browse(isIndicate);\r\n } else {\r\n this.setState({message: I18n.t('Cannot read devices!')});\r\n }\r\n }, 10000);\r\n\r\n this.props.socket.sendTo(this.props.adapterName + '.' + this.props.instance, 'browse', null)\r\n .then(list => {\r\n this.browseTimer && clearTimeout(this.browseTimer);\r\n this.browseTimerCount = 0;\r\n this.browseTimer = null;\r\n if (list && list.error) {\r\n this.setState({message: I18n.t(list.error)});\r\n } else {\r\n if (this.waitForUpdateID) {\r\n if (!this.onEdit(this.waitForUpdateID, list)) {\r\n this.setState({message: I18n.t('Device %s was not added', this.waitForUpdateID)});\r\n }\r\n this.waitForUpdateID = null;\r\n }\r\n console.log('BROWSE received.');\r\n\r\n this.setState({\r\n devices: list,\r\n loading: false,\r\n changed: [],\r\n browse: false\r\n });\r\n\r\n if (list.length > 300) {\r\n this.props.onError(I18n.t('Too many devices (%s) configured. Max number is 300', list.length));\r\n }\r\n }\r\n })\r\n .catch(e => this.setState({message: I18n.t('Error %s', e)}));\r\n }\r\n\r\n onReadyUpdate(id, state) {\r\n console.log(`Update ${id} ${state ? `${state.val}/${state.ack}` : 'null'}`);\r\n if (state && state.ack === true && state.val === true) {\r\n this.devTimer && clearTimeout(this.devTimer);\r\n this.devTimer = setTimeout(() => {\r\n this.devTimer = null;\r\n this.browse();\r\n }, 300);\r\n }\r\n }\r\n\r\n onResultUpdate(id, state) {\r\n state && state.ack === true && state.val && this.setState({message: state.val});\r\n }\r\n\r\n componentDidMount() {\r\n this.props.socket.subscribeState(`${this.props.adapterName}.${this.props.instance}.smart.updates`, this.onReadyUpdateBound);\r\n this.props.socket.subscribeState(`${this.props.adapterName}.${this.props.instance}.smart.updatesResult`, this.onResultUpdateBound);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.socket.unsubscribeState(`${this.props.adapterName}.${this.props.instance}.smart.updates`, this.onReadyUpdateBound);\r\n this.props.socket.unsubscribeState(`${this.props.adapterName}.${this.props.instance}.smart.updatesResult`, this.onResultUpdateBound);\r\n if (this.timerChanged) {\r\n clearTimeout(this.timerChanged);\r\n this.timerChanged = null;\r\n }\r\n }\r\n\r\n informInstance(id) {\r\n this.props.socket.sendTo(this.props.adapterName + '.' + this.props.instance, 'update', id);\r\n }\r\n\r\n addChanged(id, cb) {\r\n const changed = JSON.parse(JSON.stringify(this.state.changed));\r\n if (changed.indexOf(id) === -1) {\r\n changed.push(id);\r\n this.setState({changed}, () => cb && cb());\r\n } else {\r\n cb && cb();\r\n }\r\n }\r\n\r\n removeChanged(id) {\r\n const changed = JSON.parse(JSON.stringify(this.state.changed));\r\n const pos = changed.indexOf(id);\r\n\r\n if (pos !== -1) {\r\n changed.splice(pos, 1);\r\n this.setState({changed});\r\n }\r\n }\r\n\r\n onEdit(id, devices) {\r\n devices = devices || this.state.devices;\r\n const device = devices.find(dev => dev.additionalApplianceDetails.id === id);\r\n if (device) {\r\n this.props.socket.getObject(id)\r\n .then(obj => {\r\n let smartName = device.additionalApplianceDetails.friendlyNames ? device.additionalApplianceDetails.friendlyNames : device.friendlyName;\r\n if (typeof smartName === 'object' && smartName) {\r\n smartName = smartName[I18n.getLanguage()] || smartName.en;\r\n }\r\n this.editedSmartName = smartName;\r\n let editedSmartType = null;\r\n if (!device.additionalApplianceDetails.group) {\r\n editedSmartType = device.additionalApplianceDetails.smartType;\r\n }\r\n\r\n this.setState({editId: id, editedSmartType, editedSmartName: smartName, editObjectName: Utils.getObjectNameFromObj(obj, null, {language: I18n.getLanguage()})});\r\n });\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n onAskDelete(deleteId) {\r\n this.setState({deleteId, showConfirmation: true});\r\n }\r\n\r\n onDelete() {\r\n let id = this.state.deleteId;\r\n // const device = this.state.devices.find(dev => dev.additionalApplianceDetails.id === id);\r\n this.addChanged(id, () => {\r\n this.props.socket.getObject(id)\r\n .then(obj => {\r\n Utils.disableSmartName(obj, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\r\n return this.props.socket.setObject(id, obj);\r\n })\r\n .then(() => {\r\n this.setState({deleteId: '', showConfirmation: false, lastChanged: id});\r\n\r\n this.timerChanged && clearTimeout(this.timerChanged);\r\n this.timerChanged = setTimeout(() => {\r\n this.setState({lastChanged: ''});\r\n this.timerChanged = null;\r\n }, 30000);\r\n\r\n // update obj\r\n this.informInstance(id);\r\n })\r\n .catch(err => this.props.onError(err));\r\n });\r\n }\r\n\r\n renderActions(dev) {\r\n // Type\r\n const actions = [];\r\n if (!dev.actions) {\r\n console.log('Something went wrong');\r\n return null;\r\n }\r\n dev.actions.sort((a, b) => {\r\n if (a === b) return 0;\r\n if (a === 'turnOn') return -1;\r\n if (b === 'turnOn') return 1;\r\n\r\n if (a === 'turnOff') return -1;\r\n if (b === 'turnOff') return 1;\r\n return 0;\r\n });\r\n\r\n Object.keys(actionsMapping).forEach(action => {\r\n if (dev.actions.indexOf(action) !== -1) {\r\n const Icon = actionsMapping[action].icon;\r\n actions.push(<span key={action} title={actionsMapping[action].desc}><Icon className={this.props.classes.actionIcon} style={{color: actionsMapping[action].color}}/></span>);\r\n }\r\n });\r\n // add unknown actions\r\n for (let a = 0; a < dev.actions.length; a++) {\r\n if (!actionsMapping[dev.actions[a]]) {\r\n actions.push(<span key={dev.actions[a]}>{dev.actions[a]}</span>);\r\n }\r\n }\r\n return actions;\r\n }\r\n\r\n onExpand(lineNum) {\r\n const expanded = JSON.parse(JSON.stringify(this.state.expanded));\r\n const pos = expanded.indexOf(this.state.devices[lineNum].friendlyName);\r\n if (pos === -1) {\r\n expanded.push(this.state.devices[lineNum].friendlyName);\r\n } else {\r\n expanded.splice(pos, 1);\r\n }\r\n this.setState({expanded});\r\n }\r\n\r\n renderSelectByOn(dev, lineNum, id, type) {\r\n // type = '-', 'stored', false or number [5-100]\r\n if (type !== false) {\r\n const items = [\r\n <MenuItem key=\"_\" value=\"\"><em>{I18n.t('Default')}</em></MenuItem>,\r\n <MenuItem key=\"last\" value=\"stored\">{I18n.t('last value')}</MenuItem>\r\n ];\r\n for (let i = 5; i <= 100; i += 5) {\r\n items.push(<MenuItem key={i.toString()} value={i.toString()}>{i}%</MenuItem>);\r\n }\r\n return <FormControl className={this.props.classes.devSubLineByOn}>\r\n <Select className={this.props.classes.devSubLineByOnSelect} value={(type || '').toString()} onChange={e => this.onParamsChange(id, e.target.value)}>{items}</Select>\r\n <FormHelperText className={this.props.classes.devSubLineTypeTitle}>{I18n.t('by ON')}</FormHelperText>\r\n </FormControl>;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n onParamsChange(id, byON, type) {\r\n this.addChanged(id, () => {\r\n this.props.socket.getObject(id)\r\n .then(obj => {\r\n Utils.updateSmartName(obj, undefined, byON, type, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\r\n\r\n if (this.state.lastChanged !== id) {\r\n this.setState({lastChanged: id});\r\n this.timerChanged && clearTimeout(this.timerChanged);\r\n this.timerChanged = setTimeout(() => {\r\n this.setState({lastChanged: ''});\r\n this.timerChanged = null;\r\n }, 30000);\r\n }\r\n\r\n return this.props.socket.setObject(id, obj);\r\n })\r\n .then(() => {\r\n // update obj\r\n this.informInstance(id);\r\n })\r\n .catch(err => this.props.onError(err));\r\n });\r\n }\r\n\r\n renderSelectTypeSelector(type, onChange) {\r\n if (type !== false) {\r\n const items = [<MenuItem key=\"_\" value=\"_\"><em>{I18n.t('no type')}</em></MenuItem>];\r\n for (let i = 0; i < SMARTTYPES.length; i++) {\r\n items.push(<MenuItem key={SMARTTYPES[i]} value={SMARTTYPES[i]}><em>{I18n.t(SMARTTYPES[i])}</em></MenuItem>);\r\n }\r\n return <FormControl>\r\n <Select value={type || '_'} onChange={e => onChange(e.target.value === '_' ? '' : e.target.value)}>{items}</Select>\r\n <FormHelperText className={this.props.classes.devSubLineTypeTitle}>{I18n.t('Types')}</FormHelperText>\r\n </FormControl>;\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n renderSelectType(dev, lineNum, id, type) {\r\n return this.renderSelectTypeSelector(type, value => this.onParamsChange(id, undefined, value));\r\n }\r\n\r\n renderChannels(dev, lineNum) {\r\n const result = [];\r\n const classes = this.props.classes;\r\n\r\n if (dev.additionalApplianceDetails.group) {\r\n const channels = dev.additionalApplianceDetails.channels;\r\n const names = dev.additionalApplianceDetails.names;\r\n const types = dev.additionalApplianceDetails.byONs;\r\n const smarttypes = dev.additionalApplianceDetails.smartTypes;\r\n\r\n let c = 0;\r\n for (const chan in channels) {\r\n if (channels.hasOwnProperty(chan)) {\r\n for (let i = 0; i < channels[chan].length; i++) {\r\n const id = channels[chan][i].id;\r\n let background = this.state.changed.indexOf(id) !== -1 ? CHANGED_COLOR : this.props.themeType === 'dark' ? DEFAULT_CHANNEL_COLOR_DARK : DEFAULT_CHANNEL_COLOR_LIGHT;\r\n if (this.state.lastChanged === id && (background === DEFAULT_CHANNEL_COLOR_DARK || background === DEFAULT_CHANNEL_COLOR_LIGHT)) {\r\n background = this.props.themeType === 'dark' ? LAST_CHANGED_COLOR_DARK : LAST_CHANGED_COLOR_LIGHT;\r\n }\r\n result.push(<div key={'sub' + id} className={classes.devSubLine} style={(c % 2) ? {} : {background}}>\r\n <div className={clsx(this.props.classes.devLineActions, this.props.classes.channelLineActions)}>{this.renderActions(channels[chan][i])}</div>\r\n <div className={classes.devSubLineName} title={id}>{(names[id] || id)}\r\n {id !== names[id] ? <span className={classes.devSubSubLineName}>{id}</span> : null}\r\n </div>\r\n {this.renderSelectType(dev, lineNum, id, smarttypes[id])}\r\n {this.renderSelectByOn(dev, lineNum, id, types[id])}\r\n <IconButton aria-label=\"Delete\" className={this.props.classes.devSubLineDelete} onClick={() => this.onAskDelete(id, lineNum)}><IconDelete fontSize=\"middle\" /></IconButton>\r\n </div>);\r\n c++;\r\n }\r\n }\r\n }\r\n } else {\r\n const id = dev.additionalApplianceDetails.id;\r\n const name = dev.additionalApplianceDetails.name || id;\r\n let background = this.state.changed.indexOf(id) !== -1 ? CHANGED_COLOR : this.props.themeType === 'dark' ? DEFAULT_CHANNEL_COLOR_DARK : DEFAULT_CHANNEL_COLOR_LIGHT;\r\n if (this.state.lastChanged === id && (background === DEFAULT_CHANNEL_COLOR_DARK || background === DEFAULT_CHANNEL_COLOR_LIGHT)) {\r\n background = this.props.themeType === 'dark' ? LAST_CHANGED_COLOR_DARK : LAST_CHANGED_COLOR_LIGHT;\r\n }\r\n result.push(<div key={'sub' + id} className={classes.devSubLine} style={{background}}>\r\n <div className={clsx(this.props.classes.devLineActions, this.props.classes.channelLineActions)} style={{width: 80}}>{this.renderActions(dev)}</div>\r\n <div className={classes.devSubLineName} title={(id || '')}>{name}</div>\r\n {this.renderSelectType(dev, lineNum, id, dev.additionalApplianceDetails.smartType)}\r\n {this.renderSelectByOn(dev, lineNum, id, dev.additionalApplianceDetails.byON)}\r\n </div>);\r\n }\r\n return result;\r\n }\r\n\r\n renderDevice(dev, lineNum) {\r\n let friendlyName = dev.friendlyName;\r\n let title;\r\n if (!dev.additionalApplianceDetails.group && dev.additionalApplianceDetails.nameModified) {\r\n title = friendlyName;\r\n } else {\r\n title = <span className={this.props.classes.devModified} title={I18n.t('modified')}>{friendlyName}</span>;\r\n }\r\n\r\n let devCount = 0;\r\n for (const ch in dev.additionalApplianceDetails.channels) {\r\n if (dev.additionalApplianceDetails.channels.hasOwnProperty(ch)) {\r\n devCount += dev.additionalApplianceDetails.channels[ch].length;\r\n }\r\n }\r\n devCount = devCount || 1;\r\n const expanded = this.state.expanded.indexOf(friendlyName) !== -1;\r\n const id = dev.additionalApplianceDetails.id;\r\n\r\n let background = (lineNum % 2) ? (this.props.themeType === 'dark' ? '#272727' : '#f1f1f1') : 'inherit';\r\n const changed = this.state.changed.indexOf(id) !== -1;\r\n if (changed) {\r\n background = CHANGED_COLOR;\r\n } else if (id === this.state.lastChanged) {\r\n background = this.props.themeType === 'dark' ? LAST_CHANGED_COLOR_DARK : LAST_CHANGED_COLOR_LIGHT;\r\n }\r\n\r\n // If some of sub channels in change list or in last changed\r\n if (dev.additionalApplianceDetails.group && !changed && id !== this.state.lastChanged) {\r\n const channels = dev.additionalApplianceDetails.channels;\r\n try {\r\n channels && Object.keys(channels).forEach(chan =>\r\n chan && channels[chan].forEach(el => {\r\n if (this.state.changed.indexOf(el.id) !== -1) {\r\n background = CHANGED_COLOR;\r\n } else if (this.state.lastChanged === el.id) {\r\n background = this.props.themeType === 'dark' ? LAST_CHANGED_COLOR_DARK : LAST_CHANGED_COLOR_LIGHT;\r\n }\r\n })\r\n );\r\n } catch (error) {\r\n console.log(error)\r\n }\r\n }\r\n\r\n return [\r\n <div key={'line' + lineNum} className={this.props.classes.devLine} style={{background}}>\r\n <div className={this.props.classes.devLineNumber}>{lineNum + 1}.</div>\r\n <IconButton className={this.props.classes.devLineExpand} onClick={() => this.onExpand(lineNum)}>\r\n {devCount > 1 ?\r\n <Badge badgeContent={devCount} color=\"primary\">\r\n {expanded ? <IconCollapse/> : <IconExpand />}\r\n </Badge> :\r\n (expanded ? <IconCollapse/> : <IconExpand />)}\r\n </IconButton>\r\n <div className={this.props.classes.devLineNameBlock} style={{display: 'inline-block', position: 'relative'}}>\r\n <span className={this.props.classes.devLineName}>{title}</span>\r\n <span className={this.props.classes.devLineDescription}>{dev.friendlyDescription}</span>\r\n {changed ? <CircularProgress className={this.props.classes.devLineProgress} size={20}/> : null}\r\n </div>\r\n <span className={this.props.classes.devLineActions}>{this.renderActions(dev)}</span>\r\n {!dev.additionalApplianceDetails.group ?\r\n <IconButton aria-label=\"Edit\" className={this.props.classes.devLineEdit} onClick={() => this.onEdit(id)}><IconEdit fontSize=\"middle\" /></IconButton> : null}\r\n {!dev.additionalApplianceDetails.group ?\r\n <IconButton aria-label=\"Delete\" className={this.props.classes.devLineDelete} onClick={() => this.onAskDelete(id)}><IconDelete fontSize=\"middle\" /></IconButton> : null}\r\n </div>,\r\n expanded ? this.renderChannels(dev, lineNum) : null\r\n ];\r\n }\r\n\r\n renderMessage() {\r\n if (this.state.message) {\r\n return <MessageDialog text={this.state.message} onClose={() => this.setState({message: ''})}/>;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n changeSmartName(e) {\r\n e && e.preventDefault();\r\n // Check if the name is duplicate\r\n this.addChanged(this.state.editId, () => {\r\n const id = this.state.editId;\r\n const editedSmartType = this.state.editedSmartType;\r\n\r\n this.setState({editId: '', editObjectName: '', lastChanged: id, editedSmartType: null});\r\n\r\n this.timerChanged && clearTimeout(this.timerChanged);\r\n this.timerChanged = setTimeout(() => {\r\n this.setState({lastChanged: ''});\r\n this.timerChanged = null;\r\n }, 30000);\r\n\r\n this.props.socket.getObject(id)\r\n .then(obj => {\r\n Utils.updateSmartName(obj, this.editedSmartName, undefined, editedSmartType === null ? undefined : editedSmartType, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\r\n\r\n return this.props.socket.setObject(id, obj);\r\n })\r\n .then(() => {\r\n // update obj\r\n this.informInstance(id);\r\n })\r\n .catch(err => this.props.onError(err));\r\n });\r\n }\r\n\r\n renderEditDialog() {\r\n if (this.state.editId) {\r\n return <Dialog\r\n open={true}\r\n maxWidth=\"sm\"\r\n fullWidth={true}\r\n onClose={() => {\r\n this.editedSmartName = null;\r\n this.setState({editId: '', editedSmartName: ''});\r\n }}\r\n aria-labelledby=\"message-dialog-title\"\r\n aria-describedby=\"message-dialog-description\"\r\n >\r\n <DialogTitle id=\"message-dialog-title\">{this.props.title || I18n.t('Smart name for %s', this.state.editObjectName)}</DialogTitle>\r\n <DialogContent>\r\n <p><span>ID:</span> <span className={this.props.classes.editedId}>{this.state.editId}</span></p>\r\n <TextField\r\n style={{width: '100%'}}\r\n label={I18n.t('Smart name')}\r\n autoFocus\r\n onKeyDown={e =>\r\n e.keyCode === 13 && this.changeSmartName(e)}\r\n onChange={e => this.editedSmartName = e.target.value}\r\n defaultValue={this.state.editedSmartName}\r\n helperText={I18n.t('You can enter several names divided by comma')}\r\n margin=\"normal\"\r\n />\r\n {this.state.editedSmartType !== null ? this.renderSelectTypeSelector(this.state.editedSmartType, value => this.setState({editedSmartType: value})) : null}\r\n </DialogContent>\r\n <DialogActions>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => this.changeSmartName()}\r\n color=\"primary\"\r\n startIcon={<IconCheck/>}\r\n >{I18n.t('Ok')}\r\n </Button>\r\n <Button variant=\"contained\" onClick={() => {\r\n this.editedSmartName = null;\r\n this.setState({editId: '', editedSmartName: ''});\r\n }}\r\n startIcon={<IconClose/>}\r\n >{I18n.t('Cancel')}</Button>\r\n </DialogActions>\r\n </Dialog>;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n renderConfirmDialog() {\r\n if (this.state.showConfirmation) {\r\n return <Dialog\r\n open={true}\r\n maxWidth=\"sm\"\r\n fullWidth={true}\r\n onClose={() => this.setState({showConfirmation: ''})}\r\n aria-labelledby=\"confirmation-dialog-title\"\r\n aria-describedby=\"confirmation-dialog-description\"\r\n >\r\n <DialogTitle id=\"confirmation-dialog-title\">{this.props.title || I18n.t('Device %s will be disabled.', this.state.deleteId)}</DialogTitle>\r\n <DialogContent>\r\n <p>{I18n.t('Are you sure?')}</p>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => this.onDelete()}\r\n color=\"primary\"\r\n autoFocus\r\n startIcon={<IconDelete/>}\r\n >{I18n.t('Delete')}</Button>\r\n <Button\r\n variant=\"contained\"\r\n startIcon={<IconClose/>}\r\n onClick={() => this.setState({showConfirmation: ''})}>{I18n.t('Cancel')}</Button>\r\n </DialogActions>\r\n </Dialog>;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n getSelectIdDialog() {\r\n if (this.state.showSelectId) {\r\n return <DialogSelectID\r\n key=\"dialogSelectID1\"\r\n imagePrefix=\"../..\"\r\n socket={this.props.socket}\r\n selected={''}\r\n types={['state']}\r\n onClose={() => this.setState({showSelectId: false})}\r\n onOk={(selected, name) => {\r\n this.setState({showSelectId: false});\r\n\r\n this.props.socket.getObject(selected)\r\n .then(obj => {\r\n if (obj) {\r\n const name = Utils.getObjectNameFromObj(obj, null, {language: I18n.getLanguage()});\r\n Utils.updateSmartName(obj, (name || I18n.t('Device name')).replace(/[-_.]+/g, ' '), undefined, undefined, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\r\n this.addChanged(obj._id);\r\n this.waitForUpdateID = obj._id;\r\n\r\n if (this.state.lastChanged !== obj._id) {\r\n this.setState({lastChanged: obj._id});\r\n this.timerChanged && clearTimeout(this.timerChanged);\r\n this.timerChanged = setTimeout(() => {\r\n this.setState({lastChanged: ''});\r\n this.timerChanged = null;\r\n }, 30000);\r\n }\r\n\r\n this.props.socket.setObject(obj._id, obj)\r\n .then(() => this.informInstance(obj._id))\r\n .catch(err => this.setState({message: err}));\r\n } else {\r\n this.setState({message: I18n.t('Invalid ID')});\r\n }\r\n });\r\n }}\r\n />;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n renderDevices() {\r\n const filter = this.state.filter.toLowerCase();\r\n const result = [];\r\n for (let i = 0; i < this.state.devices.length; i++) {\r\n if (this.state.filter && this.state.devices[i].friendlyName.toLowerCase().indexOf(filter) === -1 ) continue;\r\n result.push(this.renderDevice(this.state.devices[i], i));\r\n }\r\n return <div key=\"listDevices\" className={this.props.classes.columnDiv}>{result}</div>;\r\n }\r\n\r\n renderListOfDevices() {\r\n if (!this.state.showListOfDevices) {\r\n return null;\r\n }\r\n const classes = this.props.classes;\r\n\r\n return <Dialog\r\n open={true}\r\n maxWidth=\"xl\"\r\n fullWidth\r\n onClose={() => this.setState({showListOfDevices: false})}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">{I18n.t('List of devices to print out, e.g. to give all device names to your partner.')} <span role=\"img\" aria-label=\"smile\">😄</span></DialogTitle>\r\n <DialogContent>\r\n <div className={ classes.headerRow } >\r\n <div className={ classes.headerCell }>{ I18n.t('Name') }</div>\r\n </div>\r\n <div className={ this.props.classes.tableDiv } >\r\n { this.state.devices.map((item, i) => <div key={i}>\r\n <div className={ classes.tableCell }>{ item.friendlyName }</div>\r\n </div>)\r\n }\r\n </div>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button variant=\"outlined\" onClick={() => {\r\n this.setState({showListOfDevices: false});\r\n const lines = this.state.devices.map(item => item.friendlyName);\r\n copy(lines.join('\\n'));\r\n }} color=\"primary\"\r\n startIcon={<IconCopy/>}\r\n >{I18n.t('Copy to clipboard')}</Button>\r\n <Button variant=\"contained\"\r\n startIcon={<IconClose/>}\r\n onClick={() => this.setState({showListOfDevices: false})} autoFocus>{I18n.t('Close')}</Button>\r\n </DialogActions>\r\n </Dialog>;\r\n }\r\n\r\n render() {\r\n if (this.state.loading) {\r\n return <CircularProgress key=\"alexaProgress\" />;\r\n }\r\n\r\n return <form key=\"alexa\" className={this.props.classes.tab}>\r\n <Fab size=\"small\" color=\"secondary\" aria-label=\"Add\" className={this.props.classes.button} onClick={() => this.setState({showSelectId: true})}><IconAdd /></Fab>\r\n <Fab size=\"small\" color=\"primary\" aria-label=\"Refresh\" className={this.props.classes.button}\r\n onClick={() => this.browse(true)} disabled={this.state.browse}>{this.state.browse ? <CircularProgress size={20} /> : <IconRefresh/>}</Fab>\r\n <Fab style={{marginLeft: '1rem'}}\r\n title={I18n.t('Show all devices for print out')}\r\n size=\"small\" aria-label=\"List of devices\" className={this.props.classes.button}\r\n onClick={() => this.setState({showListOfDevices: true})} disabled={this.state.browse}><IconList/></Fab>\r\n <TextField\r\n placeholder={I18n.t('Filter')}\r\n className={this.state.filter}\r\n value={this.state.filter}\r\n onChange={e => this.setState({filter: e.target.value})}\r\n InputProps={{\r\n endAdornment: this.state.filter ?\r\n <IconButton onClick={() => this.setState({ filter: '' })}>\r\n <IconClear />\r\n </IconButton> : undefined,\r\n }}\r\n />\r\n {this.renderDevices()}\r\n {this.renderMessage()}\r\n {this.renderEditDialog()}\r\n {this.getSelectIdDialog()}\r\n {this.renderConfirmDialog()}\r\n {this.renderListOfDevices()}\r\n </form>;\r\n }\r\n}\r\n\r\nAlexaSmartNames.propTypes = {\r\n common: PropTypes.object.isRequired,\r\n native: PropTypes.object.isRequired,\r\n instance: PropTypes.number.isRequired,\r\n adapterName: PropTypes.string.isRequired,\r\n onError: PropTypes.func,\r\n onLoad: PropTypes.func,\r\n onChange: PropTypes.func,\r\n socket: PropTypes.object.isRequired,\r\n themeType: PropTypes.string,\r\n};\r\n\r\nexport default withStyles(styles)(AlexaSmartNames);\r\n","import React, {Component} from 'react';\r\nimport {withStyles} from '@material-ui/core/styles';\r\nimport PropTypes from 'prop-types';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport Button from '@material-ui/core/Button';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Fab from '@material-ui/core/Fab';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Badge from '@material-ui/core/Badge';\r\nimport Select from '@material-ui/core/Select';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport FormHelperText from '@material-ui/core/FormHelperText';\r\nimport FormControl from '@material-ui/core/FormControl';\r\n\r\nimport {MdEdit as IconEdit} from 'react-icons/md';\r\nimport {MdAdd as IconAdd} from 'react-icons/md';\r\nimport {MdRefresh as IconRefresh} from 'react-icons/md';\r\nimport {MdClear as IconClear} from 'react-icons/md';\r\nimport {MdDelete as IconDelete} from 'react-icons/md';\r\nimport {MdFormatAlignJustify as IconExpand} from 'react-icons/md';\r\nimport {MdDragHandle as IconCollapse} from 'react-icons/md';\r\nimport {MdList as IconList} from 'react-icons/md';\r\nimport {FaPowerOff as IconOn} from 'react-icons/fa';\r\nimport {FaThermometerHalf as IconTemperature} from 'react-icons/fa';\r\nimport {FaLongArrowAltUp as IconUp} from 'react-icons/fa';\r\nimport {FaLongArrowAltDown as IconDown} from 'react-icons/fa';\r\nimport {FaPalette as IconColor} from 'react-icons/fa';\r\nimport {FaLightbulb as IconBulb} from 'react-icons/fa';\r\nimport {FaLockOpen as IconLock} from 'react-icons/fa';\r\nimport {FaThermometer as IconThermometer} from 'react-icons/fa';\r\nimport {FaTint as IconHumidity} from 'react-icons/fa';\r\nimport {FaMale as IconMotion} from 'react-icons/fa';\r\nimport {FaLink as IconContact} from 'react-icons/fa';\r\nimport IconCopy from '@material-ui/icons/FileCopy';\r\nimport IconClose from '@material-ui/icons/Close';\r\n\r\nimport Utils from '@iobroker/adapter-react/Components/Utils'\r\nimport I18n from '@iobroker/adapter-react/i18n';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport MessageDialog from '@iobroker/adapter-react/Dialogs/Message';\r\nimport DialogSelectID from '@iobroker/adapter-react/Dialogs/SelectID';\r\nimport copy from \"copy-to-clipboard\";\r\nimport IconCheck from \"@material-ui/icons/Check\";\r\n\r\nconst colorOn = '#aba613';\r\nconst colorOff = '#444';\r\nconst colorSet = '#00c6ff';\r\nconst colorRGB = '#ff7ee3';\r\nconst colorRead = '#00bc00';\r\n//const colorThermometer = '#bc1600';\r\nconst CHANGED_COLOR = '#e7000040';\r\nconst DEFAULT_CHANNEL_COLOR_DARK = '#4f4f4f';\r\nconst DEFAULT_CHANNEL_COLOR_LIGHT = '#e9e9e9';\r\nconst LAST_CHANGED_COLOR_DARK = '#5c8f65';\r\nconst LAST_CHANGED_COLOR_LIGHT = '#b4ffbe';\r\n\r\nconst actionsMapping = {\r\n OnOff: {color: colorOn, icon: IconOn, desc: 'On/Off'},\r\n Brightness: {color: colorSet, icon: IconBulb, desc: 'Dimmer'},\r\n RGB: {color: colorRGB, icon: IconBulb, desc: 'Set color'},\r\n\r\n setTargetTemperature: {color: colorSet, icon: IconTemperature, desc: 'Set target temperature'},\r\n incrementTargetTemperature: {color: colorOn, icon: IconUp, desc: 'Increment target temperature'},\r\n decrementTargetTemperature: {color: colorOff, icon: IconDown, desc: 'Decrement target temperature'},\r\n\r\n incrementPercentage: {color: colorOn, icon: IconUp, desc: 'Increment percentage'},\r\n decrementPercentage: {color: colorOff, icon: IconDown, desc: 'Decrement percentage'},\r\n\r\n setColor: {color: colorSet, icon: IconColor, desc: 'Set color'},\r\n\r\n incrementColorTemperature: {color: colorOn, icon: IconUp, desc: 'Increment color temperature'},\r\n decrementColorTemperature: {color: colorOff, icon: IconDown, desc: 'Decrement color temperature'},\r\n\r\n getTargetTemperature: {color: colorRead, icon: IconThermometer, desc: 'Get target temperature'},\r\n getTemperatureReading: {color: colorRead, icon: IconThermometer, desc: 'Get actual temperature'},\r\n\r\n setLockState: {color: colorSet, icon: IconLock, desc: 'Set lock state'},\r\n getLockState: {color: colorRead, icon: IconLock, desc: 'Read lock state'},\r\n\r\n getActualTemperature: {color: colorRead, icon: IconThermometer, desc: 'Get actual temperature'},\r\n getActualHumidity: {color: colorRead, icon: IconHumidity, desc: 'Get actual humidity'},\r\n\r\n getMotion: {color: colorRead, icon: IconMotion, desc: 'Get motion'},\r\n getContact: {color: colorRead, icon: IconContact, desc: 'Get contact'},\r\n\r\n};\r\n\r\nconst SMARTTYPES = ['LIGHT', 'SWITCH', 'THERMOSTAT', 'ACTIVITY_TRIGGER', 'SCENE_TRIGGER', 'SMARTPLUG', 'SMARTLOCK', 'CAMERA', 'THERMOSTAT.AC', 'VACUUM_CLEANER'];\r\n\r\nconst styles = theme => ({\r\n tab: {\r\n width: '100%',\r\n height: '100%'\r\n },\r\n column: {\r\n display: 'inline-block',\r\n verticalAlign: 'top',\r\n marginRight: 20,\r\n height: '100%',\r\n overflow: 'hidden'\r\n },\r\n columnDiv: {\r\n height: 'calc(100% - 40px)',\r\n overflow: 'auto',\r\n minWidth: 300\r\n },\r\n filter: {\r\n margin: 0\r\n },\r\n button: {\r\n marginRight: 20\r\n },\r\n devLineExpand: {\r\n marginRight: 10,\r\n },\r\n devLineEnabled: {\r\n position: 'absolute',\r\n right: 0,\r\n top: 0,\r\n },\r\n devLineEdit: {\r\n position: 'absolute',\r\n top: 5,\r\n right: 50\r\n },\r\n devLineDelete: {\r\n position: 'absolute',\r\n top: 5,\r\n right: 0\r\n },\r\n devLineName: {\r\n\r\n },\r\n devLineNumber:{\r\n display: 'inline-block',\r\n verticalAlign: 'middle',\r\n width: 15,\r\n },\r\n editedId: {\r\n fontStyle: 'italic'\r\n },\r\n enumLineSubName:{\r\n fontStyle: 'italic',\r\n },\r\n devLine: {\r\n height: 48,\r\n width: '100%',\r\n position: 'relative'\r\n },\r\n devLineDescription: {\r\n display: 'block',\r\n fontStyle: 'italic',\r\n fontSize: 12\r\n },\r\n devLineActions: {\r\n fontStyle: 'italic',\r\n fontSize: 12,\r\n paddingLeft: 50,\r\n display: 'inline-block',\r\n },\r\n devLineProgress: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n },\r\n channelLineActions: {\r\n width: 80\r\n },\r\n devLineNameBlock: {\r\n display: 'inline-block',\r\n width: 'calc(100% - 350px)'\r\n },\r\n columnHeader: {\r\n background: theme.palette.primary.light,\r\n padding: 10,\r\n color: theme.palette.primary.contrastText\r\n },\r\n devModified: {\r\n fontStyle: 'italic'\r\n },\r\n actionIcon: {\r\n width: 16\r\n },\r\n\r\n devSubLine: {\r\n position: 'relative',\r\n height: 48\r\n },\r\n devSubLineName: {\r\n marginLeft: 5,\r\n marginTop: 14,\r\n minWidth: 100,\r\n display: 'inline-block',\r\n fontSize: 13,\r\n paddingLeft: 70,\r\n //width: 'calc(100% - 400px)'\r\n },\r\n devSubSubLine: {\r\n fontSize: 10,\r\n fontStyle: 'italic',\r\n display: 'inline-block',\r\n marginLeft: 15\r\n },\r\n devSubLineSetId: {\r\n fontStyle: 'italic',\r\n display: 'block',\r\n color: '#999'\r\n },\r\n devSubLineByOn: {\r\n marginLeft: 5\r\n },\r\n devSubLineDelete: {\r\n position: 'absolute',\r\n top: 12,\r\n right: 12,\r\n padding: 0\r\n },\r\n devSubLineEdit: {\r\n position: 'absolute',\r\n top: 12,\r\n right: 62,\r\n padding: 0\r\n },\r\n devSubLineTypeTitle: {\r\n marginTop: 0\r\n },\r\n headerRow: {\r\n paddingLeft: theme.spacing(1),\r\n background: theme.palette.primary.main,\r\n },\r\n headerCell: {\r\n display: 'inline-block',\r\n verticalAlign: 'top',\r\n width: '100%'\r\n },\r\n tableCell: {\r\n display: 'inline-block',\r\n verticalAlign: 'top',\r\n width: '100%'\r\n },\r\n});\r\n\r\nclass AlisaDevices extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n if (!actionsMapping.translated) {\r\n Object.keys(actionsMapping).forEach(a => actionsMapping[a].desc = I18n.t(actionsMapping[a].desc));\r\n actionsMapping.translated = true;\r\n }\r\n\r\n this.state = {\r\n editedSmartName: '',\r\n editId: '',\r\n editObjectName: '',\r\n deleteId: '',\r\n\r\n showSelectId: false,\r\n showConfirmation: '',\r\n changed: [],\r\n devices: [],\r\n message: '',\r\n filter: '',\r\n loading: true,\r\n browse: false,\r\n expanded: [],\r\n lastChanged: ''\r\n };\r\n\r\n this.timerChanged = null;\r\n this.browseTimer = null;\r\n this.browseTimerCount = 0;\r\n this.editedSmartName = '';\r\n\r\n this.waitForUpdateID = null;\r\n this.onReadyUpdateBound = this.onReadyUpdate.bind(this);\r\n this.onResultUpdateBound = this.onResultUpdate.bind(this);\r\n\r\n this.props.socket.getObject(`system.adapter.${this.props.adapterName}.${this.props.instance}`).then(obj => {\r\n this.props.socket.getState(`system.adapter.${this.props.adapterName}.${this.props.instance}.alive`).then(state => {\r\n if (!obj || !obj.common || (!obj.common.enabled && (!state || !state.val))) {\r\n this.setState({message: I18n.t('Instance must be enabled'), loading: false, devices: []});\r\n } else {\r\n this.browse();\r\n }\r\n });\r\n });\r\n }\r\n\r\n browse(isIndicate) {\r\n if (Date.now() - this.lastBrowse < 500) {\r\n return;\r\n }\r\n\r\n this.lastBrowse = Date.now();\r\n\r\n if (isIndicate) {\r\n this.setState({loading: true, browse: true});\r\n } else {\r\n this.setState({browse: true});\r\n }\r\n\r\n this.browseTimer = setTimeout(() => {\r\n this.browseTimer = null;\r\n this.browseTimerCount++;\r\n if (this.browseTimerCount < 5) {\r\n this.browse(isIndicate);\r\n } else {\r\n this.setState({message: I18n.t('Cannot read devices!')});\r\n }\r\n }, 10000);\r\n\r\n this.props.socket.sendTo(this.props.adapterName + '.' + this.props.instance, 'browseAlisa', null)\r\n .then(list => {\r\n this.browseTimer && clearTimeout(this.browseTimer);\r\n this.browseTimerCount = 0;\r\n this.browseTimer = null;\r\n\r\n if (list && list.error) {\r\n this.setState({message: I18n.t(list.error)});\r\n } else {\r\n if (this.waitForUpdateID) {\r\n if (!this.onEdit(this.waitForUpdateID, list)) {\r\n this.setState({message: I18n.t('Device %s was not added', this.waitForUpdateID)});\r\n }\r\n this.waitForUpdateID = null;\r\n }\r\n\r\n this.setState({devices: list, loading: false, changed: [], browse: false});\r\n }\r\n });\r\n }\r\n\r\n onReadyUpdate(id, state) {\r\n if (state && state.ack === true && state.val === true) {\r\n if (this.devTimer) clearTimeout(this.devTimer);\r\n this.devTimer = setTimeout(() => {\r\n this.devTimer = null;\r\n this.browse();\r\n }, 300);\r\n }\r\n }\r\n\r\n onResultUpdate(id, state) {\r\n state && state.ack === true && state.val && this.setState({message: state.val});\r\n }\r\n\r\n componentDidMount() {\r\n this.props.socket.subscribeState(`${this.props.adapterName}.${this.props.instance}.smart.updates`, this.onReadyUpdateBound);\r\n this.props.socket.subscribeState(`${this.props.adapterName}.${this.props.instance}.smart.updatesResult`, this.onResultUpdateBound);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.socket.unsubscribeState(`${this.props.adapterName}.${this.props.instance}.smart.updates`, this.onReadyUpdateBound);\r\n this.props.socket.unsubscribeState(`${this.props.adapterName}.${this.props.instance}.smart.updatesResult`, this.onResultUpdateBound);\r\n if (this.timerChanged) {\r\n clearTimeout(this.timerChanged);\r\n this.timerChanged = null;\r\n }\r\n }\r\n\r\n informInstance(id) {\r\n this.props.socket.sendTo(this.props.adapterName + '.' + this.props.instance, 'update', id);\r\n }\r\n\r\n addChanged(id, cb) {\r\n const changed = JSON.parse(JSON.stringify(this.state.changed));\r\n if (!changed.includes(id)) {\r\n changed.push(id);\r\n this.setState({changed}, () => cb && cb());\r\n } else {\r\n cb && cb();\r\n }\r\n }\r\n\r\n removeChanged(id) {\r\n const changed = JSON.parse(JSON.stringify(this.state.changed));\r\n const pos = changed.indexOf(id);\r\n\r\n if (pos !== -1) {\r\n changed.splice(pos, 1);\r\n this.setState({changed});\r\n }\r\n }\r\n\r\n onEdit(id, devices) {\r\n devices = devices || this.state.devices;\r\n const device = devices.find(dev => dev.iobID === id);\r\n if (device) {\r\n this.props.socket.getObject(id)\r\n .then(obj => {\r\n let smartName = device.name;\r\n if (typeof smartName === 'object' && smartName) {\r\n smartName = smartName[I18n.getLanguage()] || smartName.en;\r\n }\r\n this.editedSmartName = smartName;\r\n this.setState({editId: id, editedSmartName: smartName, editObjectName: smartName/* Utils.getObjectNameFromObj(obj, null, {language: I18n.getLanguage()})*/});\r\n });\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n onAskDelete(deleteId) {\r\n this.setState({deleteId, showConfirmation: true});\r\n }\r\n\r\n onDelete() {\r\n let id = this.state.deleteId;\r\n // const device = this.state.devices.find(dev => dev.additionalApplianceDetails.id === id);\r\n this.addChanged(id, () => {\r\n this.props.socket.getObject(id)\r\n .then(obj => {\r\n Utils.disableSmartName(obj, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\r\n return this.props.socket.setObject(id, obj);\r\n })\r\n .then(() => {\r\n this.setState({deleteId: '', showConfirmation: false, lastChanged: id});\r\n\r\n this.timerChanged && clearTimeout(this.timerChanged);\r\n this.timerChanged = setTimeout(() => {\r\n this.setState({lastChanged: ''});\r\n this.timerChanged = null;\r\n }, 30000);\r\n\r\n // update obj\r\n this.informInstance(id);\r\n })\r\n .catch(err => this.props.onError(err));\r\n });\r\n }\r\n\r\n renderActions(dev) {\r\n // Type\r\n const actions = [];\r\n if (!dev.actions) {\r\n console.log('Something went wrong');\r\n return null;\r\n }\r\n\r\n dev.actions.sort((a, b) => {\r\n if (a === b) {\r\n return 0;\r\n }\r\n if (a === 'OnOff') {\r\n return -1;\r\n }\r\n if (b === 'OnOff') {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n\r\n Object.keys(actionsMapping).forEach(action => {\r\n if (dev.actions.includes(action)) {\r\n const Icon = actionsMapping[action].icon;\r\n actions.push(<span key={action} title={actionsMapping[action].desc}>\r\n <Icon className={this.props.classes.actionIcon} style={{color: actionsMapping[action].color}}/>\r\n </span>);\r\n }\r\n });\r\n // add unknown actions\r\n for (let a = 0; a < dev.actions.length; a++) {\r\n if (!actionsMapping[dev.actions[a]]) {\r\n actions.push(<span key={dev.actions[a]}>{dev.actions[a]}</span>);\r\n }\r\n }\r\n return actions;\r\n }\r\n\r\n onExpand(lineNum) {\r\n const expanded = JSON.parse(JSON.stringify(this.state.expanded));\r\n const pos = expanded.indexOf(this.state.devices[lineNum].name);\r\n if (pos === -1) {\r\n expanded.push(this.state.devices[lineNum].name);\r\n } else {\r\n expanded.splice(pos, 1);\r\n }\r\n this.setState({expanded});\r\n }\r\n\r\n onParamsChange(id, byON, type) {\r\n this.addChanged(id, () => {\r\n this.props.socket.getObject(id)\r\n .then(obj => {\r\n Utils.updateSmartName(obj, undefined, byON, type, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\r\n\r\n if (this.state.lastChanged !== id) {\r\n this.setState({lastChanged: id});\r\n this.timerChanged && clearTimeout(this.timerChanged);\r\n this.timerChanged = setTimeout(() => {\r\n this.setState({lastChanged: ''});\r\n this.timerChanged = null;\r\n }, 30000);\r\n }\r\n\r\n return this.props.socket.setObject(id, obj);\r\n })\r\n .then(() => {\r\n // update obj\r\n this.informInstance(id);\r\n })\r\n .catch(err => this.props.onError(err));\r\n });\r\n }\r\n\r\n renderSelectType(dev, lineNum, id, type) {\r\n if (type !== false) {\r\n const items = [<MenuItem key=\"_\" value=\"_\"><em>{I18n.t('no type')}</em></MenuItem>];\r\n for (let i = 0; i < SMARTTYPES.length; i++) {\r\n items.push(<MenuItem key={SMARTTYPES[i]} value={SMARTTYPES[i]}><em>{I18n.t(SMARTTYPES[i])}</em></MenuItem>);\r\n }\r\n return <FormControl>\r\n <Select value={type || '_'} onChange={e => this.onParamsChange(id, undefined, e.target.value)}>{items}</Select>\r\n <FormHelperText className={this.props.classes.devSubLineTypeTitle}>{I18n.t('Types')}</FormHelperText>\r\n </FormControl>;\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n renderChannels(dev, lineNum) {\r\n const result = [];\r\n const classes = this.props.classes;\r\n\r\n const id = dev.main.getId || dev.iobID;\r\n const name = dev.func;\r\n let background = this.props.themeType === 'dark' ? DEFAULT_CHANNEL_COLOR_DARK : DEFAULT_CHANNEL_COLOR_LIGHT;/*this.state.changed.indexOf(id) !== -1 ? CHANGED_COLOR : DEFAULT_CHANNEL_COLOR;\r\n if (this.state.lastChanged === id && background === DEFAULT_CHANNEL_COLOR) {\r\n background = LAST_CHANGED_COLOR;\r\n }*/\r\n result.push(<div key={'sub' + id + '_' + lineNum} className={classes.devSubLine} style={{background}}>\r\n <div className={classes.devSubLineName}>{name.toUpperCase()}</div>\r\n <div className={classes.devSubSubLine}>\r\n <div>{dev.main.getId}</div>\r\n {dev.main.setId && dev.main.setId !== dev.main.getId ? <div className={classes.devSubLineSetId}>{dev.main.setId}</div> : null}\r\n </div>\r\n </div>);\r\n\r\n dev.attributes.forEach(attr => {\r\n result.push(<div key={'sub' + attr.getId} className={classes.devSubLine} style={{background}}>\r\n <div className={classes.devSubLineName}>{attr.name.toUpperCase()}</div>\r\n <div className={classes.devSubSubLine}>\r\n <div>{attr.getId}</div>\r\n {attr.setId && attr.setId !== attr.getId ? <div className={classes.devSubLineSetId}>{attr.setId}</div> : null}\r\n </div>\r\n </div>);\r\n });\r\n\r\n /*if (dev.additionalApplianceDetails.group) {\r\n const channels = dev.additionalApplianceDetails.channels;\r\n const names = dev.additionalApplianceDetails.names;\r\n const types = dev.additionalApplianceDetails.byONs;\r\n const smarttypes = dev.additionalApplianceDetails.smartTypes;\r\n\r\n let c = 0;\r\n for (const chan in channels) {\r\n if (channels.hasOwnProperty(chan)) {\r\n for (let i = 0; i < channels[chan].length; i++) {\r\n const id = channels[chan][i].id;\r\n let background = this.state.changed.indexOf(id) !== -1 ? CHANGED_COLOR : DEFAULT_CHANNEL_COLOR;\r\n if (this.state.lastChanged === id && background === DEFAULT_CHANNEL_COLOR) {\r\n background = LAST_CHANGED_COLOR;\r\n }\r\n result.push(<div key={'sub' + id} className={classes.devSubLine} style={(c % 2) ? {} : {background}}>\r\n <div className={clsx(this.props.classes.devLineActions,this.props.classes.channelLineActions)}>{this.renderActions(channels[chan][i])}</div>\r\n <div className={classes.devSubLineName} title={id}>{(names[id] || id)}\r\n {id !== names[id] ? <span className={classes.devSubSubLineName}>{id}</span> : null}\r\n </div>\r\n {this.renderSelectType(dev, lineNum, id, smarttypes[id])}\r\n {this.renderSelectByOn(dev, lineNum, id, types[id])}\r\n <IconButton aria-label=\"Delete\" className={this.props.classes.devSubLineDelete} onClick={() => this.onAskDelete(id, lineNum)}><IconDelete fontSize=\"middle\" /></IconButton>\r\n </div>);\r\n c++;\r\n }\r\n }\r\n }\r\n } else {\r\n }*/\r\n return result;\r\n }\r\n\r\n renderDevice(dev, lineNum) {\r\n //return <div key={lineNum}>{JSON.stringify(dev)}</div>;\r\n const expanded = this.state.expanded.includes(dev.name);\r\n let background = (lineNum % 2) ? (this.props.themeType === 'dark' ? '#272727' : '#f1f1f1') : 'inherit';\r\n const changed = this.state.changed.includes(dev.iobID);\r\n if (changed) {\r\n background = CHANGED_COLOR;\r\n } else if (dev.iobID === this.state.lastChanged) {\r\n background = this.props.themeType === 'dark' ? LAST_CHANGED_COLOR_DARK : LAST_CHANGED_COLOR_LIGHT;\r\n }\r\n\r\n //const isComplex = dev.\r\n\r\n return [\r\n <div key={'line' + lineNum} className={this.props.classes.devLine} style={{background}}>\r\n <div className={this.props.classes.devLineNumber}>{lineNum + 1}.</div>\r\n <IconButton className={this.props.classes.devLineExpand} onClick={() => this.onExpand(lineNum)}>\r\n {dev.attributes.length ?\r\n <Badge badgeContent={dev.attributes.length} color=\"primary\">{expanded ? <IconCollapse/> : <IconExpand />}</Badge> :\r\n (expanded ? <IconCollapse/> : <IconExpand />)}\r\n </IconButton>\r\n <div className={this.props.classes.devLineNameBlock} style={{display: 'inline-block', position: 'relative'}}>\r\n <span className={this.props.classes.devLineName}>{dev.name}</span>\r\n <span className={this.props.classes.devLineDescription}>{dev.description}</span>\r\n {changed ? <CircularProgress className={this.props.classes.devLineProgress} size={20}/> : null}\r\n </div>\r\n <span className={this.props.classes.devLineActions}>{this.renderActions(dev)}</span>\r\n <IconButton aria-label=\"Edit\" className={this.props.classes.devLineEdit} onClick={() => this.onEdit(dev.iobID)}><IconEdit fontSize=\"middle\" /></IconButton>\r\n <IconButton aria-label=\"Delete\" className={this.props.classes.devLineDelete} onClick={() => this.onAskDelete(dev.iobID)}><IconDelete fontSize=\"middle\" /></IconButton>\r\n\r\n </div>,\r\n expanded ? this.renderChannels(dev, lineNum) : null\r\n ];\r\n }\r\n\r\n renderMessage() {\r\n if (this.state.message) {\r\n return <MessageDialog text={this.state.message} onClose={() => this.setState({message: ''})}/>;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n changeSmartName(e) {\r\n e && e.preventDefault();\r\n // Check if the name is duplicate\r\n this.addChanged(this.state.editId, () => {\r\n const id = this.state.editId;\r\n this.setState({editId: '', editObjectName: '', lastChanged: id});\r\n\r\n this.timerChanged && clearTimeout(this.timerChanged);\r\n this.timerChanged = setTimeout(() => {\r\n this.setState({lastChanged: ''});\r\n this.timerChanged = null;\r\n }, 30000);\r\n\r\n this.props.socket.getObject(id)\r\n .then(obj => {\r\n Utils.updateSmartName(obj, this.editedSmartName, undefined, undefined, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\r\n return this.props.socket.setObject(id, obj);\r\n })\r\n // update obj\r\n .then(() => this.informInstance(id))\r\n .catch(err => this.props.onError(err));\r\n });\r\n }\r\n\r\n renderEditDialog() {\r\n if (this.state.editId) {\r\n return <Dialog\r\n open={true}\r\n maxWidth=\"sm\"\r\n fullWidth={true}\r\n onClose={() => {\r\n this.editedSmartName = null;\r\n this.setState({editId: '', editedSmartName: ''});\r\n }}\r\n aria-labelledby=\"message-dialog-title\"\r\n aria-describedby=\"message-dialog-description\"\r\n >\r\n <DialogTitle id=\"message-dialog-title\">{this.props.title || I18n.t('Smart name for %s', this.state.editObjectName)}</DialogTitle>\r\n <DialogContent>\r\n <p><span>ID:</span> <span className={this.props.classes.editedId}>{this.state.editId}</span></p>\r\n <TextField\r\n style={{width: '100%'}}\r\n label={I18n.t('Smart name')}\r\n autoFocus\r\n onKeyDown={e =>\r\n e.keyCode === 13 && this.changeSmartName(e)}\r\n onChange={e => this.editedSmartName = e.target.value}\r\n defaultValue={this.state.editedSmartName}\r\n helperText={I18n.t('You can enter several names divided by comma')}\r\n margin=\"normal\"\r\n />\r\n </DialogContent>\r\n <DialogActions>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => this.changeSmartName()}\r\n color=\"primary\"\r\n startIcon={<IconCheck/>}\r\n >{I18n.t('Ok')}</Button>\r\n <Button\r\n variant=\"contained\"\r\n startIcon={<IconClose/>}\r\n onClick={() => {\r\n this.editedSmartName = null;\r\n this.setState({editId: '', editedSmartName: ''});\r\n }}>{I18n.t('Cancel')}</Button>\r\n </DialogActions>\r\n </Dialog>;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n renderConfirmDialog() {\r\n if (this.state.showConfirmation) {\r\n return <Dialog\r\n open={true}\r\n maxWidth=\"sm\"\r\n fullWidth={true}\r\n onClose={() => this.setState({showConfirmation: ''})}\r\n aria-labelledby=\"confirmation-dialog-title\"\r\n aria-describedby=\"confirmation-dialog-description\"\r\n >\r\n <DialogTitle id=\"confirmation-dialog-title\">{this.props.title || I18n.t('Device %s will be disabled.', this.state.deleteId)}</DialogTitle>\r\n <DialogContent>\r\n <p>{I18n.t('Are you sure?')}</p>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => this.onDelete()}\r\n color=\"primary\"\r\n autoFocus\r\n startIcon={<IconDelete/>}\r\n >{I18n.t('Delete')}</Button>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => this.setState({showConfirmation: ''})}\r\n startIcon={<IconClose/>}\r\n >{I18n.t('Cancel')}</Button>\r\n </DialogActions>\r\n </Dialog>;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n getSelectIdDialog() {\r\n if (this.state.showSelectId) {\r\n return <DialogSelectID\r\n key=\"dialogSelectAlisa\"\r\n imagePrefix=\"../..\"\r\n socket={this.props.socket}\r\n selected={''}\r\n types={['state']}\r\n onClose={() => this.setState({showSelectId: false})}\r\n onOk={(selected, name) => {\r\n this.setState({showSelectId: false});\r\n\r\n this.props.socket.getObject(selected)\r\n .then(obj => {\r\n if (obj) {\r\n const name = Utils.getObjectNameFromObj(obj, null, {language: I18n.getLanguage()});\r\n Utils.updateSmartName(obj, (name || I18n.t('Device name')).replace(/[-_.]+/g, ' '), undefined, undefined, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\r\n this.addChanged(obj._id);\r\n this.waitForUpdateID = obj._id;\r\n\r\n if (this.state.lastChanged !== obj._id) {\r\n this.setState({lastChanged: obj._id});\r\n this.timerChanged && clearTimeout(this.timerChanged);\r\n this.timerChanged = setTimeout(() => {\r\n this.setState({lastChanged: ''});\r\n this.timerChanged = null;\r\n }, 30000);\r\n }\r\n\r\n this.props.socket.setObject(obj._id, obj)\r\n .then(() => this.informInstance(obj._id))\r\n .catch(err => this.setState({message: err}));\r\n } else {\r\n this.setState({message: I18n.t('Invalid ID')});\r\n }\r\n });\r\n }}\r\n />;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n renderDevices() {\r\n const filter = this.state.filter.toLowerCase();\r\n const result = [];\r\n for (let i = 0; i < this.state.devices.length; i++) {\r\n if (this.state.filter && this.state.devices[i].name.toLowerCase().indexOf(filter) === -1 ) {\r\n continue;\r\n }\r\n result.push(this.renderDevice(this.state.devices[i], i));\r\n }\r\n return <div key=\"listDevices\" className={this.props.classes.columnDiv}>{result}</div>;\r\n }\r\n\r\n renderListOfDevices() {\r\n if (!this.state.showListOfDevices) {\r\n return null;\r\n }\r\n const classes = this.props.classes;\r\n\r\n return <Dialog\r\n open={true}\r\n maxWidth=\"xl\"\r\n fullWidth\r\n onClose={() => this.setState({showListOfDevices: false})}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">{I18n.t('List of devices to print out, e.g. to give all device names to your partner.')} <span role=\"img\" aria-label=\"smile\">😄</span></DialogTitle>\r\n <DialogContent>\r\n <div className={ classes.headerRow } >\r\n <div className={ classes.headerCell }>{ I18n.t('Name') }</div>\r\n </div>\r\n <div className={ this.props.classes.tableDiv } >\r\n { this.state.devices.map((item, i) => <div key={i}>\r\n <div className={ classes.tableCell }>{ item.name }</div>\r\n </div>)\r\n }\r\n </div>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button variant=\"outlined\" onClick={() => {\r\n this.setState({showListOfDevices: false});\r\n const lines = this.state.devices.map(item => item.name);\r\n copy(lines.join('\\n'));\r\n }}\r\n color=\"primary\"\r\n startIcon={<IconCopy/>}\r\n >{I18n.t('Copy to clipboard')}</Button>\r\n <Button\r\n variant=\"contained\"\r\n startIcon={<IconClose/>}\r\n onClick={() => this.setState({showListOfDevices: false})} autoFocus>{I18n.t('Close')}</Button>\r\n </DialogActions>\r\n </Dialog>;\r\n }\r\n\r\n render() {\r\n if (this.state.loading) {\r\n return <CircularProgress key=\"alexaProgress\" />;\r\n }\r\n\r\n return <form key=\"alexa\" className={this.props.classes.tab}>\r\n <Fab size=\"small\" color=\"secondary\" aria-label=\"Add\" className={this.props.classes.button} onClick={() => this.setState({showSelectId: true})}><IconAdd /></Fab>\r\n <Fab size=\"small\" color=\"primary\" aria-label=\"Refresh\" className={this.props.classes.button}\r\n onClick={() => this.browse(true)} disabled={this.state.browse}>{this.state.browse ? <CircularProgress size={20} /> : <IconRefresh/>}</Fab>\r\n <Fab style={{marginLeft: '1rem'}}\r\n title={I18n.t('Show all devices for print out')}\r\n size=\"small\" aria-label=\"List of devices\" className={this.props.classes.button}\r\n onClick={() => this.setState({showListOfDevices: true})} disabled={this.state.browse}><IconList/></Fab>\r\n <TextField\r\n placeholder={I18n.t('Filter')}\r\n className={this.state.filter}\r\n value={this.state.filter}\r\n onChange={e => this.setState({filter: e.target.value})}\r\n InputProps={{\r\n endAdornment: this.state.filter ? (\r\n <IconButton onClick={() => this.setState({ filter: '' })}>\r\n <IconClear />\r\n </IconButton>\r\n ) : undefined,\r\n }}\r\n />\r\n {this.renderDevices()}\r\n {this.renderMessage()}\r\n {this.renderEditDialog()}\r\n {this.getSelectIdDialog()}\r\n {this.renderConfirmDialog()}\r\n {this.renderListOfDevices()}\r\n </form>;\r\n }\r\n}\r\n\r\nAlisaDevices.propTypes = {\r\n common: PropTypes.object.isRequired,\r\n native: PropTypes.object.isRequired,\r\n instance: PropTypes.number.isRequired,\r\n adapterName: PropTypes.string.isRequired,\r\n onError: PropTypes.func,\r\n onLoad: PropTypes.func,\r\n onChange: PropTypes.func,\r\n socket: PropTypes.object.isRequired,\r\n themeType: PropTypes.string,\r\n};\r\n\r\nexport default withStyles(styles)(AlisaDevices);\r\n","import React from 'react';\r\n\r\nimport PropTypes from 'prop-types';\r\nimport {withStyles} from '@material-ui/core/styles';\r\nimport clsx from 'clsx';\r\n\r\nimport Table from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TableRow from '@material-ui/core/TableRow';\r\nimport TableSortLabel from '@material-ui/core/TableSortLabel';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Select from '@material-ui/core/Select';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport TextField from '@material-ui/core/TextField';\r\n\r\nimport IconEdit from '@material-ui/icons/Edit';\r\nimport IconDelete from '@material-ui/icons/Delete';\r\nimport IconExpand from '@material-ui/icons/NavigateNext';\r\nimport IconCollapse from '@material-ui/icons/ExpandMore';\r\nimport IconCheck from '@material-ui/icons/Check';\r\nimport IconClose from '@material-ui/icons/Close';\r\n\r\nfunction getAttr(obj, attr, lookup) {\r\n if (typeof attr === 'string') {\r\n attr = attr.split('.');\r\n }\r\n\r\n if (!obj) {\r\n return null;\r\n }\r\n\r\n if (attr.length === 1) {\r\n if (lookup && lookup[obj[attr[0]]]) {\r\n return lookup[obj[attr[0]]];\r\n } else {\r\n return obj[attr[0]];\r\n }\r\n } else {\r\n const name = attr.shift();\r\n return getAttr(obj[name], attr);\r\n }\r\n}\r\n\r\nfunction setAttr(obj, attr, value) {\r\n if (typeof attr === 'string') {\r\n attr = attr.split('.');\r\n }\r\n\r\n if (attr.length === 1) {\r\n return obj[attr[0]] = value;\r\n } else {\r\n const name = attr.shift();\r\n if (obj[name] === null || obj[name] === undefined) {\r\n obj[name] = {};\r\n }\r\n return setAttr(obj[name], attr, value);\r\n }\r\n}\r\n\r\nconst styles = theme => ({\r\n tableContainer: {\r\n width: '100%',\r\n height: '100%',\r\n overflow: 'auto'\r\n },\r\n table: {\r\n width: '100%',\r\n minWidth: 800,\r\n maxWidth: 1920,\r\n },\r\n cell: {\r\n paddingTop: 0,\r\n paddingBottom: 0,\r\n paddingLeft: 4,\r\n paddingRight: 4,\r\n },\r\n rowMainWithChildren: {\r\n\r\n },\r\n rowMainWithoutChildren: {\r\n\r\n },\r\n rowNoEdit: {\r\n opacity: 0.3\r\n },\r\n cellExpand: {\r\n width: 30,\r\n },\r\n cellButton: {\r\n width: 30,\r\n },\r\n cellHeader: {\r\n fontWeight: 'bold',\r\n background: theme.palette.type === 'dark' ? '#888' : '#888',\r\n color: theme.palette.type === 'dark' ? '#EEE' : '#111',\r\n height: 48,\r\n wordBreak: 'break-word',\r\n whiteSpace: 'pre',\r\n },\r\n width_name_nicknames: {\r\n maxWidth: 150,\r\n },\r\n width_ioType: {\r\n maxWidth: 100,\r\n },\r\n width_type: {\r\n maxWidth: 100,\r\n },\r\n width_displayTraits: {\r\n maxWidth: 100,\r\n },\r\n width_roomHint: {\r\n maxWidth: 100,\r\n },\r\n rowSecondary: {\r\n fontStyle: 'italic',\r\n },\r\n cellSecondary: {\r\n fontSize: 10,\r\n },\r\n visuallyHidden: {\r\n border: 0,\r\n clip: 'rect(0 0 0 0)',\r\n height: 1,\r\n margin: -1,\r\n overflow: 'hidden',\r\n padding: 0,\r\n position: 'absolute',\r\n top: 20,\r\n width: 1,\r\n },\r\n});\r\n\r\nfunction descendingComparator(a, b, orderBy, lookup) {\r\n const _a = getAttr(a, orderBy, lookup) || '';\r\n const _b = getAttr(b, orderBy, lookup) || '';\r\n\r\n if (_b < _a) {\r\n return -1;\r\n } else\r\n if (_b > _a) {\r\n return 1;\r\n } else {\r\n return 0;\r\n }\r\n}\r\n\r\nfunction getComparator(order, orderBy, lookup) {\r\n return order === 'desc'\r\n ? (a, b) => descendingComparator(a, b, orderBy, lookup)\r\n : (a, b) => -descendingComparator(a, b, orderBy, lookup);\r\n}\r\n\r\nfunction stableSort(array, comparator) {\r\n const stabilizedThis = array.map((el, index) => [el, index]);\r\n\r\n stabilizedThis.sort((a, b) => {\r\n const order = comparator(a[0], b[0]);\r\n if (order) {\r\n return order;\r\n } else {\r\n return a[1] - b[1];\r\n }\r\n });\r\n\r\n return stabilizedThis.map(el => el[0]);\r\n}\r\n\r\nclass TreeTable extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n let opened = window.localStorage.getItem('iot.ghome.opened') || '[]';\r\n try {\r\n opened = JSON.parse(opened) || [];\r\n } catch (e) {\r\n opened = [];\r\n }\r\n if (!Array.isArray(opened)) {\r\n opened = [];\r\n }\r\n\r\n this.state = {\r\n opened,\r\n editMode: false,\r\n deleteMode: false,\r\n editData: null,\r\n order: 'asc',\r\n orderBy: this.props.columns[0].field,\r\n }\r\n }\r\n\r\n renderCell(item, col, level, i) {\r\n if (this.state.editMode === i && col.editable !== 'never') {\r\n let val = getAttr(item, col.field);\r\n if (Array.isArray(val)) {\r\n val = val[0];\r\n }\r\n return <TableCell\r\n key={col.field}\r\n className={clsx(this.props.classes.cell, level && this.props.classes.cellSecondary)}\r\n style={col.cellStyle}\r\n component=\"th\" >{\r\n col.lookup ?\r\n <Select\r\n onChange={e => {\r\n const editData = this.state.editData ? {...this.state.editData} : {};\r\n if (e.target.value === val) {\r\n delete editData[col.field];\r\n } else {\r\n editData[col.field] = e.target.value;\r\n }\r\n this.setState({editData});\r\n }}\r\n value={(this.state.editData && this.state.editData[col.field]) || val}\r\n >\r\n {Object.keys(col.lookup).map(v => <MenuItem value={v}>{col.lookup[v]}</MenuItem>)}\r\n </Select>\r\n :\r\n <TextField\r\n value={this.state.editData && this.state.editData[col.field] !== undefined ? this.state.editData[col.field] : val}\r\n onChange={e => {\r\n const editData = this.state.editData ? {...this.state.editData} : {};\r\n if (e.target.value === val) {\r\n delete editData[col.field];\r\n } else {\r\n editData[col.field] = e.target.value;\r\n }\r\n this.setState({editData});\r\n }}\r\n />\r\n }</TableCell>;\r\n } else {\r\n return <TableCell\r\n key={col.field}\r\n className={clsx(this.props.classes.cell, level && this.props.classes.cellSecondary)}\r\n style={col.cellStyle}\r\n component=\"th\" >{getAttr(item, col.field, col.lookup)}</TableCell>;\r\n }\r\n }\r\n\r\n renderLine(item, level) {\r\n level = level || 0;\r\n const i = this.props.data.indexOf(item);\r\n if (!item) {\r\n return null;\r\n }\r\n if (!level && item.parentId) {\r\n return null;\r\n } else if (level && !item.parentId) {\r\n return null; // should never happens\r\n } else {\r\n // try to find children\r\n const children = this.props.data.filter(it => it.parentId === item.id);\r\n const opened = this.state.opened.includes(item.id);\r\n\r\n return [\r\n <TableRow\r\n key={item.id}\r\n className={clsx(\r\n this.props.classes.row,\r\n level && this.props.classes.rowSecondary,\r\n !level && children.length && this.props.classes.rowMainWithChildren,\r\n !level && !children.length && this.props.classes.rowMainWithoutChildren,\r\n this.state.editMode !== false && this.state.editMode !== i && this.props.classes.rowNoEdit,\r\n this.state.deleteMode !== false && this.state.deleteMode !== i && this.props.classes.rowNoEdit,\r\n )}\r\n >\r\n <TableCell className={clsx(this.props.classes.cell, this.props.classes.cellExpand, level && this.props.classes.cellSecondary)}>\r\n {children.length ? <IconButton onClick={() => {\r\n const opened = [...this.state.opened];\r\n const pos = opened.indexOf(item.id);\r\n if (pos === -1) {\r\n opened.push(item.id);\r\n opened.sort();\r\n } else {\r\n opened.splice(pos, 1);\r\n }\r\n\r\n this.setState({opened});\r\n }}>\r\n {opened ? <IconCollapse/> : <IconExpand/>}\r\n </IconButton> : null}\r\n </TableCell>\r\n <TableCell scope=\"row\"\r\n className={clsx(this.props.classes.cell, level && this.props.classes.cellSecondary)}\r\n style={this.props.columns[0].cellStyle}>\r\n {getAttr(item, this.props.columns[0].field, this.props.columns[0].lookup)}\r\n </TableCell>\r\n {this.props.columns.map((col, ii) =>\r\n !ii ? null : this.renderCell(item, col, level, i))}\r\n <TableCell className={clsx(this.props.classes.cell, this.props.classes.cellButton)}>\r\n {this.state.editMode === i || this.state.deleteMode === i ?\r\n <IconButton\r\n disabled={this.state.editMode !== false && (!this.state.editData || !Object.keys(this.state.editData).length)}\r\n onClick={() => {\r\n if (this.state.editMode !== false) {\r\n const newData = JSON.parse(JSON.stringify(item));\r\n this.state.editData && Object.keys(this.state.editData).forEach(attr => setAttr(newData, attr, this.state.editData[attr]));\r\n this.setState({editMode: false}, () => this.props.onUpdate(newData, item))\r\n } else {\r\n this.setState({deleteMode: false}, () => this.props.onDelete(item))\r\n }\r\n }}>\r\n <IconCheck/>\r\n </IconButton>\r\n :\r\n <IconButton\r\n disabled={this.state.editMode !== false}\r\n onClick={() => this.setState({editMode: i, editData: null})}>\r\n <IconEdit/>\r\n </IconButton>}\r\n </TableCell>\r\n <TableCell className={clsx(this.props.classes.cell, this.props.classes.cellButton)}>\r\n {this.state.editMode === i || this.state.deleteMode === i ?\r\n <IconButton onClick={() => this.setState({editMode: false, deleteMode: false})}>\r\n <IconClose/>\r\n </IconButton>\r\n :\r\n <IconButton\r\n disabled={this.state.deleteMode !== false}\r\n onClick={() => this.setState({deleteMode: i})}>\r\n <IconDelete/>\r\n </IconButton>\r\n }\r\n </TableCell>\r\n </TableRow>,\r\n !level && this.state.opened.includes(item.id) ? children.map(item => this.renderLine(item, level + 1)) : null,\r\n ];\r\n }\r\n }\r\n\r\n handleRequestSort(property) {\r\n const isAsc = this.state.orderBy === property && this.state.order === 'asc';\r\n this.setState({order: isAsc ? 'desc' : 'asc', orderBy: property});\r\n }\r\n\r\n renderHead() {\r\n return <TableHead>\r\n <TableRow>\r\n <TableCell component=\"th\" className={clsx(this.props.classes.cell, this.props.classes.cellHeader, this.props.classes.cellExpand)}/>\r\n <TableCell\r\n component=\"th\"\r\n className={clsx(this.props.classes.cell, this.props.classes.cellHeader, this.props.classes['width_' + this.props.columns[0].field.replace(/\\./g, '_')])}\r\n style={this.props.columns[0].cellStyle}\r\n sortDirection={this.state.orderBy === this.props.columns[0].field ? this.state.order : false}\r\n >\r\n <TableSortLabel\r\n active={this.state.orderBy === this.props.columns[0].field}\r\n direction={this.state.orderBy === this.props.columns[0].field ? this.state.order : 'asc'}\r\n onClick={() => this.handleRequestSort(this.props.columns[0].field)}\r\n >\r\n {this.props.columns[0].title}\r\n {this.state.orderBy === this.props.columns[0].field ?\r\n <span className={this.props.classes.visuallyHidden}>\r\n {this.state.order === 'desc' ? 'sorted descending' : 'sorted ascending'}\r\n </span> : null}\r\n </TableSortLabel>\r\n </TableCell>\r\n {this.props.columns.map((col, i) =>\r\n !i ? null : <TableCell\r\n key={col.field}\r\n className={clsx(this.props.classes.cell, this.props.classes.cellHeader, this.props.classes['width_' + col.field.replace(/\\./g, '_')])}\r\n style={col.cellStyle}\r\n component=\"th\"\r\n >\r\n <TableSortLabel\r\n active={this.state.orderBy === col.field}\r\n direction={this.state.orderBy === col.field ? this.state.order : 'asc'}\r\n onClick={() => this.handleRequestSort(col.field)}\r\n >\r\n {col.title}\r\n {this.state.orderBy === col.field ?\r\n <span className={this.props.classes.visuallyHidden}>\r\n {this.state.order === 'desc' ? 'sorted descending' : 'sorted ascending'}\r\n </span> : null}\r\n </TableSortLabel>\r\n </TableCell>)}\r\n <TableCell component=\"th\" className={clsx(this.props.classes.cell, this.props.classes.cellHeader, this.props.classes.cellButton)}/>\r\n <TableCell component=\"th\" className={clsx(this.props.classes.cell, this.props.classes.cellHeader, this.props.classes.cellButton)}/>\r\n </TableRow>\r\n </TableHead>;\r\n }\r\n\r\n render() {\r\n const lookup = this.props.columns ? this.props.columns.find(col => col.field === this.state.orderBy).lookup : '';\r\n const table = stableSort(this.props.data, getComparator(this.state.order, this.state.orderBy, lookup));\r\n\r\n return <div className={clsx(this.props.classes.tableContainer, this.props.className)}>\r\n <Table className={this.props.classes.table} aria-label=\"simple table\" size=\"small\" stickyHeader={true}>\r\n {this.renderHead()}\r\n <TableBody>\r\n {table.map(item => this.renderLine(item))}\r\n </TableBody>\r\n </Table>\r\n </div>;\r\n }\r\n}\r\n\r\nTreeTable.propTypes = {\r\n data: PropTypes.array.isRequired,\r\n className: PropTypes.string,\r\n loading: PropTypes.bool,\r\n columns: PropTypes.array,\r\n onUpdate: PropTypes.func,\r\n onDelete: PropTypes.func,\r\n themeType: PropTypes.string,\r\n};\r\n\r\nexport default withStyles(styles)(TreeTable);\r\n\r\n","import React, {Component} from 'react';\r\nimport {withStyles} from '@material-ui/core/styles';\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\nimport PropTypes from 'prop-types';\r\nimport copy from 'copy-to-clipboard';\r\n\r\nimport Fab from '@material-ui/core/Fab';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Select from '@material-ui/core/Select';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport FormHelperText from '@material-ui/core/FormHelperText';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport IconButton from '@material-ui/core/IconButton';\r\n\r\nimport IconCopy from '@material-ui/icons/FileCopy';\r\nimport IconClose from '@material-ui/icons/Close';\r\n\r\nimport I18n from '@iobroker/adapter-react/i18n';\r\nimport MessageDialog from '@iobroker/adapter-react/Dialogs/Message';\r\nimport DialogSelectID from '@iobroker/adapter-react/Dialogs/SelectID';\r\nimport Utils from '@iobroker/adapter-react/Components/Utils'\r\nimport ExpertIcon from '@iobroker/adapter-react/icons/IconExpert';\r\n\r\nimport TreeTable from '../Components/TreeTable';\r\n\r\nimport {MdAdd as IconAdd} from 'react-icons/md';\r\nimport {MdRefresh as IconRefresh} from 'react-icons/md';\r\nimport {MdHelpOutline as IconHelp} from 'react-icons/md';\r\nimport {MdList as IconList} from 'react-icons/md';\r\nimport {MdClear as IconClear} from 'react-icons/md';\r\n\r\nconst styles = theme => ({\r\n tab: {\r\n height: '100%',\r\n overflow: 'hidden',\r\n },\r\n tableDiv: {\r\n width: '100%',\r\n overflow: 'hidden',\r\n height: 'calc(100% - 48px)',\r\n },\r\n searchText: {\r\n width: 150,\r\n marginLeft: theme.spacing(1),\r\n verticalAlign: 'middle'\r\n },\r\n headerRow: {\r\n paddingLeft: theme.spacing(1),\r\n background: theme.palette.primary.main,\r\n },\r\n headerCell: {\r\n display: 'inline-block',\r\n verticalAlign: 'top',\r\n width: '30%'\r\n },\r\n tableCell: {\r\n display: 'inline-block',\r\n verticalAlign: 'top',\r\n width: '30%'\r\n },\r\n});\r\n\r\nconst MOBILE_HEIGHT = 400;\r\nconst MOBILE_WIDTH = 400;\r\n\r\nclass GoogleSmartNames extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.myTableRef = React.createRef();\r\n this.state = {\r\n editedSmartName: '',\r\n editId: '',\r\n editObjectName: '',\r\n deleteId: '',\r\n\r\n expertMode: window.localStorage.getItem('App.expertMode') !== 'true',\r\n helpHidden: window.localStorage.getItem('App.helpHidden') === 'true',\r\n showSelectId: false,\r\n searchText: '',\r\n showConfirmation: '',\r\n changed: [],\r\n devices: [],\r\n message: '',\r\n filter: '',\r\n loading: true,\r\n browse: false,\r\n expanded: [],\r\n lastChanged: '',\r\n helpHeight: 0\r\n };\r\n\r\n this.columns = [\r\n {\r\n title: I18n.t('ID'),\r\n field: 'id',\r\n editable: 'never',\r\n cellStyle: {\r\n maxWidth: '12rem',\r\n overflow: 'hidden',\r\n wordBreak: 'break-word'\r\n }\r\n },\r\n {title: I18n.t('Smart names'), field: 'name.nicknames'},\r\n {title: I18n.t('ioBType'), field: 'ioType', editable: 'never', cellStyle: {\r\n maxWidth: '4rem',\r\n overflow: 'hidden',\r\n wordBreak: 'break-word'\r\n }},\r\n {\r\n title: I18n.t('Type'),\r\n field: 'type',\r\n lookup: {\r\n 'action.devices.types.AC_UNIT': 'Air conditioning unit',\r\n 'action.devices.types.AIRFRESHENER': 'Air Freshener',\r\n 'action.devices.types.AIRPURIFIER': 'Air purifier',\r\n 'action.devices.types.AWNING': 'Awning',\r\n 'action.devices.types.BLINDS': 'Blinds',\r\n 'action.devices.types.BOILER': 'Boiler',\r\n 'action.devices.types.CAMERA': 'Camera',\r\n 'action.devices.types.COFFEE_MAKER': 'Coffee maker',\r\n 'action.devices.types.CURTAIN': 'Curtain',\r\n 'action.devices.types.DISHWASHER': 'Dishwasher',\r\n 'action.devices.types.DOOR': 'Door',\r\n 'action.devices.types.DRYER': 'Dryer',\r\n 'action.devices.types.FAN': 'Fan',\r\n 'action.devices.types.FIREPLACE': 'Fireplace',\r\n 'action.devices.types.GARAGE': 'Garage',\r\n 'action.devices.types.GATE': 'Gate',\r\n 'action.devices.types.HEATER': 'Heater',\r\n 'action.devices.types.HOOD': 'Hood',\r\n 'action.devices.types.KETTLE': 'Kettle',\r\n 'action.devices.types.LIGHT': 'Light',\r\n 'action.devices.types.LOCK': 'Lock',\r\n 'action.devices.types.MOP': 'Mop',\r\n 'action.devices.types.MICROWAVE': 'Microwave',\r\n 'action.devices.types.OUTLET': 'Outlet',\r\n 'action.devices.types.OVEN': 'Oven',\r\n 'action.devices.types.PERGOLA': 'Pergola',\r\n 'action.devices.types.REFRIGERATOR': 'Refrigerator',\r\n 'action.devices.types.SCENE': 'Scene',\r\n 'action.devices.types.SECURITYSYSTEM': 'Security System',\r\n 'action.devices.types.SENSOR': 'Sensor',\r\n 'action.devices.types.SHUTTER': 'Shutter',\r\n 'action.devices.types.SHOWER': 'Shower',\r\n 'action.devices.types.SPEAKER': 'Speaker',\r\n 'action.devices.types.SPRINKLER': 'Sprinkler',\r\n 'action.devices.types.SWITCH': 'Switch',\r\n 'action.devices.types.THERMOSTAT': 'Thermostat',\r\n 'action.devices.types.VACUUM': 'Vacuum',\r\n 'action.devices.types.VALVE': 'Valve',\r\n 'action.devices.types.WASHER': 'Washer',\r\n 'action.devices.types.WATERHEATER': 'Water heater',\r\n 'action.devices.types.WINDOW': 'Window'\r\n }\r\n },\r\n {title: I18n.t('Function/Trait'), field: 'displayTraits', lookup: {\r\n // 'action.devices.traits.ArmDisarm': 'ArmDisarm',\r\n 'action.devices.traits.Brightness': 'Brightness',\r\n // 'action.devices.traits.CameraStream': 'CameraStream',\r\n 'action.devices.traits.ColorSetting_temperature': 'ColorSetting_Temperature',\r\n 'action.devices.traits.ColorSetting_spectrumRGB': 'ColorSetting_RGB',\r\n // 'action.devices.traits.Dock': 'Dock',\r\n 'action.devices.traits.FanSpeed': 'FanSpeed',\r\n // 'action.devices.traits.LightEffects': 'LightEffects',\r\n // 'action.devices.traits.Locator': 'Locator',\r\n 'action.devices.traits.LockUnlock': 'LockUnlock',\r\n 'action.devices.traits.Modes': 'Modes',\r\n 'action.devices.traits.OnOff': 'OnOff',\r\n 'action.devices.traits.OpenClose': 'OpenClose',\r\n // 'action.devices.traits.RunCycle': 'RunCycle',\r\n 'action.devices.traits.Scene': 'Scene',\r\n // 'action.devices.traits.Sensor': 'Sensor',\r\n 'action.devices.traits.StartStop': 'StartStop',\r\n 'action.devices.traits.TemperatureControl_temperatureSetpointCelsius': 'Oven_SetTemp',\r\n 'action.devices.traits.TemperatureControl_temperatureAmbientCelsius': 'Oven_StatusTemp',\r\n 'action.devices.traits.TemperatureSetting_thermostatMode': 'Thermostat_Mode',\r\n 'action.devices.traits.TemperatureSetting_thermostatTemperatureSetpoint': 'Thermostat_SetTemp',\r\n 'action.devices.traits.TemperatureSetting_thermostatTemperatureAmbient': 'Thermostat_StatusTemp',\r\n 'action.devices.traits.TemperatureSetting_thermostatHumidityAmbient': 'Thermostat_StatusHumidity',\r\n // 'action.devices.traits.Timer': 'Timer',\r\n 'action.devices.traits.Toggles': 'Toggles',\r\n 'action.devices.traits.Volume': 'Volume',\r\n }},\r\n\r\n {\r\n title: I18n.t('Attributes'),\r\n field: 'displayAttributes',\r\n cellStyle: {\r\n maxWidth: '12rem',\r\n overflow: 'hidden',\r\n wordBreak: 'break-word'\r\n },\r\n expertMode: true,\r\n editComponent: props => <textarea rows={4} style={{width: '100%', resize: 'vertical'}}\r\n value={props.value}\r\n onChange={e => props.onChange(e.target.value)}\r\n />\r\n },\r\n {title: I18n.t('Room'), field: 'roomHint', editable: 'never'},\r\n {title: I18n.t('Auto'), field: 'smartEnum', editable: 'never',\r\n cellStyle: {\r\n maxWidth: '3rem',\r\n overflow: 'hidden',\r\n wordBreak: 'break-word'\r\n },\r\n expertMode: true,\r\n },\r\n {title: I18n.t('Conversation to GH'), field: 'displayConv2GH', cellStyle: {\r\n maxWidth: '4rem',\r\n overflow: 'hidden',\r\n wordBreak: 'break-word'\r\n },\r\n expertMode: true,\r\n editComponent: props => (\r\n <div>Conversation to Google Home = function(value)&#123; <br/>\r\n <textarea rows={4} style={{width: '100%', resize: 'vertical'}}\r\n value={props.value}\r\n onChange={e => props.onChange(e.target.value)}\r\n />\r\n &#125;\r\n </div>\r\n )\r\n },\r\n { title: I18n.t('Conversation to ioB'), field: 'displayConv2iob', cellStyle: {\r\n maxWidth: '4rem',\r\n overflow: 'hidden',\r\n wordBreak: 'break-word'\r\n },\r\n expertMode: true,\r\n editComponent: props => (\r\n <div>Conversation to ioBroker = function(value)&#123; <br/>\r\n <textarea rows={4} style={{width: '100%', resize: 'vertical'}}\r\n value={props.value}\r\n onChange={e => props.onChange(e.target.value)}\r\n />\r\n &#125;\r\n </div>\r\n )},\r\n ];\r\n\r\n this.timerChanged = null;\r\n this.browseTimer = null;\r\n this.browseTimerCount = 0;\r\n this.editedSmartName = '';\r\n\r\n this.waitForUpdateID = null;\r\n this.onReadyUpdateBound = this.onReadyUpdate.bind(this);\r\n this.onResultUpdateBound = this.onResultUpdate.bind(this);\r\n this.helpRef = React.createRef();\r\n\r\n this.props.socket.getObject(`system.adapter.${this.props.adapterName}.${this.props.instance}`).then(obj => {\r\n this.props.socket.getState(`system.adapter.${this.props.adapterName}.${this.props.instance}.alive`).then(state => {\r\n if (!obj || !obj.common || (!obj.common.enabled && (!state || !state.val))) {\r\n this.setState({message: I18n.t('Instance must be enabled'), loading: false, devices: []});\r\n } else {\r\n this.browse();\r\n }\r\n });\r\n });\r\n }\r\n\r\n browse(isIndicate) {\r\n if (Date.now() - this.lastBrowse < 500) return;\r\n this.lastBrowse = Date.now();\r\n if (isIndicate) {\r\n this.setState({loading: true, browse: true});\r\n } else {\r\n this.setState({browse: true});\r\n }\r\n\r\n this.browseTimer = setTimeout(() => {\r\n console.log('Browse timeout!');\r\n this.browseTimer = null;\r\n this.browseTimerCount++;\r\n if (this.browseTimerCount < 5) {\r\n this.browse(isIndicate);\r\n } else {\r\n this.setState({message: I18n.t('Cannot read devices!')});\r\n }\r\n }, 10000);\r\n\r\n this.props.socket.sendTo(this.props.adapterName + '.' + this.props.instance, 'browseGH', null)\r\n .then(list => {\r\n this.browseTimer && clearTimeout(this.browseTimer);\r\n this.browseTimerCount = 0;\r\n this.browseTimer = null;\r\n\r\n if (list && list.error) {\r\n this.setState({message: I18n.t(list.error)});\r\n } else {\r\n if (this.waitForUpdateID) {\r\n if (!this.onEdit(this.waitForUpdateID, list)) {\r\n this.setState({message: I18n.t('Device %s was not added', this.waitForUpdateID)});\r\n }\r\n this.waitForUpdateID = null;\r\n }\r\n\r\n this.setState({devices: list, loading: false, changed: [], browse: false});\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({message: I18n.t(error)});\r\n });\r\n }\r\n\r\n onReadyUpdate(id, state) {\r\n console.log(`Update ${id} ${state ? state.val + '/' + state.ack : 'null'}`);\r\n if (state && state.ack === true && state.val === true) {\r\n if (this.devTimer) clearTimeout(this.devTimer);\r\n this.devTimer = setTimeout(() => {\r\n this.devTimer = null;\r\n this.browse();\r\n }, 10);\r\n }\r\n }\r\n\r\n onResultUpdate(state) {\r\n state && state.ack === true && state.val && this.setState({message: state.val});\r\n }\r\n\r\n componentDidMount() {\r\n this.props.socket.subscribeState(`${this.props.adapterName}.${this.props.instance}.smart.updatesGH`, this.onReadyUpdateBound);\r\n this.props.socket.subscribeState(`${this.props.adapterName}.${this.props.instance}.smart.updatesResult`, this.onResultUpdateBound);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.socket.unsubscribeState(`${this.props.adapterName}.${this.props.instance}.smart.updatesGH`, this.onReadyUpdateBound);\r\n this.props.socket.unsubscribeState(`${this.props.adapterName}.${this.props.instance}.smart.updatesResult`, this.onResultUpdateBound);\r\n if (this.timerChanged) {\r\n clearTimeout(this.timerChanged);\r\n this.timerChanged = null;\r\n }\r\n }\r\n\r\n informInstance(id) {\r\n this.props.socket.sendTo(this.props.adapterName + '.' + this.props.instance, 'update', id);\r\n }\r\n\r\n addChanged(id, cb) {\r\n const changed = JSON.parse(JSON.stringify(this.state.changed));\r\n if (changed.indexOf(id) === -1) {\r\n changed.push(id);\r\n this.setState({changed}, () => cb && cb());\r\n } else {\r\n cb && cb();\r\n }\r\n }\r\n\r\n removeChanged(id) {\r\n const changed = JSON.parse(JSON.stringify(this.state.changed));\r\n const pos = changed.indexOf(id);\r\n\r\n if (pos !== -1) {\r\n changed.splice(pos, 1);\r\n this.setState({changed});\r\n }\r\n }\r\n\r\n onEdit(id, devices) {\r\n devices = devices || this.state.devices;\r\n const device = devices.find(dev => dev.id === id);\r\n if (device) {\r\n this.props.socket.getObject(id)\r\n .then(obj => {\r\n let smartName = device.common && device.common.smartName ? device.common.smartName : device._id;\r\n if (typeof smartName === 'object' && smartName) {\r\n smartName = smartName[I18n.getLanguage()] || smartName.en;\r\n }\r\n this.editedSmartName = smartName;\r\n this.setState({editId: id, editedSmartName: smartName, editObjectName: Utils.getObjectNameFromObj(obj, null, {language: I18n.getLanguage()})});\r\n });\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n onDelete() {\r\n let id = this.state.deleteId;\r\n // const device = this.state.devices.find(dev => dev.additionalApplianceDetails.id === id);\r\n this.addChanged(id, () => {\r\n this.props.socket.getObject(id)\r\n .then(obj => {\r\n Utils.disableSmartName(obj, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\r\n return this.props.socket.setObject(id, obj);\r\n })\r\n .then(() => {\r\n this.setState({deleteId: '', showConfirmation: false, lastChanged: id});\r\n\r\n this.timerChanged && clearTimeout(this.timerChanged);\r\n this.timerChanged = setTimeout(() => {\r\n this.setState({lastChanged: ''});\r\n this.timerChanged = null;\r\n }, 30000);\r\n\r\n // update obj\r\n this.informInstance(id);\r\n })\r\n .catch(err => this.props.onError(err));\r\n });\r\n }\r\n\r\n renderSelectByOn(id, type) {\r\n // type = '-', 'stored', false or number [5-100]\r\n if (type !== false) {\r\n const items = [\r\n <MenuItem key=\"_\" value=\"\"><em>{I18n.t('Default')}</em></MenuItem>,\r\n <MenuItem key=\"last\" value=\"stored\">{I18n.t('last value')}</MenuItem>\r\n ];\r\n for (let i = 5; i <= 100; i += 5) {\r\n items.push(<MenuItem key={i.toString()} value={i.toString()}>{i}%</MenuItem>);\r\n }\r\n return <FormControl className={this.props.classes.devSubLineByOn}>\r\n <Select className={this.props.classes.devSubLineByOnSelect} value={(type || '').toString()} onChange={e => this.onParamsChange(id, e.target.value)}>{items}</Select>\r\n <FormHelperText className={this.props.classes.devSubLineTypeTitle}>{I18n.t('by ON')}</FormHelperText>\r\n </FormControl>;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n onParamsChange(id, byON, type) {\r\n this.addChanged(id, () => {\r\n this.props.socket.getObject(id)\r\n .then(obj => {\r\n Utils.updateSmartName(obj, undefined, byON, type, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\r\n\r\n if (this.state.lastChanged !== id) {\r\n this.setState({lastChanged: id});\r\n this.timerChanged && clearTimeout(this.timerChanged);\r\n this.timerChanged = setTimeout(() => {\r\n this.setState({lastChanged: ''});\r\n this.timerChanged = null;\r\n }, 30000);\r\n }\r\n\r\n return this.props.socket.setObject(id, obj);\r\n })\r\n .then(() => {\r\n // update obj\r\n this.informInstance(id);\r\n })\r\n .catch(err => this.props.onError(err));\r\n });\r\n }\r\n\r\n onGHParamsChange(newData, oldData) {\r\n this.addChanged(newData.id, () => {\r\n this.props.socket.getObject(newData.id)\r\n .then(obj => {\r\n if (!obj || !obj.common) {\r\n return this.setState({message: I18n.t(`Object %s is invalid. No common found.`, newData.id)});\r\n }\r\n // id, newData.type, newData.displayTraits, newData.displayAttributes\r\n Utils.updateSmartName(obj, this.editedSmartName, undefined, undefined, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\r\n\r\n if (JSON.stringify(newData.displayTraits) !== JSON.stringify(oldData.displayTraits)) {\r\n if (!Array.isArray(newData.displayTraits)) {\r\n newData.displayTraits=[newData.displayTraits]\r\n }\r\n\r\n obj.common.smartName.ghTraits = newData.displayTraits;\r\n }\r\n if (newData.type !== oldData.type) {\r\n obj.common.smartName.ghType = newData.type;\r\n }\r\n if (newData.displayAttributes !== oldData.displayAttributes ) {\r\n obj.common.smartName.ghAttributes = newData.displayAttributes;\r\n try {\r\n if (obj.common.smartName.ghAttributes) {\r\n JSON.parse(obj.common.smartName.ghAttributes)\r\n }\r\n } catch (error) {\r\n this.setState({message: I18n.t('Attributes has not correct JSON format.')});\r\n }\r\n }\r\n if (newData.conv2GH) {\r\n obj.common.smartName.ghConv2GH = newData.displayConv2GH;\r\n }\r\n if (newData.conv2iob) {\r\n obj.common.smartName.ghConv2iob = newData.displayConv2iob;\r\n }\r\n return this.props.socket.setObject(newData.id, obj);\r\n })\r\n .then(() => {\r\n // update obj\r\n this.informInstance(newData.id);\r\n })\r\n .catch(err => this.props.onError(err));\r\n });\r\n }\r\n\r\n renderMessage() {\r\n if (this.state.message) {\r\n return <MessageDialog text={this.state.message} onClose={() => this.setState({message: ''})}/>;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n changeSmartName(e) {\r\n e && e.preventDefault();\r\n // Check if the name is duplicate\r\n this.addChanged(this.state.editId, () => {\r\n const id = this.state.editId;\r\n this.setState({editId: '', editObjectName: '', lastChanged: id});\r\n\r\n this.timerChanged && clearTimeout(this.timerChanged);\r\n this.timerChanged = setTimeout(() => {\r\n this.setState({lastChanged: ''});\r\n this.timerChanged = null;\r\n }, 30000);\r\n\r\n this.props.socket.getObject(id)\r\n .then(obj => {\r\n Utils.updateSmartName(obj, this.editedSmartName, undefined, undefined, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\r\n return this.props.socket.setObject(id, obj);\r\n })\r\n .then(() => {\r\n // update obj\r\n this.informInstance(id);\r\n })\r\n .catch(err => this.props.onError(err));\r\n });\r\n }\r\n\r\n getSelectIdDialog() {\r\n if (this.state.showSelectId) {\r\n return <DialogSelectID\r\n key=\"dialogSelectGoogle\"\r\n imagePrefix=\"../..\"\r\n socket={this.props.socket}\r\n selected={''}\r\n types={['state']}\r\n onClose={() => this.setState({showSelectId: false})}\r\n onOk={(selected) => {\r\n this.setState({showSelectId: false});\r\n\r\n this.props.socket.getObject(selected)\r\n .then(obj => {\r\n if (obj) {\r\n if (!obj.common) {\r\n return this.setState({message: I18n.t(`Object %s is invalid. No common found.`, selected)});\r\n }\r\n\r\n const name = Utils.getObjectNameFromObj(obj, null, {language: I18n.getLanguage()});\r\n Utils.updateSmartName(obj, (name || I18n.t('Device name')).replace(/[-_.]+/g, ' '), undefined, undefined, this.props.adapterName + '.' + this.props.instance, this.props.native.noCommon);\r\n this.addChanged(obj._id);\r\n this.waitForUpdateID = obj._id;\r\n\r\n if (this.state.lastChanged !== obj._id) {\r\n this.setState({lastChanged: obj._id});\r\n this.timerChanged && clearTimeout(this.timerChanged);\r\n this.timerChanged = setTimeout(() => {\r\n this.setState({lastChanged: ''});\r\n this.timerChanged = null;\r\n }, 30000);\r\n }\r\n\r\n if (!obj.common.smartName) {\r\n obj.common.smartName = {ghType: 'action.devices.types.LIGHT'};\r\n obj.common.smartName = {ghTraits: ['action.devices.traits.OnOff']}\r\n } else {\r\n obj.common.smartName.ghType = 'action.devices.types.LIGHT';\r\n obj.common.smartName.ghTraits = ['action.devices.traits.OnOff'];\r\n }\r\n\r\n this.props.socket.setObject(obj._id, obj)\r\n .then(() => {\r\n this.informInstance(obj._id);\r\n this.setState({message: I18n.t('Please add type and trait to complete the Google Home state.')});\r\n })\r\n .catch(err => this.setState({message: err}));\r\n } else {\r\n this.setState({message: I18n.t('Invalid ID')});\r\n }\r\n });\r\n }}\r\n />;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n renderListOfDevices() {\r\n if (!this.state.showListOfDevices) {\r\n return null;\r\n }\r\n const classes = this.props.classes;\r\n\r\n return <Dialog\r\n open={true}\r\n maxWidth=\"xl\"\r\n fullWidth\r\n onClose={() => this.setState({showListOfDevices: false})}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">{I18n.t('List of devices to print out, e.g. to give all device names to your partner.')} <span role=\"img\" aria-label=\"smile\">😄</span></DialogTitle>\r\n <DialogContent>\r\n <div className={ classes.headerRow } >\r\n <div className={ classes.headerCell }>{ I18n.t('Name') }</div>\r\n <div className={ classes.headerCell }>{ I18n.t('Function') }</div>\r\n <div className={ classes.headerCell }>{ I18n.t('Room') }</div>\r\n </div>\r\n <div className={ this.props.classes.tableDiv } >\r\n { this.state.devices.map((item, i) => <div key={i}>\r\n <div className={ classes.tableCell }>{ item.name.nicknames.join(', ') }</div>\r\n <div className={ classes.tableCell }>{ item.displayTraits.map(n => n.replace('action.devices.traits.', '')).join(', ') }</div>\r\n <div className={ classes.tableCell }>{ item.roomHint }</div>\r\n </div>)\r\n }\r\n </div>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button variant=\"outlined\" onClick={() => {\r\n this.setState({showListOfDevices: false});\r\n const lines = this.state.devices.map(item => item.name.nicknames.join(', ') + '\\t' + item.displayTraits + '\\t' + item.roomHint);\r\n copy(lines.join('\\n'));\r\n }} color=\"primary\" startIcon={<IconCopy/>}>{I18n.t('Copy to clipboard')}</Button>\r\n <Button startIcon={<IconClose/>} variant=\"contained\" onClick={() => this.setState({showListOfDevices: false})} autoFocus>{I18n.t('Close')}</Button>\r\n </DialogActions>\r\n </Dialog>;\r\n }\r\n\r\n renderInstructions() {\r\n const desktop = window.innerHeight > MOBILE_HEIGHT && window.innerWidth > MOBILE_WIDTH;\r\n\r\n if (this.state.helpHidden || this.props.smallDisplay || !desktop) {\r\n return null;\r\n }\r\n\r\n const manualModeHint = I18n.t('manualModeHint');\r\n return <div style={{width: '100%'}} ref={this.helpRef}>\r\n <div style={{marginTop: '4rem', display: 'flex'}}>\r\n <div style={{flex: '50%'}}>\r\n <div style={{fontWeight:\"bold\"}}>{I18n.t('Auto Mode')}</div>\r\n <div style={{marginTop: \"0.8rem\", marginRight: \"0.8rem\",}}>{I18n.t('To auto detect devices please assign a room and function to the channel if no channel available than assign to a device. Not only to the state or device. And enable them under SmartEnum/Intelligente Aufzählung')}</div>\r\n </div>\r\n <div style={{flex: '50%'}}>\r\n <div style={{fontWeight: 'bold'}}>{I18n.t('Manual Mode')}</div>\r\n <span>{Utils.renderTextWithA(manualModeHint)}</span>\r\n </div>\r\n </div>\r\n <br/>\r\n <div style={{flex: '100%'}}>\r\n <div style={{fontWeight: \"bold\"}}>{Utils.renderTextWithA(I18n.t('For help use this forum'))}</div>\r\n </div>\r\n </div>;\r\n }\r\n\r\n renderToolbar() {\r\n const desktop = window.innerHeight > MOBILE_HEIGHT && window.innerWidth > MOBILE_WIDTH;\r\n\r\n return <Toolbar variant=\"dense\">\r\n <Fab size=\"small\" color=\"secondary\" aria-label=\"Add\" className={this.props.classes.button} onClick={() => this.setState({showSelectId: true})}><IconAdd /></Fab>\r\n <Fab style={{marginLeft: '1rem'}} size=\"small\" color=\"primary\" aria-label=\"Refresh\" className={this.props.classes.button}\r\n onClick={() => this.browse(true)} disabled={this.state.browse}>{this.state.browse ? <CircularProgress size={20} /> : <IconRefresh/>}</Fab>\r\n {desktop && !this.state.hideHelp ? <Fab style={{marginLeft: '1rem'}} size=\"small\" color={this.state.helpHidden ? 'default' : 'primary'} aria-label=\"Help\" className={this.props.classes.button}\r\n title={I18n.t('Show/Hide help')}\r\n onClick={() => {\r\n window.localStorage.setItem('App.helpHidden', this.state.helpHidden ? 'false' : 'true');\r\n this.setState({helpHidden: !this.state.helpHidden});\r\n }} disabled={this.state.browse}><IconHelp/></Fab> : null }\r\n <Fab style={{marginLeft: '1rem'}}\r\n size=\"small\"\r\n color={this.state.expertMode ? 'primary' : 'default'} aria-label=\"Help\" className={this.props.classes.button}\r\n title={I18n.t('Toggle expert mode')}\r\n onClick={() => {\r\n window.localStorage.setItem('App.expertMode', this.state.expertMode ? 'false' : 'true');\r\n this.setState({expertMode: !this.state.expertMode});\r\n }} disabled={this.state.browse}><ExpertIcon/></Fab>\r\n <Fab style={{marginLeft: '1rem'}}\r\n title={I18n.t('Show all devices for print out')}\r\n size=\"small\" aria-label=\"List of devices\" className={this.props.classes.button}\r\n onClick={() => this.setState({showListOfDevices: true})} disabled={this.state.browse}><IconList/></Fab>\r\n {!this.props.smallDisplay ? <TextField\r\n className={this.props.classes.searchText}\r\n label={I18n.t('Filter')}\r\n value={this.state.searchText} onChange={e => this.setState({searchText: e.target.value})}\r\n InputProps={{\r\n endAdornment: this.state.searchText ? (\r\n <IconButton onClick={() => this.setState({ searchText: '' })}>\r\n <IconClear />\r\n </IconButton>\r\n ) : undefined,\r\n }}\r\n /> : null}\r\n </Toolbar>;\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState, snapshot) {\r\n if (this.helpRef.current) {\r\n const h = this.helpRef.current.clientHeight;\r\n if (this.state.helpHeight !== h) {\r\n if (!this.state.helpHidden && h + 64 + 48 + 200 > window.innerHeight) {\r\n setTimeout(() => this.setState({helpHeight: h, helpHidden: true, hideHelp: true}), 50);\r\n } else {\r\n setTimeout(() => this.setState({helpHeight: h}), 50);\r\n }\r\n }\r\n } else if (this.state.helpHeight) {\r\n setTimeout(() => this.setState({helpHeight: 0}), 50);\r\n }\r\n }\r\n\r\n render() {\r\n if (this.state.loading) {\r\n return <CircularProgress key=\"alexaProgress\" />;\r\n }\r\n const searchText = this.state.searchText.toLowerCase();\r\n const devices = this.state.searchText ? this.state.devices.filter(item =>\r\n item.name?.name?.toLowerCase().includes(searchText) ||\r\n item.name?.defaultNames?.find(n => n.toLowerCase().includes(searchText)) ||\r\n item.name?.nicknames?.find(n => n.toLowerCase().includes(searchText)))\r\n : this.state.devices;\r\n\r\n return <form key=\"gh\" className={this.props.classes.tab}>\r\n {this.renderToolbar()}\r\n {this.renderInstructions()}\r\n <div className={this.props.classes.tableDiv} style={{height: `calc(100% - ${48 + (this.state.helpHeight ? this.state.helpHeight + 64 : 0)}px)`}}>\r\n <TreeTable\r\n columns={this.state.expertMode ? this.columns : this.columns.filter(item => !item.expertMode)}\r\n data={devices}\r\n onUpdate={(newData, oldData) => {\r\n if (newData.name.nicknames && Array.isArray(newData.name.nicknames)) {\r\n newData.name.nicknames = newData.name.nicknames.join(',');\r\n }\r\n this.editedSmartName = newData.name.nicknames;\r\n this.setState({editId: newData.id}, () => {\r\n if (!newData.type || !newData.displayTraits) {\r\n this.setState({browse: true, message: I18n.t('Please add action and trait to complete the Google Home state.')});\r\n } else {\r\n this.setState({browse: true});\r\n }\r\n\r\n this.onGHParamsChange(newData, oldData);\r\n const devices = [...this.state.devices];\r\n devices[devices.indexOf(oldData)] = newData;\r\n this.setState({ ...this.state, devices});\r\n });\r\n }}\r\n\r\n onDelete={oldData => {\r\n // if smartenum set smartname on false if not delete/reset smartname content\r\n if (oldData.smartEnum === 'X') {\r\n this.setState({deleteId: oldData.id});\r\n } else {\r\n this.props.socket.getObject(oldData.id)\r\n .then(obj => {\r\n if (obj && obj.common && obj.common['smartName']) {\r\n delete obj.common['smartName']['ghTraits'];\r\n delete obj.common['smartName']['ghType'];\r\n delete obj.common['smartName']['ghAttributes'];\r\n }\r\n return this.props.socket.setObject(oldData.id, obj);\r\n });\r\n }\r\n\r\n return new Promise(resolve => {\r\n setTimeout(() => {\r\n if (this.state.deleteId) {\r\n this.onDelete();\r\n } else {\r\n this.informInstance(oldData.id);\r\n }\r\n resolve();\r\n const devices = [...this.state.devices];\r\n devices.splice(devices.indexOf(oldData), 1);\r\n this.setState({ ...this.state, devices });\r\n }, 600);\r\n })\r\n }}\r\n />\r\n </div>\r\n {this.renderMessage()}\r\n {this.getSelectIdDialog()}\r\n {this.renderListOfDevices()}\r\n </form>;\r\n }\r\n}\r\n\r\nGoogleSmartNames.propTypes = {\r\n common: PropTypes.object.isRequired,\r\n native: PropTypes.object.isRequired,\r\n instance: PropTypes.number.isRequired,\r\n adapterName: PropTypes.string.isRequired,\r\n onError: PropTypes.func,\r\n onLoad: PropTypes.func,\r\n onChange: PropTypes.func,\r\n socket: PropTypes.object.isRequired,\r\n themeType: PropTypes.string.isRequired,\r\n};\r\n\r\nexport const withMediaQuery = () => Component => props =>\r\n <Component smallDisplay={useMediaQuery('(max-width:600px)')} {...props} />;\r\n\r\nexport default withStyles(styles)(withMediaQuery()(GoogleSmartNames));\r\n","import React from 'react';\r\nimport {withStyles} from '@material-ui/core/styles';\r\nimport { MuiThemeProvider } from '@material-ui/core/styles';\r\n\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Tabs from '@material-ui/core/Tabs';\r\nimport Tab from '@material-ui/core/Tab';\r\nimport GenericApp from '@iobroker/adapter-react/GenericApp';\r\nimport Loader from '@iobroker/adapter-react/Components/Loader'\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Button from '@material-ui/core/Button';\r\n\r\nimport I18n from '@iobroker/adapter-react/i18n';\r\nimport TabOptions from './Tabs/Options';\r\nimport TabExtended from './Tabs/Extended';\r\nimport TabServices from './Tabs/Services';\r\nimport TabEnums from './Tabs/Enums';\r\nimport TabAlexaSmartNames from './Tabs/AlexaSmartNames';\r\nimport TabAlisaSmartNames from './Tabs/AlisaSmartNames';\r\nimport TabGoogleSmartNames from './Tabs/GoogleSmartNames';\r\n\r\nconst styles = theme => ({\r\n root: {},\r\n tabContent: {\r\n padding: 10,\r\n height: 'calc(100% - 64px - 48px - 20px)',\r\n overflow: 'auto'\r\n },\r\n tabContentIFrame: {\r\n padding: 10,\r\n height: 'calc(100% - 64px - 48px - 20px - 38px)',\r\n overflow: 'auto'\r\n }\r\n});\r\n\r\nclass App extends GenericApp {\r\n constructor(props) {\r\n const extendedProps = {...props};\r\n extendedProps.encryptedFields = ['pass'];\r\n extendedProps.translations = {\r\n 'en': require('./i18n/en'),\r\n 'de': require('./i18n/de'),\r\n 'ru': require('./i18n/ru'),\r\n 'pt': require('./i18n/pt'),\r\n 'nl': require('./i18n/nl'),\r\n 'fr': require('./i18n/fr'),\r\n 'it': require('./i18n/it'),\r\n 'es': require('./i18n/es'),\r\n 'pl': require('./i18n/pl'),\r\n 'zh-cn': require('./i18n/zh-cn'),\r\n };\r\n\r\n extendedProps.sentryDSN = window.sentryDSN;\r\n\r\n super(props, extendedProps);\r\n }\r\n\r\n onConnectionReady() {\r\n this.socket.getState(`${this.adapterName}.${this.instance}.info.ackTempPassword`)\r\n .then(state => {\r\n if (!state || !state.val) {\r\n this.setState({showAckTempPasswordDialog: true});\r\n }\r\n });\r\n }\r\n\r\n getSelectedTab() {\r\n const tab = this.state.selectedTab;\r\n if (!tab || tab === 'options') {\r\n return 0;\r\n } else\r\n if (tab === 'enums') {\r\n return 1;\r\n } else\r\n if (tab === 'alexa') {\r\n return 2;\r\n } else\r\n if (tab === 'google') {\r\n const offset = (this.state.native.amazonAlexa ? 1 : 0);\r\n return 2 + offset;\r\n } else\r\n if (tab === 'alisa') {\r\n const offset = (this.state.native.amazonAlexa ? 1 : 0) + (this.state.native.googleHome ? 1 : 0);\r\n return 2 + offset;\r\n } else\r\n if (tab === 'extended') {\r\n const offset = (this.state.native.amazonAlexa ? 1 : 0) + (this.state.native.googleHome ? 1 : 0) + (this.state.native.yandexAlisa ? 1 : 0);\r\n return 2 + offset;\r\n } else\r\n if (tab === 'services') {\r\n const offset = (this.state.native.amazonAlexa ? 1 : 0) + (this.state.native.googleHome ? 1 : 0) + (this.state.native.yandexAlisa ? 1 : 0);\r\n return 3 + offset;\r\n }\r\n }\r\n\r\n renderAckTempPasswordDialog() {\r\n if (!this.state.showAckTempPasswordDialog) {\r\n return null;\r\n } else {\r\n return <Dialog\r\n open={true}\r\n onClose={() => this.setState({showAckTempPasswordDialog: false}, () => setTimeout(() => this.setState({showAckTempPasswordDialog: true}), 1000))}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n <DialogTitle id=\"alert-dialog-title\">{I18n.t('Information: The skill linking process was changed!')}</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText id=\"alert-dialog-description\">\r\n {I18n.t('The linking process has been changed for a few months.')}\r\n {I18n.t('Now there is no temporary password that will be sent by email.')}<br/><br/>\r\n <b>{I18n.t('The password is equal with ioBroker.pro and with password that was entered here in the settings!')}</b>\r\n </DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => this.setState({showAckTempPasswordDialog: false}, () => setTimeout(() => this.setState({showAckTempPasswordDialog: true}), 1000))} autoFocus>\r\n {I18n.t('Not understood')}\r\n </Button>\r\n <Button variant=\"contained\" onClick={() =>\r\n this.socket.setState(`${this.adapterName}.${this.instance}.info.ackTempPassword`, true, true)\r\n .then(() =>\r\n this.setState({showAckTempPasswordDialog: false}))\r\n } color=\"primary\" autoFocus>\r\n {I18n.t('Roger that')}\r\n </Button>\r\n </DialogActions>\r\n </Dialog>;\r\n }\r\n }\r\n\r\n render() {\r\n if (!this.state.loaded) {\r\n return <MuiThemeProvider theme={this.state.theme}>\r\n <Loader theme={this.state.themeType} />\r\n </MuiThemeProvider>;\r\n }\r\n\r\n return <MuiThemeProvider theme={this.state.theme}>\r\n <div className=\"App\" style={{background: this.state.theme.palette.background.default, color: this.state.theme.palette.text.primary}}>\r\n <AppBar position=\"static\">\r\n <Tabs value={this.getSelectedTab()} onChange={(e, index) => this.selectTab(e.target.parentNode.dataset.name, index)} scrollButtons=\"auto\">\r\n <Tab label={I18n.t('Options')} data-name=\"options\" />\r\n <Tab label={I18n.t('Smart enums')} data-name=\"enums\" />\r\n {this.state.native.amazonAlexa && <Tab selected={this.state.selectedTab === 'alexa'} label={I18n.t('Alexa devices')} data-name=\"alexa\" />}\r\n {this.state.native.googleHome && <Tab selected={this.state.selectedTab === 'google'} label={I18n.t('Google devices')} data-name=\"google\" />}\r\n {this.state.native.yandexAlisa && <Tab selected={this.state.selectedTab === 'alisa'} label={I18n.t('Alisa devices')} data-name=\"alisa\" />}\r\n <Tab label={I18n.t('Extended options')} data-name=\"extended\" />\r\n <Tab label={I18n.t('Services and IFTTT')} data-name=\"services\" />\r\n </Tabs>\r\n </AppBar>\r\n\r\n <div className={this.isIFrame ? this.props.classes.tabContentIFrame : this.props.classes.tabContent}>\r\n {(this.state.selectedTab === 'options' || !this.state.selectedTab) && <TabOptions\r\n key=\"options\"\r\n common={this.common}\r\n socket={this.socket}\r\n native={this.state.native}\r\n onError={text => this.setState({errorText: (text || text === 0) && typeof text !== 'string' ? text.toString() : text})}\r\n onLoad={native => this.onLoadConfig(native)}\r\n instance={this.instance}\r\n adapterName={this.adapterName}\r\n changed={this.state.changed}\r\n onChange={(attr, value, cb) => this.updateNativeValue(attr, value, cb)}\r\n />}\r\n {this.state.selectedTab === 'enums' && <TabEnums\r\n key=\"enums\"\r\n common={this.common}\r\n socket={this.socket}\r\n native={this.state.native}\r\n onError={text => this.setState({errorText: (text || text === 0) && typeof text !== 'string' ? text.toString() : text})}\r\n instance={this.instance}\r\n adapterName={this.adapterName}\r\n />}\r\n {this.state.selectedTab === 'alexa' && <TabAlexaSmartNames\r\n key=\"alexa\"\r\n themeType={this.state.themeType}\r\n common={this.common}\r\n socket={this.socket}\r\n native={this.state.native}\r\n onError={text => this.setState({errorText: (text || text === 0) && typeof text !== 'string' ? text.toString() : text})}\r\n adapterName={this.adapterName}\r\n instance={this.instance}\r\n />}\r\n {this.state.selectedTab === 'google' && <TabGoogleSmartNames\r\n key=\"google\"\r\n themeType={this.state.themeType}\r\n common={this.common}\r\n socket={this.socket}\r\n native={this.state.native}\r\n onError={text => this.setState({errorText: (text || text === 0) && typeof text !== 'string' ? text.toString() : text})}\r\n adapterName={this.adapterName}\r\n instance={this.instance}\r\n />}\r\n {this.state.selectedTab === 'alisa' && <TabAlisaSmartNames\r\n key=\"alisa\"\r\n themeType={this.state.themeType}\r\n common={this.common}\r\n socket={this.socket}\r\n native={this.state.native}\r\n onError={text => this.setState({errorText: (text || text === 0) && typeof text !== 'string' ? text.toString() : text})}\r\n adapterName={this.adapterName}\r\n instance={this.instance}\r\n />}\r\n {this.state.selectedTab === 'extended' && <TabExtended\r\n key=\"extended\"\r\n common={this.common}\r\n socket={this.socket}\r\n native={this.state.native}\r\n onError={text => this.setState({errorText: (text || text === 0) && typeof text !== 'string' ? text.toString() : text})}\r\n instance={this.instance}\r\n adapterName={this.adapterName}\r\n onChange={(attr, value) => this.updateNativeValue(attr, value)}\r\n />}\r\n {this.state.selectedTab === 'services' && <TabServices\r\n key=\"services\"\r\n common={this.common}\r\n socket={this.socket}\r\n native={this.state.native}\r\n onError={text => this.setState({errorText: (text || text === 0) && typeof text !== 'string' ? text.toString() : text})}\r\n instance={this.instance}\r\n adapterName={this.adapterName}\r\n onShowError={error => this.showError(error)}\r\n onChange={(attr, value) => this.updateNativeValue(attr, value)}\r\n />}\r\n </div>\r\n {this.renderError()}\r\n {this.renderSaveCloseButtons()}\r\n {this.renderAckTempPasswordDialog()}\r\n </div>\r\n </MuiThemeProvider>;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(App);\r\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read http://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit http://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See http://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { MuiThemeProvider} from '@material-ui/core/styles';\r\nimport './index.css';\r\nimport App from './App';\r\nimport * as serviceWorker from './serviceWorker';\r\nimport {version} from '../package.json';\r\nimport theme from '@iobroker/adapter-react/Theme';\r\nimport Utils from '@iobroker/adapter-react/Components/Utils';\r\n\r\nwindow.adapterName = 'iot';\r\nwindow.sentryDSN = 'https://5ad729dbed504d15aa8bde423cae9a8e@sentry.iobroker.net/57';\r\n\r\nlet themeName = Utils.getThemeName();\r\n\r\nconsole.log(`iobroker.${window.adapterName}@${version} using theme \"${themeName}\"`);\r\n\r\nfunction build() {\r\n return ReactDOM.render(\r\n <MuiThemeProvider theme={theme(themeName)}>\r\n <App\r\n onThemeChange={_theme => {\r\n themeName = _theme;\r\n build();\r\n }}\r\n />\r\n </MuiThemeProvider>,\r\n document.getElementById('root')\r\n );\r\n}\r\n\r\nbuild();\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: http://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""}