this.blockly = el} style={{\n //marginLeft: 180,\n width: '100%',//'calc(100% - 180px)',\n height: '100%',\n //overflow: 'hidden',\n position: 'relative'}}/>,\n\n this.renderMessageDialog(),\n this.renderErrorDialog(),\n this.renderExportDialog(),\n this.renderImportDialog(),\n ];\n } else {\n return null;\n }\n }\n}\n\nBlocklyEditor.propTypes = {\n command: PropTypes.string,\n onChange: PropTypes.func,\n searchText: PropTypes.string,\n themeType: PropTypes.string\n};\n\nexport default BlocklyEditor;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\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 Popper from '@material-ui/core/Popper';\nimport Fade from '@material-ui/core/Fade';\nimport Paper from '@material-ui/core/Paper';\n\nimport IconCopy from '@material-ui/icons/FileCopy';\nimport IconCancel from '@material-ui/icons/Cancel';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n textArea: {\n width: '100%',\n height: '100%',\n },\n textAreaLight: {\n background: 'lightgray'\n },\n dialog: {\n height: '95%'\n },\n typography: {\n padding: theme.spacing(2),\n },\n buttonIcon: {\n marginRight: theme.spacing(1),\n },\n});\nclass DialogExport extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n anchorEl: null,\n popper: ''\n };\n }\n handleCancel = () => {\n this.props.onClose();\n };\n\n onCopy(event) {\n const el = window.document.getElementById('copy_input');\n if (el) {\n el.select();\n window.document.execCommand('copy');\n const target = event.currentTarget;\n\n setTimeout(() => {\n window.document.execCommand('copy');\n this.setState({popper: I18n.t('Copied'), anchorEl: target});\n setTimeout(() => this.setState({popper: '', anchorEl: null}), 1000);\n }, 50);\n\n }\n /*el.value = this.props.text;\n window.document.body.appendChild(el);\n el.select();*/\n }\n\n render() {\n const classes = this.props.classes;\n\n return (\n
\n );\n }\n}\n\nDialogExport.propTypes = {\n classes: PropTypes.object.isRequired,\n onClose: PropTypes.func,\n text: PropTypes.string,\n themeType: PropTypes.string,\n};\n\nexport default withStyles(styles)(DialogExport);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\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';\n\nimport IconOk from '@material-ui/icons/Check';\nimport IconCancel from '@material-ui/icons/Cancel';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n textArea: {\n width: 'calc(100% - 10px)',\n height: '100%',\n resize: 'none'\n },\n dialog: {\n height: '95%'\n },\n fullHeight: {\n height: '100%',\n overflow: 'hidden'\n },\n buttonIcon: {\n marginRight: theme.spacing(1),\n },\n});\nclass DialogImport extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n text: '',\n };\n }\n\n componentDidMount() {\n setTimeout(() => {\n try {\n window.document.getElementById('import-text-area').focus();\n } catch (e) {\n\n }\n }, 100);\n }\n\n handleCancel () {\n this.props.onClose();\n }\n\n handleOk () {\n this.props.onClose(this.state.text);\n }\n\n onChange(e) {\n this.setState({text: e.target.value});\n }\n\n render() {\n const classes = this.props.classes;\n\n return (\n
\n );\n }\n}\n\nDialogImport.propTypes = {\n classes: PropTypes.object.isRequired,\n onClose: PropTypes.func,\n text: PropTypes.string,\n};\n\nexport default withStyles(styles)(DialogImport);\n","/**\n * Given a cronspec, return the human-readable string.\n * @param {string} cronspec\n * @param withSeconds\n * @param {Object=} locale\n */\nfunction cronToText(cronspec, withSeconds, locale) {\n\n\n // Constant array to convert valid names to values\n const NAMES = {\n JAN: 1, FEB: 2, MAR: 3, APR: 4, MAY: 5, JUN: 6, JUL: 7, AUG: 8,\n SEP: 9, OCT: 10, NOV: 11, DEC: 12,\n SUN: 1, MON: 2, TUE: 3, WED: 4, THU: 5, FRI: 6, SAT: 7\n };\n\n // Parsable replacements for common expressions\n const REPLACEMENTS = {\n '* * * * * *': '0/1 * * * * *',\n '@YEARLY': '0 0 1 1 *',\n '@ANNUALLY': '0 0 1 1 *',\n '@MONTHLY': '0 0 1 * *',\n '@WEEKLY': '0 0 * * 0',\n '@DAILY': '0 0 * * *',\n '@HOURLY': '0 * * * *'\n };\n\n // Contains the index, min, and max for each of the constraints\n const FIELDS = {\n s: [0, 0, 59], // seconds\n m: [1, 0, 59], // minutes\n h: [2, 0, 23], // hours\n D: [3, 1, 31], // day of month\n M: [4, 1, 12], // month\n Y: [6, 1970, 2099], // year\n d: [5, 1, 7, 1] // day of week\n };\n\n /**\n * Returns the value + offset if value is a number, otherwise it\n * attempts to look up the value in the NAMES table and returns\n * that result instead.\n *\n * @param {Number,String} value: The value that should be parsed\n * @param {Number=} offset: Any offset that must be added to the value\n * @param {Number=} max\n * @returns {Number|null}\n */\n function getValue(value) {\n const offset = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1];\n const max = arguments.length <= 2 || arguments[2] === undefined ? 9999 : arguments[2];\n\n return isNaN(value) ? NAMES[value] || null : Math.min(+value + offset, max);\n }\n\n /**\n * Returns a deep clone of a schedule skipping any day of week\n * constraints.\n *\n * @param {Object} sched: The schedule that will be cloned\n * @returns {Object}\n */\n function cloneSchedule(sched) {\n const clone = {};\n let field;\n\n for (field in sched) {\n if (field !== 'dc' && field !== 'd') {\n clone[field] = sched[field].slice(0);\n }\n }\n\n return clone;\n }\n\n /**\n * Adds values to the specified constraint in the current schedule.\n *\n * @param {Object} sched: The schedule to add the constraint to\n * @param {String} name: Name of constraint to add\n * @param {Number} min: Minimum value for this constraint\n * @param {Number} max: Maximum value for this constraint\n */\n function add(sched, name, min, max) {\n const inc = arguments.length <= 4 || arguments[4] === undefined ? 0 : arguments[4];\n\n let i = min;\n\n if (!sched[name]) {\n sched[name] = [];\n }\n\n while (i <= max) {\n if (sched[name].indexOf(i) < 0) {\n sched[name].push(i);\n }\n i += inc || 1;\n }\n\n sched[name].sort(function (a, b) {\n return a - b;\n });\n }\n\n /**\n * Adds a hash item (of the form x#y or xL) to the schedule.\n *\n * @param {Object} schedules: The current schedule array to add to\n * @param {Object} curSched: The current schedule to add to\n * @param {Number} value: The value to add (x of x#y or xL)\n * @param {Number} hash: The hash value to add (y of x#y)\n */\n function addHash(schedules, curSched, value, hash) {\n // if there are any existing day of week constraints that\n // aren't equal to the one we're adding, create a new\n // composite schedule\n if ((curSched.d && !curSched.dc) || (curSched.dc && curSched.dc.indexOf(hash) < 0)) {\n schedules.push(cloneSchedule(curSched));\n curSched = schedules[schedules.length - 1];\n }\n\n add(curSched, 'd', value, value);\n add(curSched, 'dc', hash, hash);\n }\n\n /**\n *\n * @param {Object} s: The existing set of schedules\n * @param {Object} curSched: The current schedule to add to\n * @param {Number} value\n */\n function addWeekday(s, curSched, value) {\n const except1 = {},\n except2 = {};\n if (value === 1) {\n // cron doesn't pass month boundaries, so if 1st is a\n // weekend then we need to use 2nd or 3rd instead\n add(curSched, 'D', 1, 3);\n add(curSched, 'd', NAMES.MON, NAMES.FRI);\n add(except1, 'D', 2, 2);\n add(except1, 'd', NAMES.TUE, NAMES.FRI);\n add(except2, 'D', 3, 3);\n add(except2, 'd', NAMES.TUE, NAMES.FRI);\n } else {\n // normally you want the closest day, so if v is a\n // Saturday, use the previous Friday. If it's a\n // sunday, use the following Monday.\n add(curSched, 'D', value - 1, value + 1);\n add(curSched, 'd', NAMES.MON, NAMES.FRI);\n add(except1, 'D', value - 1, value - 1);\n add(except1, 'd', NAMES.MON, NAMES.THU);\n add(except2, 'D', value + 1, value + 1);\n add(except2, 'd', NAMES.TUE, NAMES.FRI);\n }\n s.exceptions.push(except1);\n s.exceptions.push(except2);\n }\n\n /**\n * Adds a range item (of the form x-y/z) to the schedule.\n *\n * @param {String} item: The cron expression item to add\n * @param {Object} curSched: The current schedule to add to\n * @param {String} name: The name to use for this constraint\n * @param {Number} min: The min value for the constraint\n * @param {Number} max: The max value for the constraint\n * @param {Number} offset: The offset to apply to the cron value\n */\n function addRange(item, curSched, name, min, max, offset) {\n // parse range/x\n const incSplit = item.split('/'),\n inc = +incSplit[1],\n range = incSplit[0];\n\n // parse x-y or * or 0\n if (range !== '*' && range !== '0') {\n const rangeSplit = range.split('-');\n min = getValue(rangeSplit[0], offset, max);\n\n // fix for issue #13, range may be single digit\n max = getValue(rangeSplit[1], offset, max) || max;\n }\n\n add(curSched, name, min, max, inc);\n }\n\n /**\n * Parses a particular item within a cron expression.\n *\n * @param {String} item: The cron expression item to parse\n * @param {Object} s: The existing set of schedules\n * @param {String} name: The name to use for this constraint\n * @param {Number} min: The min value for the constraint\n * @param {Number} max: The max value for the constraint\n * @param {Number} offset: The offset to apply to the cron value\n */\n function parse(item, s, name, min, max, offset) {\n let value,\n split,\n schedules = s.schedules,\n curSched = schedules[schedules.length - 1];\n\n // L just means min - 1 (this also makes it work for any field)\n if (item === 'L') {\n item = (min - 1).toString(10);\n }\n\n // parse x\n if ((value = getValue(item, offset, max)) !== null) {\n add(curSched, name, value, value);\n }\n // parse xW\n else if ((value = getValue(item.replace('W', ''), offset, max)) !== null) {\n addWeekday(s, curSched, value);\n }\n // parse xL\n else if ((value = getValue(item.replace('L', ''), offset, max)) !== null) {\n addHash(schedules, curSched, value, min - 1);\n }\n // parse x#y\n else if ((split = item.split('#')).length === 2) {\n value = getValue(split[0], offset, max);\n addHash(schedules, curSched, value, getValue(split[1]));\n }\n // parse x-y or x-y/z or */z or 0/z\n else {\n addRange(item, curSched, name, min, max, offset);\n }\n }\n\n /**\n * Returns true if the item is either of the form x#y or xL.\n *\n * @param {String} item: The expression item to check\n */\n function isHash(item) {\n return item.indexOf('#') > -1 || item.indexOf('L') > 0;\n }\n\n function itemSorter(a, b) {\n return isHash(a) && !isHash(b) ? 1 : a - b;\n }\n\n /**\n * Parses each of the fields in a cron expression. The expression must\n * include the seconds field, the year field is optional.\n *\n * @param {String} expr: The cron expression to parse\n */\n function parseExpr(expr) {\n const schedule = { schedules: [{}], exceptions: [] };\n const components = expr.replace(/(\\s)+/g, ' ').split(' ');\n let field;\n let f;\n let component;\n let items;\n\n for (field in FIELDS) {\n f = FIELDS[field];\n component = components[f[0]];\n if (component && component !== '*' && component !== '?') {\n // need to sort so that any #'s come last, otherwise\n // schedule clones to handle # won't contain all of the\n // other constraints\n items = component.split(',').sort(itemSorter);\n let i;\n const length = items.length;\n for (i = 0; i < length; i++) {\n parse(items[i], schedule, field, f[1], f[2], f[3]);\n }\n }\n }\n\n return schedule;\n }\n\n /**\n * Make cron expression parsable.\n *\n * @param {String} expr: The cron expression to prepare\n */\n function prepareExpr(expr) {\n const prepared = expr.toUpperCase();\n return REPLACEMENTS[prepared] || prepared;\n }\n\n function parseCron(expr, hasSeconds) {\n const e = prepareExpr(expr);\n return parseExpr(hasSeconds ? e : '0 ' + e);\n }\n\n const schedule = parseCron(cronspec, withSeconds);\n\n function absFloor(number) {\n if (number < 0) {\n return Math.ceil(number);\n } else {\n return Math.floor(number);\n }\n }\n\n function toInt(argumentForCoercion) {\n const coercedNumber = +argumentForCoercion;\n let value = 0;\n\n if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n value = absFloor(coercedNumber);\n }\n\n return value;\n }\n\n function ordinal(number) {\n const b = number % 10,\n output = (toInt(number % 100 / 10) === 1) ? locale.ORDINALS.th :\n (b === 1) ? locale.ORDINALS.st :\n (b === 2) ? locale.ORDINALS.nd :\n (b === 3) ? locale.ORDINALS.rd : locale.ORDINALS.th;\n return number + output;\n }\n\n /**\n * For an array of numbers, e.g. a list of hours in a schedule,\n * return a string listing out all of the values (complete with\n * \"and\" plus ordinal text on the last item).\n * @param {Number[]} numbers\n * @returns {string}\n */\n function numberList(numbers) {\n if (numbers.length < 2) {\n return ordinal(numbers);\n }\n\n const lastVal = numbers.pop();\n return numbers.join(', ') + ' ' + locale['and'] + ' ' + ordinal(lastVal);\n }\n\n /**\n * Parse a number into day of week, or a month name;\n * used in dateList below.\n * @param {Number|String} value\n * @param {String} type\n * @returns {String}\n */\n function numberToDateName(value, type) {\n if (type === 'dow') {\n return locale.DOW[value - 1];\n } else if (type === 'mon') {\n return locale.MONTH[value - 1];\n }\n }\n\n /**\n * From an array of numbers corresponding to dates (given in type: either\n * days of the week, or months), return a string listing all the values.\n * @param {Number[]} numbers\n * @param {String} type\n * @returns {String}\n */\n function dateList(numbers, type) {\n if (numbers.length < 2) {\n return numberToDateName('' + numbers[0], type);\n }\n\n const lastVal = '' + numbers.pop();\n let outputText = '';\n\n for (let i = 0, value; (value = numbers[i]); i++) {\n if (outputText.length > 0) {\n outputText += ', ';\n }\n outputText += numberToDateName(value, type);\n }\n return outputText + ' ' + locale['and'] + ' ' + numberToDateName(lastVal, type);\n }\n\n /**\n * Pad to equivalent of sprintf('%02d').\n * @param {Number} x\n * @returns {string}\n */\n function zeroPad(x) {\n return (x < 10) ? '0' + x : x;\n }\n\n //----------------\n\n /**\n * Given a schedule, generate a friendly sentence description.\n * @param {Object} schedule\n * @param {boolean} withSeconds\n * @returns {string}\n */\n function scheduleToSentence(schedule, withSeconds) {\n let outputText = locale.Every + ' ';\n\n if (schedule['h'] && schedule['m'] && schedule['h'].length <= 2 && schedule['m'].length <= 2 && withSeconds && schedule['s'] && schedule['s'].length <= 2 ) {\n // If there are only one or two specified values for\n // hour or minute, print them in HH:MM:SS format\n\n const hm = [];\n for (let i = 0; i < schedule['h'].length; i++) {\n for (let j = 0; j < schedule['m'].length; j++) {\n for (let k = 0; k < schedule['s'].length; k++) {\n hm.push(zeroPad(schedule['h'][i]) + ':' + zeroPad(schedule['m'][j]) + ':' + zeroPad(schedule['s'][k]));\n }\n }\n }\n if (hm.length < 2) {\n outputText = locale['At'] + ' ' + hm[0];\n } else {\n const lastVal = hm.pop();\n outputText = locale['At'] + ' ' + hm.join(', ') + ' ' + locale.and + ' ' + lastVal;\n }\n if (!schedule['d'] && !schedule['D']) {\n outputText += ' ' + locale['every day'] + ' ';\n }\n } else\n if (schedule['h'] && schedule['m'] && schedule['h'].length <= 2 && schedule['m'].length <= 2) {\n // If there are only one or two specified values for\n // hour or minute, print them in HH:MM format\n\n const hm = [];\n for (let i = 0; i < schedule['h'].length; i++) {\n for (let j = 0; j < schedule['m'].length; j++) {\n hm.push(zeroPad(schedule['h'][i]) + ':' + zeroPad(schedule['m'][j]));\n }\n }\n if (hm.length < 2) {\n outputText = locale['At'] + ' ' + hm[0];\n } else {\n const lastVal = hm.pop();\n outputText = locale['At'] + ' ' + hm.join(', ') + ' ' + locale.and + ' ' + lastVal;\n }\n\n if (!schedule['d'] && !schedule['D']) {\n outputText += ' ' + locale['every day'] + ' ';\n }\n } else {\n // Otherwise, list out every specified hour/minute value.\n\n if (schedule['h']) { // runs only at specific hours\n if (schedule['m']) { // and only at specific minutes\n if (withSeconds) {\n if (!schedule['s'] || schedule['s'].length === 60) {\n outputText += locale['second of every'] + ' ' + numberList(schedule['m']) + ' ' + locale['minute past the'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];\n } else {\n outputText += numberList(schedule['s']) + ' ' + locale['second of every'] + ' ' +numberList(schedule['m']) + ' ' + locale['minute past the'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];\n }\n } else {\n outputText += numberList(schedule['m']) + ' ' + locale['minute past the'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];\n }\n } else { // specific hours, but every minute\n if (withSeconds) {\n if (!schedule['s'] || schedule['s'].length === 60) {\n outputText += locale['second of every'] + ' ' + locale['minute of'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];\n } else {\n outputText += numberList(schedule['s']) + ' ' + locale['second of every'] + ' ' + locale['minute of'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];\n }\n } else {\n outputText += locale['minute of'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];\n }\n }\n } else if (schedule['m']) { // every hour, but specific minutes\n if (withSeconds) {\n if (!schedule['s'] || schedule['s'].length === 60) {\n outputText += locale['second of every'] + ' ' + numberList(schedule['m']) + ' ' + locale['minute every hour'];\n } else {\n outputText += numberList(schedule['s']) + ' ' + locale['second of every'] + ' ' + numberList(schedule['m']) + ' ' + locale['minute every hour'];\n }\n } else {\n outputText += numberList(schedule['m']) + ' ' + locale['minute every hour'];\n }\n } else if (withSeconds) {\n if (!schedule['s'] || schedule['s'].length === 60) {\n outputText += locale['second'];\n } else {\n outputText += numberList(schedule['s']) + ' ' + locale['second'];\n }\n } else { // cronspec has \"*\" for both hour and minute\n outputText += locale['minute'];\n }\n }\n\n if (schedule['D']) { // runs only on specific day(s) of month\n outputText += (locale['on the'] ? ' ' + locale['on the'] + ' ' : ' ') + numberList(schedule['D']);\n if (!schedule['M']) {\n outputText += ' ' + locale['of every month'];\n }\n }\n\n if (schedule['d']) { // runs only on specific day(s) of week\n if (schedule['D']) {\n // if both day fields are specified, cron uses both; superuser.com/a/348372\n outputText += ' ' + locale['and every'] + ' ';\n } else {\n outputText += ' ' + locale['on'] + ' ';\n }\n outputText += dateList(schedule['d'], 'dow');\n }\n\n if (schedule['M']) {\n // runs only in specific months; put this output last\n outputText += ' ' + locale['in'] + ' ' + dateList(schedule['M'], 'mon');\n }\n\n return outputText;\n }\n\n return scheduleToSentence(schedule.schedules[0], withSeconds);\n}\n\nexport default cronToText;\n","var JQUERY_CRON_LOCALE = {};\n\nJQUERY_CRON_LOCALE.en = {\n ORDINALS: {\n th: 'th',\n st: 'st',\n nd: 'nd',\n rd: 'rd'\n },\n MONTH: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec'\n ],\n DOW: [\n 'Sun',\n 'Mon',\n 'Tue',\n 'Wed',\n 'Thu',\n 'Fri',\n 'Sat'\n ],\n 'Every': 'Every', // start of expression\n 'and': 'and', // 1, 2, 3 and 15th\n 'every day': 'every day',\n 'minute past the': 'minute past the',\n 'hour': 'hour',\n 'minute': 'minute',\n 'minute of': 'minute of',\n 'second': 'second',\n 'second in minute': 'second in minute',\n 'second of every': 'second of every',\n 'minute every hour': 'minute every hour',\n 'on the': 'on the',\n 'of every month': 'of every month',\n 'and every': 'and every',\n 'At': 'At',\n 'on': 'on', // on sun, mon\n 'in': 'in' // in jan, apr\n};\n\nJQUERY_CRON_LOCALE.de = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n 'Januar',\n 'Februar',\n 'März',\n 'April',\n 'Mai',\n 'Juni',\n 'Juli',\n 'August',\n 'September',\n 'Oktober',\n 'November',\n 'Dezember'\n ],\n DOW: [\n 'Sonntag',\n 'Montag',\n 'Dienstag',\n 'Mittwoch',\n 'Donnerstag',\n 'Freitag',\n 'Samstag'\n ],\n 'Every': 'Jede(r)', // start of expression\n 'and': 'und', // 1, 2, 3 and 15th\n 'every day': 'jeden Tag',\n 'minute past the': 'Minuten nach',\n 'hour': 'Stunde',\n 'minute': 'Minute',\n 'minute of': 'Minuten von',\n 'second': 'Sekunde',\n 'second in minute': 'Sekunde in der Minute',\n 'second of every': 'Sekunde in',\n 'minute every hour': 'Minute jede Stunde',\n 'on the': 'am',\n 'of every month': 'im jeden Monat',\n 'and every': 'und am jeden',\n 'At': 'Um',\n 'on': 'am', // on sun, mon\n 'in': 'im' // in jan, apr\n};\n\nJQUERY_CRON_LOCALE.ru = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n 'Январе',\n 'Феврале',\n 'Марте',\n 'Апреле',\n 'Майе',\n 'Июне',\n 'Июле',\n 'Августе',\n 'Сентябре',\n 'Октябре',\n 'Ноябре',\n 'Декабре'\n ],\n DOW: [\n 'воскресение',\n 'понедельник',\n 'вторник',\n 'среду',\n 'четверг',\n 'пятницу',\n 'субботу'\n ],\n 'Every': 'Каждую(ый)', // start of expression\n 'and': 'и', // 1, 2, 3 and 15th\n 'every day': 'каждый день',\n 'minute past the': 'минуту в',\n 'hour': 'часа(ов)',\n 'minute': 'минуту',\n 'minute of': 'минут(у) в',\n 'second': 'секунду',\n 'second in minute': 'секунду в минуте',\n 'second of every': 'секунду каждой(го)',\n 'minute every hour': 'минуту каждый час',\n 'on the': '',\n 'of every month': 'числа каждого месяца',\n 'and every': 'и каждый',\n 'At': 'В',\n 'on': 'в', // on sun, mon\n 'in': 'в' // in jan, apr\n};\n\nJQUERY_CRON_LOCALE.fr = {\n ORDINALS: {\n th: 'th',\n st: 'st',\n nd: 'nd',\n rd: 'rd'\n },\n MONTH: [\n 'Fév',\n 'Mar',\n 'Avr',\n 'Mai',\n 'Jun',\n 'Juil',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Déc'\n\n ],\n DOW: [\n 'Dim',\n 'Lun',\n 'Mar',\n 'Mer',\n 'Jeu',\n 'Ven',\n 'Sam'\n\n ],\n 'Every': 'Chaque',\n 'and': 'et',\n 'every day': 'tous les jours',\n 'minute past the': 'minute après le',\n 'hour': 'heure',\n 'minute': 'minute',\n 'minute of': 'minute de',\n 'second': 'seconde',\n 'second in minute': 'seconde en minute',\n 'second of every': 'deuxième de tous',\n 'minute every hour':'minute toutes les heures',\n 'on the': 'sur le',\n 'of every month': 'de chaque mois',\n 'and every': 'et tous',\n 'At': 'À',\n 'on': 'sur',\n 'in': 'dans'\n};\n\nJQUERY_CRON_LOCALE.it = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'Pot',\n 'Giu',\n 'Lug',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dic'\n ],\n DOW: [\n 'Dom',\n 'Mon',\n 'Mar',\n 'Mer',\n 'Gio',\n 'Ve',\n 'Sat'\n ],\n 'Every': 'Ogni',\n 'and': 'e',\n 'every day': 'ogni giorno',\n 'minute past the': 'minuto dopo',\n 'hour': 'ora',\n 'minute': 'Minuto',\n 'minute of': 'minuto di',\n 'second': 'secondo',\n 'second in minute': \"secondo in minuto\",\n 'second of every': 'secondo di ogni',\n 'minute every hour': 'minuto ogni ora',\n 'on the': 'sul',\n 'of every month': 'di ogni mese',\n 'and every': 'e ogni',\n 'At': 'A',\n 'on': 'sopra',\n 'in': 'in'\n};\n\nJQUERY_CRON_LOCALE.pt = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Abr',\n 'Pod',\n 'Jun',\n 'Jul',\n 'Ago',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec'\n ],\n DOW: [\n 'Dom',\n 'Seg',\n 'Ter',\n 'Qua',\n 'Qui',\n 'Sex',\n 'Sen'\n ],\n 'Every': 'Cada',\n 'and': 'e',\n 'every day': 'todo dia',\n 'minute past the': 'minuto após o',\n 'hour': 'hora',\n 'minute': 'minuto',\n 'minute of': 'minuto de',\n 'second': 'segundo',\n 'second in minute': 'segundo em minuto',\n 'second of every': 'segundo de cada',\n 'minute every hour': 'minuto a cada hora',\n 'on the': 'no',\n 'of every month': 'de todos os meses',\n 'and every': 'e todos',\n 'At': 'At',\n 'on': 'em',\n 'in': 'dentro'\n};\n\nJQUERY_CRON_LOCALE.pl = {\n ORDINALS: {\n th: 'th',\n st: 'st',\n nd: 'nd',\n rd: 'rd'\n },\n MONTH: [ //short or full names\n 'Sty', // or 'Styczeń'\n 'Lut', // or 'Luty'\n 'Mar', // or 'Marzec'\n 'Kwi', // or 'Kwiecień'\n 'Maj', // or 'Maj'\n 'Cze', // or 'Czerwiec'\n 'Lip', // or 'Lipiec'\n 'Sie', // or 'Sierpień'\n 'Wrz', // or 'Wrzesień'\n 'Paź', // or 'Październik'\n 'Lis', // or 'Listopad'\n 'Gru' // or 'Grudzień'\n ],\n DOW: [ //short or full days name\n 'Nie', // or 'Niedziela'\n 'Pon', // or 'Poniedziałek'\n 'Wto', // or 'Wtorek'\n 'Śro', // or 'Środa'\n 'Czw', // or 'Czwartek'\n 'Pią', // or 'Piątek'\n 'Sob' // or 'Sobota\n ],\n 'Every': 'Każde(go)', // start of expression\n 'and': 'i', // 1, 2, 3 and 15th\n 'every day': 'codziennie',\n 'minute past the': 'minut po', //minute past the hour ?\n 'hour': 'godzina',\n 'minute': 'minut(a)',\n 'minute of': 'minut po',\n 'second': 'sekunda',\n 'second in minute': 'sekund na minutę',\n 'second of every': 'sekund co',\n 'minute every hour': 'minut co godzinę',\n 'on the': 'w',\n 'of every month': 'każdego miesiąca',\n 'and every': 'i każdego',\n 'At': 'O',\n 'on': 'w', // on sun, mon\n 'in': 'w' // in jan, apr\n};\n\nJQUERY_CRON_LOCALE.es = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n 'Ene',\n 'Feb',\n 'Mar',\n 'Abr',\n 'Mayo',\n 'Jun',\n 'Jul',\n 'Ago',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dic'\n ],\n DOW: [\n 'Sol',\n 'Lun',\n 'Mar',\n 'Mie',\n 'Jue',\n 'Vie',\n 'Sab'\n ],\n 'Every': 'Cada',\n 'and': 'y',\n 'every day': 'cada día',\n 'minute past the': 'minuto pasado el',\n 'hour': 'hora',\n 'minute': 'minuto',\n 'minute of': 'minuto de',\n 'second': 'segundo',\n 'second in minute': 'segundo en minuto',\n 'second of every': 'segundo de cada',\n 'minute every hour': 'minuto cada hora',\n 'on the': 'sobre el',\n 'of every month': 'de cada mes',\n 'and every': 'y cada',\n 'At': 'A',\n 'on': 'en',\n 'in': 'en'\n};\n\nJQUERY_CRON_LOCALE.nl = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'Mei',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Okt',\n 'Nov',\n 'Dec'\n ],\n DOW: [\n 'Zon',\n 'Mon',\n 'Di',\n 'Wo',\n 'Don',\n 'Vrij',\n 'Za'\n ],\n 'Every': 'Elke',\n 'and': 'en',\n 'every day': 'elke dag',\n 'minute past the': 'minuut voorbij de',\n 'hour': 'uur',\n 'minute': 'minuut',\n 'minute of': 'minuut van',\n 'second': 'tweede',\n 'second in minute': 'tweede in minuut',\n 'second of every': 'tweede van alles',\n 'minute every hour': 'minuut elk uur',\n 'on the': 'op de',\n 'of every month': 'van elke maand',\n 'and every': 'en elke',\n 'At': 'Op',\n 'on': 'op',\n 'in': 'in'\n};\n\nJQUERY_CRON_LOCALE['zh-cn'] = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n '一月',\n '二月',\n '三月',\n '四月',\n '五月',\n '六月',\n '七月',\n '八月',\n '九月',\n '十月',\n '十一月',\n '十二月'\n ],\n DOW: [\n '星期日',\n '星期一',\n '星期二',\n '星期三',\n '星期四',\n '星期五',\n '星期六'\n ],\n 'Every': '每', // start of expression\n 'and': '和', // 1, 2, 3 and 15th\n 'every day': '每天',\n 'minute past the': '分钟在每天第',\n 'hour': '小时',\n 'minute': '分钟',\n 'minute of': '分钟的',\n 'second': '秒',\n 'second in minute': '秒在分钟',\n 'second of every': '秒在每',\n 'minute every hour': '分钟在每小时中',\n 'on the': '在',\n 'of every month': '日在每月',\n 'and every': '且每',\n 'At': '在',\n 'on': '在', // on sun, mon\n 'in': '在' // in jan, apr\n};\n\nexport default JQUERY_CRON_LOCALE;\n","import cronToText from './cron2text';\nimport JQUERY_CRON_LOCALE from './jquery.cron.locale';\n\nfunction correctCasus(text, seconds) {\n text = text.replace('Каждую(ый) минуту', 'Каждую минуту');\n text = text.replace('Каждую(ый) минут(у)', 'Каждую минуту');\n text = text.replace('Каждую(ый) час', 'Каждый час');\n text = text.replace('Каждую(ый) секунду', 'Каждую секунду');\n text = text.replace(/ (\\d{1,2}) числа/, ' $1го числа');\n\n text = text.replace(/ (\\d{1,2}) в Январе/, ' $1го числа в Январе');\n text = text.replace(/ (\\d{1,2}) в Феврале/, ' $1го числа в Феврале');\n text = text.replace(/ (\\d{1,2}) в Марте/, ' $1го числа в Марте');\n text = text.replace(/ (\\d{1,2}) в Апреле/, ' $1го числа в Апреле');\n text = text.replace(/ (\\d{1,2}) в Майе/, ' $1го числа в Майе');\n text = text.replace(/ (\\d{1,2}) в Июне/, ' $1го числа в Июне');\n text = text.replace(/ (\\d{1,2}) в Июле/, ' $1го числа в Июле');\n text = text.replace(/ (\\d{1,2}) в Августе/, ' $1го числа в Августе');\n text = text.replace(/ (\\d{1,2}) в Сентябре/, ' $1го числа в Сентябре');\n text = text.replace(/ (\\d{1,2}) в Октябре/, ' $1го числа в Октябре');\n text = text.replace(/ (\\d{1,2}) в Ноябре/, ' $1го числа в Ноябре');\n text = text.replace(/ (\\d{1,2}) в Декабре/, ' $1го числа в Декабре');\n\n text = text.replace('Каждую(ый) 0 минуту', 'Каждые ноль минут');\n text = text.replace(/Каждую\\(ый\\) ([\\d\\sи,]+) минуту/, 'Каждую $1 минуту');\n\n text = text.replace(/каждой\\(го\\) ([\\d\\sи,]+) минуту/, 'каждой $1 минуты');\n text = text.replace('каждой(го) минут(у)', 'каждой минуты');\n\n text = text.replace(' 0 часа(ов)', ' 0 часов');\n text = text.replace(' 1 часа(ов)', ' 1 час');\n text = text.replace(' 2 часа(ов)', ' 2 часа');\n text = text.replace(' 3 часа(ов)', ' 3 часа');\n text = text.replace(' 4 часа(ов)', ' 4 часа');\n text = text.replace(/ (\\d{1,2}) часа\\(ов\\)/, ' $1 часов');\n\n text = text.replace('Jede(r) Sekunde', 'Jede Sekunde');\n text = text.replace(/Jede\\(r\\) ([\\d\\sund,]+) Sekunde/, 'Jede $1 Sekunde');\n text = text.replace('Jede(r) Minute', 'Jede Minute');\n text = text.replace('Jede Minuten', 'Jede Minute');\n text = text.replace('Jede(r) Stunde', 'Jede Stunde');\n text = text.replace(/Jede\\(r\\) ([\\d\\sund,]+) Minute/, 'Jede $1 Minute');\n text = text.replace('Jede Sekunde in Minuten', 'Jede Sekunde in jeder Minute');\n\n return text;\n}\n\nfunction convertCronToText(cron, lang) {\n const withSeconds = cron.split(' ').length === 6;\n let text = cronToText(cron, withSeconds, JQUERY_CRON_LOCALE[lang] || JQUERY_CRON_LOCALE.en);\n return correctCasus(text, withSeconds);\n}\n\nexport default convertCronToText;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from '@material-ui/core/styles';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport Button from '@material-ui/core/Button';\n\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport AppBar from '@material-ui/core/AppBar';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport I18n from '@iobroker/adapter-react/i18n';\nimport TextField from '@material-ui/core/TextField';\nimport convertCronToText from './simple-cron/cronText';\n\nconst styles = theme => ({\n mainDiv: {\n width: '100%',\n height: '100%',\n overflow: 'auto'\n },\n periodSelect: {\n //margin: '0 10px 60px 10px',\n display: 'block',\n width: 200\n },\n slider: {\n marginTop: 20,\n display: 'block',\n width: '100%'\n },\n tabContent: {\n padding: 20\n },\n numberButton: {\n padding: 4,\n minWidth: 40,\n margin: 5\n },\n numberButtonBreak: {\n display: 'block'\n },\n appBar: {\n color: 'white'\n }\n});\n\nconst WEEKDAYS = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n 'Sunday',\n];\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n];\n\n// 5-7,9-11 => [5,6,7,9,10,11]\nfunction convertMinusIntoArray(value, max) {\n let result = [];\n if (value === '*') {\n if (max === 24 || max === 60 || max === 7) {\n for (let i = 0; i < max; i++) {\n result.push(i);\n }\n } else {\n for (let i = 1; i <= max; i++) {\n result.push(i);\n }\n }\n return result; // array with entries max\n }\n const parts = (value || '').toString().split(',');\n for (let p = 0; p < parts.length; p++) {\n if (! parts[p].trim().length) continue;\n const items = parts[p].trim().split('-');\n if (items.length > 1) {\n let iMax = parseInt(items[1], 10);\n for (let i = parseInt(items[0], 10); i <= iMax; i++) {\n result.push(i);\n }\n } else {\n result.push(parseInt(parts[p], 10));\n }\n }\n result = result.map(a => parseInt(a, 10));\n\n result.sort();\n\n\n // remove double entries\n for (let p = result.length - 1; p >= 0; p--) {\n if (result[p] === result[p + 1]) {\n result.splice(p + 1, 1);\n }\n }\n\n\n return result;\n}\n\n// [5,6,7,9,10,11] => 5-7,9-11\nfunction convertArrayIntoMinus(value, max) {\n if (typeof value !== 'object') {\n value = [value];\n }\n if (value.length === max) {\n return '*';\n }\n const newParts = [];\n if (!value.length) {\n return '-';\n }\n value = value.map(a => parseInt(a, 10));\n\n value.sort((a, b) => a -b);\n\n let start = value[0];\n let end = value[0];\n for (let p = 1; p < value.length; p++) {\n if (value[p] - 1 !== parseInt(value[p - 1], 10)) {\n if (start === end) {\n newParts.push(start)\n } else if (end - 1 === start) {\n newParts.push(start + ',' + end);\n } else {\n newParts.push(start + '-' + end);\n }\n start = value[p];\n end = value[p];\n } else {\n end = value[p];\n }\n }\n\n if (start === end) {\n newParts.push(start)\n } else if (end - 1 === start) {\n newParts.push(start + ',' + end);\n } else {\n newParts.push(start + '-' + end);\n }\n\n return newParts.join(',');\n}\n\nclass ComplexCron extends React.Component {\n constructor(props) {\n super(props);\n let cron = (typeof this.props.cronExpression === 'string') ? this.props.cronExpression.replace(/^[\"']/, '').replace(/[\"']\\n?$/, '') : '';\n if (cron[0] === '{') {\n cron = '';\n }\n const state = ComplexCron.cron2state(cron || '* * * * *');\n\n this.state = {\n extended: false,\n tab: state.seconds !== false ? 1 : 0,\n cron: ComplexCron.state2cron(state),\n modes: {\n seconds: null,\n minutes: null,\n hours: null,\n dates: null,\n months: null,\n dows: null\n }\n };\n Object.assign(this.state, state);\n if (this.state.cron !== this.props.cronExpression) {\n setTimeout(() => this.props.onChange && this.props.onChange(this.state.cron), 100);\n }\n }\n\n static cron2state(cron) {\n cron = cron.replace(/['\"]/g, '').trim();\n const cronParts = cron.split(' ').map(p => p.trim());\n const options = {};\n\n if (cronParts.length === 6) {\n options.seconds = cronParts[0] || '*';\n options.minutes = cronParts[1] || '*';\n options.hours = cronParts[2] || '*';\n options.dates = cronParts[3] || '*';\n options.months = cronParts[4] || '*';\n options.dows = cronParts[5] || '*';\n } else {\n options.seconds = false;\n options.minutes = cronParts[0] || '*';\n options.hours = cronParts[1] || '*';\n options.dates = cronParts[2] || '*';\n options.months = cronParts[3] || '*';\n options.dows = cronParts[4] || '*';\n }\n return options;\n }\n static state2cron(state) {\n let text = `${state.minutes} ${state.hours} ${state.dates} ${state.months} ${state.dows}`;\n if (state.seconds !== false) {\n text = state.seconds + ' ' + text;\n }\n return text;\n }\n\n recalcCron() {\n let cron = ComplexCron.state2cron(this.state);\n if (cron !== this.state.cron) {\n this.setState({cron}, () => {\n this.props.onChange && this.props.onChange(this.state.cron);\n });\n }\n }\n\n onChange(cron) {\n if (cron !== this.state.cron) {\n this.setState({cron});\n this.props.onChange && this.props.onChange(cron);\n }\n }\n\n onToggle(i, type, max) {\n if (i === true) {\n this.setState({[type]: '*'}, () => this.recalcCron());\n } else if (i === false) {\n if (max === 60 || max === 24) {\n this.setState({[type]: '0'}, () => this.recalcCron());\n } else {\n this.setState({[type]: '1'}, () => this.recalcCron());\n }\n } else {\n let nums = convertMinusIntoArray(this.state[type], max);\n const pos = nums.indexOf(i);\n if (pos !== -1) {\n nums.splice(pos, 1);\n } else {\n nums.push(i);\n nums.sort();\n }\n this.setState({[type]: convertArrayIntoMinus(nums, max)}, () => this.recalcCron());\n }\n }\n\n getDigitsSelector(type, max) {\n let values = [];\n if (max === 7) {\n values = [1,2,3,4,5,6,0];\n } else if (max === 60 || max === 24) {\n for (let i = 0; i < max; i++) {\n values.push(i);\n }\n } else {\n for (let i = 1; i <= max; i++) {\n values.push(i);\n }\n }\n const parts = convertMinusIntoArray(this.state[type], max);\n return [\n (
),\n (
),\n (
\n {values.map(i =>\n [((max === 7 && i === 4) ||\n (max === 12 && i === 7) ||\n (max === 31 && !((i - 1) % 10)) ||\n (max === 60 && i && !(i % 10)) ||\n (max === 24 && i && !(i % 6))) ?\n (
) : null,\n (
\n )])}\n
)];\n }\n\n getPeriodsTab(type, max) {\n let value = this.state[type];\n let every = value === '*';\n let everyN = value.toString().indexOf('/') !== -1;\n let select;\n if (this.state.modes[type] === null) {\n select = every ? 'every' : (everyN ? 'everyN' : 'specific');\n const modes = JSON.parse(JSON.stringify(this.state.modes));\n modes[type] = select;\n return setTimeout(() => this.setState({modes}, () => this.recalcCron()), 100);\n } else {\n every = this.state.modes[type] === 'every';\n everyN = this.state.modes[type] === 'everyN';\n select = this.state.modes[type];\n }\n\n if (everyN) {\n value = parseInt(value.replace('*/', ''), 10) || 1;\n }\n\n return (
\n \n {everyN && false && ({value})}\n {everyN && ( {\n this.setState({[type]: '*/' + e.target.value}, () => this.recalcCron());\n }}\n InputLabelProps={{shrink: true,}}\n type=\"number\"\n margin=\"normal\"\n />)}\n {!every && !everyN && this.getDigitsSelector(type, max)}\n
);\n }\n\n convertCronToText(cron, lang) {\n if (cron.split(' ').indexOf('-') !== -1) {\n return I18n.t('Invalid CRON');\n } else {\n return convertCronToText(cron, lang);\n }\n }\n\n render() {\n const tab = this.state.seconds !== false ? this.state.tab : this.state.tab + 1;\n return (\n
\n
\n
{this.convertCronToText(this.state.cron, this.props.language || 'en')}
\n
this.setState({seconds: e.target.checked ? '*' : false}, () => this.recalcCron())}/>}\n label={I18n.t('use seconds')}\n />\n \n \n this.setState({tab})}>\n {this.state.seconds !== false && }\n \n \n \n \n \n \n \n {tab === 0 && ({this.getPeriodsTab('seconds', 60)}
)}\n {tab === 1 && ({this.getPeriodsTab('minutes', 60)}
)}\n {tab === 2 && ({this.getPeriodsTab('hours', 24)}
)}\n {tab === 3 && ({this.getPeriodsTab('dates', 31)}
)}\n {tab === 4 && ({this.getPeriodsTab('months', 12)}
)}\n {tab === 5 && ({this.getPeriodsTab('dows', 7)}
)}\n \n );\n }\n}\n\nComplexCron.propTypes = {\n cronExpression: PropTypes.string,\n onChange: PropTypes.func,\n language: PropTypes.string,\n};\n\nexport default withStyles(styles)(ComplexCron);\n\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from '@material-ui/core/styles';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport TextField from '@material-ui/core/TextField';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport convertCronToText from './cronText';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n mainDiv: {\n width: '100%',\n height: '100%',\n overflow: 'auto'\n },\n formControl: {\n margin: 0,\n minWidth: 120,\n },\n formControlMarginRight: {\n marginRight: 5\n },\n formControlPaddingTop: {\n paddingTop: 6.2\n }\n});\n\nconst PERIODIC = {\n once: 'once',\n interval: 'interval',\n intervalBetween: 'intervalBetween',\n specific: 'specific'\n};\nconst PERIODIC_TYPES = {\n seconds: 'seconds',\n minutes: 'minutes',\n //hours: 'hours',\n};\nconst WEEKDAYS = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n 'Sunday',\n];\n\nfunction padding(num) {\n if (num < 10) return '0' + num;\n return '' + num;\n}\nconst DEFAULT_STATE = {\n mode: PERIODIC.interval,\n interval: {\n period: 1,\n unit: PERIODIC_TYPES.minutes\n }\n};\n\nclass SimpleCron extends React.Component {\n constructor(props) {\n super(props);\n let cron = (typeof this.props.cronExpression === 'string') ? this.props.cronExpression.replace(/^[\"']/, '').replace(/[\"']\\n?$/, '') : '';\n if (cron[0] === '{') {\n cron = '';\n }\n const state = SimpleCron.cron2state(cron || '* * * * *') || DEFAULT_STATE;\n\n this.state = {\n extended: false,\n cron: SimpleCron.state2cron(state),\n mode: 'interval',\n once: {\n time: '00:00',\n date: ''\n },\n interval: {\n period: 1,\n unit: PERIODIC_TYPES.minutes\n },\n intervalBetween: {\n period: 1,\n unit: PERIODIC_TYPES.minutes,\n timeFrom: 0,\n timeTo: 24,\n weekdays: [0, 1, 2, 3, 4, 5, 6]\n },\n specific: {\n time: '00:00',\n weekdays: [0, 1, 2, 3, 4, 5, 6]\n }\n };\n Object.assign(this.state, state);\n\n if (this.state.cron !== this.props.cronExpression) {\n setTimeout(() => this.props.onChange && this.props.onChange(this.state.cron), 100);\n }\n }\n\n static periodArray2text(list, max) {\n max = max || 7;\n if (list.length === max) {\n return '*';\n } else {\n let text = [];\n let start = null;\n let end = null;\n for (let i = 0; i < list.length; i++) {\n if (start === null) {\n start = list[i];\n end = list[i];\n } else if (list[i - 1] + 1 === list[i]) {\n end = list[i];\n } else {\n if (start !== end) {\n text.push(start + '-' + end);\n } else {\n text.push(start);\n }\n start = list[i];\n end = list[i];\n }\n }\n if (start !== end) {\n text.push(start + '-' + end);\n } else {\n text.push(start);\n }\n return text.join(',');\n }\n }\n\n static text2weekdays(text) {\n if (text === '*') {\n return [0,1,2,3,4,5,6];\n }\n const parts = text.split(',');\n const list = [];\n parts.forEach(part => {\n const _parts = part.split('-');\n if (_parts.length === 2) {\n const start = parseInt(_parts[0], 10);\n const end = parseInt(_parts[1], 10);\n for (let day = start; day <= end; day++) {\n if (list.indexOf(day === 7 ? 0 : day) === -1) {\n list.push(day === 7 ? 0 : day);\n }\n }\n } else {\n if (part === '7') {\n part = 0;\n }\n part = parseInt(part, 10);\n if (list.indexOf(part) === -1) {\n list.push(part);\n }\n }\n });\n list.sort();\n return list;\n }\n\n static cron2state(cron) {\n cron = cron.replace(/['\"]/g, '').trim();\n const cronParts = cron.split(' ');\n const options = {};\n const state = {\n mode: ''\n };\n if (cronParts.length === 6) {\n options.seconds = cronParts[0] || '*';\n options.minutes = cronParts[1] || '*';\n options.hours = cronParts[2] || '*';\n options.date = cronParts[3] || '*';\n options.months = cronParts[4] || '*';\n options.dow = cronParts[5] || '*';\n } else {\n options.seconds = null;\n options.minutes = cronParts[0] || '*';\n options.hours = cronParts[1] || '*';\n options.date = cronParts[2] || '*';\n options.months = cronParts[3] || '*';\n options.dow = cronParts[4] || '*';\n }\n\n // * * * * *\n if (options.seconds === null &&\n options.minutes === '*' &&\n options.hours === '*' &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.interval;\n state.interval = {\n period: 1,\n unit: PERIODIC_TYPES.minutes\n };\n } // * * * * * *\n if (options.seconds === '*' &&\n options.minutes === '*' &&\n options.hours === '*' &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.interval;\n state.interval = {\n period: 1,\n unit: PERIODIC_TYPES.seconds\n };\n } else// */n * * * *\n if (options.seconds === null &&\n options.minutes.indexOf('/') !== -1 &&\n options.hours === '*' &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.interval;\n state.interval = {\n period: parseInt(options.minutes.split('/')[1], 10),\n unit: PERIODIC_TYPES.minutes\n };\n } else\n // */n * * * * *\n if (options.seconds !== null && options.seconds.indexOf('/') !== -1 &&\n options.minutes === '*' &&\n options.hours === '*' &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.interval;\n state.interval = {\n period: parseInt(options.seconds.split('/')[1], 10),\n unit: PERIODIC_TYPES.seconds\n };\n } else\n // */n * 1-24 * * 1-7 or */n * 1-24 * * *\n if (options.seconds !== null && options.seconds.indexOf('/') !== -1 &&\n options.minutes === '*' &&\n options.hours.indexOf('-') !== -1 &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.intervalBetween;\n state.intervalBetween = {\n period: parseInt(options.seconds.split('/')[1], 10),\n unit: PERIODIC_TYPES.seconds,\n timeFrom: parseInt(options.hours.split('-')[0], 10),\n timeTo: parseInt(options.hours.split('-')[1], 10),\n weekdays: SimpleCron.text2weekdays(options.dow)\n };\n } else\n // */n 1-24 * * 1-7 or */n 1-24 * * *\n if (options.seconds === null &&\n options.minutes.indexOf('/') !== -1 &&\n options.hours.indexOf('-') !== -1 &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.intervalBetween;\n state.intervalBetween = {\n period: parseInt(options.minutes.split('/')[1], 10),\n unit: PERIODIC_TYPES.minutes,\n timeFrom: parseInt(options.hours.split('-')[0], 10),\n timeTo: parseInt(options.hours.split('-')[1], 10),\n weekdays: SimpleCron.text2weekdays(options.dow)\n };\n } else\n // m h * * 1-7 or m h * * *\n if (options.seconds === null &&\n parseInt(options.minutes, 10).toString() === options.minutes &&\n parseInt(options.hours, 10).toString() === options.hours &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.specific;\n state.specific = {\n time: padding(parseInt(options.hours, 10)) + ':' + padding(parseInt(options.minutes, 10)),\n weekdays: SimpleCron.text2weekdays(options.dow)\n };\n } else\n // m h d M *\n if (options.seconds === null &&\n parseInt(options.minutes, 10).toString() === options.minutes &&\n parseInt(options.hours, 10).toString() === options.hours &&\n parseInt(options.date, 10).toString() === options.date &&\n parseInt(options.months, 10).toString() === options.months &&\n options.dow === '*') {\n state.mode = PERIODIC.once;\n state.once = {\n time: padding(parseInt(options.hours, 10)) + ':' + padding(parseInt(options.minutes, 10)),\n date: padding(parseInt(options.date, 10)) + '.' + padding(parseInt(options.months, 10)),\n // ignored\n weekdays: SimpleCron.text2weekdays(options.dow)\n }\n }\n\n if (state.mode) {\n return state;\n } else {\n return null;\n }\n }\n\n static state2cron(state) {\n let cron = '* * * * *';\n if (state.mode === PERIODIC.interval) {\n const settings = state.interval || {};\n if (settings.period > 60) settings.period = 60;\n if (settings.period < 1) settings.period = 1;\n\n if (settings.minutes > 60) settings.minutes = 60;\n if (settings.minutes < 1) settings.minutes = 1;\n\n if (settings.hours > 24) settings.hours = 24;\n if (settings.hours < 1) settings.hours = 1;\n\n if (state.extended) {\n cron = `${settings.minutes > 1 ? '*/' + settings.minutes : '*'} ${settings.hours > 1 ? '*/' + settings.hours : '*'} * * *`;\n } else {\n switch (settings.unit) {\n case PERIODIC_TYPES.seconds:\n cron = `${settings.period > 1 ? '*/' + settings.period : '*'} * * * * *`;\n break;\n case PERIODIC_TYPES.minutes:\n cron = `${settings.period > 1 ? '*/' + settings.period : '*'} * * * *`;\n break;\n default:\n break;\n }\n }\n } else if (state.mode === PERIODIC.intervalBetween) {\n const settings = state.intervalBetween || {};\n let hours;\n settings.timeFrom = settings.timeFrom || 0;\n settings.timeTo = settings.timeTo === undefined ? 24 : settings.timeTo;\n if (settings.timeFrom === 0 && settings.timeTo === 24) {\n hours = '*';\n } else {\n hours = settings.timeFrom !== settings.timeTo ? settings.timeFrom + '-' + settings.timeTo : '*';\n }\n if (settings.period > 60) settings.period = 60;\n if (settings.period < 1) settings.period = 1;\n settings.unit = settings.unit || PERIODIC_TYPES.minutes;\n switch (settings.unit) {\n case PERIODIC_TYPES.seconds:\n cron = `${settings.period > 1 ? '*/' + settings.period : '*'} * ${hours} * * ${this.periodArray2text(settings.weekdays)}`;\n break;\n case PERIODIC_TYPES.minutes:\n cron = `${settings.period > 1 ? '*/' + settings.period : '*'} ${hours} * * ${this.periodArray2text(settings.weekdays)}`;\n break;\n default:\n break;\n }\n } else if (state.mode === PERIODIC.specific) {\n const settings = state.specific || {};\n const parts = (settings.time || '00:00').split(':');\n let minutes = parseInt(parts[1], 10) || 0;\n if (minutes > 59) minutes = 59;\n if (minutes < 0) minutes = 0;\n let hours = parseInt(parts[0], 10) || 0;\n if (hours > 23) hours = 59;\n if (hours < 0) hours = 0;\n\n cron = `${minutes} ${hours} * * ${this.periodArray2text(settings.weekdays || [])}`;\n } else if (state.mode === PERIODIC.once) {\n const settings = state.once || {};\n if (!settings.date) {\n settings.date = new Date().getDate() + '.' + padding(new Date().getMonth() + 1);\n }\n const parts = (settings.time || '00:00').split(':');\n const partsDate = settings.date.split('.');\n let minutes = parseInt(parts[1], 10) || 0;\n if (minutes > 59) minutes = 59;\n if (minutes < 0) minutes = 0;\n let hours = parseInt(parts[0], 10) || 0;\n if (hours > 23) hours = 59;\n if (hours < 0) hours = 0;\n let date = parseInt(partsDate[0], 10) || 1;\n if (date > 31) date = 31;\n if (date < 1) hours = 1;\n let month = parseInt(partsDate[1], 10) || 1;\n if (month > 12) month = 12;\n if (month < 1) month = 1;\n\n cron = `${minutes} ${hours} ${date} ${month} *`;\n }\n return cron;\n }\n\n recalcCron() {\n this.onChange(SimpleCron.state2cron(this.state));\n }\n\n getControlsWeekdaysElements(type) {\n const settings = this.state[type];\n return (
\n
{I18n.t('On weekdays')}
\n {[1,2,3,4,5,6,0].map(day => (\n {\n const settings = JSON.parse(JSON.stringify(this.state[type]));\n const pos = settings.weekdays.indexOf(day);\n e.target.checked && pos === -1 && settings.weekdays.push(day);\n !e.target.checked && pos !== -1 && settings.weekdays.splice(pos, 1);\n settings.weekdays.sort();\n this.setState({[type]: settings}, () => this.recalcCron());\n }}\n value={day.toString()}\n />\n }\n label={I18n.t(WEEKDAYS[day])}\n />))\n });\n }\n\n getControlsPeriodElements(type) {\n const settings = this.state[type];\n\n if (this.state.extended) {\n return (
\n
{I18n.t('sc_period')}
\n {\n const settings = JSON.parse(JSON.stringify(this.state[type]));\n settings.minutes = parseInt(e.target.value, 10);\n if (settings.minutes < 1) settings.minutes = 1;\n this.setState({[type]: settings}, () => this.recalcCron());\n }}\n min={1}\n max={60}\n type=\"number\"\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />\n {\n const settings = JSON.parse(JSON.stringify(this.state[type]));\n settings.hours = parseInt(e.target.value, 10);\n if (settings.hours < 1) settings.hours = 1;\n this.setState({[type]: settings}, () => this.recalcCron());\n }}\n min={1}\n max={24}\n type=\"number\"\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />\n );\n } else {\n return (
\n
{I18n.t('sc_period')}
\n {\n const settings = JSON.parse(JSON.stringify(this.state[type]));\n settings.period = parseInt(e.target.value, 10);\n if (settings.period < 1) settings.period = 1;\n this.setState({[type]: settings}, () => this.recalcCron());\n }}\n min={1}\n max={60}\n type=\"number\"\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />);\n }\n }\n\n getControlsTime(type) {\n const settings = this.state[type];\n return (
\n {\n const settings = JSON.parse(JSON.stringify(this.state[type]));\n settings.time = e.target.value;\n this.setState({[type]: settings}, () => this.recalcCron());\n }}\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />\n );\n }\n\n getControlsDate(type) {\n const settings = this.state[type];\n\n if (!settings.date) {\n const d = new Date();\n settings.date = d.getDate() + '.' + padding(d.getMonth() + 1);\n }\n\n //
{I18n.t('sc_at')}\n return (
\n {\n const settings = JSON.parse(JSON.stringify(this.state[type]));\n settings.date = e.target.value;\n this.setState({[type]: settings}, () => this.recalcCron());\n }}\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />\n );\n }\n\n getOnceElements() {\n return (
\n {this.getControlsTime('once')}\n {this.getControlsDate('once')}\n
);\n }\n\n getIntervalElements() {\n return this.getControlsPeriodElements('interval');\n }\n\n getIntervalBetweenElements() {\n const settings = this.state.intervalBetween;\n return [\n this.getControlsPeriodElements('intervalBetween'),\n (
\n
{I18n.t('sc_hours')}
\n \n {I18n.t('sc_from')}\n \n \n \n {I18n.t('sc_to')}\n \n \n ),\n this.getControlsWeekdaysElements('intervalBetween')\n ];\n }\n\n getSpecificTimeElements() {\n return [\n (
{this.getControlsTime('specific')}
),\n this.getControlsWeekdaysElements('specific')\n ]\n }\n\n onModeChange(mode) {\n if (mode !== this.state.mode) {\n this.setState({mode}, () => this.recalcCron());\n }\n }\n\n onChange(cron) {\n if (cron !== this.state.cron) {\n this.setState({cron});\n this.props.onChange && this.props.onChange(cron);\n }\n }\n\n render() {\n return (\n
\n
\n
{convertCronToText(this.state.cron, this.props.language || 'en')}
\n
\n {I18n.t('Repeat')}\n \n
\n {this.state.mode === PERIODIC.once && this.getOnceElements()}\n {this.state.mode === PERIODIC.interval && this.getIntervalElements()}\n {this.state.mode === PERIODIC.intervalBetween && this.getIntervalBetweenElements()}\n {this.state.mode === PERIODIC.specific && this.getSpecificTimeElements()}\n
\n );\n }\n}\n\nSimpleCron.propTypes = {\n cronExpression: PropTypes.string,\n onChange: PropTypes.func,\n language: PropTypes.string,\n};\n\nexport default withStyles(styles)(SimpleCron);\n\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from '@material-ui/core/styles';\nimport Input from '@material-ui/core/Input';\nimport Radio from '@material-ui/core/Radio';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport FormGroup from '@material-ui/core/FormGroup';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport MaskedInput from 'react-text-mask';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport TextField from \"@material-ui/core/TextField\";\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n hr: {\n border: 0,\n borderTop: '1px solid gray'\n },\n scrollWindow: {\n width: '100%',\n overflow: 'auto',\n height: 'calc(100% - 22px)'\n },\n rowDiv: {\n width: '100%',\n },\n modeDiv: {\n width: 200,\n display: 'inline-block',\n verticalAlign: 'top'\n },\n settingsDiv: {\n display: 'inline-block',\n verticalAlign: 'top'\n },\n inputTime: {\n width: 90,\n marginTop: 0,\n marginLeft: 5\n },\n inputDate: {\n width: 140,\n marginTop: 0,\n marginLeft: 5\n },\n inputEvery: {\n width: 40,\n marginLeft: 5,\n marginRight: 5,\n },\n inputRadio: {\n padding: '4px 12px',\n verticalAlign: 'top'\n },\n inputGroup: {\n maxWidth: 400,\n display: 'inline-block'\n },\n inputGroupElement: {\n width: 120,\n },\n inputDateDay: {\n width: 60,\n },\n inputDateDayCheck: {\n padding: 4,\n },\n inputSmallCheck: {\n padding: 0,\n },\n rowOnce: {\n\n },\n\n rowDays: {\n background: theme.palette.type !== 'dark' ? '#ddeaff' : '#4b5057'\n },\n rowDows: {\n background: theme.palette.type !== 'dark' ? '#DDFFDD' : '#52646c'\n },\n rowDates: {\n background: theme.palette.type !== 'dark' ? '#DDDDFF' : '#747a86'\n },\n rowWeeks: {\n background: theme.palette.type !== 'dark' ? '#DDDDFF' : '#717680'\n },\n rowMonths: {\n background: theme.palette.type !== 'dark' ? '#DDFFFF' : '#1f5557'\n },\n rowMonthsDates: {\n background: theme.palette.type !== 'dark' ? '#EEFFFF' : '#3c5737',\n maxWidth: 600\n },\n rowYears: {\n background: theme.palette.type !== 'dark' ? '#fbffdd' : '#574b33'\n },\n rowDaysDows: {\n background: theme.palette.type !== 'dark' ? '#EEEAFF' : '#573544',\n paddingLeft: 10,\n paddingBottom: 10\n },\n rowDowsDows: {\n background: theme.palette.type !== 'dark' ? '#EEFFEE' : '#3d4c54',\n paddingLeft: 10,\n paddingBottom: 10\n }\n});\n\nconst WEEKDAYS = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n 'Sunday',\n];\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n];\nconst PERIODS = {\n 'minutes': 'minutes',\n 'hours': 'hours',\n};\nconst ASTRO = [\n 'sunrise',\n 'sunriseEnd',\n 'goldenHourEnd',\n 'solarNoon',\n 'goldenHour',\n 'sunsetStart',\n 'sunset',\n 'dusk',\n 'nauticalDusk',\n 'night',\n 'nightEnd',\n 'nauticalDawn',\n 'dawn',\n 'nadir',\n];\n\nfunction padding(num) {\n if (num < 10) return '0' + num;\n return '' + num;\n}\n\nfunction TextTime(props) {\n const { inputRef, ...other } = props;\n\n return (\n
\n );\n}\n\nTextTime.propTypes = {\n inputRef: PropTypes.func.isRequired,\n};\n\nfunction TextDate(props) {\n const { inputRef, ...other } = props;\n\n return (\n
\n );\n}\n\nTextDate.propTypes = {\n inputRef: PropTypes.func.isRequired,\n};\n\nconst DEFAULT = {\n time: {\n exactTime: false,\n\n start: '00:00',\n end: '23:59',\n\n mode: 'hours',\n interval: 1,\n },\n period: {\n once: '',\n days: 1,\n dows: '',\n dates: '',\n weeks: 0,\n months: '',\n\n years: 0,\n yearMonth: 0,\n yearDate: 0,\n },\n valid: {\n from: '',\n to: ''\n }\n};\nfunction string2USdate(date) {\n const parts = date.split('.');\n if (parts.length === 3) {\n return parts[2] + '-' + parts[1] + '-' + parts[0];\n }\n\n}\nclass Schedule extends React.Component {\n constructor(props) {\n super(props);\n let schedule;\n if (this.props.schedule && typeof this.props.schedule === 'string' && this.props.schedule[0] === '{') {\n try {\n schedule = JSON.parse(this.props.schedule);\n } catch (e) {\n\n }\n }\n\n if ((!schedule || !Object.keys(schedule).length) && this.props.onChange) {\n setTimeout(() => this.onChange(this.state.schedule, true), 200);\n }\n schedule = schedule || {};\n schedule = Object.assign({}, DEFAULT, schedule);\n schedule.valid.from = schedule.valid.from || this.now2string();\n\n this.refFrom = React.createRef();\n this.refTo = React.createRef();\n this.refOnce = React.createRef();\n\n this.state = {\n schedule,\n desc: this.state2text(schedule)\n };\n\n if (JSON.stringify(schedule) !== this.props.schedule) {\n setTimeout(() => this.props.onChange && this.props.onChange(JSON.stringify(schedule)), 100);\n }\n }\n\n onChange(schedule, force) {\n const isDiff = JSON.stringify(schedule) !== JSON.stringify(this.state.schedule);\n if (force || isDiff) {\n isDiff && this.setState({schedule, desc: this.state2text(schedule)});\n const copy = JSON.parse(JSON.stringify(schedule));\n if (copy.period.once) {\n let once = copy.period.once;\n delete copy.period;\n copy.period = {once};\n delete copy.valid;\n } else\n if (copy.period.days) {\n let days = copy.period.days;\n let dows = copy.period.dows;\n delete copy.period;\n copy.period = {days};\n if (dows && dows !== '[]') {\n copy.period.dows = dows;\n }\n } else\n if (copy.period.weeks) {\n let weeks = copy.period.weeks;\n let dows = copy.period.dows;\n delete copy.period;\n copy.period = {weeks};\n if (dows && dows !== '[]') {\n copy.period.dows = dows;\n }\n } else\n if (copy.period.months) {\n let months = copy.period.months;\n let dates = copy.period.dates;\n delete copy.period;\n copy.period = {months};\n if (dates && dates !== '[]') {\n copy.period.dates = dates;\n }\n } else\n if (copy.period.years) {\n let years = copy.period.years;\n let yearMonth = copy.period.yearMonth;\n let yearDate = copy.period.yearDate;\n delete copy.period;\n copy.period = {years, yearDate};\n if (yearMonth) {\n copy.period.yearMonth = yearMonth;\n }\n }\n\n if (copy.time.exactTime) {\n delete copy.time.end;\n delete copy.time.mode;\n delete copy.time.interval;\n } else {\n delete copy.time.exactTime;\n }\n if (copy.valid) {\n if (!copy.valid.to) {\n delete copy.valid.to;\n }\n if (copy.period.days === 1 || copy.period.weeks === 1 || copy.period.months === 1 || copy.period.years === 1) {\n const from = this.string2date(copy.valid.from);\n const today = new Date();\n today.setHours(0);\n today.setMinutes(0);\n today.setSeconds(0);\n today.setMilliseconds(0);\n if (from <= today) {\n delete copy.valid.from;\n }\n }\n if (!copy.valid.from && !copy.valid.to) {\n delete copy.valid;\n }\n }\n\n this.props.onChange && this.props.onChange(JSON.stringify(copy));\n }\n }\n\n state2text(schedule) {\n let desc = [];\n let validFrom = this.string2date(schedule.valid.from);\n if (schedule.period.once) {\n // once\n let once = this.string2date(schedule.period.once);\n let now = new Date();\n now.setMilliseconds(0);\n now.setSeconds(0);\n now.setMinutes(0);\n now.setHours(0);\n\n //\n if (once < now) {\n // will ne be not executed any more, because start is in the past\n return I18n.t('sch_desc_onceInPast');\n } else {\n // only once\n desc.push(I18n.t('sch_desc_once_on', schedule.period.once));\n }\n } else\n if (schedule.period.days) {\n if (schedule.period.days === 1) {\n if (schedule.period.dows) {\n const dows = JSON.parse(schedule.period.dows);\n if (dows.length === 2 && dows[0] === 0 && dows[1] === 6) {\n // on weekends\n desc.push(I18n.t('sch_desc_onWeekends'));\n } else if (dows.length === 5 && dows[0] === 1 && dows[1] === 2 && dows[2] === 3 && dows[3] === 4 && dows[4] === 5) {\n // on workdays\n desc.push(I18n.t('sch_desc_onWorkdays'));\n } else {\n const tDows = dows.map(day => I18n.t(WEEKDAYS[day]));\n if (tDows.length === 1) {\n // on Monday\n desc.push(I18n.t('sch_desc_onWeekday', tDows[0]));\n } else if (tDows.length === 7) {\n // on every day\n desc.push(I18n.t('sch_desc_everyDay'));\n } else {\n const last = tDows.pop();\n // on Monday and Sunday\n desc.push(I18n.t('sch_desc_onWeekdays', tDows.join(', '), last));\n }\n }\n } else {\n desc.push(I18n.t('sch_desc_everyDay'));\n }\n } else {\n desc.push(I18n.t('sch_desc_everyNDay', schedule.period.days));\n }\n } else\n if (schedule.period.weeks) {\n if (schedule.period.weeks === 1) {\n desc.push(I18n.t('sch_desc_everyWeek'));\n } else {\n desc.push(I18n.t('sch_desc_everyNWeeks', schedule.period.weeks));\n }\n\n if (schedule.period.dows) {\n const dows = JSON.parse(schedule.period.dows);\n if (dows.length === 2 && dows[0] === 0 && dows[1] === 6) {\n // on weekends\n desc.push(I18n.t('sch_desc_onWeekends'));\n } else if (dows.length === 5 && dows[0] === 1 && dows[1] === 2 && dows[2] === 3 && dows[3] === 4 && dows[4] === 5) {\n // on workdays\n desc.push(I18n.t('sch_desc_onWorkdays'));\n } else {\n const tDows = dows.map(day => I18n.t(WEEKDAYS[day]));\n if (tDows.length === 1) {\n // on Monday\n desc.push(I18n.t('sch_desc_onWeekday', tDows[0]));\n } else if (tDows.length === 7) {\n // on every day\n desc.push(I18n.t('sch_desc_everyDay'));\n } else {\n const last = tDows.pop();\n // on Monday and Sunday\n desc.push(I18n.t('sch_desc_onWeekdays', tDows.join(', '), last));\n }\n }\n } else {\n return I18n.t('sch_desc_never');\n }\n } else\n if (schedule.period.months) {\n if (schedule.period.dates) {\n const dates = JSON.parse(schedule.period.dates);\n if (dates.length === 1) {\n // in 1 of month\n desc.push(I18n.t('sch_desc_onDate', dates[0]));\n } else if (dates.length === 31) {\n desc.push(I18n.t('sch_desc_onEveryDate'));\n } else if (!dates.length) {\n return I18n.t('sch_desc_never');\n } else {\n const last = dates.pop();\n // in 1 and 4 of month\n desc.push(I18n.t('sch_desc_onDates', dates.join(', '), last));\n }\n } else {\n desc.push(I18n.t('sch_desc_onEveryDate'));\n }\n\n if (schedule.period.months === 1) {\n desc.push(I18n.t('sch_desc_everyMonth'));\n } else if (typeof schedule.period.months === 'number') {\n desc.push(I18n.t('sch_desc_everyNMonths', schedule.period.months));\n } else {\n const months = JSON.parse(schedule.period.months);\n const tMonths = months.map(month => I18n.t(MONTHS[month - 1]));\n if (!tMonths.length) {\n // in January\n return I18n.t('sch_desc_never');\n } else if (tMonths.length === 1) {\n // in January\n desc.push(I18n.t('sch_desc_onMonth', tMonths[0]));\n } else if (tMonths.length === 12) {\n // every month\n desc.push(I18n.t('sch_desc_everyMonth'));\n } else {\n const last = tMonths.pop();\n // in January and May\n desc.push(I18n.t('sch_desc_onMonths', tMonths.join(', '), last));\n }\n }\n }\n else\n if (schedule.period.years) {\n if (schedule.period.years === 1) {\n desc.push(I18n.t('sch_desc_everyYear'));\n } else {\n desc.push(I18n.t('sch_desc_everyNYears', schedule.period.years));\n }\n desc.push(I18n.t('sch_desc_onDate', schedule.period.yearDate, schedule.period.yearMonth ? I18n.t(MONTHS[schedule.period.yearMonth - 1]) : I18n.t('sch_desc_everyMonth')));\n }\n\n // time\n if (schedule.time.exactTime) {\n if (ASTRO.indexOf(schedule.time.start) !== -1) {\n // at sunset\n desc.push(I18n.t('sch_desc_atTime', I18n.t('sch_astro_' + schedule.time.start)));\n } else {\n // at HH:MM\n desc.push(I18n.t('sch_desc_atTime', schedule.time.start));\n }\n } else {\n if (schedule.time.mode === PERIODS.minutes) {\n if (schedule.time.interval === 1) {\n // every minute\n desc.push(I18n.t('sch_desc_everyMinute'));\n } else {\n // every N minutes\n desc.push(I18n.t('sch_desc_everyNMinutes', schedule.time.interval));\n }\n } else {\n if (schedule.time.interval === 1) {\n // every minute\n desc.push(I18n.t('sch_desc_everyHour'));\n } else {\n // every N minutes\n desc.push(I18n.t('sch_desc_everyNHours', schedule.time.interval));\n }\n }\n const start = ASTRO.indexOf(schedule.time.start) !== -1 ? I18n.t('sch_astro_' + schedule.time.start) : schedule.time.start;\n const end = ASTRO.indexOf(schedule.time.end) !== -1 ? I18n.t('sch_astro_' + schedule.time.end) : schedule.time.end;\n if (start !== '00:00' || (end !== '24:00' && end !== '23:59')) {\n // from HH:mm to HH:mm\n desc.push(I18n.t('sch_desc_intervalFromTo', start, end));\n }\n }\n\n if (!schedule.period.once) {\n // valid\n if (validFrom.getTime() > Date.now() && schedule.valid.to) {\n // from XXX to XXXX\n desc.push(I18n.t('sch_desc_validFromTo', schedule.valid.from, schedule.valid.to));\n } else if (validFrom.getTime() > Date.now()) {\n // from XXXX\n desc.push(I18n.t('sch_desc_validFrom', schedule.valid.from));\n } else if (schedule.valid.to) {\n // till XXXX\n desc.push(I18n.t('sch_desc_validTo', schedule.valid.to));\n }\n }\n return desc.join(' ');\n }\n\n getTimePeriodElements() {\n const schedule = this.state.schedule;\n let wholeDay = false;\n let day = false;\n let night = false;\n let fromTo = true;\n if (schedule.time.start === '00:00' && schedule.time.end === '24:00') {\n wholeDay = true;\n fromTo = false;\n } else if (schedule.time.start === 'sunrise') {\n day = true;\n fromTo = false;\n } else if (schedule.time.start === 'sunset') {\n night = true;\n fromTo = false;\n }\n\n return (\n
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.exactTime = false;\n this.onChange(_schedule);\n }}/>} label={I18n.t('sch_intervalTime')} />\n
\n
\n
\n {!schedule.time.exactTime && (
\n
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = '00:00';\n _schedule.time.end = '23:59';\n this.onChange(_schedule);\n }}/>} label={!fromTo ? I18n.t('sch_fromTo') : ''} />\n {fromTo && [\n ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = e.target.value;\n this.onChange(_schedule);\n }}\n InputLabelProps={{shrink: true,}}\n label={I18n.t('sch_from')}\n margin=\"normal\"\n />),\n ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.end = e.target.value;\n this.onChange(_schedule);\n }}\n InputLabelProps={{shrink: true,}}\n label={I18n.t('sch_to')}\n margin=\"normal\"\n />)\n ]}\n
\n
)}\n\n {!schedule.time.exactTime && (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = '00:00';\n _schedule.time.end = '24:00';\n this.onChange(_schedule);\n }}/>} label={I18n.t('sch_wholeDay')} />
) }\n\n {!schedule.time.exactTime && (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = 'sunrise';\n _schedule.time.end = 'sunset';\n this.onChange(_schedule);\n }}/>} label={I18n.t('sch_astroDay')} />
) }\n\n {!schedule.time.exactTime && (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = 'sunset';\n _schedule.time.end = 'sunrise';\n this.onChange(_schedule);\n }}/>} label={I18n.t('sch_astroNight')} />
) }\n
\n {!schedule.time.exactTime && this.getPeriodSettingsMinutes()}\n
\n
);\n }\n\n getTimeExactElements() {\n const isAstro = ASTRO.indexOf(this.state.schedule.time.start) !== -1;\n\n return (
\n
\n {\n const schedule = JSON.parse(JSON.stringify(this.state.schedule));\n schedule.time.exactTime = true;\n this.onChange(schedule);\n }}/>} label={I18n.t('sch_exactTime')} />\n
\n {this.state.schedule.time.exactTime &&\n (
)\n }\n {this.state.schedule.time.exactTime && !isAstro &&\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = e.target.value;\n this.onChange(_schedule);\n }}\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />
)\n }\n
)\n }\n\n getDivider() {\n return (
);\n }\n\n getPeriodModes() {\n const schedule = this.state.schedule;\n const isOnce = !schedule.period.dows && !schedule.period.months && !schedule.period.dates && !schedule.period.years && !schedule.period.days && !schedule.period.weeks;\n if (isOnce && !schedule.period.once) {\n schedule.period.once = this.now2string(true);\n }\n\n return [\n // ----- once ---\n (
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.once = _schedule.period.once || this.now2string(true);\n _schedule.period.dows = '';\n _schedule.period.months = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodOnce')} />\n
\n {isOnce && (
\n { {\n this.timerOnce && clearTimeout(this.timerOnce);\n\n this.refOnce.current.style.background = '#ff000030';\n this.timerOnce = setTimeout(value => {\n this.timerOnce = null;\n this.refOnce.current.style.background = '';\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const date = this.string2date(value);\n if (date.toString() !== 'Invalid Date') {\n _schedule.period.once = padding(date.getDate()) + '.' + padding(date.getMonth() + 1) + '.' + date.getFullYear();\n this.onChange(_schedule);\n }\n }, 1500, e.target.value);\n }}\n InputLabelProps={{shrink: true,}}\n label={I18n.t('sch_at')}\n margin=\"normal\"\n />}\n
)}\n
),\n\n\n // ----- days ---\n (
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = 1;\n _schedule.period.dows = '';\n _schedule.period.months = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodDaily')} />\n
\n
\n {this.getPeriodSettingsDaily()}\n {schedule.period.days ? this.getPeriodSettingsWeekdays() : null}\n
\n
),\n\n\n // ----- days of weeks ---\n /*!schedule.period.days && (\n
\n
\n {\n const schedule = JSON.parse(JSON.stringify(this.state.schedule));\n schedule.period.dows = schedule.period.dows ? '' : '[0,1,2,3,4,5,6]';\n this.onChange(schedule);\n }}/>)}\n label={I18n.t('sch_periodWeekdays')} />\n
\n
\n {this.getPeriodSettingsWeekdays()}\n
\n
),\n*/\n // ----- weeks ---\n (
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = schedule.period.weeks ? 0 : 1;\n _schedule.period.dows = schedule.period.dows || '[0]';\n _schedule.period.months = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodWeekly')} />\n
\n
\n
{this.getPeriodSettingsWeekly()}
\n
{this.state.schedule.period.weeks ? this.getPeriodSettingsWeekdays() : null}
\n
\n
),\n\n\n // ----- months ---\n (
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = 1;\n _schedule.period.dows = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodMonthly')} />\n
\n
\n {this.getPeriodSettingsMonthly()}\n {schedule.period.months ? (
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = _schedule.period.months || 1;\n const dates = [];\n for (let i = 1; i <= 31; i++) {\n dates.push(i);\n }\n _schedule.period.dates = _schedule.period.dates || JSON.stringify(dates);\n _schedule.period.dows = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodDates')} />
\n
\n {this.getPeriodSettingsDates()}\n
\n
) : null}\n
\n
),\n\n\n // ----- years ---\n (
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = 1;\n _schedule.period.yearDate = 1;\n _schedule.period.yearMonth = 1;\n _schedule.period.dows = '';\n _schedule.period.months = 0;\n _schedule.period.dates = '';\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodYearly')} />\n
\n
\n
{this.getPeriodSettingsYearly()}
\n {!!schedule.period.years && (
\n {I18n.t('sch_on')}\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.yearDate = parseInt(e.target.value, 10);\n if (_schedule.period.yearDate < 1) _schedule.period.yearDate = 31;\n if (_schedule.period.yearDate > 31) _schedule.period.yearDate = 1;\n this.onChange(_schedule);\n }} />\n \n
)}\n
\n
),\n ];\n }\n\n getPeriodSettingsMinutes() {\n return (
\n \n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.interval = parseInt(e.target.value, 10);\n this.onChange(_schedule);\n }} />\n \n
);\n }\n\n getPeriodSettingsWeekdays() {\n // || this.state.schedule.period.dows === '[1, 2, 3, 4, 5]' || this.state.schedule.period.dows === '[0, 6]'\n const schedule = this.state.schedule;\n const isSpecific = schedule.period.dows && schedule.period.dows !== '[1, 2, 3, 4, 5]' && schedule.period.dows !== '[0, 6]';\n return [\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dows = '[1, 2, 3, 4, 5]';\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodWorkdays')} />
),\n\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dows = '[0, 6]';\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodWeekend')} />
),\n\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dows = '[0,1,2,3,4,5,6]';\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodWeekdays')} />\n {isSpecific && (schedule.period.days === 1 || schedule.period.weeks) && (\n {[1,2,3,4,5,6,0].map(i =>\n ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n let dows;\n try {\n dows = JSON.parse(_schedule.period.dows);\n } catch (e) {\n dows = [];\n }\n if (e.target.checked && dows.indexOf(i) === -1) {\n dows.push(i);\n } else if (!e.target.checked && dows.indexOf(i) !== -1) {\n dows.splice(dows.indexOf(i), 1);\n }\n dows.sort((a, b) => a - b);\n _schedule.period.dows = JSON.stringify(dows);\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t(WEEKDAYS[i])}\n />))}\n )}\n
),\n ];\n }\n\n getPeriodSettingsDaily() {\n if (!this.state.schedule.period.days) {\n return;\n }\n const schedule = this.state.schedule;\n return [\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = 1;\n _schedule.period.dows = '';\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodEveryDay')} />
),\n (
1} onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = 2;\n _schedule.period.dows = '';\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodEvery')} />\n {schedule.period.days > 1 && [( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = parseInt(e.target.value, 10);\n _schedule.period.dows = '';\n this.onChange(_schedule);\n }} />), ({I18n.t('sch_periodDay')})]}\n
),\n ];\n }\n\n getPeriodSettingsWeekly() {\n if (!this.state.schedule.period.weeks) {\n return;\n }\n const schedule = this.state.schedule;\n return [\n (
\n
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = 1;\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodEveryWeek')} />
\n
\n 1} onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = 2;\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodEvery')} />\n {schedule.period.weeks > 1 && [( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = parseInt(e.target.value, 10);\n this.onChange(_schedule);\n }} />), ({I18n.t('sch_periodWeek')})]}\n
\n
),\n ];\n }\n\n getPeriodSettingsDates() {\n if (!this.state.schedule.period.dates) {\n return;\n }\n const schedule = this.state.schedule;\n\n const dates = [];\n for (let i = 1; i <= 31; i++) {\n dates.push(i);\n }\n\n const parsedDates = JSON.parse(schedule.period.dates);\n\n return (\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const dates = [];\n for (let i = 1; i <= 31; i++) {\n dates.push(i);\n }\n _schedule.period.dates = JSON.stringify(dates);\n this.onChange(_schedule);\n }}\n />\n } label={I18n.t('sch_all')}\n />\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dates = '[]';\n this.onChange(_schedule);\n }}\n />\n } label={I18n.t('sch_no_one')}\n />\n {parsedDates.length !== 31 && !!parsedDates.length && ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const result = [];\n const parsedDates = JSON.parse(_schedule.period.dates);\n for (let i = 1; i <= 31; i++) {\n if (parsedDates.indexOf(i) === -1) {\n result.push(i);\n }\n }\n result.sort((a, b) => a - b);\n _schedule.period.dates = JSON.stringify(result);\n this.onChange(_schedule);\n }}\n />\n } label={I18n.t('sch_invert')}\n />)}\n \n {dates.map(i =>\n ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n let dates;\n try {\n dates = JSON.parse(_schedule.period.dates);\n } catch (e) {\n dates = [];\n }\n if (e.target.checked && dates.indexOf(i) === -1) {\n dates.push(i);\n } else if (!e.target.checked && dates.indexOf(i) !== -1) {\n dates.splice(dates.indexOf(i), 1);\n }\n dates.sort((a, b) => a - b);\n _schedule.period.dates = JSON.stringify(dates);\n this.onChange(_schedule);\n }}\n />\n } label={i < 10 ? [(0), ({i})] : i}\n />))}\n );\n }\n\n getPeriodSettingsMonthly() {\n if (!this.state.schedule.period.months) {\n return;\n }\n const schedule = this.state.schedule;\n const parsedMonths = typeof schedule.period.months === 'string' ? JSON.parse(schedule.period.months) : [];\n\n return [\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = 1;\n this.onChange(schedule);\n }}/>)\n }\n label={I18n.t('sch_periodEveryMonth')} />
),\n (
1} onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = 2;\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodEvery')} />\n {typeof schedule.period.months === 'number' && schedule.period.months > 1 && [( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = parseInt(e.target.value, 10);\n if (_schedule.period.months < 1) _schedule.period.months = 1;\n this.onChange(_schedule);\n }} />), ({I18n.t('sch_periodMonth')})]}\n
),\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = '[1,2,3,4,5,6,7,8,9,10,11,12]';\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodSpecificMonths')} />\n {typeof schedule.period.months === 'string' &&\n (\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const months = [];\n for (let i = 1; i <= 12; i++) {\n months.push(i);\n }\n _schedule.period.months = JSON.stringify(months);\n this.onChange(_schedule);\n }}\n />\n } label={I18n.t('sch_all')}\n />\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = '[]';\n this.onChange(_schedule);\n }}\n />\n } label={I18n.t('sch_no_one')}\n />\n {parsedMonths.length !== 12 && !!parsedMonths.length && ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const result = [];\n const parsedMonths = JSON.parse(_schedule.period.months);\n for (let i = 1; i <= 12; i++) {\n if (parsedMonths.indexOf(i) === -1) {\n result.push(i);\n }\n }\n result.sort((a, b) => a - b);\n _schedule.period.months = JSON.stringify(result);\n this.onChange(_schedule);\n }}\n />\n } label={I18n.t('sch_invert')}\n />)}\n \n {MONTHS.map((month, i) => ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n let months;\n try {\n months = JSON.parse(_schedule.period.months);\n } catch (e) {\n months = [];\n }\n if (e.target.checked && months.indexOf(i + 1) === -1) {\n months.push(i + 1);\n } else if (!e.target.checked && months.indexOf(i + 1) !== -1) {\n months.splice(months.indexOf(i + 1), 1);\n }\n months.sort((a, b) => a - b);\n _schedule.period.months = JSON.stringify(months);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t(month)}\n />))}\n )}\n ),\n ];\n }\n\n getPeriodSettingsYearly() {\n if (!this.state.schedule.period.years) {\n return;\n }\n const schedule = this.state.schedule;\n return [\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = 1;\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodEveryYear')} />
),\n (
1} onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = 2;\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodEvery')} />\n {schedule.period.years > 1 && [( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = parseInt(e.target.value, 10);\n if (_schedule.period.years < 1) _schedule.period.years = 1;\n this.onChange(_schedule);\n }} />), ({I18n.t('sch_periodYear')})]}\n
),\n ];\n }\n\n now2string(isEnd) {\n const d = new Date();\n d.setHours(0);\n d.setMinutes(0);\n d.setSeconds(0);\n d.setMilliseconds(0);\n if (isEnd) {\n d.setDate(d.getDate() + 2);\n d.setMilliseconds(d.getMilliseconds() - 1);\n }\n\n return padding(d.getDate()) + '.' + padding(d.getMonth() + 1) + '.' + padding(d.getFullYear());\n }\n\n string2date(str) {\n let parts = str.split('.'); // 31.12.2019\n if (parts.length === 1) {\n parts = str.split('-'); // 2018-12-31\n return new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10));\n } else {\n return new Date(parseInt(parts[2], 10), parseInt(parts[1], 10) - 1, parseInt(parts[0], 10));\n }\n }\n\n getValidSettings() {\n const schedule = this.state.schedule;\n // ----- from ---\n return (\n
\n
\n {I18n.t('sch_valid')}\n {I18n.t('sch_validFrom')}\n
\n
\n {\n this.timerFrom && clearTimeout(this.timerFrom);\n\n this.refFrom.current.style.background = '#ff000030';\n\n this.timerFrom = setTimeout(value => {\n this.timerFrom = null;\n this.refFrom.current.style.background = '';\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const date = this.string2date(value);\n if (date.toString() !== 'Invalid Date') {\n _schedule.valid.from = padding(date.getDate()) + '.' + padding(date.getMonth() + 1) + '.' + date.getFullYear();\n this.onChange(_schedule);\n }\n }, 1500, e.target.value);\n }}\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.valid.to = _schedule.valid.to ? '' : this.now2string(true);\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_validTo')} />\n {!!schedule.valid.to && (\n {\n this.timerTo && clearTimeout(this.timerTo);\n\n this.refTo.current.style.background = '#ff000030';\n this.timerTo = setTimeout(value => {\n this.timerTo = null;\n this.refTo.current.style.background = '';\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const date = this.string2date(value);\n if (date.toString() !== 'Invalid Date') {\n _schedule.valid.to = padding(date.getDate()) + '.' + padding(date.getMonth() + 1) + '.' + date.getFullYear();\n this.onChange(_schedule);\n }\n }, 1500, e.target.value);\n }}\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />)}\n
\n
\n );\n }\n\n render() {\n return (
\n
{this.state.desc}
\n
\n
{I18n.t('sch_time')}
\n {this.getTimePeriodElements()}\n {this.getTimeExactElements()}\n {this.getDivider()}\n {I18n.t('sch_period')}
\n {this.getPeriodModes()}\n {!this.state.schedule.period.once && this.getDivider()}\n {!this.state.schedule.period.once && this.getValidSettings()}\n \n
);\n }\n}\n\nSchedule.propTypes = {\n schedule: PropTypes.string,\n onChange: PropTypes.func\n};\n\nexport default withStyles(styles)(Schedule);\n\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from '@material-ui/core/styles/index';\nimport Button from '@material-ui/core/Button';\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 Radio from '@material-ui/core/Radio';\n\nimport IconOk from '@material-ui/icons/Check';\nimport IconCancel from '@material-ui/icons/Cancel';\n\nimport ComplexCron from '../Components/ComplexCron';\nimport SimpleCron from '../Components/simple-cron/SimpleCron';\nimport Schedule from '../Components/Schedule';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\n// Generate cron expression\n\nconst styles = theme => ({\n headerID: {\n fontWeight: 'bold',\n fontStyle: 'italic'\n },\n radio: {\n display: 'inline-block'\n },\n dialogPaper: {\n height: 'calc(100% - 96px)'\n },\n buttonIcon: {\n marginRight: theme.spacing(1),\n }\n});\n\nclass DialogCron extends React.Component {\n constructor(props) {\n super(props);\n let cron;\n if (this.props.cron && typeof this.props.cron === 'string' && this.props.cron.replace(/^[\"']/, '')[0] !== '{') {\n cron = this.props.cron.replace(/['\"]/g, '').trim();\n } else {\n cron = this.props.cron || '{}';\n if (typeof cron === 'string') {\n cron = cron.replace(/^[\"']/, '').replace(/[\"']\\n?$/, '');\n }\n }\n\n this.state = {\n cron,\n mode: this.props.simple ?\n 'simple' :\n (typeof cron === 'object' || cron[0] === '{' ?\n 'wizard' :\n (SimpleCron.cron2state(this.props.cron || '* * * * *') ? 'simple' : 'complex'))\n };\n }\n\n handleCancel() {\n this.props.onClose();\n }\n\n handleOk() {\n this.props.onOk(this.state.cron);\n this.props.onClose();\n }\n\n setMode(mode) {\n this.setState({mode});\n }\n\n render() {\n return (\n
\n );\n }\n}\n\nDialogCron.propTypes = {\n classes: PropTypes.object,\n onClose: PropTypes.func,\n onOk: PropTypes.func.isRequired,\n title: PropTypes.string,\n cron: PropTypes.string,\n cancel: PropTypes.string,\n ok: PropTypes.string,\n simple: PropTypes.bool,\n language: PropTypes.string\n\n};\n\nexport default withStyles(styles)(DialogCron);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\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';\n\nimport IconSave from '@material-ui/icons/Save';\nimport IconCancel from '@material-ui/icons/Cancel';\n\nimport ScriptEditorComponent from '../Components/ScriptEditorVanilaMonaco';\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n textArea: {\n width: 'calc(100% - 10px)',\n resize: 'none'\n },\n dialog: {\n height: '95%'\n },\n fullHeight: {\n height: '100%',\n overflow: 'hidden'\n },\n args: {\n color: theme.palette.type === 'dark' ? 'white' : 'black',\n height: 30,\n width: '100%',\n fontSize: 16\n },\n argsTitle: {\n color: theme.palette.type === 'dark' ? 'white' : 'black',\n fontWeight: 'bold'\n },\n buttonIcon: {\n marginRight: theme.spacing(1),\n }\n});\n\nclass DialogScriptEditor extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n source: this.props.source,\n };\n if (!this.state.source && this.props.isReturn) {\n this.state.source = '\\nreturn false';\n }\n\n }\n\n componentDidMount() {\n setTimeout(() => {\n try {\n window.document.getElementById('source-text-area').focus();\n } catch (e) {\n\n }\n }, 100);\n }\n\n handleCancel () {\n this.props.onClose(false);\n }\n\n handleOk () {\n if (this.props.isReturn && this.state.source.indexOf('return ') === -1) {\n\n } else {\n this.props.onClose(this.state.source);\n }\n }\n\n onChange(value) {\n this.setState({source: value});\n }\n\n render() {\n const classes = this.props.classes;\n\n return
;\n }\n}\n\nDialogScriptEditor.propTypes = {\n classes: PropTypes.object.isRequired,\n adapterName: PropTypes.string.isRequired,\n runningInstances: PropTypes.object.isRequired,\n onClose: PropTypes.func,\n source: PropTypes.string,\n args: PropTypes.string,\n isReturn: PropTypes.bool,\n themeType: PropTypes.string,\n socket: PropTypes.object\n};\n\nexport default withStyles(styles)(DialogScriptEditor);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\n\nimport Toolbar from '@material-ui/core/Toolbar';\nimport {withStyles} from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport Badge from '@material-ui/core/Badge';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Checkbox from '@material-ui/core/Checkbox';\n\nimport {MdSave as IconSave} from 'react-icons/md';\nimport {MdCancel as IconCancel} from 'react-icons/md';\nimport {MdClose as IconClose} from 'react-icons/md';\nimport {MdRefresh as IconRestart} from 'react-icons/md';\nimport {MdInput as IconDoEdit} from 'react-icons/md';\nimport {FaClock as IconCron} from 'react-icons/fa';\nimport {FaClipboardList as IconSelectId} from 'react-icons/fa';\nimport {FaFileExport as IconExport} from 'react-icons/fa';\nimport {FaFileImport as IconImport} from 'react-icons/fa';\nimport {FaFlagCheckered as IconCheck} from 'react-icons/fa';\nimport {MdGpsFixed as IconLocate} from 'react-icons/md';\nimport {MdClearAll as IconCloseAll} from 'react-icons/md';\nimport {MdBuild as IconDebugMenu} from 'react-icons/md';\nimport {MdBugReport as IconDebug} from 'react-icons/md';\nimport {MdPlaylistAddCheck as IconVerbose} from 'react-icons/md';\n\nimport ImgJS from './assets/js.png';\nimport ImgBlockly from './assets/blockly.png';\nimport ImgTypeScript from './assets/typescript.png';\nimport ImgBlockly2Js from './assets/blockly2js.png'\n\nimport I18n from '@iobroker/adapter-react/i18n';\nimport ScriptEditorComponent from './Components/ScriptEditorVanilaMonaco';\nimport BlocklyEditor from './Components/BlocklyEditor';\nimport DialogConfirm from '@iobroker/adapter-react/Dialogs/Confirm';\nimport DialogSelectID from '@iobroker/adapter-react/Dialogs/SelectID';\nimport DialogCron from './Dialogs/Cron';\nimport DialogScriptEditor from './Dialogs/ScriptEditor';\n\n\nconst images = {\n 'Blockly': ImgBlockly,\n 'Javascript/js': ImgJS,\n def: ImgJS,\n 'TypeScript/ts': ImgTypeScript,\n};\n\nconst MENU_ITEM_HEIGHT = 48;\nconst COLOR_DEBUG = '#02a102';\nconst COLOR_VERBOSE = '#70aae9';\n\nconst styles = theme => ({\n\n toolbar: {\n minHeight: 38,//Theme.toolbar.height,\n boxShadow: '0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12)'\n },\n toolbarButtons: {\n padding: 4,\n marginLeft: 4\n },\n editorDiv: {\n height: `calc(100% - ${theme.toolbar.height + 38/*Theme.toolbar.height */ + 5}px)`,\n width: '100%',\n overflow: 'hidden',\n position: 'relative'\n },\n textButton: {\n marginRight: 10,\n minHeight: 24,\n padding: '6px 16px'\n },\n saveButton: {\n background: '#ff9900'\n },\n textIcon: {\n marginLeft: theme.spacing(1),\n },\n tabIcon: {\n width: 24,\n height: 24,\n verticalAlign: 'middle',\n marginBottom: 2,\n marginRight: 2,\n borderRadius: 3\n },\n hintIcon: {\n //fontSize: 32,\n padding: '0 8px 0 8px'\n },\n hintText: {\n //fontSize: 18\n },\n hintButton: {\n marginTop: 8,\n marginLeft: 20\n },\n tabMenuButton: {\n position: 'absolute',\n top: 0,\n right: 0,\n },\n tabChanged: {\n color: theme.palette.secondary.main\n },\n tabText: {\n maxWidth: 130,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n display: 'inline-block',\n verticalAlign: 'middle',\n },\n tabChangedIcon: {\n color: '#FF0000',\n fontSize: 16\n },\n closeButton: {\n position: 'absolute',\n top: 8,\n right: 0,\n zIndex: 10,\n padding: 8,\n cursor: 'pointer'\n },\n notRunning: {\n color: '#ffbc00',\n marginRight: theme.spacing(1)\n },\n tabButton: {\n\n },\n tabButtonWrapper: {\n display: 'inline-block',\n },\n menuIcon: {\n width: 18,\n height: 18,\n borderRadius: 2,\n marginRight: 5\n },\n});\n\nclass Editor extends React.Component {\n constructor(props) {\n super(props);\n\n const selected = window.localStorage.getItem('Editor.selected') || '';\n let editing = window.localStorage.getItem('Editor.editing') || '[]';\n try {\n editing = JSON.parse(editing);\n } catch (e) {\n editing = [];\n }\n if (selected && editing.indexOf(selected) === -1) {\n editing.push(selected);\n }\n\n this.tabsRef = React.createRef();\n\n this.state = {\n selected: selected,\n editing: editing, // array of opened scripts\n changed: {}, // for every script\n blockly: null,\n debugEnabled: false,\n verboseEnabled: false,\n showBlocklyCode: false,\n showSelectId: false,\n showCron: false,\n showScript: false,\n insert: '',\n searchText: '',\n themeType: this.props.themeType,\n visible: props.visible,\n cmdToBlockly: '',\n menuOpened: !!this.props.menuOpened,\n menuTabsOpened: false,\n menuTabsAnchorEl: null,\n runningInstances: this.props.runningInstances || {},\n showDebugMenu: false,\n toast: '',\n instancesLoaded: false,\n };\n\n this.setChangedInAdmin();\n\n /* ----------------------- */\n // required by selectIdDialog in Blockly\n this.selectId = {\n initValue: null,\n callback: null\n };\n this.cron = {\n initValue: null,\n callback: null\n };\n this.scriptDialog = {\n initValue: null,\n callback: null,\n args: null,\n isReturn: false\n };\n\n window.systemLang = I18n.getLanguage();\n window.main = {\n objects: {},\n getObject: (id, cb) => this.props.socket.getObject(id).then(obj => cb && cb(null, obj)).catch(err => cb && cb(err)),\n instances: [],\n selectIdDialog: (initValue, cb) => {\n this.selectId.callback = cb;\n this.selectId.initValue = initValue;\n this.setState({showSelectId: true});\n },\n cronDialog: (initValue, cb) => {\n this.cron.callback = cb;\n this.cron.initValue = initValue;\n this.setState({showCron: true});\n },\n showScriptDialog: (value, args, isReturn, cb) => {\n this.scriptDialog.callback = cb;\n this.scriptDialog.initValue = value;\n this.scriptDialog.args = args;\n this.scriptDialog.isReturn = isReturn || false;\n this.setState({showScript: true});\n }\n };\n\n this.objects = props.objects;\n /* ----------------------- */\n\n this.scripts = {};\n\n if (!this.state.selected && this.state.editing.length) {\n this.state.selected = this.state.editing[0];\n }\n\n this.getAllAdapterInstances()\n .then(() => {\n // to enable logging\n if (this.props.onSelectedChange && this.state.selected) {\n setTimeout(() => this.props.onSelectedChange(this.state.selected, this.state.editing), 100);\n }\n });\n }\n\n getAllAdapterInstances() {\n return this.props.socket.getAdapterInstances(true)\n .then(instanceObjects => {\n const objects = {};\n const instances = instanceObjects.map(obj => {\n objects[obj._id] = obj;\n return obj._id;\n });\n window.main.objects = objects;\n window.main.instances = instances;\n this.setState({instancesLoaded: true});\n });\n }\n\n onInstanceChanged = (id, obj) => {\n if (!id) {\n return;\n }\n\n if (!obj && window.main.instances.includes[id]) {\n delete window.main.objects[id];\n const pos = window.main.instances.indexOf(id);\n window.main.instances.splice(pos, 1);\n } else\n if (obj && obj.type === 'instance') {\n // update instances\n if (!window.main.instances.includes(id)) {\n window.main.instances.push(id);\n window.main.instances.sort();\n }\n window.main.objects[id] = obj;\n }\n };\n\n setChangedInAdmin() {\n const isChanged = Object.keys(this.state.changed).find(id => this.state.changed[id]);\n\n if (typeof window.parent !== 'undefined' && window.parent) {\n window.parent.configNotSaved = isChanged;\n }\n }\n\n componentDidMount() {\n window.addEventListener('beforeunload', this.onBrowserClose, false);\n this.props.socket.subscribeObject('system.adapter.*', this.onInstanceChanged);\n }\n\n componentWillUnmount() {\n window.removeEventListener('beforeunload', this.onBrowserClose);\n this.props.socket.unsubscribeObject('system.adapter.*', this.onInstanceChanged);\n }\n\n onBrowserClose = e => {\n const isChanged = Object.keys(this.scripts).find(id =>\n JSON.stringify(this.scripts[id]) !== JSON.stringify(this.props.objects[id].common));\n\n if (!!isChanged) {\n console.log('Script ' + console.log('Script ' + JSON.stringify(this.scripts[isChanged])));\n const message = I18n.t('Configuration not saved.');\n e = e || window.event;\n // For IE and Firefox\n if (e) {\n e.returnValue = message;\n }\n\n // For Safari\n return message;\n }\n };\n\n removeNonExistingScripts(nextProps, newState) {\n nextProps = nextProps || this.props;\n newState = newState || {};\n\n let _changed = false;\n if (this.state.editing) {\n const isAnyNonExists = this.state.editing.find(id => !nextProps.objects[id]);\n\n if (isAnyNonExists) {\n // remove non-existing scripts\n const editing = JSON.parse(JSON.stringify(this.state.editing));\n for (let i = editing.length - 1; i >= 0; i--) {\n if (!this.objects[editing[i]]) {\n _changed = true;\n editing.splice(i, 1);\n }\n }\n if (_changed) {\n newState.editing = editing;\n }\n if (this.state.selected && !this.objects[this.state.selected]) {\n _changed = true;\n newState.selected = editing[0] || '';\n if (this.scripts[newState.selected]) {\n if (this.state.blockly !== (this.scripts[newState.selected].engineType === 'Blockly')) {\n newState.blockly = this.scripts[newState.selected].engineType === 'Blockly';\n _changed = true;\n }\n if (this.state.verboseEnabled !== this.scripts[newState.selected].verbose) {\n newState.verboseEnabled = this.scripts[newState.selected].verbose;\n _changed = true;\n }\n if (this.state.debugEnabled !== this.scripts[newState.selected].debug) {\n newState.debugEnabled = this.scripts[newState.selected].debug;\n _changed = true;\n }\n }\n }\n }\n }\n return _changed;\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n const newState = {};\n let _changed = false;\n if (JSON.stringify(nextProps.runningInstances) !== JSON.stringify(this.state.runningInstances)) {\n _changed = true;\n newState.runningInstances = nextProps.runningInstances;\n }\n\n if (this.state.menuOpened !== nextProps.menuOpened) {\n newState.menuOpened = nextProps.menuOpened;\n _changed = true;\n }\n\n if (this.state.themeType !== nextProps.themeType) {\n newState.themeType = nextProps.themeType;\n _changed = true;\n }\n\n // check if all opened files still exists\n if (this.removeNonExistingScripts(nextProps, newState)) {\n _changed = true;\n }\n\n // update search text\n if (this.state.searchText !== nextProps.searchText) {\n newState.searchText = nextProps.searchText;\n _changed = true;\n }\n\n // if objects read\n if (this.objects !== nextProps.objects) {\n this.objects = nextProps.objects;\n window.main.objects = nextProps.objects;\n\n // update all scripts\n Object.keys(this.scripts).forEach(id => {\n const source = this.scripts[id].source;\n this.scripts[id] = JSON.parse(JSON.stringify(this.objects[id].common));\n this.scripts[id].source = source;\n });\n\n // if script is blockly\n if (this.state.selected && this.objects[this.state.selected]) {\n this.scripts[this.state.selected] = this.scripts[this.state.selected] || JSON.parse(JSON.stringify(this.objects[this.state.selected].common));\n if (this.state.blockly !== (this.scripts[this.state.selected].engineType === 'Blockly')) {\n newState.blockly = this.scripts[this.state.selected].engineType === 'Blockly';\n _changed = true;\n }\n if (this.state.verboseEnabled !== this.scripts[this.state.selected].verbose) {\n newState.verboseEnabled = this.scripts[this.state.selected].verbose;\n _changed = true;\n }\n if (this.state.debugEnabled !== this.scripts[this.state.selected].debug) {\n newState.debugEnabled = this.scripts[this.state.selected].debug;\n _changed = true;\n }\n }\n\n // remove non-existing scripts\n const editing = JSON.parse(JSON.stringify(this.state.editing));\n for (let i = editing.length - 1; i >= 0; i--) {\n if (!this.objects[editing[i]]) {\n _changed = true;\n editing.splice(i, 1);\n if (this.state.changed[editing[i]] !== undefined) {\n newState.changed = newState.changed || JSON.parse(JSON.stringify(this.state.changed));\n delete newState.changed[editing[i]];\n }\n }\n }\n if (this.state.selected && !this.objects[this.state.selected]) {\n newState.selected = editing[0] || '';\n }\n if (_changed) {\n newState.editing = editing;\n }\n } else {\n // update all scripts\n for (const id in this.scripts) {\n if (!this.scripts.hasOwnProperty(id)) continue;\n if (this.objects[id] && this.objects[id].common) {\n const oldSource = this.scripts[id].source;\n const commonLocal = JSON.parse(JSON.stringify(this.scripts[id]));\n commonLocal.source = this.objects[id].common.source;\n // if anything except source was changed\n if (JSON.stringify(commonLocal) !== JSON.stringify(this.objects[id].common)) {\n this.scripts[id] = JSON.parse(JSON.stringify(this.objects[id].common));\n this.scripts[id].source = oldSource;\n }\n\n if (oldSource !== this.objects[id].common.source) {\n // take new script if it not yet changed\n if (!this.state.changed[id]) {\n // just use new value\n this.scripts[id].source = this.objects[id].common.source;\n } else {\n if (this.objects[id].from && this.objects[id].from.startsWith('system.adapter.javascript.')) {\n this.objects[id].from = 'system.adapter.admin.0';\n // show that script was changed from outside\n this.setState({toast: I18n.t('Script %s was modified on disk.', id.split('.').pop())});\n }\n }\n } else {\n if (this.state.changed[id]) {\n newState.changed = newState.changed || JSON.parse(JSON.stringify(this.state.changed));\n newState.changed[id] = false;\n _changed = true;\n }\n }\n } else {\n delete this.scripts[id];\n if (this.state.selected === id) {\n if (this.state.editing.indexOf(id) !== -1) {\n const editing = JSON.parse(JSON.stringify(this.state.editing));\n const pos = editing.indexOf(id);\n if (pos !== -1) {\n editing.splice(pos, 1);\n newState.editing = editing;\n _changed = true;\n }\n }\n newState.selected = this.state.editing[0] || '';\n _changed = true;\n }\n }\n }\n }\n\n if (this.state.selected !== nextProps.selected && nextProps.selected) {\n if (nextProps.selected) {\n this.scripts[nextProps.selected] = this.scripts[nextProps.selected] || JSON.parse(JSON.stringify(this.props.objects[nextProps.selected].common));\n }\n\n const nextCommon = this.props.objects[nextProps.selected] && this.props.objects[nextProps.selected].common;\n\n const changed = nextCommon && JSON.stringify(this.scripts[nextProps.selected]) !== JSON.stringify(nextCommon);\n\n const editing = JSON.parse(JSON.stringify(this.state.editing));\n if (nextProps.selected && editing.indexOf(nextProps.selected) === -1) {\n editing.push(nextProps.selected);\n this.props.onSelectedChange(nextProps.selected, editing);\n window.localStorage && window.localStorage.setItem('Editor.editing', JSON.stringify(editing));\n }\n\n _changed = true;\n newState.changed = newState.changed || JSON.parse(JSON.stringify(this.state.changed));\n newState.changed[nextProps.selected] = changed;\n newState.editing = editing;\n newState.selected = nextProps.selected;\n newState.blockly = this.scripts[nextProps.selected].engineType === 'Blockly';\n newState.verboseEnabled = this.scripts[nextProps.selected].verbose;\n newState.debugEnabled = this.scripts[nextProps.selected].debug;\n newState.showBlocklyCode = false;\n } else {\n\n }\n\n if (this.state.visible !== nextProps.visible) {\n _changed = true;\n newState.visible = nextProps.visible;\n }\n _changed && this.setState(newState, () => this.setChangedInAdmin());\n }\n\n onRestart() {\n this.props.onRestart && this.props.onRestart(this.state.selected);\n }\n\n onSave() {\n if (this.state.changed[this.state.selected]) {\n const changed = JSON.parse(JSON.stringify(this.state.changed));\n changed[this.state.selected] = false;\n this.setState({changed}, () => {\n this.setChangedInAdmin();\n this.props.onChange && this.props.onChange(this.state.selected, this.scripts[this.state.selected]);\n });\n }\n }\n\n onSaveAll() {\n const changed = JSON.parse(JSON.stringify(this.state.changed));\n Object.keys(changed)\n .forEach(id => {\n if (changed[id]) {\n changed[id] = false;\n this.props.onChange && this.props.onChange(id, this.scripts[id]);\n }\n });\n\n this.setState({ changed }, () =>\n this.setChangedInAdmin());\n }\n\n onCancel() {\n this.scripts[this.state.selected] = JSON.parse(JSON.stringify(this.props.objects[this.state.selected].common));\n\n const changed = JSON.parse(JSON.stringify(this.state.changed));\n changed[this.state.selected] = false;\n\n this.setState({changed}, () => this.setChangedInAdmin());\n }\n\n onRegisterSelect(func) {\n this.getSelect = func;\n }\n\n onConvert2JS() {\n this.showConfirmDialog(I18n.t('It will not be possible to revert this operation.'), result => {\n if (result) {\n this.scripts[this.state.selected].engineType = 'Javascript/js';\n let source = this.scripts[this.state.selected].source;\n const lines = source.split('\\n');\n lines.pop();\n this.scripts[this.state.selected].source = lines.join('\\n');\n const nowSelected = this.state.selected;\n\n const changed = JSON.parse(JSON.stringify(this.state.changed));\n changed[this.state.selected] = true;\n\n this.setState({changed, blockly: false, selected: ''}, () => {\n this.setChangedInAdmin();\n // force update of the editor\n setTimeout(() => this.setState({selected: nowSelected}), 100);\n });\n }\n });\n }\n\n onChange(options) {\n options = options || {};\n if (options.script !== undefined) {\n this.scripts[this.state.selected].source = options.script;\n }\n if (options.debug !== undefined) {\n this.scripts[this.state.selected].debug = options.debug;\n }\n if (options.verbose !== undefined) {\n this.scripts[this.state.selected].verbose = options.verbose;\n }\n const _changed = JSON.stringify(this.scripts[this.state.selected]) !== JSON.stringify(this.props.objects[this.state.selected].common);\n if (_changed !== (this.state.changed[this.state.selected] || false)) {\n\n const changed = JSON.parse(JSON.stringify(this.state.changed));\n changed[this.state.selected] = _changed;\n this.objects[this.state.selected].from = 'system.adapter.admin.0';\n this.setState({changed}, () => this.setChangedInAdmin());\n\n }\n }\n\n onTabChange(event, selected) {\n window.localStorage && window.localStorage.setItem('Editor.selected', selected);\n const common = this.scripts[selected] || (this.props.objects[selected] && this.props.objects[selected].common);\n this.setState({selected, blockly: common.engineType === 'Blockly', showBlocklyCode: false, verboseEnabled: common.verbose, debugEnabled: common.debug});\n this.props.onSelectedChange && this.props.onSelectedChange(selected, this.state.editing);\n }\n\n isScriptChanged(id) {\n return this.scripts[id] && this.props.objects[id] && JSON.stringify(this.scripts[id]) !== JSON.stringify(this.props.objects[id].common);\n }\n\n onTabClose(id, e) {\n e && e.stopPropagation();\n\n const pos = this.state.editing.indexOf(id);\n if (this.state.editing.indexOf(id) !== -1) {\n if (this.isScriptChanged(id)) {\n this.showConfirmDialog(I18n.t('Discard changes for %s', this.props.objects[id].common.name), ok => {\n if (ok) {\n delete this.scripts[id];\n this.onTabClose(id);\n }\n });\n } else {\n const editing = JSON.parse(JSON.stringify(this.state.editing));\n editing.splice(pos, 1);\n const newState = {editing};\n if (id === this.state.selected) {\n if (editing.length) {\n if (pos === 0 || editing.length === 1) {\n newState.selected = editing[0];\n } else {\n newState.selected = editing[pos - 1];\n }\n } else {\n newState.selected = '';\n }\n } else if (this.state.selected && !editing.length) {\n newState.selected = '';\n }\n window.localStorage && window.localStorage.setItem('Editor.editing', JSON.stringify(editing));\n if (newState.selected !== undefined) {\n newState.changed = newState.changed || JSON.parse(JSON.stringify(this.state.changed));\n newState.changed[newState.selected] = this.isScriptChanged(newState.selected);\n const common = newState.selected && (this.scripts[newState.selected] || (this.props.objects[newState.selected] && this.props.objects[newState.selected].common));\n newState.blockly = common ? common.engineType === 'Blockly' : false;\n newState.verboseEnabled = common ? common.verbose : false;\n newState.debugEnabled = common ? common.debug : false;\n newState.showBlocklyCode = false;\n }\n\n this.setState(newState, () => {\n this.setChangedInAdmin();\n\n if (newState.selected !== undefined) {\n this.props.onSelectedChange && this.props.onSelectedChange(newState.selected, this.state.editing);\n window.localStorage && window.localStorage.setItem('Editor.selected', newState.selected);\n } else {\n this.props.onSelectedChange && this.props.onSelectedChange(this.state.selected, this.state.editing);\n }\n });\n }\n }\n }\n\n showConfirmDialog(question, cb) {\n this.confirmCallback = cb;\n this.setState({confirm: question});\n }\n\n sendCommandToBlockly(cmd) {\n this.setState({cmdToBlockly: cmd}, () =>\n setTimeout(() =>\n this.setState({cmdToBlockly: ''}), 200));\n }\n\n getTabs() {\n if (this.state.editing.length) {\n return [
this.onTabChange(event, value)}\n indicatorColor=\"primary\"\n style={{position: 'relative', width: this.state.editing.length > 1 ? 'calc(100% - 50px)' : '100%', display: 'inline-block'}}\n textColor=\"primary\"\n variant=\"scrollable\"\n scrollButtons=\"auto\"\n >\n {this.state.editing.map(id => {\n if (!this.props.objects[id]) {\n const label = [\n {id.split('.').pop()}
,\n this.onTabClose(id, e)} fontSize=\"small\"/>];\n return ;\n } else {\n let text = this.props.objects[id].common.name;\n let title = '';\n if (text.length > 18) {\n title = text;\n text = text.substring(0, 15) + '...';\n }\n const changed = this.props.objects[id].common && this.scripts[id] && this.props.objects[id].common.source !== this.scripts[id].source;\n const label = [\n ,\n {text}
,\n changed ? ▣ : null,\n this.onTabClose(id, e)} fontSize=\"small\"/>\n ];\n\n return ;\n }\n })}\n ,\n this.state.editing.length > 1 ?
{\n const editing = [this.state.selected];\n // Do not close not saved tabs\n Object.keys(this.scripts).forEach(id =>\n id !== this.state.selected &&\n JSON.stringify(this.scripts[id]) !== JSON.stringify(this.props.objects[id].common) &&\n editing.push(id)\n );\n\n window.localStorage && window.localStorage.setItem('Editor.editing', JSON.stringify(editing));\n this.setState({menuTabsOpened: false, menuTabsAnchorEl: null, editing: editing});\n }}\n >\n \n : null\n ];\n } else {\n return
\n \n
;\n }\n }\n\n getDebugMenu() {\n if (!this.state.showDebugMenu) return null;\n\n return ;\n }\n\n getDebugBadge() {\n return [\n this.state.debugEnabled && this.state.verboseEnabled && (
),\n this.state.debugEnabled && !this.state.verboseEnabled && (
),\n !this.state.debugEnabled && this.state.verboseEnabled && (
),\n ]\n }\n\n getToolbar() {\n const isInstanceRunning = this.state.selected && this.scripts[this.state.selected] && this.scripts[this.state.selected].engine && this.state.runningInstances[this.scripts[this.state.selected].engine];\n const isScriptRunning = this.state.selected && this.scripts[this.state.selected] && this.scripts[this.state.selected].enabled;\n\n if (this.state.selected) {\n const changedAll = Object.keys(this.state.changed).filter(id => this.state.changed[id]).length;\n const changed = this.state.changed[this.state.selected];\n return
\n {this.state.menuOpened && this.props.onLocate && ( this.props.onLocate(this.state.selected)}>)}\n {!changed && isInstanceRunning && this.onRestart()} title={I18n.t('Restart')}>}\n {!changed && !isScriptRunning && {I18n.t('Script is not running')}}\n {!changed && isScriptRunning && !isInstanceRunning && {I18n.t('Instance is disabled')}}\n {changed && }\n {(changedAll > 1 || (changedAll === 1 && !changed)) && ()}\n {changed && ()}\n \n\n {this.state.blockly && !this.state.showBlocklyCode &&\n ( this.sendCommandToBlockly('export')}>\n )}\n\n {this.state.blockly && !this.state.showBlocklyCode &&\n ( this.sendCommandToBlockly('import')}>\n )}\n\n {this.state.blockly && !this.state.showBlocklyCode &&\n ( this.sendCommandToBlockly('check')}>\n )}\n\n {!this.state.blockly && !this.state.showBlocklyCode && ( this.setState({showCron: true})}>)}\n\n {!this.state.blockly && !this.state.showBlocklyCode && ( this.setState({showSelectId: true})}>)}\n\n {this.state.blockly && this.state.showBlocklyCode && ()}\n\n {this.state.blockly && ()}\n\n {!this.state.showBlocklyCode && ( this.setState({showDebugMenu: true, menuDebugAnchorEl: e.currentTarget})}>\n \n \n \n )}\n\n ;\n } else {\n return null;\n }\n }\n\n getScriptEditor() {\n if (this.state.selected && this.props.objects[this.state.selected] && this.state.blockly !== null && (!this.state.blockly || this.state.showBlocklyCode)) {\n this.scripts[this.state.selected] = this.scripts[this.state.selected] || JSON.parse(JSON.stringify(this.props.objects[this.state.selected].common));\n\n return
\n this.setState({insert: ''})}\n onForceSave={() => this.onSave()}\n searchText={this.state.searchText}\n onRegisterSelect={func => this.onRegisterSelect(func)}\n readOnly={this.state.showBlocklyCode}\n changed={this.state.changed[this.state.selected]}\n code={this.scripts[this.state.selected].source || ''}\n isDark={this.state.themeType === 'dark'}\n socket={this.props.socket}\n runningInstances={this.state.runningInstances}\n onChange={newValue => this.onChange({script: newValue})}\n language={this.scripts[this.state.selected].engineType === 'TypeScript/ts' ? 'typescript' : 'javascript'}\n />\n
;\n } else {\n return null;\n }\n }\n\n getBlocklyEditor() {\n if (this.state.instancesLoaded && this.state.selected && this.props.objects[this.state.selected] && (this.state.blockly && !this.state.showBlocklyCode) && this.state.visible) {\n this.scripts[this.state.selected] = this.scripts[this.state.selected] || JSON.parse(JSON.stringify(this.props.objects[this.state.selected].common));\n\n return (
\n this.onChange({script: newValue})}\n />\n
);\n } else {\n return null;\n }\n }\n\n getConfirmDialog() {\n if (this.state.confirm) {\n return (
{\n if (this.confirmCallback) {\n const cb = this.confirmCallback;\n this.confirmCallback = null;\n cb(result);\n }\n this.setState({confirm: ''});\n }}\n />);\n } else {\n return null;\n }\n }\n\n getSelectIdDialog() {\n if (this.state.showSelectId) {\n let selectedId = this.selectId.callback ? this.selectId.initValue || '' : this.getSelect ? this.getSelect() : '';\n // it could be:\n // - 'id.xx'/* aksjdhsdf*/\n // - \"id.xx\"/* aksjdhsdf*/\n // - \"id.xx\"//\n let pos = selectedId.indexOf('/*');\n if (pos !== -1) {\n selectedId = selectedId.substring(0, pos);\n }\n pos = selectedId.indexOf('//');\n if (pos !== -1) {\n selectedId = selectedId.substring(0, pos);\n }\n let m = selectedId.match(/\"([^\"]+)\"/);\n if (m) {\n selectedId = m[1];\n }\n m = selectedId.match(/'([^']+)'/);\n if (m) {\n selectedId = m[1];\n }\n\n return {\n this.setState({showSelectId: false});\n if (this.selectId.callback) {\n this.selectId.callback = null;\n }\n }}\n onOk={(selected, name) => {\n this.selectId.initValue = null;\n if (this.selectId.callback) {\n this.selectId.callback(selected);\n this.selectId.callback = null;\n } else {\n this.setState({insert: `'${selected}'/*${name}*/`})\n }\n }}\n />;\n } else {\n return null;\n }\n }\n\n getCronDialog() {\n if (this.state.showCron) {\n return ( this.setState({showCron: false})}\n onOk={cron => {\n this.cron.initValue = null;\n if (this.cron.callback) {\n this.cron.callback(cron);\n this.cron.callback = null;\n } else {\n this.setState({insert: `'${cron}'`})\n }\n }}\n />);\n } else {\n return null;\n }\n }\n\n getEditorDialog() {\n if (this.state.showScript) {\n return {\n this.scriptDialog.initValue = null;\n if (this.scriptDialog.callback) {\n result !== false && this.scriptDialog.callback(result || '');\n this.scriptDialog.callback = null;\n }\n this.setState({showScript: false});\n }}\n />;\n } else {\n return null;\n }\n }\n\n getToast() {\n return this.setState({toast: ''})}\n ContentProps={{'aria-describedby': 'message-id',}}\n message={{this.state.toast}}\n action={[\n this.setState({toast: ''})}\n >\n ,\n ]}\n />;\n }\n\n render() {\n if (this.state.selected && this.props.objects[this.state.selected] && this.state.blockly === null) {\n this.scripts[this.state.selected] = this.scripts[this.state.selected] || JSON.parse(JSON.stringify(this.props.objects[this.state.selected].common));\n setTimeout(() => {\n const newState = {\n blockly: this.scripts[this.state.selected].engineType === 'Blockly',\n showBlocklyCode: false,\n debugEnabled: this.scripts[this.state.selected].debug,\n verboseEnabled: this.scripts[this.state.selected].verbose,\n };\n\n // check if all opened files still exists\n this.removeNonExistingScripts(null, newState);\n this.setState(newState);\n }, 100);\n }\n\n return [\n this.getTabs(),\n this.getToolbar(),\n this.getScriptEditor(),\n this.getBlocklyEditor(),\n this.getConfirmDialog(),\n this.getSelectIdDialog(),\n this.getCronDialog(),\n this.getEditorDialog(),\n this.getDebugMenu(),\n this.getToast(),\n ];\n }\n}\n\nEditor.propTypes = {\n objects: PropTypes.object.isRequired,\n instances: PropTypes.array.isRequired,\n adapterName: PropTypes.string.isRequired,\n selected: PropTypes.string.isRequired,\n onSelectedChange: PropTypes.func.isRequired,\n onRestart: PropTypes.func,\n onChange: PropTypes.func.isRequired,\n visible: PropTypes.bool,\n menuOpened: PropTypes.bool,\n onLocate: PropTypes.func,\n runningInstances: PropTypes.object,\n socket: PropTypes.object,\n searchText: PropTypes.string,\n themeName: PropTypes.string,\n themeType: PropTypes.string,\n};\n\nexport default withStyles(styles)(Editor);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\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 Dropzone from 'react-dropzone';\nimport DialogError from './Error';\nimport {MdFileUpload as IconUpload} from 'react-icons/md';\nimport {MdCancel as IconNo} from 'react-icons/md';\nimport {MdPlusOne as IconPlus} from 'react-icons/md';\n\nimport IconCancel from '@material-ui/icons/Cancel';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n dialog: {\n height: '95%'\n },\n fullHeight: {\n height: '100%',\n overflow: 'hidden'\n },\n dropzone: {\n marginTop: 20,\n width: '100%',\n borderWidth: 5,\n borderStyle: 'dashed',\n borderColor: '#d0cccc',\n textAlign: 'center',\n boxSizing: 'border-box',\n paddingTop: 45,\n borderRadius: 10,\n height: 'calc(100% - 10px)'\n },\n dropzoneDiv: {\n width: '100%',\n height: '100%'\n },\n dropzoneRejected: {\n borderColor: '#970000',\n },\n dropzoneAccepted: {\n borderColor: '#17cd02',\n },\n icon: {\n height: '30%',\n width: '30%',\n color: '#eeeeee',\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%,-50%)',\n zIndex: 0,\n },\n iconError: {\n color: '#ffc3c6',\n },\n iconOk: {\n color: '#aaeebc',\n },\n text: {\n top: '50%',\n left: '50%',\n transform: 'translate(-50%,-50%)',\n color: '#868686',\n position: 'absolute',\n zIndex: 1,\n },\n buttonIcon: {\n marginRight: theme.spacing(1),\n },\n});\nclass DialogImportFile extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n error: '',\n imageStatus: ''\n };\n }\n\n componentDidMount() {\n setTimeout(() => {\n try {\n window.document.getElementById('import-text-area').focus();\n } catch (e) {\n\n }\n }, 100);\n }\n\n handleCancel () {\n this.props.onClose();\n }\n\n onChange(e) {\n this.setState({text: e.target.value});\n }\n\n static readFileDataUrl(file, cb) {\n const reader = new FileReader();\n reader.onload = () => {\n cb(null, {data: reader.result, name: file.name});\n };\n reader.onabort = () => {\n console.error('file reading was aborted');\n cb(I18n.t('file reading was aborted'));\n };\n reader.onerror = (e) => {\n console.error('file reading has failed');\n cb(I18n.t('file reading has failed: %s', e));\n };\n\n reader.readAsDataURL(file)\n }\n\n handleDropFile(files) {\n if (files && files.hasOwnProperty('target')) {\n files = files.target.files;\n }\n\n if (!files && !files.length) {\n return;\n }\n\n const file = files[files.length - 1];\n\n if (!file) {\n return;\n }\n DialogImportFile.readFileDataUrl(file, (err, result) => {\n if (err) {\n this.setState({error: err})\n } else {\n this.props.onClose(result && result.data);\n }\n });\n }\n\n render() {\n const classes = this.props.classes;\n const className = classes.dropzone + ' ' + (this.state.imageStatus === 'accepted' ? classes.dropzoneAccepted : (this.state.imageStatus === 'rejected' ? classes.dropzoneRejected : ''));\n\n return (\n \n );\n }\n}\n\nDialogImportFile.propTypes = {\n classes: PropTypes.object.isRequired,\n onClose: PropTypes.func,\n};\n\nexport default withStyles(styles)(DialogImportFile);\n","import React from 'react';\nimport {withStyles} from '@material-ui/core/styles';\nimport SplitterLayout from 'react-splitter-layout';\nimport {MdMenu as IconMenuClosed} from 'react-icons/md';\nimport {MdArrowBack as IconMenuOpened} from 'react-icons/md';\n\nimport 'react-splitter-layout/lib/index.css';\n\nimport GenericApp from '@iobroker/adapter-react/GenericApp';\nimport Loader from '@iobroker/adapter-react/Components/Loader'\nimport I18n from '@iobroker/adapter-react/i18n';\nimport DialogMessage from '@iobroker/adapter-react/Dialogs/Message';\nimport DialogConfirm from '@iobroker/adapter-react/Dialogs/Confirm';\nimport Utils from '@iobroker/adapter-react/Components/Utils';\n\nimport SideMenu from './SideMenu';\nimport Log from './Log';\nimport Editor from './Editor';\nimport DialogError from './Dialogs/Error';\nimport DialogImportFile from './Dialogs/ImportFile';\nimport BlocklyEditor from './Components/BlocklyEditor';\n\nconst styles = theme => ({\n root: {\n flexGrow: 1,\n display: 'flex',\n width: '100%',\n height: '100%'\n },\n menuDiv: {\n overflow: 'hidden',\n },\n splitterDivs: {\n '&>div': {\n overflow: 'hidden',\n width: '100%',\n height: '100%',\n },\n '& .layout-splitter': {\n background: theme.palette.type === 'dark' ? '#595858' : '#ccc;'\n }\n },\n mainDiv: {\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n },\n /*appBarWithMenu: {\n width: `calc(100% - ${Theme.menu.width}px)`,\n marginLeft: Theme.menu.width,\n },\n appBarWithoutMenu: {\n width: `100%`,\n marginLeft: 0,\n },*/\n content: {\n width: '100%',\n height: '100%',\n backgroundColor: theme.palette.background && theme.palette.background.default,\n position: 'relative'\n },\n splitterDivWithMenu: {\n width: `calc(100% - 300px)`,\n height: '100%'\n },\n menuDivWithoutMenu: {\n '&>div:first-child': {\n display: 'none'\n },\n '&>.layout-splitter': {\n display: 'none'\n },\n },\n progress: {\n margin: 100\n },\n menuOpenCloseButton: {\n position: 'absolute',\n left: 0,\n borderRadius: '0 5px 5px 0',\n top: 6,\n paddingTop: 8,\n cursor: 'pointer',\n zIndex: 1,\n height: 25,\n width: 20,\n background: theme.palette.secondary.main,\n color: theme.palette.primary.main,\n paddingLeft: 3,\n '&:hover': {\n color: 'white'\n }\n }\n});\n\nclass App extends GenericApp {\n constructor(props) {\n super(props, {\n translations: {\n 'en': require('./i18n/en'),\n 'de': require('./i18n/de'),\n 'es': require('./i18n/es'),\n 'fr': require('./i18n/fr'),\n 'it': require('./i18n/it'),\n 'nl': require('./i18n/nl'),\n 'pl': require('./i18n/pl'),\n 'pt': require('./i18n/pt'),\n 'ru': require('./i18n/ru'),\n 'zh-cn': require('./i18n/zh-cn'),\n },\n bottomButtons: false,\n socket: {\n autoSubscribeLog: true,\n },\n });\n\n // this.logIndex = 0;\n this.logSize = window.localStorage ? parseFloat(window.localStorage.getItem('App.logSize')) || 150 : 150;\n this.menuSize = window.localStorage ? parseFloat(window.localStorage.getItem('App.menuSize')) || 500 : 500;\n this.hosts = [];\n this.importFile = null;\n this.scripts = {};\n\n window.alert = message => {\n console.error(message);\n this.showError(message.toString());\n };\n }\n\n onScriptsChanged = (id, obj) => {\n if (!id) {\n return;\n }\n let changed = false;\n const newState = {};\n if (id.startsWith('script.js.')) {\n if (obj) {\n if (JSON.stringify(this.scripts[id]) !== JSON.stringify(obj)) {\n this.scripts[id] = obj;\n changed = true;\n newState.scriptsHash = this.state.scriptsHash + 1;\n }\n } else if (this.scripts[id]) {\n delete this.scripts[id];\n changed = true;\n newState.scriptsHash = this.state.scriptsHash + 1;\n }\n }\n\n changed && this.setState(newState);\n };\n\n onInstanceChanged = (id, obj) => {\n if (!id) {\n return;\n }\n let changed = false;\n const newState = {};\n\n if (id.match(/^system\\.adapter\\.[-_\\w\\d]+\\$/)) {\n // update instances\n if (id.startsWith('system.adapter.' + this.adapterName + '.')) {\n if (obj && obj.type === 'instance') {\n if (!this.state.instances.includes(id)) {\n newState.instances = [...this.state.instances];\n newState.instances.push(id);\n newState.instances.sort();\n changed = true;\n // request alive\n this.socket.subscribeState(obj._id + '.alive', this.onInstanceAliveChange());\n }\n } else if (!obj && this.state.instances.includes(id)) {\n this.socket.unsubscribeState(id + '.alive', this.onInstanceAliveChange());\n newState.instances = [...this.state.instances];\n const pos = newState.instances.indexOf(id);\n newState.instances.splice(pos, 1);\n changed = true;\n }\n }\n\n\n\n\n if (obj && obj[id].common && obj[id].common.blockly) {\n this.confirmCallback = result => result && window.location.reload();\n newState.confirm = I18n.t('Some blocks were updated. Reload admin?');\n changed = true;\n }\n }\n changed && this.setState(newState);\n };\n\n onHostChanged = (id, obj) => {\n if (!id) {\n return;\n }\n let changed = false;\n const newState = {};\n\n if (id.startsWith('system.host.')) {\n if (obj && obj.type === 'host') {\n if (!this.hosts.includes(id)) {\n this.hosts.push(id);\n this.hosts.sort();\n }\n } else if (!obj && this.hosts.includes(id)) {\n const pos = this.hosts.indexOf(id);\n this.hosts.splice(pos, 1);\n }\n }\n\n changed && this.setState(newState);\n };\n\n onConnectionReady() {\n window.systemLang = this.socket.systemLang;\n this.setState({\n ready: false,\n updateScripts: 0,\n scriptsHash: 0,\n instances: [],\n updating: false,\n resizing: false,\n selected: null,\n logMessage: {},\n editing: [],\n menuOpened: window.localStorage ? window.localStorage.getItem('App.menuOpened') !== 'false' : true,\n menuSelectId: '',\n expertMode: window.localStorage ? window.localStorage.getItem('App.expertMode') === 'true' : false,\n logHorzLayout: window.localStorage ? window.localStorage.getItem('App.logHorzLayout') === 'true' : false,\n runningInstances: {},\n confirm: '',\n importFile: false,\n message: '',\n searchText: '',\n });\n\n const newState = {};\n\n // load instances & scripts\n // Read all instances\n this.subscribeOnInstances()\n .then(result => {\n newState.instances = result.instances;\n newState.runningInstances = result.runningInstances;\n return this.readAdaptersWithBlockly();\n })\n .then(() => this.socket.getHosts())\n .then(hosts => {\n this.hosts = hosts.map(obj => obj._id);\n // load all scripts\n return this.readAllScripts();\n })\n .then(scripts => {\n if (window.localStorage && window.localStorage.getItem('App.expertMode') !== 'true' && window.localStorage.getItem('App.expertMode') !== 'false') {\n // detect if some global scripts exists\n if (Object.keys(scripts).find(id => id.startsWith('script.js.global.') && scripts.type === 'script')) {\n newState.expertMode = true;\n }\n }\n this.scripts = scripts;\n\n let scriptsHash = this.state.scriptsHash;\n if (this.compareScripts(scripts)) {\n scriptsHash++;\n }\n newState.scriptsHash = scriptsHash;\n newState.ready = true;\n this.socket.subscribeObject('script.*', this.onScriptsChanged);\n this.socket.subscribeObject('system.adapter.*', this.onInstanceChanged);\n this.socket.subscribeObject('system.host.*', this.onHostChanged);\n\n this.setState(newState);\n });\n }\n\n subscribeOnInstances() {\n return this.socket.getAdapterInstances(this.adapterName)\n .then(instancesArray => {\n const instances = instancesArray.map(obj => parseInt(obj._id.split('.').pop())).sort();\n const runningInstances = {};\n instances.forEach(id => runningInstances['system.adapter.' + this.adapterName + '.' + id] = false);\n\n const promises = [];\n\n // subscribe on instances\n instances.forEach(instance => {\n const instanceId = `system.adapter.${this.adapterName}.${instance}`;\n const id = `${instanceId}.alive`;\n promises.push(this.socket.getState(id)\n .then(state => {\n runningInstances[instanceId] = state ? state.val : false;\n this.socket.subscribeState(id, this.onInstanceAliveChange);\n }));\n });\n\n return Promise.all(promises)\n .then(() => ({instances, runningInstances}));\n })\n }\n\n readAllScripts() {\n return this.socket.getObjectView('script.js.', 'script.js.\\u9999', 'channel')\n .then(folders =>\n this.socket.getObjectView('script.js.', 'script.js.\\u9999', 'script')\n .then(scripts => {\n Object.keys(scripts).forEach(id => folders[id] = scripts[id]);\n return folders;\n }));\n }\n\n readAdaptersWithBlockly() {\n return this.socket.getObjectView('system.adapter.', 'system.adapter.\\u9999', 'adapter')\n .then(adapters =>\n new Promise(resolve =>\n BlocklyEditor.loadCustomBlockly(adapters, () => resolve())));\n }\n\n onInstanceAliveChange = (id, state) => {\n if (id) {\n id = id && id.substring(0, id.length - 6); // - .alive\n\n if (this.state.runningInstances[id] !== (state ? state.val : false)) {\n const runningInstances = JSON.parse(JSON.stringify(this.state.runningInstances));\n runningInstances[id] = state ? state.val : false;\n this.setState({runningInstances});\n }\n }\n };\n\n compareScripts(newScripts) {\n const oldIds = Object.keys(this.scripts);\n const newIds = Object.keys(newScripts);\n if (oldIds.length !== newIds.length) {\n this.scripts = this.newScripts;\n return true;\n }\n if (JSON.stringify(oldIds) !== JSON.stringify(newIds)) {\n this.scripts = this.newScripts;\n return true;\n }\n for (let i = 0; i < oldIds.length; i++) {\n let oldScript = this.scripts[oldIds[i]].common;\n let newScript = newScripts[oldIds[i]].common;\n if (oldScript.name !== newScript.name) {\n this.scripts = this.newScripts;\n return true;\n }\n if (oldScript.engine !== newScript.engine) {\n this.scripts = this.newScripts;\n return true;\n }\n if (oldScript.engineType !== newScript.engineType) {\n this.scripts = this.newScripts;\n return true;\n }\n if (oldScript.enabled !== newScript.enabled) {\n this.scripts = this.newScripts;\n return true;\n }\n }\n }\n\n onRename(oldId, newId, newName, newInstance) {\n console.log(`Rename ${oldId} => ${newId}`);\n let promise;\n this.setState({updating: true});\n\n // Rename script.js.common.Skript_1 => script.js.common.New folder.Skript_1\n\n if (this.scripts[oldId] && this.scripts[oldId].type === 'script') {\n const common = JSON.parse(JSON.stringify(this.scripts[oldId].common));\n common.name = newName || common.name;\n if (newInstance !== undefined) {\n common.engine = 'system.adapter.javascript.' + newInstance;\n }\n // Check if the script is not a children of other script\n const parts = newId.split('.');\n parts.pop();\n const parentID = parts.join('.');\n\n if (this.scripts[parentID] && this.scripts[parentID].type === 'script') {\n parts.pop();\n newId = parts.join('.') + '.' + newId.split('.').pop();\n }\n\n promise = this.updateScript(oldId, newId, common);\n } else {\n promise = this.renameGroup(oldId, newId, newName);\n }\n\n promise\n .then(() => this.setState({updating: false}))\n .catch(err => err !== 'canceled' && this.showError(err));\n }\n\n renameGroup(id, newId, newName, _list) {\n if (!_list) {\n _list = [];\n\n // collect all elements to rename\n // find all elements\n _list = Object.keys(this.scripts).filter(_id => _id.startsWith(id + '.'));\n\n return this.socket.getObject(id)\n .then(obj => {\n obj = obj || {common: {}};\n obj.common.name = newName || obj.common.name || id.split('.').pop();\n obj._id = newId;\n\n this.socket.delObject(id)\n .catch(() => {})\n .then(() => this.socket.setObject(newId, obj))\n .then(() => this.renameGroup(id, newId, newName, _list))\n .catch(e => {\n console.log(e);\n });\n })\n .catch(e => {\n console.log(e);\n const obj = {\n _id: newId,\n type: 'channel',\n common: {\n name: newName || id.split('.').pop()\n },\n native: {}\n };\n // may be it is virtual folder\n return this.socket.setObject(newId, obj)\n .then(() => this.renameGroup(id, newId, newName, _list));\n });\n } else if (_list.length) {\n let nId = _list.pop();\n\n return this.socket.getObject(nId)\n .then(obj =>\n this.socket.delObject(nId)\n .catch(() => {})\n .then(() => {\n nId = newId + nId.substring(id.length);\n obj._id = nId;\n return this.socket.setObject(nId, obj);\n })\n .then(() => this.renameGroup(id, newId, newName, _list))\n );\n } else {\n return Promise.resolve();\n }\n }\n\n onUpdateScript(id, common) {\n if (this.scripts[id] && this.scripts[id].type === 'script') {\n this.updateScript(id, id, common)\n .then(() => {})\n .catch(err => err !== 'canceled' && this.showError(err));\n }\n }\n\n onSelect(selected) {\n if (this.scripts[selected] && this.scripts[selected].common && this.scripts[selected].type === 'script') {\n this.setState({selected, menuSelectId: selected}, () =>\n setTimeout(() => this.setState({menuSelectId: ''})), 300);\n }\n }\n\n onExpertModeChange(expertMode) {\n if (this.state.expertMode !== expertMode) {\n window.localStorage && window.localStorage.setItem('App.expertMode', expertMode ? 'true' : 'false');\n this.setState({ expertMode });\n }\n }\n\n showError(err) {\n this.setState({ errorText: err ? err.toString() : '' });\n }\n\n showMessage(message) {\n this.setState({ message: message ? message.toString() : '' });\n }\n\n onDelete(id) {\n this.socket.delObject(id)\n .then(() => {})\n .catch(err =>\n this.showError(err));\n }\n\n onEdit(id) {\n if (this.state.selected !== id) {\n this.setState({selected: id});\n }\n }\n\n onAddNew(id, name, isFolder, instance, type, source) {\n const reg = new RegExp(`^${id}\\\\.`);\n\n if (Object.keys(this.scripts).find(_id => id === _id || reg.test(id))) {\n return this.showError(I18n.t('Yet exists!'));\n }\n\n if (isFolder) {\n this.socket.setObject(id, {\n common: {\n name,\n expert: true\n },\n type: 'channel'\n })\n .then(() =>\n setTimeout(() => this.setState({menuSelectId: id}, () =>\n setTimeout(() => this.setState({menuSelectId: ''})), 300), 1000))\n .catch(err => this.showError(err));\n } else {\n this.socket.setObject(id, {\n common: {\n name,\n expert: true,\n engineType: type,\n engine: 'system.adapter.javascript.' + (instance || 0),\n source: source || '',\n debug: false,\n verbose: false\n },\n type: 'script'\n })\n .then(() => setTimeout(() => this.onSelect(id), 1000))\n .catch(err => this.showError(err));\n }\n }\n\n updateScript(oldId, newId, newCommon) {\n return this.socket.getObject(oldId)\n .then(_obj => {\n const obj = {common: {}};\n\n if (newCommon.engine !== undefined) obj.common.engine = newCommon.engine;\n if (newCommon.enabled !== undefined) obj.common.enabled = newCommon.enabled;\n if (newCommon.source !== undefined) obj.common.source = newCommon.source;\n if (newCommon.debug !== undefined) obj.common.debug = newCommon.debug;\n if (newCommon.verbose !== undefined) obj.common.verbose = newCommon.verbose;\n\n obj.from = 'system.adapter.admin.0'; // we must distinguish between GUI(admin.0) and disk(javascript.0)\n\n if (oldId === newId && _obj && _obj.common && newCommon.name === _obj.common.name) {\n if (!newCommon.engineType || newCommon.engineType !== _obj.common.engineType) {\n if (newCommon.engineType !== undefined) {\n obj.common.engineType = newCommon.engineType || 'Javascript/js';\n }\n\n return new Promise((resolve, reject) =>\n this.socket.getRawSocket().emit('extendObject', oldId, obj, err =>\n err ? reject(err) : resolve()));\n } else {\n return new Promise((resolve, reject) =>\n this.socket.getRawSocket().emit('extendObject', oldId, obj, err =>\n err ? reject(err) : resolve()));\n }\n } else {\n // let prefix;\n\n // let parts = _obj.common.engineType.split('/');\n\n // prefix = 'script.' + (parts[1] || parts[0]) + '.';\n\n if (_obj && _obj.common) {\n _obj.common.engineType = newCommon.engineType || _obj.common.engineType || 'Javascript/js';\n return this.socket.delObject(oldId)\n .then(() => {\n if (obj.common.engine !== undefined) _obj.common.engine = obj.common.engine;\n if (obj.common.enabled !== undefined) _obj.common.enabled = obj.common.enabled;\n if (obj.common.source !== undefined) _obj.common.source = obj.common.source;\n if (obj.common.name !== undefined) _obj.common.name = obj.common.name;\n if (obj.common.debug !== undefined) _obj.common.debug = obj.common.debug;\n if (obj.common.verbose !== undefined) _obj.common.verbose = obj.common.verbose;\n\n delete _obj._rev;\n\n // Name must always exist\n _obj.common.name = newCommon.name;\n\n _obj._id = newId; // prefix + newCommon.name.replace(/[\\s\"']/g, '_');\n\n this.socket.setObject(newId, _obj);\n });\n } else {\n _obj = obj;\n }\n\n // Name must always exist\n _obj.common.name = newCommon.name;\n\n _obj._id = newId; // prefix + newCommon.name.replace(/[\\s\"']/g, '_');\n\n return this.socket.setObject(newId, _obj);\n }\n });\n }\n\n onEnableDisable(id, enabled) {\n if (this.scripts[id] && this.scripts[id].type === 'script') {\n const common = this.scripts[id].common;\n common.enabled = enabled;\n common.expert = true;\n this.updateScript(id, id, common)\n .catch(err => err !== 'canceled' && this.showError(err));\n }\n }\n\n getLiveHost(cb, _list) {\n if (!_list) {\n _list = this.hosts ? [...this.hosts] : [];\n }\n\n if (_list.length) {\n const id = _list.shift();\n this.socket.getState(id + '.alive')\n .then(state => {\n if (state && state.val) {\n cb(id);\n } else {\n setTimeout(() => this.getLiveHost(cb, _list));\n }\n });\n } else {\n cb();\n }\n }\n\n onExport() {\n this.getLiveHost(host => {\n if (!host) {\n return this.showError(I18n.t('No active host found'));\n }\n\n const d = new Date();\n let date = d.getFullYear();\n let m = d.getMonth() + 1;\n if (m < 10) {\n m = '0' + m;\n }\n date += '-' + m;\n m = d.getDate();\n if (m < 10) {\n m = '0' + m;\n }\n date += '-' + m + '-';\n\n this.socket.getRawSocket().emit('sendToHost', host, 'readObjectsAsZip', {\n adapter: 'javascript',\n id: 'script.js',\n link: date + 'scripts.zip' // request link to file and not the data itself\n }, data => {\n if (typeof data === 'string') {\n // it is a link to created file\n const a = document.createElement('a');\n // the data is \"system.host.HOST.zip.2020-01-26-scripts.zip\"\n const parts = data.split('.zip.');\n a.href = '/zip/' + parts[0] + '/' + parts[1];\n document.body.appendChild(a);\n a.click();\n a.remove();\n } else {\n data.error && this.showError(data.error);\n if (data.data) {\n const a = document.createElement('a');\n a.href = 'data: application/zip;base64,' + data.data;\n a.download = date + 'scripts.zip';\n document.body.appendChild(a);\n a.click();\n a.remove();\n }\n }\n });\n });\n }\n\n onImport(data) {\n this.importFile = data;\n if (data) {\n this.confirmCallback = this.onImportConfirmed.bind(this);\n this.setState({importFile: false, confirm: I18n.t('Existing scripts will be overwritten.')});\n } else {\n this.setState({importFile: false});\n }\n }\n\n onImportConfirmed(ok) {\n let data = this.importFile;\n this.importFile = null;\n if (ok && data) {\n data = data.split(',')[1];\n this.getLiveHost(host => {\n if (!host) {\n this.showError(I18n.t('No active host found'));\n return;\n }\n this.socket.getRawSocket().emit('sendToHost', host, 'writeObjectsAsZip', {\n data: data,\n adapter: 'javascript',\n id: 'script.js'\n }, data => {\n if (data === 'permissionError') {\n this.showError(I18n.t(data));\n } else if (!data || data.error) {\n this.showError(data ? I18n.t(data.error) : I18n.t('Unknown error'));\n } else {\n this.showMessage(I18n.t('Done'));\n }\n });\n });\n }\n }\n\n toggleLogLayout() {\n window.localStorage && window.localStorage.setItem('App.logHorzLayout', this.state.logHorzLayout ? 'false' : 'true');\n this.setState({logHorzLayout: !this.state.logHorzLayout});\n }\n\n renderMain() {\n const {classes} = this.props;\n const errorDialog = this.state.errorText ? this.setState({errorText: ''})} text={this.state.errorText}/> : null;\n return [\n this.state.message ? this.setState({message: ''})} text={this.state.message}/> : null,\n errorDialog,\n this.state.importFile ? this.onImport(data)} /> : null,\n this.state.confirm ? {\n this.state.confirm && this.setState({confirm: ''});\n this.confirmCallback && this.confirmCallback(result);\n this.confirmCallback = null;\n }}\n text={this.state.confirm}/> : null,\n \n
{\n window.localStorage && window.localStorage.setItem('App.menuOpened', this.state.menuOpened ? 'false' : 'true');\n this.setState({menuOpened: !this.state.menuOpened, resizing: true});\n setTimeout(() => this.setState({resizing: false}), 300);\n }}>\n {this.state.menuOpened ? () : ()}\n
\n
this.setState({resizing: true})}\n onSecondaryPaneSizeChange={size => this.logSize = parseFloat(size)}\n onDragEnd={() => {\n this.setState({resizing: false});\n window.localStorage && window.localStorage.setItem('App.logSize', this.logSize.toString());\n }}\n >\n this.setState({menuSelectId})}\n runningInstances={this.state.runningInstances}\n menuOpened={this.state.menuOpened}\n searchText={this.state.searchText}\n themeType={this.state.themeType}\n themeName={this.state.themeName}\n onChange={(id, common) => this.onUpdateScript(id, common)}\n onSelectedChange={(id, editing) => {\n const newState = {};\n let changed = false;\n if (id !== this.state.selected) {\n changed = true;\n newState.selected = id;\n }\n if (JSON.stringify(editing) !== JSON.stringify(this.state.editing)) {\n changed = true;\n newState.editing = JSON.parse(JSON.stringify(editing));\n }\n changed && this.setState(newState);\n }}\n onRestart={id => this.socket.extendObject(id, {common: {enabled: true}})}\n selected={this.state.selected && this.scripts[this.state.selected] && this.scripts[this.state.selected].type === 'script' ? this.state.selected : ''}\n objects={this.scripts}\n instances={this.state.instances}\n />\n this.toggleLogLayout()} editing={this.state.editing} socket={this.socket} selected={this.state.selected}/>\n \n
,\n ];\n }\n\n render() {\n const {classes} = this.props;\n\n if (!this.state.ready) {\n // return ();\n return ;\n }\n\n return \n
this.setState({resizing: true})}\n onSecondaryPaneSizeChange={size => this.menuSize = parseFloat(size)}\n onDragEnd={() => {\n this.setState({resizing: false});\n window.localStorage && window.localStorage.setItem('App.menuSize', this.menuSize.toString());\n }}\n >\n \n {\n Utils.setThemeName(themeName);\n const themeType = Utils.getThemeType(themeName);\n this.setState({themeName, themeType}, () => this.props.onThemeChange(themeName))\n }}\n runningInstances={this.state.runningInstances}\n onExpertModeChange={this.onExpertModeChange.bind(this)}\n onDelete={this.onDelete.bind(this) }\n onAddNew={ this.onAddNew.bind(this) }\n onEnableDisable={this.onEnableDisable.bind(this)}\n onExport={this.onExport.bind(this)}\n width={this.menuSize}\n onImport={() => this.setState({importFile: true})}\n onSearch={searchText => this.setState({searchText})}\n />\n
\n {this.renderMain()}\n \n
;\n }\n}\n\nexport default withStyles(styles)(App);\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);\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 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 if (\n response.status === 404 ||\n response.headers.get('content-type').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';\nimport ReactDOM from 'react-dom';\nimport * as Sentry from '@sentry/browser';\nimport * as SentryIntegrations from '@sentry/integrations';\nimport { MuiThemeProvider} from '@material-ui/core/styles';\n\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\nimport {version} from '../package.json';\nimport theme from '@iobroker/adapter-react/Theme';\nimport Utils from '@iobroker/adapter-react/Components/Utils';\n\nwindow.adapterName = 'javascript';\nlet themeName = Utils.getThemeName();\n\nconsole.log('iobroker.' + window.adapterName + '@' + version + ' using theme \"' + themeName + '\"');\n\nfunction build() {\n if (typeof Map === 'undefined') {\n console.log('Something is wrong')\n }\n return ReactDOM.render(\n {\n themeName = _theme;\n build();\n }}/>\n , document.getElementById('root'));\n\n}\n\n// if not local development\nif (window.location.host !== 'localhost:3000') {\n Sentry.init({\n dsn: 'https://504499a725eb4898930d3b9e9da95740@sentry.iobroker.net/56',\n release: 'iobroker.' + window.adapterName + '@' + version,\n integrations: [\n new SentryIntegrations.Dedupe()\n ]\n });\n}\n\nbuild();\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: http://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","module.exports = \"data:image/png;base64,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\""],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["assets/blockly.png","assets/typescript.png","assets/tileJS.png","assets/tileTS.png","assets/tileBlockly.png","assets/blockly2js.png","Dialogs/Rename.js","Dialogs/Delete.js","Dialogs/AddNewScript.js","Dialogs/New.js","Dialogs/Error.js","SideMenu.js","Log.js","Components/ScriptEditorVanilaMonaco.js","Components/BlocklyEditor.js","Dialogs/Export.js","Dialogs/Import.js","Components/simple-cron/cron2text.js","Components/simple-cron/jquery.cron.locale.js","Components/simple-cron/cronText.js","Components/ComplexCron.js","Components/simple-cron/SimpleCron.js","Components/Schedule.js","Dialogs/Cron.js","Dialogs/ScriptEditor.js","Editor.js","Dialogs/ImportFile.js","App.js","serviceWorker.js","index.js","assets/js.png"],"names":["module","exports","DialogRename","props","handleCancel","onClose","handleOk","onRename","oldId","state","id","name","instance","handleChange","setState","getId","isShowInstance","folder","instances","length","prefix","getPrefix","parts","split","pop","join","replace","this","nextProps","Dialog","disableBackdropClick","disableEscapeKeyDown","maxWidth","fullWidth","open","aria-labelledby","DialogTitle","I18n","t","DialogContent","noValidate","autoComplete","TextField","style","width","autoFocus","label","value","onKeyPress","ev","key","preventDefault","setTimeout","onChange","e","target","margin","disabled","FormControl","InputLabel","htmlFor","Select","parseInt","inputProps","map","MenuItem","DialogActions","Button","onClick","color","className","classes","buttonIcon","React","Component","withStyles","theme","marginRight","spacing","DialogDelete","onDelete","fontSize","fontWeight","DialogAddNew","type","html","lang","getLanguage","window","focus","Card","card","CardActionArea","CardMedia","media","image","ImgJS","title","CardContent","text","CardActions","size","openHtml","ImgTS","ImgBlockly","textAlign","getJSCard","getBlocklyCard","getTSCard","display","height","DialogNew","onAdd","existingItems","indexOf","error","parent","helperText","minWidth","parents","splice","names","forEach","n","i","el","find","item","push","DialogError","console","log","aria-describedby","titleBackground","root","titleColor","DialogContentText","background","palette","main","contrastText","COLOR_RUN","green","COLOR_PROBLEM","yellow","COLOR_PAUSE","red","ROOT_ID","COMMON_ID","GLOBAL_ID","SELECTED_STYLE","images","def","ImgTypeScript","getObjectName","obj","common","en","toString","prepareList","data","modified","result","depth","index","ids","Object","keys","enabled","engineType","engine","it","sort","a","b","idA","toLowerCase","idB","parentIndex","Droppable","onDrop","useDrop","accept","drop","isOver","undefined","collect","monitor","shallow","isOverAny","ref","clsx","children","Draggable","useDrag","opacity","isDragging","drag","transform","SideDrawer","expanded","localStorage","getItem","JSON","parse","inputRef","createRef","listItems","scripts","problems","reorder","themeName","selected","creatingScript","creatingFolder","copingScript","renaming","deleting","choosingType","errorText","menuOpened","menuAnchorEl","searchMode","expertMode","searchText","typeFilter","statusFilter","runningInstances","scriptsHash","newExp","ensureSelectedIsVisible","filterTimer","isAllZeroInstances","getIsAllZeroInstances","problemsTimer","onProblemUpdatedBound","onProblemUpdated","bind","cb","tasks","shift","match","that","_id","substring","socket","getState","err","readProblems","subscribeState","unsubscribeState","stringify","changed","val","pos","isSearchEnabled","newState","filterListStatic","ensureSelectedIsVisibleStatic","getIsAllZeroInstancesStatic","setItem","stopPropagation","startsWith","saveExpanded","IconButton","iconButtons","onEnableDisable","onEdit","Promise","resolve","whiteSpace","padding","overflow","flex","onToggle","filtered","filteredPartly","childrenFiltered","depthPx","assign","marginLeft","cursor","isExpanded","includes","iconClass","iconStyle","folderIcon","folderIconReorder","folderIconNoReorder","scriptIcon","scriptIconReorder","scriptIconNoReorder","childrenCount","ListItem","script","scriptReorder","folderReorder","onDoubleClick","onDblClick","ListItemIcon","listItemIcon","alt","src","ListItemText","primary","getTextStyle","ListItemSecondaryAction","renderItemButtonsOnEnd","source","newId","items","dragging","filter","isFilteredOut","reactChildren","element","renderListItem","renderOneItem","onDragFinish","List","dense","disablePadding","mainList","copyId","word","m","menuAnchorFilterEl","filterIcon","selectedItem","Menu","anchorEl","PaperProps","maxHeight","MENU_ITEM_HEIGHT","event","showError","then","iconDropdownMenu","onCloseMenu","onExpertModeChange","onExport","onImport","onThemeChange","newThemeName","onAddNew","onCopy","RootRef","rootRef","Input","toolbarSearch","placeholder","clearTimeout","filterList","onSearch","toolbarButtons","float","mini","marginTop","aria-label","aria-owns","aria-haspopup","currentTarget","getMainMenu","onAddNewFolder","folders","footerButtons","Blockly","footerButtonsRight","onExpandAll","onCollapseAll","renamingItem","copingItem","Drawer","variant","menu","paper","drawerPaper","anchor","toolbar","getToolbarButtons","Divider","backend","HTML5Backend","innerMenu","renderAllItems","footer","getBottomButtons","newName","newInstance","getUniqueName","getFolders","getUniqueFolderName","objects","found","lastIndexOf","nState","selectId","position","lineHeight","paddingRight","iconOnTheRight","right","top","overflowX","overflowY","borderRadius","marginBottom","userSelect","transitionDuration","transitionProperty","paddingTop","paddingBottom","paddingLeft","expandButton","backgroundColor","gText","Log","lines","goBottom","editing","lastIndex","messagesEnd","logHandlerBound","logHandler","message","ts","substr","severity","trTime","d","getHours","getMinutes","getSeconds","getMilliseconds","getTimeString","Date","trSeverity","current","scrollIntoView","behavior","allLines","generateLine","ms","date","toLocaleString","registerLogHandler","unregisterLogHandler","scrollToBottom","str","document","createElement","body","appendChild","select","execCommand","removeChild","copyToClipboard","logBox","toolbox","clearLog","onLayoutChange","layoutIcon","verticalLayout","logBoxInner","table","clear","hasOwnProperty","info","warn","debug","silly","fontFamily","left","boxShadow","isIdOfGlobalScript","test","toolboxXml","ScriptEditor","isDark","language","readOnly","alive","check","typingsLoaded","runningInstancesStr","monacoDiv","editor","monaco","insert","originalCode","code","typings","lastSearch","monacoCounter","waitForMonaco","scriptAdapterInstance","sendTo","setTypeCheck","setEditorTypings","componentDidMount","onRegisterSelect","getModel","getValueInRange","getSelection","compilerOptions","languages","typescript","typescriptDefaults","ScriptTarget","ES2015","allowJs","checkJs","noLib","lib","moduleResolution","ModuleResolutionKind","NodeJs","setCompilerOptions","create","lineNumbers","scrollBeyondLastLine","automaticLayout","onDidChangeModelContent","getValue","loadTypings","addCommand","KeyMod","CtrlCmd","KeyCode","KEY_S","onForceSave","highlightText","options","selectOnLineNumbers","setEditorOptions","setValue","setEditorLanguage","updateOptions","lineWrap","wordWrap","typeCheck","setTheme","dispose","model","uri","path","filenameWithoutExtension","extension","newLanguage","newModel","createModel","Uri","from","setModel","noSemanticValidation","noSyntaxValidation","setDiagnosticsOptions","currentScriptName","isGlobalScript","partialDeclarationsPath","wantedTypings","filePath","content","setExtraLibs","addExtraLib","existingLibs","getExtraLibs","selection","range","Range","startLineNumber","startColumn","endLineNumber","endColumn","executeEdits","forceMoveMarkers","findMatches","r","setSelection","revealLine","row","getPosition","lineNumber","col","column","initNewScript","insertTextIntoEditor","onInserted","newValue","Fab","bottom","zIndex","forceUpdate","DialogExport","popper","getElementById","dialog","textArea","themeType","textAreaLight","Popper","placement","transition","TransitionProps","Fade","timeout","Paper","typography","tabIndex","aria-hidden","DialogImport","fullHeight","resize","languageBlocklyLoaded","languageOwnLoaded","toolboxText","scriptsLoaded","BlocklyEditor","blockly","blocklyWorkspace","exportText","importText","someSelected","changeTimer","onResizeBind","onResize","lastCommand","blinkBlock","loadLanguages","searchXml","_result","tagName","attributes","nodeName","innerHTML","innerText","childNodes","node","Xml","workspaceToDom","allBlocks","getAllBlocks","blocks","searchBlocks","addSelect","someSelectedTime","now","removeSelect","command","blocklyCheckBlocks","badBlock","blocklyBlinkBlock","exportBlocks","importBlocks","searchId","updateBackground","loadCode","fileLang","setAttribute","onload","onreadystatechange","readyState","getElementsByTagName","fileCustom","svgResize","xml","l","decodeURIComponent","atob","block","unselect","isShadow","connections","getConnections_","conn","j","targetConnection","warningText","blocklyGetUnconnectedBlock","blocklyGetBlockWithWarning","sourceBlock_","INPUT_VALUE","OUTPUT_VALUE","_optional","warning","oneWay","JavaScript","workspaceToCode","dom","domToText","btoa","encodeURIComponent","xmlBlock","blockToDom","dragMode_","DRAG_FREE","deleteNext","xy","getRelativeToSurfaceXY","RTL","x","y","domToPrettyText","trim","variables","vars","utils","textToDomDocument","nodes","createVariable","loading","xmlBlocks","textToDom","paste","onBlocklyChanged","ignoreChanges","jsCode2Blockly","domToWorkspace","blocklyRemoveOrphanedShadows","didUpdate","addEventListener","getToolbox","inject","zoom","controls","wheel","startScale","maxScale","minScale","scaleSpeed","move","scrollbars","trashcan","grid","colour","snap","addChangeListener","masterEvent","Events","UI","CREATE","getElementsByClassName","_originalStyle","stroke","fill","removeEventListener","blocklyCode2JSCode","outerHTML","p1","MSG","CustomBlocks","_b","Words","HUE","onImportBlocks","componentDidUpdate","renderMessageDialog","renderErrorDialog","renderExportDialog","renderImportDialog","url","callback","location","scriptTag","onerror","adapter","loadJS","loadScripts","adapters","toLoad","DOMParser","xmlStr","parseFromString","ActiveXObject","xmlDoc","async","loadXML","cronToText","cronspec","withSeconds","locale","NAMES","JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC","SUN","MON","TUE","WED","THU","FRI","SAT","REPLACEMENTS","FIELDS","s","h","D","M","Y","offset","arguments","max","isNaN","Math","min","add","sched","inc","addHash","schedules","curSched","hash","dc","field","clone","slice","cloneSchedule","except1","except2","exceptions","addWeekday","incSplit","rangeSplit","addRange","isHash","itemSorter","toInt","argumentForCoercion","number","coercedNumber","isFinite","ceil","floor","ordinal","ORDINALS","th","st","nd","rd","numberList","numbers","lastVal","numberToDateName","DOW","MONTH","dateList","outputText","zeroPad","schedule","Every","hm","k","and","scheduleToSentence","expr","hasSeconds","prepared","toUpperCase","prepareExpr","f","component","components","parseExpr","parseCron","JQUERY_CRON_LOCALE","convertCronToText","cron","seconds","correctCasus","WEEKDAYS","MONTHS","convertMinusIntoArray","p","iMax","convertArrayIntoMinus","newParts","start","end","ComplexCron","cronExpression","cron2state","extended","tab","state2cron","modes","minutes","hours","dates","months","dows","recalcCron","nums","values","numberButton","every","everyN","periodSelect","verticalAlign","num","InputLabelProps","shrink","getDigitsSelector","mainDiv","FormControlLabel","control","Checkbox","checked","AppBar","appBar","Tabs","active","Tab","tabContent","getPeriodsTab","cronParts","slider","numberButtonBreak","PERIODIC","once","interval","intervalBetween","specific","PERIODIC_TYPES","DEFAULT_STATE","mode","period","unit","SimpleCron","time","timeFrom","timeTo","weekdays","settings","day","formControl","formControlMarginRight","getDate","getMonth","formControlPaddingTop","getControlsTime","getControlsDate","getControlsPeriodElements","hour","getControlsWeekdaysElements","onModeChange","getOnceElements","getIntervalElements","getIntervalBetweenElements","getSpecificTimeElements","list","part","_parts","dow","text2weekdays","periodArray2text","partsDate","month","PERIODS","ASTRO","DEFAULT","exactTime","days","weeks","years","yearMonth","yearDate","valid","to","string2USdate","Schedule","now2string","refFrom","refTo","refOnce","desc","state2text","force","isDiff","copy","string2date","today","setHours","setMinutes","setSeconds","setMilliseconds","validFrom","tDows","last","tMonths","getTime","wholeDay","night","fromTo","rowDiv","modeDiv","Radio","inputRadio","_schedule","settingsDiv","inputTime","getPeriodSettingsMinutes","isAstro","hr","isOnce","rowOnce","inputDate","defaultValue","timerOnce","getFullYear","rowDays","getPeriodSettingsDaily","getPeriodSettingsWeekdays","rowDows","getPeriodSettingsWeekly","rowDowsDows","rowMonths","getPeriodSettingsMonthly","rowMonthsDates","getPeriodSettingsDates","rowYears","getPeriodSettingsYearly","inputEvery","isSpecific","FormGroup","inputGroup","inputGroupElement","inputSmallCheck","parsedDates","inputDateDay","inputDateDayCheck","pointerEvents","parsedMonths","isEnd","setDate","timerFrom","timerTo","scrollWindow","getTimePeriodElements","getTimeExactElements","getDivider","getPeriodModes","getValidSettings","border","borderTop","rowDates","rowWeeks","rowDaysDows","DialogCron","simple","onOk","dialogPaper","setMode","ok","cancel","headerID","fontStyle","radio","DialogScriptEditor","isReturn","args","argsTitle","adapterName","Editor","onInstanceChanged","onBrowserClose","isChanged","returnValue","tabsRef","debugEnabled","verboseEnabled","showBlocklyCode","showSelectId","showCron","showScript","visible","cmdToBlockly","menuTabsOpened","menuTabsAnchorEl","showDebugMenu","toast","instancesLoaded","setChangedInAdmin","initValue","scriptDialog","systemLang","getObject","catch","selectIdDialog","cronDialog","showScriptDialog","getAllAdapterInstances","onSelectedChange","getAdapterInstances","instanceObjects","configNotSaved","subscribeObject","unsubscribeObject","_changed","verbose","removeNonExistingScripts","oldSource","commonLocal","nextCommon","onRestart","func","getSelect","showConfirmDialog","nowSelected","isScriptChanged","onTabClose","question","confirmCallback","confirm","cmd","onTabChange","indicatorColor","textColor","scrollButtons","tabIcon","tabText","tabChanged","tabChangedIcon","closeButton","wrapped","href","tabButton","wrapper","tabButtonWrapper","tabMenuButton","_event","hintButton","hintIcon","menuDebugAnchorEl","menuIcon","isInstanceRunning","isScriptRunning","changedAll","Toolbar","onLocate","notRunning","textButton","saveButton","onSave","textIcon","onSaveAll","onCancel","sendCommandToBlockly","onConvert2JS","ImgBlockly2Js","Badge","badgeMargin","badgeContent","getDebugBadge","editorDiv","resizing","selectedId","imagePrefix","statesOnly","Snackbar","anchorOrigin","vertical","horizontal","autoHideDuration","ContentProps","action","closeToast","getTabs","getToolbar","getScriptEditor","getBlocklyEditor","getConfirmDialog","getSelectIdDialog","getCronDialog","getEditorDialog","getDebugMenu","getToast","minHeight","hintText","secondary","textOverflow","DialogImportFile","imageStatus","files","file","readFileDataUrl","dropzone","dropzoneAccepted","dropzoneRejected","maxSize","acceptClassName","rejectClassName","handleDropFile","multiple","getRootProps","getInputProps","isDragActive","isDragReject","dropzoneDiv","icon","iconError","iconOk","reader","FileReader","onabort","readAsDataURL","borderWidth","borderStyle","borderColor","boxSizing","App","translations","require","bottomButtons","autoSubscribeLog","onScriptsChanged","onInstanceAliveChange","reload","onHostChanged","hosts","logSize","parseFloat","menuSize","importFile","alert","ready","updateScripts","updating","logMessage","menuSelectId","logHorzLayout","subscribeOnInstances","readAdaptersWithBlockly","getHosts","readAllScripts","compareScripts","instancesArray","promises","instanceId","all","getObjectView","loadCustomBlockly","newScripts","oldIds","newIds","oldScript","newScript","promise","parentID","updateScript","renameGroup","_list","nId","delObject","setObject","native","isFolder","reg","RegExp","expert","onSelect","newCommon","_obj","reject","getRawSocket","emit","_rev","getLiveHost","host","link","click","remove","download","onImportConfirmed","showMessage","errorDialog","menuOpenCloseButton","primaryMinSize","secondaryInitialSize","onDragStart","onSecondaryPaneSizeChange","onDragEnd","onUpdateScript","extendObject","toggleLogLayout","primaryIndex","secondaryMinSize","customClassName","splitterDivs","menuDivWithoutMenu","SideMenu","update","Utils","setThemeName","getThemeType","renderMain","GenericApp","flexGrow","menuDiv","default","splitterDivWithMenu","progress","Boolean","hostname","getThemeName","version","Sentry","dsn","release","integrations","SentryIntegrations","build","Map","ReactDOM","render","_theme","navigator","serviceWorker","registration","unregister"],"mappings":"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YAAoB,YACpB,kBAAoB,eACpB,KAAoB,SACpB,OAAoB,SACpB,YAAoB,cACpB,OAAoB,UACpB,mBAAoB,wBACpB,kBAAoB,aACpB,oBAAqB,qBACrB,SAAoB,KACpB,iBAAoB,iBACpB,YAAoB,eACpB,GAAoB,KACpB,GAAoB,KACpB,GAAoB,MAGxBqB,GAAwB,CACpB9B,SAAU,CACNC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,IAERM,MAAO,CACH,uCACA,6CACA,iCACA,uCACA,2BACA,2BACA,2BACA,6CACA,mDACA,6CACA,uCACA,8CAEJD,IAAK,CACD,qEACA,qEACA,6CACA,iCACA,6CACA,6CACA,8CAEJ,MAAoB,qDACpB,IAAoB,SACpB,YAAoB,gEACpB,kBAAoB,8CACpB,KAAoB,yCACpB,OAAoB,uCACpB,YAAoB,gDACpB,OAAoB,6CACpB,mBAAoB,yFACpB,kBAAoB,gGACpB,oBAAqB,+FACrB,SAAoB,GACpB,iBAAoB,iHACpB,YAAoB,8CACpB,GAAoB,SACpB,GAAoB,SACpB,GAAoB,UAGxBqB,GAAwB,CACpB9B,SAAU,CACNC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,MAERM,MAAO,CACH,SACA,MACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,MACA,UAGJD,IAAK,CACD,MACA,MACA,MACA,MACA,MACA,MACA,OAGJ,MAAoB,SACpB,IAAoB,KACpB,YAAoB,iBACpB,kBAAoB,qBACpB,KAAoB,QACpB,OAAoB,SACpB,YAAoB,YACpB,OAAoB,UACpB,mBAAoB,oBACpB,kBAAoB,sBACpB,oBAAoB,2BACpB,SAAoB,SACpB,iBAAoB,iBACpB,YAAoB,UACpB,GAAoB,OACpB,GAAoB,MACpB,GAAoB,QAGxBqB,GAAwB,CACpB9B,SAAU,CACNC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,IAERM,MAAO,CACH,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEJD,IAAK,CACD,MACA,MACA,MACA,MACA,MACA,KACA,OAEJ,MAAqB,OACrB,IAAqB,IACrB,YAAqB,cACrB,kBAAqB,cACrB,KAAqB,MACrB,OAAqB,SACrB,YAAqB,YACrB,OAAqB,UACrB,mBAAqB,oBACrB,kBAAqB,kBACrB,oBAAqB,kBACrB,SAAqB,MACrB,iBAAqB,eACrB,YAAqB,SACrB,GAAqB,IACrB,GAAqB,QACrB,GAAqB,MAGzBqB,GAAwB,CACpB9B,SAAU,CACNC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,IAERM,MAAO,CACH,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEJD,IAAK,CACD,MACA,MACA,MACA,MACA,MACA,MACA,OAEJ,MAAwB,OACxB,IAAwB,IACxB,YAAwB,WACxB,kBAAwB,mBACxB,KAAwB,OACxB,OAAwB,SACxB,YAAwB,YACxB,OAAwB,UACxB,mBAAwB,oBACxB,kBAAwB,kBACxB,oBAAwB,qBACxB,SAAwB,KACxB,iBAAwB,oBACxB,YAAwB,UACxB,GAAwB,KACxB,GAAwB,KACxB,GAAwB,UAG5BqB,GAAwB,CACpB9B,SAAU,CACNC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,MAERM,MAAO,CACH,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,WACA,MACA,OAEJD,IAAK,CACD,MACA,MACA,MACA,WACA,MACA,WACA,OAEJ,MAAoB,iBACpB,IAAoB,IACpB,YAAoB,aACpB,kBAAoB,WACpB,KAAoB,UACpB,OAAoB,WACpB,YAAoB,WACpB,OAAoB,UACpB,mBAAoB,wBACpB,kBAAoB,YACpB,oBAAqB,wBACrB,SAAoB,IACpB,iBAAoB,6BACpB,YAAoB,iBACpB,GAAoB,IACpB,GAAoB,IACpB,GAAoB,KAGxBqB,GAAwB,CACpB9B,SAAU,CACNC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,IAERM,MAAO,CACH,MACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEJD,IAAK,CACD,MACA,MACA,MACA,MACA,MACA,MACA,OAEJ,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","file":"static/js/main.805d303a.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from \"@material-ui/core/styles\";\n\nimport Button from '@material-ui/core/Button';\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 TextField from '@material-ui/core/TextField';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nimport IconCancel from '@material-ui/icons/Cancel';\nimport IconOk from \"@material-ui/icons/Check\";\n\nconst styles = theme => ({\n buttonIcon: {\n marginRight: theme.spacing(1),\n }\n});\n\nclass DialogRename extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n name: props.name,\n id: props.id,\n instance: props.instance || 0\n };\n this.isShowInstance = !props.folder && props.instances && (props.instance || props.instances[0] || props.instances.length > 1);\n this.prefix = this.getPrefix(props.id);\n this.oldId = props.id;\n }\n\n getPrefix(id) {\n const parts = (id || '').split('.');\n parts.pop();\n return parts.join('.');\n }\n\n getId(name) {\n name = (name || '').replace(/[\\\\/\\][*,;'\"`<>?\\s]/g, '_');\n return this.prefix + '.' + name;\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.name !== this.props.name) {\n this.setState({name: nextProps.name});\n }\n if (nextProps.id !== this.props.id) {\n this.prefix = this.getPrefix(nextProps.id);\n this.setState({id: nextProps.id});\n }\n }\n\n handleCancel = () => {\n this.props.onClose();\n };\n\n handleOk = () => {\n this.props.onRename(this.oldId, this.state.id, this.state.name, this.state.instance);\n this.props.onClose();\n };\n\n handleChange = name => {\n this.setState({name, id: this.getId(name)});\n };\n\n render() {\n return (\n \n );\n }\n}\n\nDialogRename.propTypes = {\n onClose: PropTypes.func,\n onRename: PropTypes.func,\n name: PropTypes.string,\n id: PropTypes.string,\n instance: PropTypes.number,\n instances: PropTypes.array,\n folder: PropTypes.bool,\n};\n\nexport default withStyles(styles)(DialogRename);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Button from '@material-ui/core/Button';\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 {MdDelete as IconDelete} from 'react-icons/md';\n\nimport IconOk from '@material-ui/icons/Check';\nimport IconCancel from '@material-ui/icons/Cancel';\n\nimport I18n from '@iobroker/adapter-react/i18n';\nimport {withStyles} from \"@material-ui/core/styles\";\n\nconst styles = theme => ({\n buttonIcon: {\n marginRight: theme.spacing(1),\n }\n});\n\n\nclass DialogDelete extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n name: props.name,\n id: props.id,\n };\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.name !== this.props.name) {\n this.setState({name: nextProps.name});\n }\n if (nextProps.id !== this.props.id) {\n this.setState({id: nextProps.id});\n }\n }\n\n handleCancel = () => {\n this.props.onClose(null);\n };\n\n handleOk = () => {\n this.props.onDelete(this.state.id);\n this.props.onClose(this.props.value);\n };\n\n render() {\n return (\n \n );\n }\n}\n\nDialogDelete.propTypes = {\n onClose: PropTypes.func,\n onDelete: PropTypes.func,\n name: PropTypes.string,\n id: PropTypes.string,\n};\n\nexport default withStyles(styles)(DialogDelete);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\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 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';\n\nimport ImgJS from '../assets/tileJS.png';\nimport ImgTS from '../assets/tileTS.png';\nimport ImgBlockly from '../assets/tileBlockly.png';\nimport IconCancel from '@material-ui/icons/Cancel';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n card: {\n maxWidth: 345,\n display: 'inline-block',\n margin: '0 10px 0 10px'\n },\n media: {\n height: 100,\n },\n text: {\n maxWidth: 200,\n },\n buttonIcon: {\n marginRight: theme.spacing(1),\n }\n});\n\nclass DialogAddNew extends React.Component {\n handleCancel = () => {\n this.props.onClose();\n };\n\n handleOk = type => {\n this.props.onClose(type);\n };\n\n openHtml(html) {\n const lang = I18n.getLanguage();\n if (lang === 'de' || lang === 'ru') {\n html = html.replace(/\\/en\\//, '/' + lang + '/');\n }\n const win = window.open(html, '_blank');\n win.focus();\n }\n\n getJSCard() {\n return (\n this.props.onClose && this.props.onClose('Javascript/js')}>\n \n \n Javascript
\n {I18n.t('JS description')}
\n \n \n \n \n \n \n );\n }\n getTSCard() {\n return (\n this.props.onClose && this.props.onClose('TypeScript/ts')}>\n \n \n Typescript
\n {I18n.t('TS description')}
\n \n \n \n \n \n \n );\n }\n getBlocklyCard() {\n return (\n this.props.onClose && this.props.onClose('Blockly')}>\n \n \n Blockly
\n {I18n.t('Blockly description')}
\n \n \n \n \n \n \n );\n }\n render() {\n return (\n \n );\n }\n}\n\nDialogAddNew.propTypes = {\n onClose: PropTypes.func\n};\n\nexport default withStyles(styles)(DialogAddNew);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from \"@material-ui/core/styles\";\n\nimport Button from '@material-ui/core/Button';\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 TextField from '@material-ui/core/TextField';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport IconOk from '@material-ui/icons/Check';\nimport IconCancel from '@material-ui/icons/Cancel';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n buttonIcon: {\n marginRight: theme.spacing(1),\n }\n});\n\n\nclass DialogNew extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n name: props.name || 'Script',\n instance: props.instance || 0,\n parent: props.parent,\n error: ''\n };\n this.isShowInstance = !props.folder && props.instances && (props.instance || props.instances[0] || props.instances.length > 1);\n }\n\n getId(name) {\n name = name || this.state.name || '';\n name = name.replace(/[\\\\/\\][.*,;'\"`<>?\\s]/g, '_');\n return (this.state ? this.state.parent : this.props.parent) + '.' + name;\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.name !== this.props.name) {\n this.setState({name: nextProps.name});\n }\n }\n\n handleCancel = () => {\n this.props.onClose();\n };\n\n handleOk = () => {\n this.props.onAdd(this.getId(this.state.name), this.state.name, this.state.instance, this.props.type);\n this.props.onClose();\n };\n\n handleChange = name => {\n const id = this.getId(name);\n if (!name) {\n this.setState({name, id, error: I18n.t('Empty name is not allowed')});\n } else\n if (this.props.existingItems && this.props.existingItems.indexOf(id) !== -1) {\n this.setState({name, id, error: I18n.t('Duplicate name')});\n } else {\n this.setState({name, id, error: ''});\n }\n };\n\n render() {\n return (\n \n );\n }\n}\n\nDialogNew.propTypes = {\n onClose: PropTypes.func,\n onAdd: PropTypes.func,\n name: PropTypes.string,\n title: PropTypes.string,\n parent: PropTypes.string,\n instance: PropTypes.number,\n instances: PropTypes.array,\n parents: PropTypes.array,\n existingItems: PropTypes.array,\n folder: PropTypes.bool,\n type: PropTypes.string,\n};\n\nexport default withStyles(styles)(DialogNew);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\n\nimport IconOk from '@material-ui/icons/Check';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n titleBackground: {\n background: theme.palette.error.main,\n },\n titleColor: {\n color: theme.palette.error.contrastText,\n '&>h2': {\n color: theme.palette.error.contrastText,\n }\n },\n buttonIcon: {\n marginRight: theme.spacing(1),\n }\n});\n\nclass DialogError extends React.Component {\n constructor(props) {\n super(props);\n console.log('Error created')\n }\n handleOk = () => {\n this.props.onClose && this.props.onClose();\n };\n\n render() {\n return (\n \n );\n }\n}\n\nDialogError.propTypes = {\n onClose: PropTypes.func,\n title: PropTypes.string,\n text: PropTypes.string,\n icon: PropTypes.object\n};\n\nexport default withStyles(styles)(DialogError);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport {withStyles} from '@material-ui/core/styles';\nimport Drawer from '@material-ui/core/Drawer';\nimport Divider from '@material-ui/core/Divider';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport IconButton from '@material-ui/core/IconButton';\nimport { useDrag, useDrop, DndProvider as DragDropContext } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend'\n\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Input from '@material-ui/core/Input';\nimport RootRef from '@material-ui/core/RootRef';\n\nimport red from '@material-ui/core/colors/red';\nimport green from '@material-ui/core/colors/green';\nimport yellow from '@material-ui/core/colors/yellow';\n\nimport {MdMoreVert as IconMore} from 'react-icons/md';\nimport {FaFolder as IconFolder} from 'react-icons/fa';\nimport {FaFolderOpen as IconFolderOpened} from 'react-icons/fa';\nimport {MdContentCopy as IconCopy} from 'react-icons/md';\nimport {MdDelete as IconDelete} from 'react-icons/md';\nimport {MdInput as IconDoEdit} from 'react-icons/md';\nimport {MdClose as IconClear} from 'react-icons/md';\nimport {MdFormatClear as IconClose} from 'react-icons/md';\nimport {MdPlayArrow as IconPlay} from 'react-icons/md';\nimport {MdAdd as IconAdd} from 'react-icons/md';\nimport {MdCreateNewFolder as IconAddFolder} from 'react-icons/md';\nimport {MdPause as IconPause} from 'react-icons/md';\nimport {MdSwapVert as IconReorder} from 'react-icons/md';\nimport {MdEdit as IconEdit} from 'react-icons/md';\nimport {MdSearch as IconFind} from 'react-icons/md';\nimport {MdPersonPin as IconExpert} from 'react-icons/md';\nimport {FaFileExport as IconExport} from 'react-icons/fa';\nimport {FaFileImport as IconImport} from 'react-icons/fa';\nimport {MdPalette as IconDark} from 'react-icons/md';\nimport {MdUnfoldMore as IconExpandAll} from 'react-icons/md';\nimport {MdUnfoldLess as IconCollapseAll} from 'react-icons/md';\n\nimport ImgJS from './assets/js.png';\nimport ImgBlockly from './assets/blockly.png';\nimport ImgTypeScript from './assets/typescript.png';\n\nimport I18n from '@iobroker/adapter-react/i18n';\nimport DialogRename from './Dialogs/Rename';\nimport DialogDelete from './Dialogs/Delete';\nimport DialogAddNewScript from './Dialogs/AddNewScript';\nimport DialogNew from './Dialogs/New';\nimport DialogError from './Dialogs/Error';\n\nconst MENU_ITEM_HEIGHT = 48;\nconst COLOR_RUN = green[400];\nconst COLOR_PROBLEM = yellow[400];\nconst COLOR_PAUSE = red[400];\nconst ROOT_ID = 'script.js';\nconst COMMON_ID = ROOT_ID + '.common';\nconst GLOBAL_ID = ROOT_ID + '.global';\nconst NARROW_WIDTH = 350;\nconst LEVEL_PADDING = 16;\n\nconst SELECTED_STYLE = {\n background: '#164477',\n color: 'white'\n};\n\nconst styles = theme => ({\n drawerPaper: {\n position: 'relative',\n width: '100%', //Theme.menu.width,\n height: '100%',\n overflow: 'hidden'\n },\n toolbar: {\n height: theme.toolbar.height\n },\n toolbarButtons: {\n color: theme.palette.type === 'dark'? 'white !important' : 'black !important'\n },\n toolbarSearch: {\n width: 'calc(100% - 105px)',\n lineHeight: '34px',\n marginLeft: 5\n },\n iconButtons: {\n width: 32,\n height: 32,\n padding: 2\n },\n iconDropdownMenu: {\n paddingRight: 5\n },\n iconOnTheRight: {\n position: 'absolute',\n right: 10,\n top: 'calc(50% - 8px)'\n },\n menu: {\n width: '100%',\n height: '100%'\n },\n innerMenu: {\n width: '100%',\n height: 'calc(100% - 76px)',\n overflowX: 'hidden',\n overflowY: 'auto'\n },\n listItemIcon: {\n minWidth: 32,\n },\n filterIcon: {\n width: 18,\n height: 18,\n borderRadius: 2,\n marginRight: 5\n },\n scriptIcon: {\n width: 18,\n height: 18,\n borderRadius: 2,\n marginTop: 4,\n marginBottom: 4,\n marginLeft: 8,\n marginRight: 4,\n },\n folder: {\n //background: theme.palette.type === 'dark' ? '#6a6a6a' : '#e2e2e2',\n cursor: 'pointer',\n padding: 0,\n userSelect: 'none'\n },\n folderReorder: {\n opacity: 0.3,\n transitionDuration: '0.5s',\n transitionProperty: 'opacity'\n },\n folderIcon: {\n width: 20,\n height: 20,\n },\n folderIconReorder: {\n paddingTop: 4,\n paddingBottom: 4,\n paddingLeft: 8,\n paddingRight: 4,\n },\n folderIconNoReorder: {\n cursor: 'pointer',\n paddingTop: 4,\n paddingBottom: 4,\n paddingLeft: 8,\n paddingRight: 4,\n },\n script: {\n cursor: 'pointer',\n padding: 0,\n userSelect: 'none'\n },\n scriptReorder: {\n opacity: 1,\n transitionDuration: '0.5s',\n transitionProperty: 'opacity'\n },\n reorder: {\n //padding: '9px 16px 9px 9px',\n },\n expandButton: {\n width: 37,\n height: 37\n },\n selected: SELECTED_STYLE,\n instances: {\n color: 'gray',\n fontSize: 'smaller'\n },\n childrenCount: {\n float: 'right',\n marginRight: 5,\n fontSize: 10,\n opacity: 0.4,\n },\n footer: {\n height: 24,\n },\n footerButtons: {\n '&:hover': {\n backgroundColor: '#dbdbdb'\n },\n color: theme.palette.type === 'dark' ? '#ffffff' : '#111111',\n cursor: 'pointer',\n marginTop: 1,\n marginRight: 2,\n height: 22,\n width: 22,\n },\n footerButtonsRight: {\n float: 'right'\n },\n\n mainList: {\n '& .js-folder-dragover>div>li>.folder-reorder': {\n background: '#40adff'\n },\n '& .js-folder-dragging .folder-reorder': {\n opacity: 1,\n },\n '& .js-folder-dragging .script-reorder': {\n opacity: 0.3,\n }\n }\n});\n\nconst images = {\n 'Blockly': ImgBlockly,\n 'Javascript/js': ImgJS,\n def: ImgJS,\n 'TypeScript/ts': ImgTypeScript,\n};\n\nconst getObjectName = (id, obj, lang) => {\n lang = lang || I18n.getLanguage();\n if (obj && obj.common && obj.common.name) {\n if (typeof obj.common.name === 'object') {\n return (obj.common.name[lang] || obj.common.name.en || id.replace(/^script\\.js./, '')).toString();\n } else {\n return obj.common.name.toString();\n }\n } else {\n return id.replace(/^script\\.js./, '');\n }\n};\n\nconst prepareList = data => {\n const result = [{\n id: ROOT_ID,\n depth: 0,\n index: 0,\n parent: null,\n title: 'root',\n type: 'folder'\n }];\n const ids = Object.keys(data);\n\n /*ids.sort((a, b) => {\n if ((a === 'script.js.common' || a === 'script.js.global') && (b === 'script.js.common' || b === 'script.js.global')) {\n return a > b ? 1 : -1;\n } else if (a === 'script.js.common' || a === 'script.js.global' || b === 'script.js.common' || b === 'script.js.global') {\n return 1;\n } else {\n return a > b ? 1 : -1;\n }\n });*/\n\n for (let i = 0; i < ids.length; i++) {\n const obj = data[ids[i]];\n const parts = ids[i].split('.');\n parts.pop();\n result.push({\n id: ids[i],\n title: getObjectName(ids[i], obj),\n enabled: obj && obj.common && obj.common.enabled,\n depth: parts.length - 1,\n type: obj.type === 'script' ? obj.common.engineType : 'folder',\n parent: parts.length > 1 ? parts.join('.') : null,\n instance: obj.common.engine ? parseInt(obj.common.engine.split('.').pop(), 10) || 0 : null\n });\n }\n\n // Place all folder-less scripts at start\n /*result.sort((a, b) => {\n // without folders => always at start\n if (!a.parent && a.type !== 'folder' && !b.parent && b.type !== 'folder') {\n if (a.id === b.id) {\n return 0;\n } else {\n return a.id > b.id ? 1 : -1;\n }\n } else if (!a.parent && a.type !== 'folder') {\n return -1;\n } else if (!b.parent && b.type !== 'folder') {\n return 1;\n } else {\n // common and global are always at the end\n if ((a.id.startsWith('script.js.common') || a.id.startsWith('script.js.global')) &&\n (b.id.startsWith('script.js.common') || b.id.startsWith('script.js.global'))) {\n if (a.id === b.id) {\n return 0;\n } else {\n return a.id > b.id ? 1 : -1;\n }\n } else if (a.id.startsWith('script.js.common') || a.id.startsWith('script.js.global')) {\n return 1;\n } else if (b.id.startsWith('script.js.common') || b.id.startsWith('script.js.global')) {\n return -1;\n } else {\n if (a.id === b.id) {\n return 0;\n } else {\n return a.id > b.id ? 1 : -1;\n }\n }\n }\n });*/\n\n let modified;\n do {\n modified = false;\n // check if all parents exists\n // eslint-disable-next-line\n result.forEach(item => {\n if (item.parent) {\n const parent = result.find(it => it.id === item.parent);\n if (!parent) {\n const parts = item.parent.split('.');\n parts.pop();\n result.push({\n id: item.parent,\n title: item.parent.split('.').pop(),\n depth: parts.length - 1,\n type: 'folder',\n parent: parts.length > 1 ? parts.join('.') : null\n });\n modified = true;\n }\n }\n });\n } while (modified);\n\n // Folders first\n result.sort((a, b) => {\n const idA = a.id.toLowerCase();\n const idB = b.id.toLowerCase();\n if (a.type === 'folder' && b.type !== 'folder') {\n return -1;\n } else if (b.type === 'folder' && a.type !== 'folder') {\n return 1;\n }\n\n if (idA > idB) {\n return 1;\n } else if (idA < idB) {\n return -1;\n } else {\n return 0;\n }\n });\n\n // Fill all index\n result.forEach((item, i) => item.index = i);\n\n // Fill all parentIndex\n result.forEach(item => {\n if (item.parent) {\n const parent = result.find(it => it.id === item.parent);\n if (parent) {\n item.parentIndex = parent.index;\n }\n }\n });\n\n return result;\n};\n\nexport const Droppable = (props) => {\n const { onDrop} = props;\n\n const [{ isOver, isOverAny}, drop] = useDrop({\n accept: ['script'],\n drop: e => isOver ? onDrop(e) : undefined,\n collect: monitor => ({\n isOver: monitor.isOver({ shallow: true }),\n isOverAny: monitor.isOver(),\n }),\n });\n\n return \n {props.children}\n
;\n};\n\nexport const Draggable = (props) => {\n const { name } = props;\n const [{ opacity }, drag] = useDrag({\n item: {\n name,\n type: 'script'\n },\n collect: (monitor) => ({\n opacity: monitor.isDragging() ? 0.3 : 1,\n }),\n });\n // About transform: https://github.com/react-dnd/react-dnd/issues/832#issuecomment-442071628\n return \n {props.children}\n
;\n};\n\nclass SideDrawer extends React.Component {\n constructor(props) {\n super(props);\n\n let expanded = window.localStorage ? window.localStorage.getItem('SideMenu.expanded') : '[]';\n try {\n expanded = JSON.parse(expanded) || [];\n } catch (e) {\n expanded = [];\n }\n\n this.inputRef = new React.createRef();\n\n this.state = {\n listItems: prepareList(props.scripts || {}),\n expanded: expanded,\n problems: [],\n reorder: false,\n themeName: this.props.themeName,\n selected: window.localStorage ? window.localStorage.getItem('SideMenu.selected') || null : null,\n creatingScript: false,\n creatingFolder: false,\n copingScript: '',\n renaming: null,\n deleting: null,\n choosingType: null,\n errorText: '',\n instances: props.instances || [],\n menuOpened: false,\n menuAnchorEl: null,\n searchMode: false,\n expertMode: this.props.expertMode,\n searchText: '',\n width: this.props.width || 300,\n typeFilter: window.localStorage ? window.localStorage.getItem('SideMenu.typeFilter') || '' : '', // blockly, js, ts\n statusFilter: window.localStorage ? window.localStorage.getItem('SideMenu.statusFilter') || '' : '',\n runningInstances: this.props.runningInstances || {},\n scriptsHash: props.scriptsHash,\n };\n\n const newExp = this.ensureSelectedIsVisible();\n if (newExp) {\n this.state.expanded = newExp;\n }\n\n // debounce search process\n this.filterTimer = null;\n\n this.state.isAllZeroInstances = this.getIsAllZeroInstances();\n\n this.problems = null; //cache\n this.problemsTimer = null;\n this.onProblemUpdatedBound = this.onProblemUpdated.bind(this);\n }\n\n readProblems(cb, tasks) {\n if (!tasks) {\n tasks = Object.keys(this.props.scripts);\n }\n if (!tasks || !tasks.length) {\n cb && cb();\n } else {\n const id = tasks.shift();\n if (this.props.scripts[id] &&\n this.props.scripts[id].type === 'script' &&\n this.props.scripts[id].common &&\n this.props.scripts[id].common.enabled &&\n !id.match(/^script\\.js\\.global\\./) // GLOBAL_ID\n ) {\n const instance = this.props.scripts[id].common.engine.split('.').pop();\n const that = this; // sometimes lambda does not work\n const _id = 'javascript.' + instance + '.scriptProblem.' + id.substring(ROOT_ID.length + 1);\n\n this.props.socket.getState(_id, (err, state) => {\n that.onProblemUpdated(_id, state);\n setTimeout(() => that.readProblems(cb, tasks), 0);\n });\n } else {\n setTimeout(() => this.readProblems(cb, tasks), 0);\n }\n }\n }\n\n componentDidMount() {\n this.readProblems(() => {\n this.props.instances.forEach(instance => {\n this.props.socket.subscribeState('javascript.' + instance + '.scriptProblem.*', this.onProblemUpdatedBound);\n });\n });\n }\n\n componentWillUnmount() {\n this.props.instances.forEach(instance => {\n this.props.socket.unsubscribeState('javascript.' + instance + '.scriptProblem.*', this.onProblemUpdatedBound);\n });\n }\n\n onProblemUpdated(id, state) {\n if (!state || !id) return;\n id = ROOT_ID + '.' + id.replace(/^javascript\\.\\d+\\.scriptProblem\\./, '');\n\n if (!this.problems) {\n this.problems = JSON.parse(JSON.stringify(this.state.problems));\n }\n let changed = false;\n\n if (state.val) {\n if (this.problems.indexOf(id) === -1) {\n this.problems.push(id);\n changed = true;\n }\n } else {\n const pos = this.problems.indexOf(id);\n if (pos !== -1) {\n this.problems.splice(pos, 1);\n changed = true;\n }\n }\n\n if (changed && !this.problemsTimer) {\n this.problemsTimer = setTimeout(() => {\n this.problemsTimer = null;\n this.setState({problems: this.problems});\n this.problems = null;\n }, 300);\n }\n }\n\n static filterListStatic(isSearchEnabled, listItems, searchMode, searchText, objects) {\n listItems = JSON.parse(JSON.stringify(listItems));\n let changed = false;\n let newState = {listItems};\n if (isSearchEnabled !== false && searchMode && searchText) {\n const text = searchText.toLowerCase();\n listItems.forEach(item => {\n const id = item.title.toLowerCase();\n item.filteredPartly = false;\n let found = id.indexOf(text) !== -1;\n if (!found && (objects && objects[item.id] && objects[item.id].common && objects[item.id].common.source)) {\n if (objects[item.id].common.engineType === 'Blockly') {\n const pos = objects[item.id].common.source.lastIndexOf('//');\n found = objects[item.id].common.source.substring(0, pos).toLowerCase().indexOf(text) !== -1;\n } else {\n found = objects[item.id].common.source.toLowerCase().indexOf(text) !== -1;\n }\n }\n if (found) {\n if (item.filtered) {\n item.filtered = false;\n changed = true;\n }\n } else if (!item.filtered) {\n item.filtered = true;\n changed = true;\n }\n });\n\n if (changed) {\n // check that all parents of every non-filtered item are visible\n for (let i = listItems.length - 1; i >= 0; i--) {\n const item = listItems[i];\n if (!item.filtered || item.filteredPartly) {\n let it = item;\n do {\n if (it.parent && listItems[it.parentIndex]) {\n changed = true;\n listItems[it.parentIndex].filteredPartly = true;\n }\n it = it.parent && listItems[it.parentIndex] ? listItems[it.parentIndex] : null;\n } while(it);\n }\n }\n }\n } else {\n listItems.forEach(item => {\n if (item.filtered || item.filteredPartly) {\n item.filtered = false;\n item.filteredPartly = false;\n changed = true;\n }\n });\n if (isSearchEnabled === false) {\n newState.searchText = '';\n newState.searchMode = false;\n changed = true;\n }\n }\n\n return changed ? newState : null;\n }\n\n filterList(isSearchEnabled, cb) {\n const newState = SideDrawer.filterListStatic(\n isSearchEnabled,\n this.state.listItems,\n this.state.searchMode,\n this.state.searchText,\n this.props.scripts\n );\n\n if (newState) {\n this.setState(newState, () => cb && cb());\n } else if (cb) {\n cb();\n }\n }\n\n static ensureSelectedIsVisibleStatic(selected, expanded, listItems) {\n expanded = JSON.parse(JSON.stringify(expanded));\n let changed = false;\n\n // ensure that the item is visible\n let el = typeof selected === 'object' ? selected : listItems.find(it => it.id === selected);\n do {\n // eslint-disable-next-line\n el = el && el.parent && listItems.find(it => it.id === el.parent);\n if (el) {\n if (expanded.indexOf(el.id) === -1) {\n expanded.push(el.id);\n changed = true;\n }\n }\n } while(el);\n return changed && expanded;\n }\n\n ensureSelectedIsVisible(selected, expanded) {\n SideDrawer.ensureSelectedIsVisibleStatic(selected || this.state.selected, expanded || this.state.expanded, this.state.listItems);\n }\n\n static getDerivedStateFromProps(props, state) {\n const newState = {};\n let changed = false;\n if (state.expertMode !== props.expertMode) {\n changed = true;\n newState.expertMode = props.expertMode;\n }\n if (state.scriptsHash !== props.scriptsHash && props.scripts) {\n const listItems = prepareList(props.scripts || {});\n\n newState.listItems = listItems;\n\n if (state.searchText) {\n const nState = SideDrawer.filterListStatic(true, listItems, state.searchMode, state.searchText, props.scripts);\n nState && Object.assign(newState, nState);\n }\n\n const isAllZeroInstances = SideDrawer.getIsAllZeroInstancesStatic(listItems, props.instances || []);\n\n const newExp = SideDrawer.ensureSelectedIsVisibleStatic(state.selected, state.expanded, state.listItems);\n\n newState.isAllZeroInstances = isAllZeroInstances;\n if (newExp) {\n newState.expanded = newExp;\n }\n changed = true;\n }\n\n if (state.width !== props.width) {\n changed = true;\n newState.width = props.width;\n }\n if (state.themeName !== props.themeName) {\n changed = true;\n newState.themeName = props.themeName;\n }\n\n if (props.selectId && state.selected !== props.selectId) {\n const item = state.listItems.find(item => item.id === props.selectId);\n\n if (!state.reorder && item) {\n const expanded = SideDrawer.ensureSelectedIsVisibleStatic(item, state.expanded, state.listItems);\n newState.selected = item.id;\n if (expanded) {\n newState.expanded = expanded;\n }\n changed = true;\n window.localStorage && window.localStorage.setItem('SideMenu.selected', item.id);\n }\n }\n\n if (changed) {\n return newState;\n } else {\n return null;\n }\n }\n\n static getIsAllZeroInstancesStatic(listItems, instances) {\n let isAllZeroInstances = !instances[0] && instances.length <= 1;\n\n if (isAllZeroInstances) {\n listItems.forEach(item => {\n if (item.type !== 'folder' && item.instance !== 0) {\n isAllZeroInstances = false;\n }\n });\n }\n return isAllZeroInstances;\n }\n\n getIsAllZeroInstances(listItems, instances) {\n listItems = listItems || this.state.listItems;\n instances = instances || this.state.instances;\n return SideDrawer.getIsAllZeroInstancesStatic(listItems || this.state.listItems, instances || this.state.instances);\n }\n\n saveExpanded(expanded) {\n window.localStorage.setItem('SideMenu.expanded', JSON.stringify(expanded || this.state.expanded));\n }\n\n showError(err) {\n this.setState({errorText: err});\n }\n\n onToggle(id, e) {\n e && e.stopPropagation();\n if (id === ROOT_ID) {\n return;\n }\n const expanded = [...this.state.expanded];\n const newState = {expanded};\n const pos = expanded.indexOf(id);\n if (pos !== -1) {\n expanded.splice(pos, 1);\n if (this.state.selected && this.state.selected.startsWith(id + '.')) {\n newState.selected = id;\n window.localStorage && window.localStorage.setItem('SideMenu.selected', id);\n }\n } else {\n expanded.push(id);\n expanded.sort();\n }\n this.setState({expanded});\n this.saveExpanded(expanded);\n }\n\n renderItemButtonsOnEnd(item, children) {\n if (this.state.reorder) {\n return null;\n }\n if (item.type !== 'folder') {\n let color = item.enabled ? COLOR_RUN : COLOR_PAUSE;\n if (item.enabled && this.state.problems.indexOf(item.id) !== -1) {\n color = COLOR_PROBLEM;\n }\n\n return [\n {\n e.stopPropagation();\n this.props.onEnableDisable && this.props.onEnableDisable(item.id, !item.enabled)\n }}\n title={item.enabled ? I18n.t('Pause script') : I18n.t('Run script')}\n key=\"startStop\"\n style={{color}}>\n {item.enabled ? () : ()}\n ,\n this.state.width > NARROW_WIDTH ? this.onDelete(item, e)}> : null,\n this.onEdit(item, e)}>,\n ];\n } else if (this.state.width > NARROW_WIDTH) {\n if (item.id !== ROOT_ID && item.id !== COMMON_ID && item.id !== GLOBAL_ID && (!children || !children.length)) {\n return this.onDelete(item, e)}>;\n } else {\n return null;\n }\n }\n }\n\n onDelete(item, e) {\n e && e.stopPropagation();\n return new Promise(resolve => {\n if (typeof item !== 'object') {\n this.setState({deleting: item});\n } else {\n this.setState({deleting: item.id});\n }\n });\n }\n\n onEdit(item, e) {\n this.onClick(item, e);\n this.props.onEdit && this.props.onEdit(item.id);\n }\n\n getTextStyle(item) {\n if (!this.state.reorder && item.type !== 'folder') {\n return {\n //width: 130,\n width: `calc(100% - ${this.state.width > NARROW_WIDTH ? 185 : 137}px)`,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n flex: 'none',\n padding: '0 16px 0 0'\n };\n } else {\n return {\n whiteSpace: 'nowrap',\n padding: '0 16px 0 0'\n };\n }\n }\n\n onClick(item, e) {\n e && e.stopPropagation();\n if (!this.state.reorder && item) {\n const expanded = this.ensureSelectedIsVisible(item);\n const newState = {selected: item.id};\n if (expanded) {\n newState.expanded = expanded;\n }\n this.setState(newState);\n window.localStorage && window.localStorage.setItem('SideMenu.selected', item.id);\n }\n }\n\n onDblClick(item, e) {\n e && e.stopPropagation();\n if (this.state.reorder) {\n return;\n }\n if (item.type === 'folder') {\n this.onToggle(item.id);\n } else {\n this.onEdit(item);\n }\n }\n\n isFilteredOut(item) {\n if (item.filtered && !item.filteredPartly) return true;\n\n if (this.state.typeFilter && item.type !== 'folder' && item.type !== this.state.typeFilter) {\n return true;\n }\n\n if (this.state.statusFilter &&\n item.type !== 'folder' &&\n (\n (this.state.statusFilter === 'running' && !item.enabled) ||\n (this.state.statusFilter === 'paused' && item.enabled) ||\n (this.state.statusFilter === 'problems' && (!item.enabled || this.state.problems.indexOf(item.id) === -1)))\n ) {\n return true;\n }\n\n return (item.id === GLOBAL_ID && !this.state.expertMode);\n }\n\n renderListItem(item, children, childrenFiltered) {\n if (item.id === ROOT_ID && !this.state.reorder) {\n return null;\n }\n\n const depthPx = (this.state.reorder ? item.depth : item.depth - 1) * LEVEL_PADDING;\n\n let title = item.title;\n\n if (this.state.searchText) {\n const pos = title.toLowerCase().indexOf(this.state.searchText.toLowerCase());\n if (pos !== -1) {\n title = [\n ({title.substring(0, pos)}),\n ({title.substring(pos, pos + this.state.searchText.length)}),\n ({title.substring(pos + this.state.searchText.length)}),\n ];\n }\n }\n\n if (!this.state.isAllZeroInstances && item.type !== 'folder') {\n title = [\n [{item.instance}] ,\n {title}\n ];\n }\n\n const style = Object.assign({\n marginLeft: depthPx,\n cursor: item.type === 'folder' && this.state.reorder ? 'default' : 'inherit',\n width: `calc(100% - ${depthPx}px)`\n }, item.id === this.state.selected && !this.state.reorder ? SELECTED_STYLE : {});\n\n if (!this.state.reorder) {\n style.opacity = item.filteredPartly ? 0.5 : 1;\n }\n\n if (item.id === GLOBAL_ID && item.id !== this.state.selected) {\n style.color = '#00a200';\n }\n\n let isExpanded = item.id === ROOT_ID;\n if (!isExpanded && children) {\n isExpanded = this.state.expanded.includes(item.id);\n }\n\n let iconStyle = {};\n if (item.id === GLOBAL_ID) {\n iconStyle.color = '#356956';\n } else if (item.id === COMMON_ID) {\n iconStyle.color = '#4899e1';\n }\n let iconClass;\n if (item.type === 'folder') {\n iconClass = clsx(this.props.classes.folderIcon, this.state.reorder ? this.props.classes.folderIconReorder : this.props.classes.folderIconNoReorder);\n } else {\n iconClass = clsx(this.props.classes.scriptIcon, this.state.reorder ? this.props.classes.scriptIconReorder : this.props.classes.scriptIconNoReorder);\n }\n\n let childrenCount = null;\n if ((childrenFiltered && childrenFiltered.length) || (children && children.length)) {\n childrenCount = {childrenFiltered && childrenFiltered.length !== children.length ? `${childrenFiltered.length}(${children.length})` : children.length};\n }\n\n return this.onClick(item, e)}\n onDoubleClick={e => this.onDblClick(item, e)}\n >\n {\n item.type === 'folder' ? (\n this.state.reorder || isExpanded ?\n !this.state.reorder && this.onToggle(item.id, e)}/> :\n !this.state.reorder && this.onToggle(item.id, e)}/>\n )\n :\n \n }\n {title}{childrenCount})}/>\n {this.renderItemButtonsOnEnd(item, children)}\n ;\n }\n\n onDragFinish(source, target) {\n let newId = target + '.' + source.split('.').pop();\n if (newId !== source) {\n // If target yet exists => add Copy to\n if (this.state.listItems.find(item => item.id === newId)) {\n newId += '_' + I18n.t('copy');\n }\n\n this.props.onRename && this.props.onRename(source, newId);\n }\n return undefined;\n }\n\n renderOneItem(items, item, dragging) {\n let childrenFiltered = (this.state.statusFilter || this.state.typeFilter) && items.filter(i => i.parent === item.id ? !this.isFilteredOut(i) : false);\n let children = items.filter(i => i.parent === item.id);\n\n if (this.isFilteredOut(item)) {\n return;\n }\n\n if (item.type === 'folder' && (this.state.statusFilter || this.state.typeFilter) && !childrenFiltered.length) {\n return;\n }\n\n const element = this.renderListItem(item, children, childrenFiltered);\n const result = [];\n let reactChildren;\n if (children && (this.state.reorder || this.state.expanded.includes(item.id) || item.id === ROOT_ID)) {\n reactChildren = children.map(it => this.renderOneItem(items, it));\n }\n\n if (this.state.reorder) {\n if (item.type === 'folder') {\n result.push( this.onDragFinish(e.name, item.id)}>\n {element}\n {reactChildren || null}\n );\n } else {\n result.push(\n {element}\n {reactChildren || null}\n );\n }\n } else {\n result.push(element);\n reactChildren && reactChildren.forEach(e => result.push(e));\n }\n\n return result;\n }\n\n renderAllItems(items) {\n const result = items\n .filter(item => !item.parent)\n .map(item =>\n this.renderOneItem(items, item));\n\n return \n {result}\n
;\n }\n\n onAddNew(e) {\n e && e.stopPropagation();\n let item = this.state.listItems.find(i => i.id === this.state.selected);\n let parent = ROOT_ID;\n while (item && item.type !== 'folder') {\n item = this.state.listItems[item.parentIndex];\n }\n if (item) {\n parent = item.id;\n }\n\n this.parent = parent;\n this.setState({choosingType: true});\n }\n\n onCopy(e, id) {\n e && e.stopPropagation();\n let item = this.state.listItems.find(i => i.id === id);\n let parent = ROOT_ID;\n while (item && item.type !== 'folder') {\n item = this.state.listItems[item.parentIndex];\n }\n if (item) {\n parent = item.id;\n }\n\n this.parent = parent;\n this.setState({copingScript: id});\n }\n\n onAddNewFolder(e) {\n e && e.stopPropagation();\n let item = this.state.listItems.find(i => i.id === this.state.selected);\n let parent = ROOT_ID;\n while (item && item.type !== 'folder') {\n item = this.state.listItems[item.parentIndex];\n }\n if (item) {\n parent = item.id;\n }\n\n this.parent = parent;\n this.setState({creatingFolder: true});\n }\n\n onRename(e) {\n e && e.stopPropagation();\n this.setState({renaming: this.state.selected});\n }\n\n getUniqueName(copyId) {\n let i = 1;\n let word = I18n.t('Script') + ' ';\n if (copyId) {\n let name = getObjectName(copyId, this.props.scripts[copyId]);\n const m = name.match(/\\d+$/);\n if (m) {\n word = name.replace(/\\d+$/, '');\n i = parseInt(m[0], 10) + 1;\n } else {\n word = name;\n }\n }\n\n // eslint-disable-next-line\n while (this.state.listItems.find(it => it.id === this.parent + '.' + word.replace(/\\.\\s/g, '_') + i)) {\n i++;\n }\n /*ignore jslint end*/\n return word + i;\n }\n\n getUniqueFolderName() {\n let i = 1;\n // eslint-disable-next-line\n while (this.state.listItems.find(it => it.id === this.parent + '.' + I18n.t('Folder') + '_' + i)) {\n i++;\n }\n return I18n.t('Folder') + ' ' + i;\n }\n\n onCloseMenu(cb) {\n this.setState({menuOpened: false, menuAnchorEl: null, menuAnchorFilterEl: null}, cb);\n }\n\n getFilterBadge() {\n return [\n this.state.statusFilter === true && (),\n this.state.statusFilter === false && (),\n this.state.typeFilter === 'Blockly' && ('Bl'),\n this.state.typeFilter === 'Javascript/js' && ('JS'),\n this.state.typeFilter === 'TypeScript/ts' && ('TS'),\n ]\n }\n\n getMainMenu(children, selectedItem) {\n return ;\n }\n\n // render menu and toolbar\n getToolbarButtons() {\n const result = [];\n const classes = this.props.classes;\n if (this.state.searchMode) {\n result.push( {\n this.setState({searchText: e.target.value});\n this.filterTimer && clearTimeout(this.filterTimer);\n this.filterTimer = setTimeout(() => {\n this.filterTimer = null;\n this.filterList(true);\n this.props.onSearch && this.props.onSearch(this.state.searchText);\n }, 400);\n }}\n />);\n\n result.push( {\n e.stopPropagation();\n this.filterList(false, () => this.props.onSearch && this.props.onSearch(this.state.searchText));\n }}\n >);\n\n this.state.searchText && result.push( {\n e.stopPropagation();\n this.setState({searchText: ''}, () => {\n this.filterList(true);\n this.props.onSearch && this.props.onSearch(this.state.searchText);\n });\n }}\n >);\n } else {\n if (!this.state.reorder) {\n // Open Menu\n result.push( {\n event.stopPropagation();\n event.preventDefault();\n this.setState({menuOpened: true, menuAnchorEl: event.currentTarget});\n }}\n >\n {/**/}\n \n {/**/}\n );\n\n const selectedItem = this.state.listItems.find(it => it.id === this.state.selected);\n let children;\n if (selectedItem && this.state.width <= NARROW_WIDTH && selectedItem.type === 'folder') {\n children = this.state.listItems.filter(i => i.parent === this.state.selected);\n }\n\n // Menu\n result.push(this.getMainMenu(children, selectedItem));\n\n // New Script\n result.push( this.onAddNew(e)}\n >);\n\n // New Folder\n result.push( this.onAddNewFolder()}\n >);\n }\n\n // Search\n result.push( {\n e.stopPropagation();\n this.setState({searchMode: true});\n }}\n >);\n\n // Reorder button\n result.push( {\n e.stopPropagation();\n this.setState({reorder: !this.state.reorder});\n }}\n >);\n\n if (!this.state.reorder && this.state.selected && this.state.selected !== GLOBAL_ID && this.state.selected !== COMMON_ID) {\n // Rename\n result.push( this.onRename(e)}\n >);\n\n\n // const selectedItem = this.state.listItems.find(i => i.id === this.state.selected);\n // if (selectedItem && selectedItem.type !== 'folder') {\n // // Restart\n // result.push(( {\n // e.stopPropagation();\n // this.props.onEnableDisable && this.props.onEnableDisable();\n // }}\n // >));\n // }\n }\n\n }\n return result;\n }\n\n getFolders() {\n const folders = [{id: ROOT_ID, name: I18n.t('Root folder')}];\n this.state.listItems.forEach(item =>\n item.type === 'folder' && folders.push({id: item.id, name: item.title})\n );\n return folders;\n }\n\n onCollapseAll() {\n this.setState({expanded: []});\n this.saveExpanded([]);\n }\n\n onExpandAll() {\n const expanded = [];\n this.state.listItems.forEach(item =>\n this.state.listItems.find(it => it.parent === item.id) && expanded.push(item.id));\n this.setState({expanded});\n this.saveExpanded(expanded);\n }\n\n getBottomButtons() {\n if (this.state.reorder) {\n return null;\n }\n return [\n {\n event.stopPropagation();\n event.preventDefault();\n const statusFilter = this.state.statusFilter === 'running' ? '' : 'running';\n window.localStorage && window.localStorage.setItem('SideMenu.statusFilter', statusFilter);\n this.setState({statusFilter});\n }}\n />,\n\n {\n const statusFilter = this.state.statusFilter === 'paused' ? '' : 'paused';\n window.localStorage && window.localStorage.setItem('SideMenu.statusFilter', statusFilter);\n this.setState({statusFilter});\n }}\n />,\n {\n const statusFilter = this.state.statusFilter === 'problems' ? '' : 'problems';\n window.localStorage && window.localStorage.setItem('SideMenu.statusFilter', statusFilter);\n this.setState({statusFilter});\n }}\n />,\n {\n const typeFilter = this.state.typeFilter === 'Blockly' ? '' : 'Blockly';\n window.localStorage && window.localStorage.setItem('SideMenu.typeFilter', typeFilter);\n this.setState({typeFilter});\n }}\n />,\n {\n const typeFilter = this.state.typeFilter === 'Javascript/js' ? '' : 'Javascript/js';\n window.localStorage && window.localStorage.setItem('SideMenu.typeFilter', typeFilter);\n this.setState({typeFilter});\n }}\n />,\n {\n const typeFilter = this.state.typeFilter === 'TypeScript/ts' ? '' : 'TypeScript/ts';\n window.localStorage && window.localStorage.setItem('SideMenu.typeFilter', typeFilter);\n this.setState({typeFilter});\n }}\n />,\n this.onExpandAll()}/>,\n this.state.expanded.length ? this.onCollapseAll()}/> : null,\n ];\n }\n\n render() {\n const {classes} = this.props;\n\n const renamingItem = this.state.renaming && this.state.listItems.find(i => i.id === this.state.renaming);\n const copingItem = this.state.copingScript && this.props.scripts[this.state.copingScript];\n\n return [\n this.onClick({id: ''})}\n >\n \n {this.getToolbarButtons()}\n
\n\n \n\n \n \n {this.renderAllItems(this.state.listItems)}\n
\n \n\n \n\n {this.getBottomButtons()}
\n ,\n\n renamingItem ? this.setState({renaming: false})}\n onRename={(oldId, newName, newId, newInstance) => this.props.onRename && this.props.onRename(oldId, newName, newId, newInstance)}\n /> : null,\n\n this.state.deleting ? i.id === this.state.deleting).title}\n id={this.state.deleting}\n onClose={() => this.setState({deleting: false})}\n onDelete={id => this.props.onDelete && this.props.onDelete(id)}\n /> : null,\n\n this.state.choosingType ? {\n this.setState({choosingType: false});\n type && this.setState({creatingScript: type})\n }}\n /> : null,\n\n this.state.creatingScript ? this.setState({creatingScript: false})}\n title={I18n.t('Create new script')}\n name={ this.getUniqueName() }\n parents={ this.getFolders() }\n folder={ false }\n existingItems={this.state.listItems.map(item => item.id)}\n instance={this.props.instances[0] || 0}\n instances={this.props.instances}\n type={this.state.creatingScript}\n parent={this.parent}\n onAdd={(id, name, instance, type) => {\n this.props.onAddNew && this.props.onAddNew(id, name, false, instance, type);\n }}\n /> : null,\n\n this.state.copingScript ? this.setState({copingScript: ''})}\n title={I18n.t('Copy script')}\n name={ this.getUniqueName(this.state.copingScript) }\n parents={this.getFolders()}\n folder={false}\n instance={parseInt((copingItem && copingItem.common && copingItem.common.engine && copingItem.common.engine.split('.').pop()) || 0, 10)}\n instances={this.props.instances}\n type={(copingItem && copingItem.common && copingItem.common.engineType) || 'Javascript/js'}\n parent={this.parent}\n onAdd={(id, name, instance, type) => {\n const copingItem = this.state.copingScript && this.props.scripts[this.state.copingScript];\n if (copingItem && copingItem.common) {\n // disable script by coping\n copingItem.common.enabled = false;\n }\n this.props.onAddNew && this.props.onAddNew(id, name, false, instance, type, copingItem && copingItem.common && copingItem.common.source);\n }}\n /> : null,\n\n this.state.creatingFolder ? this.setState({creatingFolder: false})}\n title={I18n.t('Create new folder')}\n parents={this.getFolders()}\n name={this.getUniqueFolderName()}\n parent={this.parent}\n onAdd={(id, name) => {\n this.props.onAddNew && this.props.onAddNew(id, name, true);\n }}\n /> : null,\n this.state.errorText ? this.setState({errorText: ''})} text={this.state.errorText}/> : null\n ];\n }\n}\n\nSideDrawer.propTypes = {\n classes: PropTypes.object.isRequired,\n instances: PropTypes.array.isRequired,\n scripts: PropTypes.object.isRequired,\n scriptsHash: PropTypes.number,\n onEdit: PropTypes.func,\n selectId: PropTypes.string,\n expertMode: PropTypes.bool,\n onExpertModeChange: PropTypes.func,\n onEnableDisable: PropTypes.func,\n runningInstances: PropTypes.object,\n socket: PropTypes.object,\n themeName: PropTypes.string,\n themeType: PropTypes.string,\n onSelect: PropTypes.func,\n onAddNew: PropTypes.func,\n onRename: PropTypes.func,\n onDelete: PropTypes.func,\n onImport: PropTypes.func,\n onExport: PropTypes.func,\n onSearch: PropTypes.func,\n onThemeChange: PropTypes.func,\n width: PropTypes.number\n};\n\nexport default withStyles(styles)(SideDrawer);\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\n\nimport IconButton from '@material-ui/core/IconButton';\nimport {MdDeleteForever as IconDelete} from 'react-icons/md';\nimport {MdVerticalAlignBottom as IconBottom} from 'react-icons/md';\nimport {MdContentCopy as IconCopy} from 'react-icons/md';\n\nimport I18n from '@iobroker/adapter-react/i18n';\nimport {withStyles} from '@material-ui/core/styles/index';\n\n// replace later with MdHorizontalSplit and MdVerticalSplit\nconst IconVerticalSplit = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgAQMAAADYVuV7AAAABlBMVEUAAAAzMzPI8eYgAAAAAXRSTlMAQObYZgAAACFJREFUeAFjAIJRwP////8PYIKWHCigNQdKj/pn1D+jAABTG16wVQqVpQAAAABJRU5ErkJggg==';\nconst IconHorizontalSplit = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgAQMAAADYVuV7AAAABlBMVEUAAAAzMzPI8eYgAAAAAXRSTlMAQObYZgAAABtJREFUeAFjAIJRwP8fCj7QkENn/4z6Z5QzCgBjbWaoyx1PqQAAAABJRU5ErkJggg==';\n\nfunction getTimeString(d) {\n let text;\n let i = d.getHours();\n if (i < 10) i = '0' + i.toString();\n text = i + ':';\n\n i = d.getMinutes();\n if (i < 10) i = '0' + i.toString();\n text += i + ':';\n i = d.getSeconds();\n if (i < 10) i = '0' + i.toString();\n text += i + '.';\n i = d.getMilliseconds();\n if (i < 10) {\n i = '00' + i.toString();\n } else if (i < 100) {\n i = '0' + i.toString();\n }\n text += i;\n return text;\n}\nconst TOOLBOX_WIDTH = 34;\n\nconst styles = theme => ({\n logBox: {\n width: '100%',\n height: '100%',\n position: 'relative',\n overflow: 'hidden'\n },\n logBoxInner: {\n color: theme.palette.type === 'dark' ? 'white' : 'black',\n width: `calc(100% - ${TOOLBOX_WIDTH}px)`,\n height: '100%',\n marginLeft: TOOLBOX_WIDTH,\n overflow: 'auto',\n position: 'relative'\n },\n info: {\n background: theme.palette.type === 'dark' ? 'darkgrey' : 'lightgrey',\n color: theme.palette.type === 'dark' ? 'black' : 'black'\n },\n error: {\n background: '#FF0000',\n color: theme.palette.type === 'dark' ? 'black' : 'white'\n },\n warn: {\n background: '#FF8000',\n color: theme.palette.type === 'dark' ? 'black' : 'white'\n },\n debug: {\n background: 'gray',\n opacity: 0.8,\n color: theme.palette.type === 'dark' ? 'black' : 'white'\n },\n silly: {\n background: 'gray',\n opacity: 0.6,\n color: theme.palette.type === 'dark' ? 'black' : 'white'\n },\n table: {\n fontFamily: 'monospace',\n width: '100%',\n\n },\n toolbox: {\n position: 'absolute',\n top: 0,\n left: 0,\n marginLeft: 2,\n width: TOOLBOX_WIDTH,\n height: '100%',\n boxShadow: '2px 0px 4px -1px rgba(0, 0, 0, 0.2), 4px 0px 5px 0px rgba(0, 0, 0, 0.14), 1px 0px 10px 0px rgba(0, 0, 0, 0.12)'\n },\n trTime: {\n width: 90\n },\n trSeverity: {\n width: 40,\n fontWeight: 'bold'\n },\n iconButtons: {\n width: 32,\n height: 32,\n padding: 4\n },\n layoutIcon: {\n width: 24,\n height: 24,\n background: theme.palette.type === 'dark' ? '#9d9d9d' : undefined,\n borderRadius: theme.palette.type === 'dark' ? 30 : undefined,\n },\n});\n\nfunction copyToClipboard(str) {\n const el = window.document.createElement('textarea');\n el.value = str;\n window.document.body.appendChild(el);\n el.select();\n window.document.execCommand('copy');\n window.document.body.removeChild(el);\n}\n\nfunction paddingMs(ms) {\n if (ms < 10) return '00' + ms;\n if (ms < 100) return '0' + ms;\n return ms;\n}\n\nlet gText = {};\n\nclass Log extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n lines: {},\n goBottom: true,\n selected: null,\n editing: this.props.editing || []\n };\n this.lastIndex = null;\n this.messagesEnd = React.createRef();\n this.logHandlerBound = this.logHandler.bind(this);\n }\n\n generateLine(message) {\n return (\n {getTimeString(new Date(message.ts))} | \n {message.severity} | \n {message.message} | \n
);\n }\n\n scrollToBottom() {\n this.messagesEnd && this.messagesEnd.current && this.messagesEnd.current.scrollIntoView({behavior: 'smooth'});\n }\n logHandler(message) {\n let allLines = this.state.lines;\n const selected = this.state.editing.find(id => message.message.indexOf(id) !== -1);\n if (!selected) return;\n\n let lines = allLines[selected] || [];\n let text = gText[selected] || [];\n\n lines.push(this.generateLine(message));\n let severity = message.severity;\n if (severity === 'info' || severity === 'warn') {\n severity += ' ';\n }\n const date = new Date(message.ts);\n text.push(`${date.toLocaleString()}.${paddingMs(date.getMilliseconds())}\\t[${severity}]: ${message.message}`);\n if (lines.length > 300) {\n lines.splice(0, lines.length - 300);\n text.splice(0, lines.length - 300);\n }\n gText[selected] = text;\n allLines[selected] = lines;\n\n this.setState({lines: allLines});\n }\n\n componentDidMount() {\n this.props.socket.registerLogHandler(this.logHandlerBound);\n }\n\n componentWillUnmount() {\n this.props.socket.unregisterLogHandler(this.logHandlerBound);\n }\n\n componentDidUpdate() {\n this.state.goBottom && this.scrollToBottom();\n }\n\n static getDerivedStateFromProps(props, state) {\n let changed = false;\n let newState = {};\n\n if (props.selected !== state.selected) {\n let selected = props.selected;\n let allLines = state.lines;\n allLines[selected] = allLines[selected] || [];\n gText[selected] = gText[selected] || [];\n newState.selected = selected;\n changed = true;\n }\n\n if (JSON.stringify(props.editing) !== JSON.stringify(state.editing)) {\n const editing = JSON.parse(JSON.stringify(props.editing));\n let allLines = state.lines;\n\n for (const id in gText) {\n if (gText.hasOwnProperty(id)) {\n if (editing.indexOf(id) === -1) {\n delete gText[id];\n delete allLines[id];\n }\n }\n }\n\n newState.editing = editing;\n }\n return changed ? newState : null;\n }\n\n onCopy() {\n copyToClipboard((gText[this.state.selected] || []).join('\\n'));\n }\n\n clearLog() {\n let allLines = this.state.lines;\n if (allLines[this.state.selected]) {\n allLines[this.state.selected] = [];\n }\n if (gText[this.state.selected]) {\n gText[this.state.selected] = [];\n }\n this.setState({lines: allLines});\n }\n\n render() {\n const lines = this.state.selected && this.state.lines[this.state.selected];\n return (\n \n
\n
this.setState({goBottom: !this.state.goBottom})} color={this.state.goBottom ? 'secondary' : ''}>\n {lines && lines.length ? (
this.clearLog()}>) : null}\n {lines && lines.length ? (
this.onCopy()}>) : null}\n {this.props.onLayoutChange ? (
this.props.onLayoutChange()} title={I18n.t('Change layout')}>) : null}\n
\n {this.state.selected && lines && lines.length ?\n (
) :\n (
{I18n.t('Log outputs')}
)\n }\n
\n );\n }\n}\n\nLog.propTypes = {\n selected: PropTypes.string,\n socket: PropTypes.object,\n onLayoutChange: PropTypes.func,\n verticalLayout: PropTypes.bool\n};\n\nexport default withStyles(styles)(Log);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Fab from '@material-ui/core/Fab';\n\nimport {MdGTranslate as IconNoCheck} from 'react-icons/md';\nimport I18n from '@iobroker/adapter-react/i18n';\n\nfunction isIdOfGlobalScript(id) {\n return /^script\\.js\\.global\\./.test(id);\n}\nlet index = 0;\nclass ScriptEditor extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n name: 'current',\n isDark: props.isDark || false,\n language: props.language || 'javascript',\n readOnly: props.readOnly || false,\n alive: true,\n check: false,\n searchText: this.props.searchText || '',\n typingsLoaded: false,\n };\n this.runningInstancesStr = JSON.stringify(this.props.runningInstances);\n this.monacoDiv = null; //ref\n this.editor = null;\n this.monaco = window.monaco;\n this.insert = '';\n this.originalCode = props.code || '';\n this.typings = {}; // TypeScript declarations\n this.lastSearch = '';\n }\n\n waitForMonaco(cb) {\n if (!this.monaco || !this.props.runningInstances) {\n this.monaco = window.monaco;\n this.monacoCounter = this.monacoCounter || 0;\n this.monacoCounter++;\n if (!this.monaco && this.monacoCounter < 20) {\n console.log('wait for monaco loaded');\n return setTimeout(() => this.waitForMonaco(cb), 200);\n } else if (this.monacoCounter >= 20) {\n console.error('Cannot load monaco!');\n }\n } else {\n cb && cb();\n }\n }\n\n loadTypings(runningInstances) {\n if (!this.editor) {\n return;\n }\n runningInstances = runningInstances || this.props.runningInstances;\n let scriptAdapterInstance = runningInstances && Object.keys(runningInstances).find(id => runningInstances[id]);\n if (scriptAdapterInstance) {\n this.props.socket.sendTo(scriptAdapterInstance.replace('system.adapter.', ''), 'loadTypings', null)\n .then(result => {\n this.setState({alive: true, check: true, typingsLoaded: true});\n this.setTypeCheck(true);\n if (result.typings) {\n this.typings = result.typings;\n this.setEditorTypings(this.state.name);\n } else {\n console.error(`failed to load typings: ${result.error}`);\n }\n });\n }\n }\n\n componentDidMount() {\n if (!this.monaco || !this.props.runningInstances) {\n this.monaco = window.monaco;\n if (!this.monaco) {\n console.log('wait for monaco loaded');\n return this.waitForMonaco(() => this.componentDidMount());\n }\n }\n if (!this.editor) {\n this.props.onRegisterSelect && this.props.onRegisterSelect(() => this.editor.getModel().getValueInRange(this.editor.getSelection()));\n // For some reason we have to get the original compiler options\n // and assign new properties one by one\n const compilerOptions = this.monaco.languages.typescript.typescriptDefaults['getCompilerOptions']();\n compilerOptions.target = this.monaco.languages.typescript.ScriptTarget.ES2015;\n compilerOptions.allowJs = true;\n compilerOptions.checkJs = this.props.checkJs !== false;\n compilerOptions.noLib = true;\n compilerOptions.lib = [];\n compilerOptions.moduleResolution = this.monaco.languages.typescript.ModuleResolutionKind.NodeJs;\n this.monaco.languages.typescript.typescriptDefaults.setCompilerOptions(compilerOptions);\n\n this.setTypeCheck(false);\n\n // Create the editor instances\n this.editor = this.monaco.editor.create(this.monacoDiv, {\n lineNumbers: 'on',\n scrollBeyondLastLine: false,\n automaticLayout: true\n });\n\n this.editor.onDidChangeModelContent(e =>\n this.onChange(this.editor.getValue()));\n\n // Load typings for the JS editor\n /** @type {string} */\n this.loadTypings();\n\n this.editor.addCommand(this.monaco.KeyMod.CtrlCmd | this.monaco.KeyCode.KEY_S, () =>\n this.onForceSave());\n\n setTimeout(() => this.highlightText(this.state.searchText));\n }\n const options = {\n selectOnLineNumbers: true,\n scrollBeyondLastLine: false,\n automaticLayout: true,\n readOnly: this.state.readOnly,\n language: this.state.language,\n isDark: this.state.isDark\n };\n\n this.setEditorOptions(options);\n this.editor.focus();\n this.editor.setValue(this.originalCode);\n }\n\n /**\n * Sets some options of the code editor\n * @param {object} options The editor options to change\n * @param {Partial<{readOnly: boolean, lineWrap: boolean, language: EditorLanguage, typeCheck: boolean}>} options\n */\n setEditorOptions(options) {\n if (options) {\n if (options.language) {\n this.setEditorLanguage(options.language);\n }\n if (options.readOnly !== undefined) {\n this.editor.updateOptions({readOnly: options.readOnly});\n }\n if (options.lineWrap !== undefined) {\n this.editor.updateOptions({wordWrap: options.lineWrap ? 'on' : 'off'});\n }\n if (options.typeCheck !== undefined) {\n this.setTypeCheck(options.typeCheck);\n }\n if (options.isDark !== undefined) {\n this.monaco.editor.setTheme(options.isDark ? 'vs-dark' : 'vs');\n }\n }\n }\n\n componentWillUnmount() {\n if (this.editor) {\n this.props.onRegisterSelect && this.props.onRegisterSelect(null);\n this.editor.dispose();\n this.editor = null;\n }\n }\n\n /** @typedef {\"javascript\" | \"typescript\" | \"coffee\"} EditorLanguage */\n\n /**\n * Sets the language of the code editor\n * @param {EditorLanguage} language\n */\n setEditorLanguage(language) {\n // we need to recreate the model when changing languages,\n // so remember its settings\n const model = this.editor.getModel();\n const code = model.getValue();\n const uri = model.uri.path;\n\n const filenameWithoutExtension =\n typeof uri === 'string' && uri.indexOf('.') > -1\n ? uri.substr(0, uri.lastIndexOf('.'))\n : 'index';\n\n const extension =\n language === 'javascript' ? 'js'\n : (language === 'typescript' ? 'ts'\n : (language === 'coffee' ? 'coffee'\n : language));\n\n // get rid of the original model\n model.dispose();\n\n // Both JS and TS need the model to work in TypeScript as the script type\n // is inferred from the file extension\n const newLanguage = (language === 'javascript' || language === 'typescript') ? 'typescript' : language;\n\n const newModel = this.monaco.editor.createModel(\n code,\n newLanguage,\n this.monaco.Uri.from({path: `${filenameWithoutExtension}${index++}.${extension}`})\n );\n\n this.editor.setModel(newModel);\n }\n\n /**\n * Enables or disables the type checking in the editor\n * @param {boolean} enabled - Whether type checking is enabled or not\n */\n setTypeCheck(enabled) {\n const options = {\n noSemanticValidation: !this.state.alive || !enabled, // toggle the type checking\n noSyntaxValidation: !this.state.alive // always check the syntax\n };\n this.monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions(options);\n }\n\n /**\n * @param {string} [currentScriptName] The name of the current script\n */\n setEditorTypings(currentScriptName = '') {\n const isGlobalScript = isIdOfGlobalScript(currentScriptName);\n // The filename of the declarations this script can see if it is a global script\n const partialDeclarationsPath = `${currentScriptName}.d.ts`;\n const wantedTypings = [];\n for (const path of Object.keys(this.typings)) {\n // global scripts don't get to see all other global scripts\n // but only a part of them\n if (isGlobalScript) {\n if (path === 'global.d.ts') continue;\n if (path.startsWith('script.js.global') && path !== partialDeclarationsPath) continue;\n }\n wantedTypings.push({\n filePath: path,\n content: this.typings[path],\n });\n }\n // BF: check https://microsoft.github.io/monaco-editor/playground.html#extending-language-services-semantic-tokens-provider-example\n // to support 0.21.0\n\n if (this.monaco.languages.typescript.typescriptDefaults.setExtraLibs) {\n this.monaco.languages.typescript.typescriptDefaults.setExtraLibs(wantedTypings);\n } else if (this.monaco.languages.typescript.typescriptDefaults.addExtraLib) {\n const existingLibs = this.monaco.languages.typescript.typescriptDefaults.getExtraLibs();\n wantedTypings.forEach(lib => {\n if (!existingLibs[lib.filePath]) {\n this.monaco.languages.typescript.typescriptDefaults.addExtraLib(lib, lib.filePath);\n }\n });\n }\n }\n\n /**\n * Inserts some text into the given editor\n * @param {string} text The text to add\n */\n insertTextIntoEditor(text) {\n const selection = this.editor.getSelection();\n const range = new this.monaco.Range(\n selection.startLineNumber, selection.startColumn,\n selection.endLineNumber, selection.endColumn\n );\n this.editor.executeEdits('', [{range: range, text: text, forceMoveMarkers: true}]);\n this.editor.focus();\n }\n\n highlightText(text) {\n let range = text && this.editor.getModel().findMatches(text);\n if (range && range.length) {\n range.forEach(r => this.editor.setSelection(r.range));\n this.editor.revealLine(range[0].range.startLineNumber);\n } else if (this.editor) {\n const row = this.editor.getPosition().lineNumber;\n const col = this.editor.getPosition().column;\n this.editor.setSelection(new this.monaco.Range(row, col, row, col));\n }\n }\n\n initNewScript(name, code) {\n this.setState({name});\n this.originalCode = code || '';\n this.editor && this.editor.setValue(code);\n this.highlightText(this.lastSearch);\n //this.setEditorLanguage();\n // Update the typings because global scripts need different typings than normal scripts\n // and each global script has different typings\n this.setEditorTypings(name);\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n const options = {};\n if (this.state.name !== nextProps.name) {\n // A different script was selected\n this.initNewScript(nextProps.name, nextProps.code);\n }\n\n // if some running instance will be foung and\n if (JSON.stringify(nextProps.runningInstances) !== this.runningInstancesStr) {\n this.runningInstancesStr = JSON.stringify(nextProps.runningInstances);\n if (!this.state.typingsLoaded) {\n this.loadTypings(nextProps.runningInstances);\n }\n }\n\n // if the code not yet changed, update the new code\n if (!nextProps.changed && nextProps.code !== this.originalCode) {\n this.originalCode = nextProps.code;\n this.editor.setValue(this.originalCode);\n }\n\n if (nextProps.searchText !== this.lastSearch) {\n this.lastSearch = nextProps.searchText;\n this.highlightText(this.lastSearch);\n }\n\n if (this.state.language !== (nextProps.language || 'javascript')) {\n this.setState({language: nextProps.language || 'javascript'});\n options.language = nextProps.language || 'javascript';\n } else if (this.state.readOnly !== (nextProps.readOnly || false)) {\n this.setState({readOnly: nextProps.readOnly || false});\n options.readOnly = nextProps.readOnly;\n } else if (this.state.isDark !== (nextProps.isDark || false)) {\n this.setState({isDark: nextProps.isDark || false});\n options.isDark = nextProps.isDark;\n }\n\n this.setEditorOptions(options);\n\n if (this.insert !== nextProps.insert) {\n this.insert = nextProps.insert;\n if (this.insert) {\n console.log('Insert text' + this.insert);\n setTimeout(insert => {\n this.insertTextIntoEditor(insert);\n setTimeout(() => this.props.onInserted && this.props.onInserted(), 100);\n }, 100, this.insert);\n }\n }\n }\n\n onChange(newValue, e) {\n if (!this.props.readOnly) {\n this.props.onChange && this.props.onChange(this.editor.getValue());\n }\n }\n\n render() {\n if (!this.monaco || !this.props.runningInstances) {\n setTimeout(() => {\n this.monaco = window.monaco;\n this.forceUpdate()\n }, 200);\n return null;\n }\n\n return this.monacoDiv = el} style={{width: '100%', height: '100%', overflow: 'hidden', position: 'relative'}}>\n {!this.state.check && }\n
;\n }\n}\n\nScriptEditor.propTypes = {\n adapterName: PropTypes.string.isRequired,\n socket: PropTypes.object,\n runningInstances: PropTypes.object,\n name: PropTypes.string,\n onChange: PropTypes.func,\n onForceSave: PropTypes.func,\n onInserted: PropTypes.func,\n isDark: PropTypes.bool,\n readOnly: PropTypes.bool,\n code: PropTypes.string,\n language: PropTypes.string,\n onRegisterSelect: PropTypes.func,\n searchText: PropTypes.string,\n checkJs: PropTypes.bool,\n changed: PropTypes.bool,\n};\n\nexport default ScriptEditor;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport I18n from '@iobroker/adapter-react/i18n';\nimport DialogMessage from '@iobroker/adapter-react/Dialogs/Message';\nimport DialogError from '../Dialogs/Error';\nimport DialogExport from '../Dialogs/Export';\nimport DialogImport from '../Dialogs/Import';\n\nlet languageBlocklyLoaded = false;\nlet languageOwnLoaded = false;\nlet toolboxText = null;\nlet toolboxXml;\nlet scriptsLoaded = [];\n\n// BF (2020-10-31) I have no Idea, why it does not work as static in BlocklyEditor, but outside of BlocklyEditor it works\nfunction searchXml(root, text, _id, _result) {\n _result = _result || [];\n if (root.tagName === 'BLOCK' || root.tagName === 'block') {\n _id = root.id;\n }\n if (root.tagName === 'FIELD' || root.tagName === 'field') {\n for (let a = 0; a < root.attributes.length; a++) {\n const val = (root.attributes[a].value || '').toLowerCase();\n if (root.attributes[a].nodeName === 'name' && (val === 'oid' || val === 'text')) {\n if ((root.innerHTML || root.innerText || '').toLowerCase().includes(text)) {\n _result.push(_id);\n }\n }\n }\n }\n root.childNodes.forEach(node =>\n searchXml(node, text, _id, _result));\n\n return _result;\n}\n\n\nclass BlocklyEditor extends React.Component {\n constructor(props) {\n super(props);\n\n this.blockly = null; //ref\n this.blocklyWorkspace = null;\n this.toolbox = null;\n this.Blockly = window.Blockly;\n\n this.state = {\n languageOwnLoaded,\n languageBlocklyLoaded,\n changed: false,\n message: '',\n error: '',\n themeType: this.props.themeType,\n exportText: '',\n importText: false,\n searchText: this.props.searchText || '',\n };\n this.originalCode = props.code || '';\n\n this.someSelected = null;\n this.changeTimer = null;\n\n this.onResizeBind = this.onResize.bind(this);\n\n this.lastCommand = '';\n this.lastSearch = this.props.searchText || '';\n this.blinkBlock = null;\n this.loadLanguages();\n }\n\n static loadJS(url, callback, location) {\n const scriptTag = document.createElement('script');\n try {\n scriptTag.src = url;\n\n scriptTag.onload = callback;\n scriptTag.onreadystatechange = callback;\n scriptTag.onerror = callback;\n\n (location || window.document.body).appendChild(scriptTag);\n } catch (e) {\n console.error('Cannot load ' + url + ': ' + e);\n callback && callback();\n }\n };\n\n static loadScripts(scripts, callback) {\n if (!scripts || !scripts.length) {\n return callback && callback();\n }\n const adapter = scripts.pop();\n if (scriptsLoaded.indexOf(adapter) === -1) {\n scriptsLoaded.push(adapter);\n BlocklyEditor.loadJS('../../adapter/' + adapter + '/blockly.js', (/*data, textStatus, jqxhr*/) =>\n setTimeout(() => BlocklyEditor.loadScripts(scripts, callback), 0));\n } else {\n setTimeout(() => BlocklyEditor.loadScripts(scripts, callback), 0);\n }\n }\n\n static loadCustomBlockly(adapters, callback) {\n // get all adapters, that can have blockly\n const toLoad = [];\n for (const id in adapters) {\n if (!adapters.hasOwnProperty(id) ||\n !adapters[id] ||\n !id.match(/^system\\.adapter\\./) ||\n adapters[id].type !== 'adapter'\n ) {\n continue;\n }\n\n if (adapters[id].common && adapters[id].common.blockly) {\n console.log('Detected custom blockly: ' + adapters[id].common.name);\n toLoad.push(adapters[id].common.name);\n }\n }\n\n BlocklyEditor.loadScripts(toLoad, callback);\n }\n\n static loadXMLDoc(text) {\n let parseXml;\n if (window.DOMParser) {\n parseXml = function(xmlStr) {\n return ( new window.DOMParser() ).parseFromString(xmlStr, \"text/xml\");\n };\n } else if (typeof window.ActiveXObject != \"undefined\" && new window.ActiveXObject(\"Microsoft.XMLDOM\")) {\n parseXml = function(xmlStr) {\n var xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n xmlDoc.async = \"false\";\n xmlDoc.loadXML(xmlStr);\n return xmlDoc;\n };\n } else {\n parseXml = function() { return null; }\n }\n return parseXml(text);\n }\n\n searchBlocks(text) {\n if (this.blocklyWorkspace) {\n const dom = this.Blockly.Xml.workspaceToDom(this.blocklyWorkspace);\n const ids = searchXml(dom, text.toLowerCase());\n const allBlocks = this.blocklyWorkspace.getAllBlocks();\n const result = [];\n allBlocks.filter(b => ids.includes(b.id)).forEach(b => result.push(b));\n return result;\n }\n }\n\n searchId() {\n const blocks = this.lastSearch && this.searchBlocks(this.lastSearch);\n if (blocks && blocks.length) {\n this.someSelected = blocks;\n this.someSelected.forEach(b => b.addSelect());\n this.someSelectedTime = Date.now();\n } else if (this.someSelected) {\n // remove selection\n this.someSelected.forEach(b => b.removeSelect());\n this.someSelected = null;\n }\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n if (nextProps.command && this.lastCommand !== nextProps.command) {\n this.lastCommand = nextProps.command;\n setTimeout(() => this.lastCommand = '', 300);\n if (this.lastCommand === 'check') {\n this.blocklyCheckBlocks((err, badBlock) => {\n if (!err) {\n this.setState({message: I18n.t('Ok')});\n } else {\n badBlock && this.blocklyBlinkBlock(badBlock);\n this.setState({error: {text: I18n.t(err), title: I18n.t('Error was found')}});\n this.blinkBlock = badBlock;\n }\n });\n } else if (this.lastCommand === 'export') {\n this.exportBlocks();\n } else if (this.lastCommand === 'import') {\n this.importBlocks();\n }\n }\n\n if (nextProps.searchText !== this.lastSearch) {\n this.lastSearch = nextProps.searchText;\n this.searchId();\n }\n\n if (this.state.themeType !== nextProps.themeType) {\n this.setState({themeType: nextProps.themeType}, () => this.updateBackground());\n }\n\n if (this.originalCode !== nextProps.code) {\n this.originalCode = nextProps.code || '';\n this.loadCode();\n this.searchId();\n }\n }\n\n loadLanguages() {\n // load blockly language\n if (!languageBlocklyLoaded) {\n const fileLang = window.document.createElement('script');\n fileLang.setAttribute('type', 'text/javascript');\n fileLang.setAttribute('src', 'google-blockly/msg/js/' + I18n.getLanguage() + '.js');\n\n // most browsers\n fileLang.onload = () => {\n languageBlocklyLoaded = true;\n this.setState({languageBlocklyLoaded});\n };\n // IE 6 & 7\n fileLang.onreadystatechange = () => {\n if (this.readyState === 'complete') {\n languageBlocklyLoaded = true;\n this.setState({languageBlocklyLoaded});\n }\n };\n window.document.getElementsByTagName('head')[0].appendChild(fileLang);\n }\n if (!languageOwnLoaded) {\n const fileCustom = window.document.createElement('script');\n fileCustom.setAttribute('type', 'text/javascript');\n fileCustom.setAttribute('src', 'google-blockly/own/msg/' + I18n.getLanguage() + '.js');\n // most browsers\n fileCustom.onload = () => {\n languageOwnLoaded = true;\n this.setState({languageOwnLoaded});\n };\n // IE 6 & 7\n fileCustom.onreadystatechange = () => {\n if (this.readyState === 'complete') {\n languageOwnLoaded = true;\n this.setState({languageOwnLoaded});\n }\n };\n window.document.getElementsByTagName('head')[0].appendChild(fileCustom);\n }\n }\n\n onResize() {\n this.Blockly.svgResize(this.blocklyWorkspace);\n }\n\n jsCode2Blockly(text) {\n text = text || '';\n const lines = text.split(/[\\r\\n]+|\\r|\\n/g);\n let xml = '';\n for (let l = lines.length - 1; l >= 0; l--) {\n if (lines[l].substring(0, 2) === '//') {\n xml = lines[l].substring(2);\n break;\n }\n }\n if (xml.substring(0, 4) === ' block.select(), i);\n setTimeout(() => block.unselect(), i + 150);\n }\n }\n\n blocklyRemoveOrphanedShadows() {\n if (this.blocklyWorkspace) {\n let blocks = this.blocklyWorkspace.getAllBlocks();\n let block;\n for (let i = 0; (block = blocks[i]); i++) {\n if (block.isShadow()) {\n const connections = block.getConnections_(true);\n let conn;\n for (let j = 0; (conn = connections[j]); j++) {\n if (!conn.targetConnection) {\n // remove it\n block.dispose();\n break;\n }\n }\n }\n }\n }\n }\n\n blocklyCheckBlocks(cb) {\n let warningText;\n if (!this.blocklyWorkspace || this.blocklyWorkspace.getAllBlocks().length === 0) {\n cb && cb('no blocks found');\n return;\n }\n let badBlock = this.blocklyGetUnconnectedBlock();\n if (badBlock) {\n warningText = 'not properly connected';\n } else {\n badBlock = this.blocklyGetBlockWithWarning();\n if (badBlock) {\n warningText = 'warning on this block';\n }\n }\n\n if (badBlock) {\n if (cb) {\n cb(warningText, badBlock);\n } else {\n this.blocklyBlinkBlock(badBlock);\n }\n return false;\n }\n\n cb();\n\n return true;\n }\n\n // get unconnected block\n blocklyGetUnconnectedBlock () {\n const blocks = this.blocklyWorkspace.getAllBlocks();\n let block;\n for (let i = 0; (block = blocks[i]); i++) {\n const connections = block.getConnections_(true);\n let conn;\n for (let j = 0; (conn = connections[j]); j++) {\n if (!conn.sourceBlock_ || ((conn.type === this.Blockly.INPUT_VALUE || conn.type === this.Blockly.OUTPUT_VALUE) && !conn.targetConnection && !conn._optional)) {\n return block;\n }\n }\n }\n return null;\n }\n\n // get block with warning\n blocklyGetBlockWithWarning() {\n const blocks = this.blocklyWorkspace.getAllBlocks();\n let block;\n for (let i = 0; (block = blocks[i]); i++) {\n if (block.warning) {\n return block;\n }\n }\n return null;\n }\n\n blocklyCode2JSCode(oneWay) {\n let code = this.Blockly.JavaScript.workspaceToCode(this.blocklyWorkspace);\n if (!oneWay) {\n code += '\\n';\n const dom = this.Blockly.Xml.workspaceToDom(this.blocklyWorkspace);\n const text = this.Blockly.Xml.domToText(dom);\n code += '//' + btoa(encodeURIComponent(text));\n }\n\n return code;\n }\n\n exportBlocks() {\n let exportText;\n if (this.Blockly.selected) {\n const xmlBlock = this.Blockly.Xml.blockToDom(this.Blockly.selected);\n if (this.Blockly.dragMode_ !== this.Blockly.DRAG_FREE) {\n this.Blockly.Xml.deleteNext(xmlBlock);\n }\n // Encode start position in XML.\n const xy = this.Blockly.selected.getRelativeToSurfaceXY();\n xmlBlock.setAttribute('x', this.Blockly.selected.RTL ? -xy.x : xy.x);\n xmlBlock.setAttribute('y', xy.y);\n\n exportText = this.Blockly.Xml.domToPrettyText(xmlBlock);\n } else {\n const dom = this.Blockly.Xml.workspaceToDom(this.blocklyWorkspace);\n exportText = this.Blockly.Xml.domToPrettyText(dom);\n }\n this.setState({exportText});\n }\n\n importBlocks() {\n this.setState({importText: true});\n }\n\n onImportBlocks(xml) {\n xml = (xml || '').trim();\n if (xml) {\n try {\n if (!xml.startsWith('';\n }\n let variables = xml.replace(/[\\n\\r]/g, '').match(/(.*)<\\/variables>/);\n if (variables) {\n let vars = this.Blockly.utils.xml.textToDomDocument('' + variables[1] + '');\n if (vars) {\n let nodes = vars.childNodes && vars.childNodes[0] && vars.childNodes[0].childNodes;\n if (nodes) {\n for (let i = 0; i < nodes.length; i++) {\n nodes[i].id && this.blocklyWorkspace.createVariable(nodes[i].id);\n }\n }\n }\n }\n xml = xml.replace(/[\\n\\r]/g, '').replace(/.*<\\/variables>/g, '');\n window.scripts.loading = true;\n let xmlBlocks = this.Blockly.Xml.textToDom(xml);\n if (xmlBlocks.nodeName === 'xml') {\n for (let b = 0; b < xmlBlocks.children.length; b++) {\n this.blocklyWorkspace.paste(xmlBlocks.children[b]);\n }\n } else {\n this.blocklyWorkspace.paste(xmlBlocks);\n }\n\n window.scripts.loading = false;\n\n\n this.onBlocklyChanged();\n } catch (e) {\n this.setState({error: {text: e, title: I18n.t('Import error')}});\n }\n }\n }\n\n loadCode() {\n if (!this.blocklyWorkspace) {\n return;\n }\n\n this.ignoreChanges = true;\n this.blocklyWorkspace.clear();\n\n try {\n const xml = this.jsCode2Blockly(this.originalCode) || '';\n window.scripts.loading = true;\n const dom = this.Blockly.Xml.textToDom(xml);\n this.Blockly.Xml.domToWorkspace(dom, this.blocklyWorkspace);\n window.scripts.loading = false;\n } catch (e) {\n console.error(e);\n setTimeout(() => this.setState({error: I18n.t('Cannot extract Blockly code!')}));\n }\n setTimeout(() => this.ignoreChanges = false, 100);\n }\n\n onBlocklyChanged() {\n this.blocklyRemoveOrphanedShadows();\n this.setState({changed: true});\n this.onChange();\n }\n\n componentDidUpdate() {\n if (!this.blockly) {\n return;\n }\n if (this.didUpdate) {\n clearTimeout(this.didUpdate);\n this.didUpdate = null;\n }\n\n if (this.blocklyWorkspace) {\n return;\n }\n\n window.addEventListener('resize', this.onResizeBind, false);\n toolboxText = toolboxText || this.getToolbox();\n toolboxXml = toolboxXml || this.Blockly.Xml.textToDom(toolboxText);\n\n this.blocklyWorkspace = this.Blockly.inject(\n this.blockly,\n {\n media: 'google-blockly/media/',\n toolbox: toolboxXml,\n zoom: {\n controls: true,\n wheel: false,\n startScale: 1.0,\n maxScale: 3,\n minScale: 0.3,\n scaleSpeed: 1.2\n },\n move: {\n scrollbars: true,\n drag: true,\n wheel: true\n },\n trashcan: true,\n grid: {\n spacing: 25,\n length: 3,\n colour: '#ccc',\n snap: true\n }\n }\n );\n // for blockly itself\n window.scripts = {\n blocklyWorkspace: this.blocklyWorkspace\n };\n\n // Listen to events on master workspace.\n this.blocklyWorkspace.addChangeListener(masterEvent => {\n if (this.someSelected && Date.now() - this.someSelectedTime > 500) {\n const allBlocks = this.blocklyWorkspace.getAllBlocks();\n this.someSelected = null;\n allBlocks.forEach(b => b.removeSelect());\n }\n\n if (masterEvent.type === this.Blockly.Events.UI || masterEvent.type === this.Blockly.Events.CREATE) {\n return; // Don't mirror UI events.\n }\n if (this.ignoreChanges) return;\n this.changeTimer && clearTimeout(this.changeTimer);\n this.changeTimer = setTimeout(() => {\n this.changeTimer = null;\n this.onBlocklyChanged();\n }, 200);\n\n });\n this.loadCode();\n this.onResize();\n // Move toolbar to the valid position\n const toolbar = document.getElementsByClassName('blocklyToolboxDiv')[0];\n this.blockly.appendChild(toolbar);\n\n this.updateBackground();\n setTimeout(() => this.searchId(), 200); // select found blocks\n }\n\n updateBackground() {\n const background = document.getElementsByClassName('blocklyMainBackground')[0];\n if (this.state.themeType === 'dark') {\n if (!background._originalStyle) {\n background._originalStyle = {\n stroke: background.style.stroke,\n fill: background.style.fill\n };\n }\n // add class\n background.style.stroke = '#3a3a3a';\n background.style.fill = '#515151';\n } else if (background._originalStyle) {\n background.style.stroke = background._originalStyle.stroke;\n background.style.fill = background._originalStyle.fill;\n }\n }\n\n componentWillUnmount() {\n if (!this.blocklyWorkspace) return;\n this.blocklyWorkspace.dispose();\n this.blocklyWorkspace = null;\n this.changeTimer && clearTimeout(this.changeTimer);\n this.changeTimer = null;\n window.removeEventListener('resize', this.onResizeBind);\n }\n\n onChange() {\n this.originalCode = this.blocklyCode2JSCode();\n this.props.onChange && this.props.onChange(this.originalCode);\n }\n\n getToolbox() {\n // Interpolate translated messages into toolbox.\n let toolboxText = window.document.getElementById('toolbox').outerHTML;\n toolboxText = toolboxText.replace(/{(\\w+)}/g, (m, p1) => window.MSG[p1]);\n\n if (this.Blockly.CustomBlocks) {\n let blocks = '';\n const lang = I18n.getLanguage();\n for (let cb = 0; cb < this.Blockly.CustomBlocks.length; cb++) {\n const name = this.Blockly.CustomBlocks[cb];\n // add blocks\n blocks += '';\n for (const _b in this.Blockly[name].blocks) {\n if (this.Blockly[name].blocks.hasOwnProperty(_b)) {\n blocks += this.Blockly[name].blocks[_b];\n }\n }\n blocks += '';\n }\n toolboxText = toolboxText.replace('%%CUSTOM_BLOCKS%%', blocks);\n }\n\n return toolboxText;\n }\n\n renderMessageDialog() {\n return this.state.message ?\n this.setState({message: ''})}\n /> :\n null;\n }\n renderErrorDialog() {\n return this.state.error ?\n {\n if (this.blinkBlock) {\n this.blocklyBlinkBlock(this.blinkBlock);\n this.blinkBlock = null;\n }\n this.setState({error: ''});\n }}/> :\n null;\n }\n\n renderExportDialog() {\n return this.state.exportText ? this.setState({exportText: ''})} text={this.state.exportText}/> : null;\n }\n\n renderImportDialog() {\n return this.state.importText ? {\n this.setState({importText: false});\n this.onImportBlocks(text);\n }}/> : null;\n }\n\n render() {\n if (this.state.languageBlocklyLoaded && this.state.languageOwnLoaded) {\n this.didUpdate = setTimeout(() => {\n this.didUpdate = null;\n this.componentDidUpdate();\n }, 100);\n\n return [\n this.blockly = el} style={{\n //marginLeft: 180,\n width: '100%',//'calc(100% - 180px)',\n height: '100%',\n //overflow: 'hidden',\n position: 'relative'}}/>,\n\n this.renderMessageDialog(),\n this.renderErrorDialog(),\n this.renderExportDialog(),\n this.renderImportDialog(),\n ];\n } else {\n return null;\n }\n }\n}\n\nBlocklyEditor.propTypes = {\n command: PropTypes.string,\n onChange: PropTypes.func,\n searchText: PropTypes.string,\n themeType: PropTypes.string\n};\n\nexport default BlocklyEditor;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\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 Popper from '@material-ui/core/Popper';\nimport Fade from '@material-ui/core/Fade';\nimport Paper from '@material-ui/core/Paper';\n\nimport IconCopy from '@material-ui/icons/FileCopy';\nimport IconCancel from '@material-ui/icons/Cancel';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n textArea: {\n width: '100%',\n height: '100%',\n },\n textAreaLight: {\n background: 'lightgray'\n },\n dialog: {\n height: '95%'\n },\n typography: {\n padding: theme.spacing(2),\n },\n buttonIcon: {\n marginRight: theme.spacing(1),\n },\n});\nclass DialogExport extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n anchorEl: null,\n popper: ''\n };\n }\n handleCancel = () => {\n this.props.onClose();\n };\n\n onCopy(event) {\n const el = window.document.getElementById('copy_input');\n if (el) {\n el.select();\n window.document.execCommand('copy');\n const target = event.currentTarget;\n\n setTimeout(() => {\n window.document.execCommand('copy');\n this.setState({popper: I18n.t('Copied'), anchorEl: target});\n setTimeout(() => this.setState({popper: '', anchorEl: null}), 1000);\n }, 50);\n\n }\n /*el.value = this.props.text;\n window.document.body.appendChild(el);\n el.select();*/\n }\n\n render() {\n const classes = this.props.classes;\n\n return (\n
\n );\n }\n}\n\nDialogExport.propTypes = {\n classes: PropTypes.object.isRequired,\n onClose: PropTypes.func,\n text: PropTypes.string,\n themeType: PropTypes.string,\n};\n\nexport default withStyles(styles)(DialogExport);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\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';\n\nimport IconOk from '@material-ui/icons/Check';\nimport IconCancel from '@material-ui/icons/Cancel';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n textArea: {\n width: 'calc(100% - 10px)',\n height: '100%',\n resize: 'none'\n },\n dialog: {\n height: '95%'\n },\n fullHeight: {\n height: '100%',\n overflow: 'hidden'\n },\n buttonIcon: {\n marginRight: theme.spacing(1),\n },\n});\nclass DialogImport extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n text: '',\n };\n }\n\n componentDidMount() {\n setTimeout(() => {\n try {\n window.document.getElementById('import-text-area').focus();\n } catch (e) {\n\n }\n }, 100);\n }\n\n handleCancel () {\n this.props.onClose();\n }\n\n handleOk () {\n this.props.onClose(this.state.text);\n }\n\n onChange(e) {\n this.setState({text: e.target.value});\n }\n\n render() {\n const classes = this.props.classes;\n\n return (\n
\n );\n }\n}\n\nDialogImport.propTypes = {\n classes: PropTypes.object.isRequired,\n onClose: PropTypes.func,\n text: PropTypes.string,\n};\n\nexport default withStyles(styles)(DialogImport);\n","/**\n * Given a cronspec, return the human-readable string.\n * @param {string} cronspec\n * @param withSeconds\n * @param {Object=} locale\n */\nfunction cronToText(cronspec, withSeconds, locale) {\n\n\n // Constant array to convert valid names to values\n const NAMES = {\n JAN: 1, FEB: 2, MAR: 3, APR: 4, MAY: 5, JUN: 6, JUL: 7, AUG: 8,\n SEP: 9, OCT: 10, NOV: 11, DEC: 12,\n SUN: 1, MON: 2, TUE: 3, WED: 4, THU: 5, FRI: 6, SAT: 7\n };\n\n // Parsable replacements for common expressions\n const REPLACEMENTS = {\n '* * * * * *': '0/1 * * * * *',\n '@YEARLY': '0 0 1 1 *',\n '@ANNUALLY': '0 0 1 1 *',\n '@MONTHLY': '0 0 1 * *',\n '@WEEKLY': '0 0 * * 0',\n '@DAILY': '0 0 * * *',\n '@HOURLY': '0 * * * *'\n };\n\n // Contains the index, min, and max for each of the constraints\n const FIELDS = {\n s: [0, 0, 59], // seconds\n m: [1, 0, 59], // minutes\n h: [2, 0, 23], // hours\n D: [3, 1, 31], // day of month\n M: [4, 1, 12], // month\n Y: [6, 1970, 2099], // year\n d: [5, 1, 7, 1] // day of week\n };\n\n /**\n * Returns the value + offset if value is a number, otherwise it\n * attempts to look up the value in the NAMES table and returns\n * that result instead.\n *\n * @param {Number,String} value: The value that should be parsed\n * @param {Number=} offset: Any offset that must be added to the value\n * @param {Number=} max\n * @returns {Number|null}\n */\n function getValue(value) {\n const offset = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1];\n const max = arguments.length <= 2 || arguments[2] === undefined ? 9999 : arguments[2];\n\n return isNaN(value) ? NAMES[value] || null : Math.min(+value + offset, max);\n }\n\n /**\n * Returns a deep clone of a schedule skipping any day of week\n * constraints.\n *\n * @param {Object} sched: The schedule that will be cloned\n * @returns {Object}\n */\n function cloneSchedule(sched) {\n const clone = {};\n let field;\n\n for (field in sched) {\n if (field !== 'dc' && field !== 'd') {\n clone[field] = sched[field].slice(0);\n }\n }\n\n return clone;\n }\n\n /**\n * Adds values to the specified constraint in the current schedule.\n *\n * @param {Object} sched: The schedule to add the constraint to\n * @param {String} name: Name of constraint to add\n * @param {Number} min: Minimum value for this constraint\n * @param {Number} max: Maximum value for this constraint\n */\n function add(sched, name, min, max) {\n const inc = arguments.length <= 4 || arguments[4] === undefined ? 0 : arguments[4];\n\n let i = min;\n\n if (!sched[name]) {\n sched[name] = [];\n }\n\n while (i <= max) {\n if (sched[name].indexOf(i) < 0) {\n sched[name].push(i);\n }\n i += inc || 1;\n }\n\n sched[name].sort(function (a, b) {\n return a - b;\n });\n }\n\n /**\n * Adds a hash item (of the form x#y or xL) to the schedule.\n *\n * @param {Object} schedules: The current schedule array to add to\n * @param {Object} curSched: The current schedule to add to\n * @param {Number} value: The value to add (x of x#y or xL)\n * @param {Number} hash: The hash value to add (y of x#y)\n */\n function addHash(schedules, curSched, value, hash) {\n // if there are any existing day of week constraints that\n // aren't equal to the one we're adding, create a new\n // composite schedule\n if ((curSched.d && !curSched.dc) || (curSched.dc && curSched.dc.indexOf(hash) < 0)) {\n schedules.push(cloneSchedule(curSched));\n curSched = schedules[schedules.length - 1];\n }\n\n add(curSched, 'd', value, value);\n add(curSched, 'dc', hash, hash);\n }\n\n /**\n *\n * @param {Object} s: The existing set of schedules\n * @param {Object} curSched: The current schedule to add to\n * @param {Number} value\n */\n function addWeekday(s, curSched, value) {\n const except1 = {},\n except2 = {};\n if (value === 1) {\n // cron doesn't pass month boundaries, so if 1st is a\n // weekend then we need to use 2nd or 3rd instead\n add(curSched, 'D', 1, 3);\n add(curSched, 'd', NAMES.MON, NAMES.FRI);\n add(except1, 'D', 2, 2);\n add(except1, 'd', NAMES.TUE, NAMES.FRI);\n add(except2, 'D', 3, 3);\n add(except2, 'd', NAMES.TUE, NAMES.FRI);\n } else {\n // normally you want the closest day, so if v is a\n // Saturday, use the previous Friday. If it's a\n // sunday, use the following Monday.\n add(curSched, 'D', value - 1, value + 1);\n add(curSched, 'd', NAMES.MON, NAMES.FRI);\n add(except1, 'D', value - 1, value - 1);\n add(except1, 'd', NAMES.MON, NAMES.THU);\n add(except2, 'D', value + 1, value + 1);\n add(except2, 'd', NAMES.TUE, NAMES.FRI);\n }\n s.exceptions.push(except1);\n s.exceptions.push(except2);\n }\n\n /**\n * Adds a range item (of the form x-y/z) to the schedule.\n *\n * @param {String} item: The cron expression item to add\n * @param {Object} curSched: The current schedule to add to\n * @param {String} name: The name to use for this constraint\n * @param {Number} min: The min value for the constraint\n * @param {Number} max: The max value for the constraint\n * @param {Number} offset: The offset to apply to the cron value\n */\n function addRange(item, curSched, name, min, max, offset) {\n // parse range/x\n const incSplit = item.split('/'),\n inc = +incSplit[1],\n range = incSplit[0];\n\n // parse x-y or * or 0\n if (range !== '*' && range !== '0') {\n const rangeSplit = range.split('-');\n min = getValue(rangeSplit[0], offset, max);\n\n // fix for issue #13, range may be single digit\n max = getValue(rangeSplit[1], offset, max) || max;\n }\n\n add(curSched, name, min, max, inc);\n }\n\n /**\n * Parses a particular item within a cron expression.\n *\n * @param {String} item: The cron expression item to parse\n * @param {Object} s: The existing set of schedules\n * @param {String} name: The name to use for this constraint\n * @param {Number} min: The min value for the constraint\n * @param {Number} max: The max value for the constraint\n * @param {Number} offset: The offset to apply to the cron value\n */\n function parse(item, s, name, min, max, offset) {\n let value,\n split,\n schedules = s.schedules,\n curSched = schedules[schedules.length - 1];\n\n // L just means min - 1 (this also makes it work for any field)\n if (item === 'L') {\n item = (min - 1).toString(10);\n }\n\n // parse x\n if ((value = getValue(item, offset, max)) !== null) {\n add(curSched, name, value, value);\n }\n // parse xW\n else if ((value = getValue(item.replace('W', ''), offset, max)) !== null) {\n addWeekday(s, curSched, value);\n }\n // parse xL\n else if ((value = getValue(item.replace('L', ''), offset, max)) !== null) {\n addHash(schedules, curSched, value, min - 1);\n }\n // parse x#y\n else if ((split = item.split('#')).length === 2) {\n value = getValue(split[0], offset, max);\n addHash(schedules, curSched, value, getValue(split[1]));\n }\n // parse x-y or x-y/z or */z or 0/z\n else {\n addRange(item, curSched, name, min, max, offset);\n }\n }\n\n /**\n * Returns true if the item is either of the form x#y or xL.\n *\n * @param {String} item: The expression item to check\n */\n function isHash(item) {\n return item.indexOf('#') > -1 || item.indexOf('L') > 0;\n }\n\n function itemSorter(a, b) {\n return isHash(a) && !isHash(b) ? 1 : a - b;\n }\n\n /**\n * Parses each of the fields in a cron expression. The expression must\n * include the seconds field, the year field is optional.\n *\n * @param {String} expr: The cron expression to parse\n */\n function parseExpr(expr) {\n const schedule = { schedules: [{}], exceptions: [] };\n const components = expr.replace(/(\\s)+/g, ' ').split(' ');\n let field;\n let f;\n let component;\n let items;\n\n for (field in FIELDS) {\n f = FIELDS[field];\n component = components[f[0]];\n if (component && component !== '*' && component !== '?') {\n // need to sort so that any #'s come last, otherwise\n // schedule clones to handle # won't contain all of the\n // other constraints\n items = component.split(',').sort(itemSorter);\n let i;\n const length = items.length;\n for (i = 0; i < length; i++) {\n parse(items[i], schedule, field, f[1], f[2], f[3]);\n }\n }\n }\n\n return schedule;\n }\n\n /**\n * Make cron expression parsable.\n *\n * @param {String} expr: The cron expression to prepare\n */\n function prepareExpr(expr) {\n const prepared = expr.toUpperCase();\n return REPLACEMENTS[prepared] || prepared;\n }\n\n function parseCron(expr, hasSeconds) {\n const e = prepareExpr(expr);\n return parseExpr(hasSeconds ? e : '0 ' + e);\n }\n\n const schedule = parseCron(cronspec, withSeconds);\n\n function absFloor(number) {\n if (number < 0) {\n return Math.ceil(number);\n } else {\n return Math.floor(number);\n }\n }\n\n function toInt(argumentForCoercion) {\n const coercedNumber = +argumentForCoercion;\n let value = 0;\n\n if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n value = absFloor(coercedNumber);\n }\n\n return value;\n }\n\n function ordinal(number) {\n const b = number % 10,\n output = (toInt(number % 100 / 10) === 1) ? locale.ORDINALS.th :\n (b === 1) ? locale.ORDINALS.st :\n (b === 2) ? locale.ORDINALS.nd :\n (b === 3) ? locale.ORDINALS.rd : locale.ORDINALS.th;\n return number + output;\n }\n\n /**\n * For an array of numbers, e.g. a list of hours in a schedule,\n * return a string listing out all of the values (complete with\n * \"and\" plus ordinal text on the last item).\n * @param {Number[]} numbers\n * @returns {string}\n */\n function numberList(numbers) {\n if (numbers.length < 2) {\n return ordinal(numbers);\n }\n\n const lastVal = numbers.pop();\n return numbers.join(', ') + ' ' + locale['and'] + ' ' + ordinal(lastVal);\n }\n\n /**\n * Parse a number into day of week, or a month name;\n * used in dateList below.\n * @param {Number|String} value\n * @param {String} type\n * @returns {String}\n */\n function numberToDateName(value, type) {\n if (type === 'dow') {\n return locale.DOW[value - 1];\n } else if (type === 'mon') {\n return locale.MONTH[value - 1];\n }\n }\n\n /**\n * From an array of numbers corresponding to dates (given in type: either\n * days of the week, or months), return a string listing all the values.\n * @param {Number[]} numbers\n * @param {String} type\n * @returns {String}\n */\n function dateList(numbers, type) {\n if (numbers.length < 2) {\n return numberToDateName('' + numbers[0], type);\n }\n\n const lastVal = '' + numbers.pop();\n let outputText = '';\n\n for (let i = 0, value; (value = numbers[i]); i++) {\n if (outputText.length > 0) {\n outputText += ', ';\n }\n outputText += numberToDateName(value, type);\n }\n return outputText + ' ' + locale['and'] + ' ' + numberToDateName(lastVal, type);\n }\n\n /**\n * Pad to equivalent of sprintf('%02d').\n * @param {Number} x\n * @returns {string}\n */\n function zeroPad(x) {\n return (x < 10) ? '0' + x : x;\n }\n\n //----------------\n\n /**\n * Given a schedule, generate a friendly sentence description.\n * @param {Object} schedule\n * @param {boolean} withSeconds\n * @returns {string}\n */\n function scheduleToSentence(schedule, withSeconds) {\n let outputText = locale.Every + ' ';\n\n if (schedule['h'] && schedule['m'] && schedule['h'].length <= 2 && schedule['m'].length <= 2 && withSeconds && schedule['s'] && schedule['s'].length <= 2 ) {\n // If there are only one or two specified values for\n // hour or minute, print them in HH:MM:SS format\n\n const hm = [];\n for (let i = 0; i < schedule['h'].length; i++) {\n for (let j = 0; j < schedule['m'].length; j++) {\n for (let k = 0; k < schedule['s'].length; k++) {\n hm.push(zeroPad(schedule['h'][i]) + ':' + zeroPad(schedule['m'][j]) + ':' + zeroPad(schedule['s'][k]));\n }\n }\n }\n if (hm.length < 2) {\n outputText = locale['At'] + ' ' + hm[0];\n } else {\n const lastVal = hm.pop();\n outputText = locale['At'] + ' ' + hm.join(', ') + ' ' + locale.and + ' ' + lastVal;\n }\n if (!schedule['d'] && !schedule['D']) {\n outputText += ' ' + locale['every day'] + ' ';\n }\n } else\n if (schedule['h'] && schedule['m'] && schedule['h'].length <= 2 && schedule['m'].length <= 2) {\n // If there are only one or two specified values for\n // hour or minute, print them in HH:MM format\n\n const hm = [];\n for (let i = 0; i < schedule['h'].length; i++) {\n for (let j = 0; j < schedule['m'].length; j++) {\n hm.push(zeroPad(schedule['h'][i]) + ':' + zeroPad(schedule['m'][j]));\n }\n }\n if (hm.length < 2) {\n outputText = locale['At'] + ' ' + hm[0];\n } else {\n const lastVal = hm.pop();\n outputText = locale['At'] + ' ' + hm.join(', ') + ' ' + locale.and + ' ' + lastVal;\n }\n\n if (!schedule['d'] && !schedule['D']) {\n outputText += ' ' + locale['every day'] + ' ';\n }\n } else {\n // Otherwise, list out every specified hour/minute value.\n\n if (schedule['h']) { // runs only at specific hours\n if (schedule['m']) { // and only at specific minutes\n if (withSeconds) {\n if (!schedule['s'] || schedule['s'].length === 60) {\n outputText += locale['second of every'] + ' ' + numberList(schedule['m']) + ' ' + locale['minute past the'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];\n } else {\n outputText += numberList(schedule['s']) + ' ' + locale['second of every'] + ' ' +numberList(schedule['m']) + ' ' + locale['minute past the'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];\n }\n } else {\n outputText += numberList(schedule['m']) + ' ' + locale['minute past the'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];\n }\n } else { // specific hours, but every minute\n if (withSeconds) {\n if (!schedule['s'] || schedule['s'].length === 60) {\n outputText += locale['second of every'] + ' ' + locale['minute of'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];\n } else {\n outputText += numberList(schedule['s']) + ' ' + locale['second of every'] + ' ' + locale['minute of'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];\n }\n } else {\n outputText += locale['minute of'] + ' ' + numberList(schedule['h']) + ' ' + locale['hour'];\n }\n }\n } else if (schedule['m']) { // every hour, but specific minutes\n if (withSeconds) {\n if (!schedule['s'] || schedule['s'].length === 60) {\n outputText += locale['second of every'] + ' ' + numberList(schedule['m']) + ' ' + locale['minute every hour'];\n } else {\n outputText += numberList(schedule['s']) + ' ' + locale['second of every'] + ' ' + numberList(schedule['m']) + ' ' + locale['minute every hour'];\n }\n } else {\n outputText += numberList(schedule['m']) + ' ' + locale['minute every hour'];\n }\n } else if (withSeconds) {\n if (!schedule['s'] || schedule['s'].length === 60) {\n outputText += locale['second'];\n } else {\n outputText += numberList(schedule['s']) + ' ' + locale['second'];\n }\n } else { // cronspec has \"*\" for both hour and minute\n outputText += locale['minute'];\n }\n }\n\n if (schedule['D']) { // runs only on specific day(s) of month\n outputText += (locale['on the'] ? ' ' + locale['on the'] + ' ' : ' ') + numberList(schedule['D']);\n if (!schedule['M']) {\n outputText += ' ' + locale['of every month'];\n }\n }\n\n if (schedule['d']) { // runs only on specific day(s) of week\n if (schedule['D']) {\n // if both day fields are specified, cron uses both; superuser.com/a/348372\n outputText += ' ' + locale['and every'] + ' ';\n } else {\n outputText += ' ' + locale['on'] + ' ';\n }\n outputText += dateList(schedule['d'], 'dow');\n }\n\n if (schedule['M']) {\n // runs only in specific months; put this output last\n outputText += ' ' + locale['in'] + ' ' + dateList(schedule['M'], 'mon');\n }\n\n return outputText;\n }\n\n return scheduleToSentence(schedule.schedules[0], withSeconds);\n}\n\nexport default cronToText;\n","var JQUERY_CRON_LOCALE = {};\n\nJQUERY_CRON_LOCALE.en = {\n ORDINALS: {\n th: 'th',\n st: 'st',\n nd: 'nd',\n rd: 'rd'\n },\n MONTH: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec'\n ],\n DOW: [\n 'Sun',\n 'Mon',\n 'Tue',\n 'Wed',\n 'Thu',\n 'Fri',\n 'Sat'\n ],\n 'Every': 'Every', // start of expression\n 'and': 'and', // 1, 2, 3 and 15th\n 'every day': 'every day',\n 'minute past the': 'minute past the',\n 'hour': 'hour',\n 'minute': 'minute',\n 'minute of': 'minute of',\n 'second': 'second',\n 'second in minute': 'second in minute',\n 'second of every': 'second of every',\n 'minute every hour': 'minute every hour',\n 'on the': 'on the',\n 'of every month': 'of every month',\n 'and every': 'and every',\n 'At': 'At',\n 'on': 'on', // on sun, mon\n 'in': 'in' // in jan, apr\n};\n\nJQUERY_CRON_LOCALE.de = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n 'Januar',\n 'Februar',\n 'März',\n 'April',\n 'Mai',\n 'Juni',\n 'Juli',\n 'August',\n 'September',\n 'Oktober',\n 'November',\n 'Dezember'\n ],\n DOW: [\n 'Sonntag',\n 'Montag',\n 'Dienstag',\n 'Mittwoch',\n 'Donnerstag',\n 'Freitag',\n 'Samstag'\n ],\n 'Every': 'Jede(r)', // start of expression\n 'and': 'und', // 1, 2, 3 and 15th\n 'every day': 'jeden Tag',\n 'minute past the': 'Minuten nach',\n 'hour': 'Stunde',\n 'minute': 'Minute',\n 'minute of': 'Minuten von',\n 'second': 'Sekunde',\n 'second in minute': 'Sekunde in der Minute',\n 'second of every': 'Sekunde in',\n 'minute every hour': 'Minute jede Stunde',\n 'on the': 'am',\n 'of every month': 'im jeden Monat',\n 'and every': 'und am jeden',\n 'At': 'Um',\n 'on': 'am', // on sun, mon\n 'in': 'im' // in jan, apr\n};\n\nJQUERY_CRON_LOCALE.ru = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n 'Январе',\n 'Феврале',\n 'Марте',\n 'Апреле',\n 'Майе',\n 'Июне',\n 'Июле',\n 'Августе',\n 'Сентябре',\n 'Октябре',\n 'Ноябре',\n 'Декабре'\n ],\n DOW: [\n 'воскресение',\n 'понедельник',\n 'вторник',\n 'среду',\n 'четверг',\n 'пятницу',\n 'субботу'\n ],\n 'Every': 'Каждую(ый)', // start of expression\n 'and': 'и', // 1, 2, 3 and 15th\n 'every day': 'каждый день',\n 'minute past the': 'минуту в',\n 'hour': 'часа(ов)',\n 'minute': 'минуту',\n 'minute of': 'минут(у) в',\n 'second': 'секунду',\n 'second in minute': 'секунду в минуте',\n 'second of every': 'секунду каждой(го)',\n 'minute every hour': 'минуту каждый час',\n 'on the': '',\n 'of every month': 'числа каждого месяца',\n 'and every': 'и каждый',\n 'At': 'В',\n 'on': 'в', // on sun, mon\n 'in': 'в' // in jan, apr\n};\n\nJQUERY_CRON_LOCALE.fr = {\n ORDINALS: {\n th: 'th',\n st: 'st',\n nd: 'nd',\n rd: 'rd'\n },\n MONTH: [\n 'Fév',\n 'Mar',\n 'Avr',\n 'Mai',\n 'Jun',\n 'Juil',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Déc'\n\n ],\n DOW: [\n 'Dim',\n 'Lun',\n 'Mar',\n 'Mer',\n 'Jeu',\n 'Ven',\n 'Sam'\n\n ],\n 'Every': 'Chaque',\n 'and': 'et',\n 'every day': 'tous les jours',\n 'minute past the': 'minute après le',\n 'hour': 'heure',\n 'minute': 'minute',\n 'minute of': 'minute de',\n 'second': 'seconde',\n 'second in minute': 'seconde en minute',\n 'second of every': 'deuxième de tous',\n 'minute every hour':'minute toutes les heures',\n 'on the': 'sur le',\n 'of every month': 'de chaque mois',\n 'and every': 'et tous',\n 'At': 'À',\n 'on': 'sur',\n 'in': 'dans'\n};\n\nJQUERY_CRON_LOCALE.it = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'Pot',\n 'Giu',\n 'Lug',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dic'\n ],\n DOW: [\n 'Dom',\n 'Mon',\n 'Mar',\n 'Mer',\n 'Gio',\n 'Ve',\n 'Sat'\n ],\n 'Every': 'Ogni',\n 'and': 'e',\n 'every day': 'ogni giorno',\n 'minute past the': 'minuto dopo',\n 'hour': 'ora',\n 'minute': 'Minuto',\n 'minute of': 'minuto di',\n 'second': 'secondo',\n 'second in minute': \"secondo in minuto\",\n 'second of every': 'secondo di ogni',\n 'minute every hour': 'minuto ogni ora',\n 'on the': 'sul',\n 'of every month': 'di ogni mese',\n 'and every': 'e ogni',\n 'At': 'A',\n 'on': 'sopra',\n 'in': 'in'\n};\n\nJQUERY_CRON_LOCALE.pt = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Abr',\n 'Pod',\n 'Jun',\n 'Jul',\n 'Ago',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec'\n ],\n DOW: [\n 'Dom',\n 'Seg',\n 'Ter',\n 'Qua',\n 'Qui',\n 'Sex',\n 'Sen'\n ],\n 'Every': 'Cada',\n 'and': 'e',\n 'every day': 'todo dia',\n 'minute past the': 'minuto após o',\n 'hour': 'hora',\n 'minute': 'minuto',\n 'minute of': 'minuto de',\n 'second': 'segundo',\n 'second in minute': 'segundo em minuto',\n 'second of every': 'segundo de cada',\n 'minute every hour': 'minuto a cada hora',\n 'on the': 'no',\n 'of every month': 'de todos os meses',\n 'and every': 'e todos',\n 'At': 'At',\n 'on': 'em',\n 'in': 'dentro'\n};\n\nJQUERY_CRON_LOCALE.pl = {\n ORDINALS: {\n th: 'th',\n st: 'st',\n nd: 'nd',\n rd: 'rd'\n },\n MONTH: [ //short or full names\n 'Sty', // or 'Styczeń'\n 'Lut', // or 'Luty'\n 'Mar', // or 'Marzec'\n 'Kwi', // or 'Kwiecień'\n 'Maj', // or 'Maj'\n 'Cze', // or 'Czerwiec'\n 'Lip', // or 'Lipiec'\n 'Sie', // or 'Sierpień'\n 'Wrz', // or 'Wrzesień'\n 'Paź', // or 'Październik'\n 'Lis', // or 'Listopad'\n 'Gru' // or 'Grudzień'\n ],\n DOW: [ //short or full days name\n 'Nie', // or 'Niedziela'\n 'Pon', // or 'Poniedziałek'\n 'Wto', // or 'Wtorek'\n 'Śro', // or 'Środa'\n 'Czw', // or 'Czwartek'\n 'Pią', // or 'Piątek'\n 'Sob' // or 'Sobota\n ],\n 'Every': 'Każde(go)', // start of expression\n 'and': 'i', // 1, 2, 3 and 15th\n 'every day': 'codziennie',\n 'minute past the': 'minut po', //minute past the hour ?\n 'hour': 'godzina',\n 'minute': 'minut(a)',\n 'minute of': 'minut po',\n 'second': 'sekunda',\n 'second in minute': 'sekund na minutę',\n 'second of every': 'sekund co',\n 'minute every hour': 'minut co godzinę',\n 'on the': 'w',\n 'of every month': 'każdego miesiąca',\n 'and every': 'i każdego',\n 'At': 'O',\n 'on': 'w', // on sun, mon\n 'in': 'w' // in jan, apr\n};\n\nJQUERY_CRON_LOCALE.es = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n 'Ene',\n 'Feb',\n 'Mar',\n 'Abr',\n 'Mayo',\n 'Jun',\n 'Jul',\n 'Ago',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dic'\n ],\n DOW: [\n 'Sol',\n 'Lun',\n 'Mar',\n 'Mie',\n 'Jue',\n 'Vie',\n 'Sab'\n ],\n 'Every': 'Cada',\n 'and': 'y',\n 'every day': 'cada día',\n 'minute past the': 'minuto pasado el',\n 'hour': 'hora',\n 'minute': 'minuto',\n 'minute of': 'minuto de',\n 'second': 'segundo',\n 'second in minute': 'segundo en minuto',\n 'second of every': 'segundo de cada',\n 'minute every hour': 'minuto cada hora',\n 'on the': 'sobre el',\n 'of every month': 'de cada mes',\n 'and every': 'y cada',\n 'At': 'A',\n 'on': 'en',\n 'in': 'en'\n};\n\nJQUERY_CRON_LOCALE.nl = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'Mei',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Okt',\n 'Nov',\n 'Dec'\n ],\n DOW: [\n 'Zon',\n 'Mon',\n 'Di',\n 'Wo',\n 'Don',\n 'Vrij',\n 'Za'\n ],\n 'Every': 'Elke',\n 'and': 'en',\n 'every day': 'elke dag',\n 'minute past the': 'minuut voorbij de',\n 'hour': 'uur',\n 'minute': 'minuut',\n 'minute of': 'minuut van',\n 'second': 'tweede',\n 'second in minute': 'tweede in minuut',\n 'second of every': 'tweede van alles',\n 'minute every hour': 'minuut elk uur',\n 'on the': 'op de',\n 'of every month': 'van elke maand',\n 'and every': 'en elke',\n 'At': 'Op',\n 'on': 'op',\n 'in': 'in'\n};\n\nJQUERY_CRON_LOCALE['zh-cn'] = {\n ORDINALS: {\n th: '',\n st: '',\n nd: '',\n rd: ''\n },\n MONTH: [\n '一月',\n '二月',\n '三月',\n '四月',\n '五月',\n '六月',\n '七月',\n '八月',\n '九月',\n '十月',\n '十一月',\n '十二月'\n ],\n DOW: [\n '星期日',\n '星期一',\n '星期二',\n '星期三',\n '星期四',\n '星期五',\n '星期六'\n ],\n 'Every': '每', // start of expression\n 'and': '和', // 1, 2, 3 and 15th\n 'every day': '每天',\n 'minute past the': '分钟在每天第',\n 'hour': '小时',\n 'minute': '分钟',\n 'minute of': '分钟的',\n 'second': '秒',\n 'second in minute': '秒在分钟',\n 'second of every': '秒在每',\n 'minute every hour': '分钟在每小时中',\n 'on the': '在',\n 'of every month': '日在每月',\n 'and every': '且每',\n 'At': '在',\n 'on': '在', // on sun, mon\n 'in': '在' // in jan, apr\n};\n\nexport default JQUERY_CRON_LOCALE;\n","import cronToText from './cron2text';\nimport JQUERY_CRON_LOCALE from './jquery.cron.locale';\n\nfunction correctCasus(text, seconds) {\n text = text.replace('Каждую(ый) минуту', 'Каждую минуту');\n text = text.replace('Каждую(ый) минут(у)', 'Каждую минуту');\n text = text.replace('Каждую(ый) час', 'Каждый час');\n text = text.replace('Каждую(ый) секунду', 'Каждую секунду');\n text = text.replace(/ (\\d{1,2}) числа/, ' $1го числа');\n\n text = text.replace(/ (\\d{1,2}) в Январе/, ' $1го числа в Январе');\n text = text.replace(/ (\\d{1,2}) в Феврале/, ' $1го числа в Феврале');\n text = text.replace(/ (\\d{1,2}) в Марте/, ' $1го числа в Марте');\n text = text.replace(/ (\\d{1,2}) в Апреле/, ' $1го числа в Апреле');\n text = text.replace(/ (\\d{1,2}) в Майе/, ' $1го числа в Майе');\n text = text.replace(/ (\\d{1,2}) в Июне/, ' $1го числа в Июне');\n text = text.replace(/ (\\d{1,2}) в Июле/, ' $1го числа в Июле');\n text = text.replace(/ (\\d{1,2}) в Августе/, ' $1го числа в Августе');\n text = text.replace(/ (\\d{1,2}) в Сентябре/, ' $1го числа в Сентябре');\n text = text.replace(/ (\\d{1,2}) в Октябре/, ' $1го числа в Октябре');\n text = text.replace(/ (\\d{1,2}) в Ноябре/, ' $1го числа в Ноябре');\n text = text.replace(/ (\\d{1,2}) в Декабре/, ' $1го числа в Декабре');\n\n text = text.replace('Каждую(ый) 0 минуту', 'Каждые ноль минут');\n text = text.replace(/Каждую\\(ый\\) ([\\d\\sи,]+) минуту/, 'Каждую $1 минуту');\n\n text = text.replace(/каждой\\(го\\) ([\\d\\sи,]+) минуту/, 'каждой $1 минуты');\n text = text.replace('каждой(го) минут(у)', 'каждой минуты');\n\n text = text.replace(' 0 часа(ов)', ' 0 часов');\n text = text.replace(' 1 часа(ов)', ' 1 час');\n text = text.replace(' 2 часа(ов)', ' 2 часа');\n text = text.replace(' 3 часа(ов)', ' 3 часа');\n text = text.replace(' 4 часа(ов)', ' 4 часа');\n text = text.replace(/ (\\d{1,2}) часа\\(ов\\)/, ' $1 часов');\n\n text = text.replace('Jede(r) Sekunde', 'Jede Sekunde');\n text = text.replace(/Jede\\(r\\) ([\\d\\sund,]+) Sekunde/, 'Jede $1 Sekunde');\n text = text.replace('Jede(r) Minute', 'Jede Minute');\n text = text.replace('Jede Minuten', 'Jede Minute');\n text = text.replace('Jede(r) Stunde', 'Jede Stunde');\n text = text.replace(/Jede\\(r\\) ([\\d\\sund,]+) Minute/, 'Jede $1 Minute');\n text = text.replace('Jede Sekunde in Minuten', 'Jede Sekunde in jeder Minute');\n\n return text;\n}\n\nfunction convertCronToText(cron, lang) {\n const withSeconds = cron.split(' ').length === 6;\n let text = cronToText(cron, withSeconds, JQUERY_CRON_LOCALE[lang] || JQUERY_CRON_LOCALE.en);\n return correctCasus(text, withSeconds);\n}\n\nexport default convertCronToText;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from '@material-ui/core/styles';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport Button from '@material-ui/core/Button';\n\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport AppBar from '@material-ui/core/AppBar';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport I18n from '@iobroker/adapter-react/i18n';\nimport TextField from '@material-ui/core/TextField';\nimport convertCronToText from './simple-cron/cronText';\n\nconst styles = theme => ({\n mainDiv: {\n width: '100%',\n height: '100%',\n overflow: 'auto'\n },\n periodSelect: {\n //margin: '0 10px 60px 10px',\n display: 'block',\n width: 200\n },\n slider: {\n marginTop: 20,\n display: 'block',\n width: '100%'\n },\n tabContent: {\n padding: 20\n },\n numberButton: {\n padding: 4,\n minWidth: 40,\n margin: 5\n },\n numberButtonBreak: {\n display: 'block'\n },\n appBar: {\n color: 'white'\n }\n});\n\nconst WEEKDAYS = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n 'Sunday',\n];\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n];\n\n// 5-7,9-11 => [5,6,7,9,10,11]\nfunction convertMinusIntoArray(value, max) {\n let result = [];\n if (value === '*') {\n if (max === 24 || max === 60 || max === 7) {\n for (let i = 0; i < max; i++) {\n result.push(i);\n }\n } else {\n for (let i = 1; i <= max; i++) {\n result.push(i);\n }\n }\n return result; // array with entries max\n }\n const parts = (value || '').toString().split(',');\n for (let p = 0; p < parts.length; p++) {\n if (! parts[p].trim().length) continue;\n const items = parts[p].trim().split('-');\n if (items.length > 1) {\n let iMax = parseInt(items[1], 10);\n for (let i = parseInt(items[0], 10); i <= iMax; i++) {\n result.push(i);\n }\n } else {\n result.push(parseInt(parts[p], 10));\n }\n }\n result = result.map(a => parseInt(a, 10));\n\n result.sort();\n\n\n // remove double entries\n for (let p = result.length - 1; p >= 0; p--) {\n if (result[p] === result[p + 1]) {\n result.splice(p + 1, 1);\n }\n }\n\n\n return result;\n}\n\n// [5,6,7,9,10,11] => 5-7,9-11\nfunction convertArrayIntoMinus(value, max) {\n if (typeof value !== 'object') {\n value = [value];\n }\n if (value.length === max) {\n return '*';\n }\n const newParts = [];\n if (!value.length) {\n return '-';\n }\n value = value.map(a => parseInt(a, 10));\n\n value.sort((a, b) => a -b);\n\n let start = value[0];\n let end = value[0];\n for (let p = 1; p < value.length; p++) {\n if (value[p] - 1 !== parseInt(value[p - 1], 10)) {\n if (start === end) {\n newParts.push(start)\n } else if (end - 1 === start) {\n newParts.push(start + ',' + end);\n } else {\n newParts.push(start + '-' + end);\n }\n start = value[p];\n end = value[p];\n } else {\n end = value[p];\n }\n }\n\n if (start === end) {\n newParts.push(start)\n } else if (end - 1 === start) {\n newParts.push(start + ',' + end);\n } else {\n newParts.push(start + '-' + end);\n }\n\n return newParts.join(',');\n}\n\nclass ComplexCron extends React.Component {\n constructor(props) {\n super(props);\n let cron = (typeof this.props.cronExpression === 'string') ? this.props.cronExpression.replace(/^[\"']/, '').replace(/[\"']\\n?$/, '') : '';\n if (cron[0] === '{') {\n cron = '';\n }\n const state = ComplexCron.cron2state(cron || '* * * * *');\n\n this.state = {\n extended: false,\n tab: state.seconds !== false ? 1 : 0,\n cron: ComplexCron.state2cron(state),\n modes: {\n seconds: null,\n minutes: null,\n hours: null,\n dates: null,\n months: null,\n dows: null\n }\n };\n Object.assign(this.state, state);\n if (this.state.cron !== this.props.cronExpression) {\n setTimeout(() => this.props.onChange && this.props.onChange(this.state.cron), 100);\n }\n }\n\n static cron2state(cron) {\n cron = cron.replace(/['\"]/g, '').trim();\n const cronParts = cron.split(' ').map(p => p.trim());\n const options = {};\n\n if (cronParts.length === 6) {\n options.seconds = cronParts[0] || '*';\n options.minutes = cronParts[1] || '*';\n options.hours = cronParts[2] || '*';\n options.dates = cronParts[3] || '*';\n options.months = cronParts[4] || '*';\n options.dows = cronParts[5] || '*';\n } else {\n options.seconds = false;\n options.minutes = cronParts[0] || '*';\n options.hours = cronParts[1] || '*';\n options.dates = cronParts[2] || '*';\n options.months = cronParts[3] || '*';\n options.dows = cronParts[4] || '*';\n }\n return options;\n }\n static state2cron(state) {\n let text = `${state.minutes} ${state.hours} ${state.dates} ${state.months} ${state.dows}`;\n if (state.seconds !== false) {\n text = state.seconds + ' ' + text;\n }\n return text;\n }\n\n recalcCron() {\n let cron = ComplexCron.state2cron(this.state);\n if (cron !== this.state.cron) {\n this.setState({cron}, () => {\n this.props.onChange && this.props.onChange(this.state.cron);\n });\n }\n }\n\n onChange(cron) {\n if (cron !== this.state.cron) {\n this.setState({cron});\n this.props.onChange && this.props.onChange(cron);\n }\n }\n\n onToggle(i, type, max) {\n if (i === true) {\n this.setState({[type]: '*'}, () => this.recalcCron());\n } else if (i === false) {\n if (max === 60 || max === 24) {\n this.setState({[type]: '0'}, () => this.recalcCron());\n } else {\n this.setState({[type]: '1'}, () => this.recalcCron());\n }\n } else {\n let nums = convertMinusIntoArray(this.state[type], max);\n const pos = nums.indexOf(i);\n if (pos !== -1) {\n nums.splice(pos, 1);\n } else {\n nums.push(i);\n nums.sort();\n }\n this.setState({[type]: convertArrayIntoMinus(nums, max)}, () => this.recalcCron());\n }\n }\n\n getDigitsSelector(type, max) {\n let values = [];\n if (max === 7) {\n values = [1,2,3,4,5,6,0];\n } else if (max === 60 || max === 24) {\n for (let i = 0; i < max; i++) {\n values.push(i);\n }\n } else {\n for (let i = 1; i <= max; i++) {\n values.push(i);\n }\n }\n const parts = convertMinusIntoArray(this.state[type], max);\n return [\n (
),\n (
),\n (
\n {values.map(i =>\n [((max === 7 && i === 4) ||\n (max === 12 && i === 7) ||\n (max === 31 && !((i - 1) % 10)) ||\n (max === 60 && i && !(i % 10)) ||\n (max === 24 && i && !(i % 6))) ?\n (
) : null,\n (
\n )])}\n
)];\n }\n\n getPeriodsTab(type, max) {\n let value = this.state[type];\n let every = value === '*';\n let everyN = value.toString().indexOf('/') !== -1;\n let select;\n if (this.state.modes[type] === null) {\n select = every ? 'every' : (everyN ? 'everyN' : 'specific');\n const modes = JSON.parse(JSON.stringify(this.state.modes));\n modes[type] = select;\n return setTimeout(() => this.setState({modes}, () => this.recalcCron()), 100);\n } else {\n every = this.state.modes[type] === 'every';\n everyN = this.state.modes[type] === 'everyN';\n select = this.state.modes[type];\n }\n\n if (everyN) {\n value = parseInt(value.replace('*/', ''), 10) || 1;\n }\n\n return (
\n \n {everyN && false && ({value})}\n {everyN && ( {\n this.setState({[type]: '*/' + e.target.value}, () => this.recalcCron());\n }}\n InputLabelProps={{shrink: true,}}\n type=\"number\"\n margin=\"normal\"\n />)}\n {!every && !everyN && this.getDigitsSelector(type, max)}\n
);\n }\n\n convertCronToText(cron, lang) {\n if (cron.split(' ').indexOf('-') !== -1) {\n return I18n.t('Invalid CRON');\n } else {\n return convertCronToText(cron, lang);\n }\n }\n\n render() {\n const tab = this.state.seconds !== false ? this.state.tab : this.state.tab + 1;\n return (\n
\n
\n
{this.convertCronToText(this.state.cron, this.props.language || 'en')}
\n
this.setState({seconds: e.target.checked ? '*' : false}, () => this.recalcCron())}/>}\n label={I18n.t('use seconds')}\n />\n \n \n this.setState({tab})}>\n {this.state.seconds !== false && }\n \n \n \n \n \n \n \n {tab === 0 && ({this.getPeriodsTab('seconds', 60)}
)}\n {tab === 1 && ({this.getPeriodsTab('minutes', 60)}
)}\n {tab === 2 && ({this.getPeriodsTab('hours', 24)}
)}\n {tab === 3 && ({this.getPeriodsTab('dates', 31)}
)}\n {tab === 4 && ({this.getPeriodsTab('months', 12)}
)}\n {tab === 5 && ({this.getPeriodsTab('dows', 7)}
)}\n \n );\n }\n}\n\nComplexCron.propTypes = {\n cronExpression: PropTypes.string,\n onChange: PropTypes.func,\n language: PropTypes.string,\n};\n\nexport default withStyles(styles)(ComplexCron);\n\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from '@material-ui/core/styles';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport TextField from '@material-ui/core/TextField';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport convertCronToText from './cronText';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n mainDiv: {\n width: '100%',\n height: '100%',\n overflow: 'auto'\n },\n formControl: {\n margin: 0,\n minWidth: 120,\n },\n formControlMarginRight: {\n marginRight: 5\n },\n formControlPaddingTop: {\n paddingTop: 6.2\n }\n});\n\nconst PERIODIC = {\n once: 'once',\n interval: 'interval',\n intervalBetween: 'intervalBetween',\n specific: 'specific'\n};\nconst PERIODIC_TYPES = {\n seconds: 'seconds',\n minutes: 'minutes',\n //hours: 'hours',\n};\nconst WEEKDAYS = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n 'Sunday',\n];\n\nfunction padding(num) {\n if (num < 10) return '0' + num;\n return '' + num;\n}\nconst DEFAULT_STATE = {\n mode: PERIODIC.interval,\n interval: {\n period: 1,\n unit: PERIODIC_TYPES.minutes\n }\n};\n\nclass SimpleCron extends React.Component {\n constructor(props) {\n super(props);\n let cron = (typeof this.props.cronExpression === 'string') ? this.props.cronExpression.replace(/^[\"']/, '').replace(/[\"']\\n?$/, '') : '';\n if (cron[0] === '{') {\n cron = '';\n }\n const state = SimpleCron.cron2state(cron || '* * * * *') || DEFAULT_STATE;\n\n this.state = {\n extended: false,\n cron: SimpleCron.state2cron(state),\n mode: 'interval',\n once: {\n time: '00:00',\n date: ''\n },\n interval: {\n period: 1,\n unit: PERIODIC_TYPES.minutes\n },\n intervalBetween: {\n period: 1,\n unit: PERIODIC_TYPES.minutes,\n timeFrom: 0,\n timeTo: 24,\n weekdays: [0, 1, 2, 3, 4, 5, 6]\n },\n specific: {\n time: '00:00',\n weekdays: [0, 1, 2, 3, 4, 5, 6]\n }\n };\n Object.assign(this.state, state);\n\n if (this.state.cron !== this.props.cronExpression) {\n setTimeout(() => this.props.onChange && this.props.onChange(this.state.cron), 100);\n }\n }\n\n static periodArray2text(list, max) {\n max = max || 7;\n if (list.length === max) {\n return '*';\n } else {\n let text = [];\n let start = null;\n let end = null;\n for (let i = 0; i < list.length; i++) {\n if (start === null) {\n start = list[i];\n end = list[i];\n } else if (list[i - 1] + 1 === list[i]) {\n end = list[i];\n } else {\n if (start !== end) {\n text.push(start + '-' + end);\n } else {\n text.push(start);\n }\n start = list[i];\n end = list[i];\n }\n }\n if (start !== end) {\n text.push(start + '-' + end);\n } else {\n text.push(start);\n }\n return text.join(',');\n }\n }\n\n static text2weekdays(text) {\n if (text === '*') {\n return [0,1,2,3,4,5,6];\n }\n const parts = text.split(',');\n const list = [];\n parts.forEach(part => {\n const _parts = part.split('-');\n if (_parts.length === 2) {\n const start = parseInt(_parts[0], 10);\n const end = parseInt(_parts[1], 10);\n for (let day = start; day <= end; day++) {\n if (list.indexOf(day === 7 ? 0 : day) === -1) {\n list.push(day === 7 ? 0 : day);\n }\n }\n } else {\n if (part === '7') {\n part = 0;\n }\n part = parseInt(part, 10);\n if (list.indexOf(part) === -1) {\n list.push(part);\n }\n }\n });\n list.sort();\n return list;\n }\n\n static cron2state(cron) {\n cron = cron.replace(/['\"]/g, '').trim();\n const cronParts = cron.split(' ');\n const options = {};\n const state = {\n mode: ''\n };\n if (cronParts.length === 6) {\n options.seconds = cronParts[0] || '*';\n options.minutes = cronParts[1] || '*';\n options.hours = cronParts[2] || '*';\n options.date = cronParts[3] || '*';\n options.months = cronParts[4] || '*';\n options.dow = cronParts[5] || '*';\n } else {\n options.seconds = null;\n options.minutes = cronParts[0] || '*';\n options.hours = cronParts[1] || '*';\n options.date = cronParts[2] || '*';\n options.months = cronParts[3] || '*';\n options.dow = cronParts[4] || '*';\n }\n\n // * * * * *\n if (options.seconds === null &&\n options.minutes === '*' &&\n options.hours === '*' &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.interval;\n state.interval = {\n period: 1,\n unit: PERIODIC_TYPES.minutes\n };\n } // * * * * * *\n if (options.seconds === '*' &&\n options.minutes === '*' &&\n options.hours === '*' &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.interval;\n state.interval = {\n period: 1,\n unit: PERIODIC_TYPES.seconds\n };\n } else// */n * * * *\n if (options.seconds === null &&\n options.minutes.indexOf('/') !== -1 &&\n options.hours === '*' &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.interval;\n state.interval = {\n period: parseInt(options.minutes.split('/')[1], 10),\n unit: PERIODIC_TYPES.minutes\n };\n } else\n // */n * * * * *\n if (options.seconds !== null && options.seconds.indexOf('/') !== -1 &&\n options.minutes === '*' &&\n options.hours === '*' &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.interval;\n state.interval = {\n period: parseInt(options.seconds.split('/')[1], 10),\n unit: PERIODIC_TYPES.seconds\n };\n } else\n // */n * 1-24 * * 1-7 or */n * 1-24 * * *\n if (options.seconds !== null && options.seconds.indexOf('/') !== -1 &&\n options.minutes === '*' &&\n options.hours.indexOf('-') !== -1 &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.intervalBetween;\n state.intervalBetween = {\n period: parseInt(options.seconds.split('/')[1], 10),\n unit: PERIODIC_TYPES.seconds,\n timeFrom: parseInt(options.hours.split('-')[0], 10),\n timeTo: parseInt(options.hours.split('-')[1], 10),\n weekdays: SimpleCron.text2weekdays(options.dow)\n };\n } else\n // */n 1-24 * * 1-7 or */n 1-24 * * *\n if (options.seconds === null &&\n options.minutes.indexOf('/') !== -1 &&\n options.hours.indexOf('-') !== -1 &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.intervalBetween;\n state.intervalBetween = {\n period: parseInt(options.minutes.split('/')[1], 10),\n unit: PERIODIC_TYPES.minutes,\n timeFrom: parseInt(options.hours.split('-')[0], 10),\n timeTo: parseInt(options.hours.split('-')[1], 10),\n weekdays: SimpleCron.text2weekdays(options.dow)\n };\n } else\n // m h * * 1-7 or m h * * *\n if (options.seconds === null &&\n parseInt(options.minutes, 10).toString() === options.minutes &&\n parseInt(options.hours, 10).toString() === options.hours &&\n options.date === '*' &&\n options.months === '*') {\n state.mode = PERIODIC.specific;\n state.specific = {\n time: padding(parseInt(options.hours, 10)) + ':' + padding(parseInt(options.minutes, 10)),\n weekdays: SimpleCron.text2weekdays(options.dow)\n };\n } else\n // m h d M *\n if (options.seconds === null &&\n parseInt(options.minutes, 10).toString() === options.minutes &&\n parseInt(options.hours, 10).toString() === options.hours &&\n parseInt(options.date, 10).toString() === options.date &&\n parseInt(options.months, 10).toString() === options.months &&\n options.dow === '*') {\n state.mode = PERIODIC.once;\n state.once = {\n time: padding(parseInt(options.hours, 10)) + ':' + padding(parseInt(options.minutes, 10)),\n date: padding(parseInt(options.date, 10)) + '.' + padding(parseInt(options.months, 10)),\n // ignored\n weekdays: SimpleCron.text2weekdays(options.dow)\n }\n }\n\n if (state.mode) {\n return state;\n } else {\n return null;\n }\n }\n\n static state2cron(state) {\n let cron = '* * * * *';\n if (state.mode === PERIODIC.interval) {\n const settings = state.interval || {};\n if (settings.period > 60) settings.period = 60;\n if (settings.period < 1) settings.period = 1;\n\n if (settings.minutes > 60) settings.minutes = 60;\n if (settings.minutes < 1) settings.minutes = 1;\n\n if (settings.hours > 24) settings.hours = 24;\n if (settings.hours < 1) settings.hours = 1;\n\n if (state.extended) {\n cron = `${settings.minutes > 1 ? '*/' + settings.minutes : '*'} ${settings.hours > 1 ? '*/' + settings.hours : '*'} * * *`;\n } else {\n switch (settings.unit) {\n case PERIODIC_TYPES.seconds:\n cron = `${settings.period > 1 ? '*/' + settings.period : '*'} * * * * *`;\n break;\n case PERIODIC_TYPES.minutes:\n cron = `${settings.period > 1 ? '*/' + settings.period : '*'} * * * *`;\n break;\n default:\n break;\n }\n }\n } else if (state.mode === PERIODIC.intervalBetween) {\n const settings = state.intervalBetween || {};\n let hours;\n settings.timeFrom = settings.timeFrom || 0;\n settings.timeTo = settings.timeTo === undefined ? 24 : settings.timeTo;\n if (settings.timeFrom === 0 && settings.timeTo === 24) {\n hours = '*';\n } else {\n hours = settings.timeFrom !== settings.timeTo ? settings.timeFrom + '-' + settings.timeTo : '*';\n }\n if (settings.period > 60) settings.period = 60;\n if (settings.period < 1) settings.period = 1;\n settings.unit = settings.unit || PERIODIC_TYPES.minutes;\n switch (settings.unit) {\n case PERIODIC_TYPES.seconds:\n cron = `${settings.period > 1 ? '*/' + settings.period : '*'} * ${hours} * * ${this.periodArray2text(settings.weekdays)}`;\n break;\n case PERIODIC_TYPES.minutes:\n cron = `${settings.period > 1 ? '*/' + settings.period : '*'} ${hours} * * ${this.periodArray2text(settings.weekdays)}`;\n break;\n default:\n break;\n }\n } else if (state.mode === PERIODIC.specific) {\n const settings = state.specific || {};\n const parts = (settings.time || '00:00').split(':');\n let minutes = parseInt(parts[1], 10) || 0;\n if (minutes > 59) minutes = 59;\n if (minutes < 0) minutes = 0;\n let hours = parseInt(parts[0], 10) || 0;\n if (hours > 23) hours = 59;\n if (hours < 0) hours = 0;\n\n cron = `${minutes} ${hours} * * ${this.periodArray2text(settings.weekdays || [])}`;\n } else if (state.mode === PERIODIC.once) {\n const settings = state.once || {};\n if (!settings.date) {\n settings.date = new Date().getDate() + '.' + padding(new Date().getMonth() + 1);\n }\n const parts = (settings.time || '00:00').split(':');\n const partsDate = settings.date.split('.');\n let minutes = parseInt(parts[1], 10) || 0;\n if (minutes > 59) minutes = 59;\n if (minutes < 0) minutes = 0;\n let hours = parseInt(parts[0], 10) || 0;\n if (hours > 23) hours = 59;\n if (hours < 0) hours = 0;\n let date = parseInt(partsDate[0], 10) || 1;\n if (date > 31) date = 31;\n if (date < 1) hours = 1;\n let month = parseInt(partsDate[1], 10) || 1;\n if (month > 12) month = 12;\n if (month < 1) month = 1;\n\n cron = `${minutes} ${hours} ${date} ${month} *`;\n }\n return cron;\n }\n\n recalcCron() {\n this.onChange(SimpleCron.state2cron(this.state));\n }\n\n getControlsWeekdaysElements(type) {\n const settings = this.state[type];\n return (
\n
{I18n.t('On weekdays')}
\n {[1,2,3,4,5,6,0].map(day => (\n {\n const settings = JSON.parse(JSON.stringify(this.state[type]));\n const pos = settings.weekdays.indexOf(day);\n e.target.checked && pos === -1 && settings.weekdays.push(day);\n !e.target.checked && pos !== -1 && settings.weekdays.splice(pos, 1);\n settings.weekdays.sort();\n this.setState({[type]: settings}, () => this.recalcCron());\n }}\n value={day.toString()}\n />\n }\n label={I18n.t(WEEKDAYS[day])}\n />))\n });\n }\n\n getControlsPeriodElements(type) {\n const settings = this.state[type];\n\n if (this.state.extended) {\n return (
\n
{I18n.t('sc_period')}
\n {\n const settings = JSON.parse(JSON.stringify(this.state[type]));\n settings.minutes = parseInt(e.target.value, 10);\n if (settings.minutes < 1) settings.minutes = 1;\n this.setState({[type]: settings}, () => this.recalcCron());\n }}\n min={1}\n max={60}\n type=\"number\"\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />\n {\n const settings = JSON.parse(JSON.stringify(this.state[type]));\n settings.hours = parseInt(e.target.value, 10);\n if (settings.hours < 1) settings.hours = 1;\n this.setState({[type]: settings}, () => this.recalcCron());\n }}\n min={1}\n max={24}\n type=\"number\"\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />\n );\n } else {\n return (
\n
{I18n.t('sc_period')}
\n {\n const settings = JSON.parse(JSON.stringify(this.state[type]));\n settings.period = parseInt(e.target.value, 10);\n if (settings.period < 1) settings.period = 1;\n this.setState({[type]: settings}, () => this.recalcCron());\n }}\n min={1}\n max={60}\n type=\"number\"\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />);\n }\n }\n\n getControlsTime(type) {\n const settings = this.state[type];\n return (
\n {\n const settings = JSON.parse(JSON.stringify(this.state[type]));\n settings.time = e.target.value;\n this.setState({[type]: settings}, () => this.recalcCron());\n }}\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />\n );\n }\n\n getControlsDate(type) {\n const settings = this.state[type];\n\n if (!settings.date) {\n const d = new Date();\n settings.date = d.getDate() + '.' + padding(d.getMonth() + 1);\n }\n\n //
{I18n.t('sc_at')}\n return (
\n {\n const settings = JSON.parse(JSON.stringify(this.state[type]));\n settings.date = e.target.value;\n this.setState({[type]: settings}, () => this.recalcCron());\n }}\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />\n );\n }\n\n getOnceElements() {\n return (
\n {this.getControlsTime('once')}\n {this.getControlsDate('once')}\n
);\n }\n\n getIntervalElements() {\n return this.getControlsPeriodElements('interval');\n }\n\n getIntervalBetweenElements() {\n const settings = this.state.intervalBetween;\n return [\n this.getControlsPeriodElements('intervalBetween'),\n (
\n
{I18n.t('sc_hours')}
\n \n {I18n.t('sc_from')}\n \n \n \n {I18n.t('sc_to')}\n \n \n ),\n this.getControlsWeekdaysElements('intervalBetween')\n ];\n }\n\n getSpecificTimeElements() {\n return [\n (
{this.getControlsTime('specific')}
),\n this.getControlsWeekdaysElements('specific')\n ]\n }\n\n onModeChange(mode) {\n if (mode !== this.state.mode) {\n this.setState({mode}, () => this.recalcCron());\n }\n }\n\n onChange(cron) {\n if (cron !== this.state.cron) {\n this.setState({cron});\n this.props.onChange && this.props.onChange(cron);\n }\n }\n\n render() {\n return (\n
\n
\n
{convertCronToText(this.state.cron, this.props.language || 'en')}
\n
\n {I18n.t('Repeat')}\n \n
\n {this.state.mode === PERIODIC.once && this.getOnceElements()}\n {this.state.mode === PERIODIC.interval && this.getIntervalElements()}\n {this.state.mode === PERIODIC.intervalBetween && this.getIntervalBetweenElements()}\n {this.state.mode === PERIODIC.specific && this.getSpecificTimeElements()}\n
\n );\n }\n}\n\nSimpleCron.propTypes = {\n cronExpression: PropTypes.string,\n onChange: PropTypes.func,\n language: PropTypes.string,\n};\n\nexport default withStyles(styles)(SimpleCron);\n\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from '@material-ui/core/styles';\nimport Input from '@material-ui/core/Input';\nimport Radio from '@material-ui/core/Radio';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport FormGroup from '@material-ui/core/FormGroup';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport MaskedInput from 'react-text-mask';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport TextField from \"@material-ui/core/TextField\";\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n hr: {\n border: 0,\n borderTop: '1px solid gray'\n },\n scrollWindow: {\n width: '100%',\n overflow: 'auto',\n height: 'calc(100% - 22px)'\n },\n rowDiv: {\n width: '100%',\n },\n modeDiv: {\n width: 200,\n display: 'inline-block',\n verticalAlign: 'top'\n },\n settingsDiv: {\n display: 'inline-block',\n verticalAlign: 'top'\n },\n inputTime: {\n width: 90,\n marginTop: 0,\n marginLeft: 5\n },\n inputDate: {\n width: 140,\n marginTop: 0,\n marginLeft: 5\n },\n inputEvery: {\n width: 40,\n marginLeft: 5,\n marginRight: 5,\n },\n inputRadio: {\n padding: '4px 12px',\n verticalAlign: 'top'\n },\n inputGroup: {\n maxWidth: 400,\n display: 'inline-block'\n },\n inputGroupElement: {\n width: 120,\n },\n inputDateDay: {\n width: 60,\n },\n inputDateDayCheck: {\n padding: 4,\n },\n inputSmallCheck: {\n padding: 0,\n },\n rowOnce: {\n\n },\n\n rowDays: {\n background: theme.palette.type !== 'dark' ? '#ddeaff' : '#4b5057'\n },\n rowDows: {\n background: theme.palette.type !== 'dark' ? '#DDFFDD' : '#52646c'\n },\n rowDates: {\n background: theme.palette.type !== 'dark' ? '#DDDDFF' : '#747a86'\n },\n rowWeeks: {\n background: theme.palette.type !== 'dark' ? '#DDDDFF' : '#717680'\n },\n rowMonths: {\n background: theme.palette.type !== 'dark' ? '#DDFFFF' : '#1f5557'\n },\n rowMonthsDates: {\n background: theme.palette.type !== 'dark' ? '#EEFFFF' : '#3c5737',\n maxWidth: 600\n },\n rowYears: {\n background: theme.palette.type !== 'dark' ? '#fbffdd' : '#574b33'\n },\n rowDaysDows: {\n background: theme.palette.type !== 'dark' ? '#EEEAFF' : '#573544',\n paddingLeft: 10,\n paddingBottom: 10\n },\n rowDowsDows: {\n background: theme.palette.type !== 'dark' ? '#EEFFEE' : '#3d4c54',\n paddingLeft: 10,\n paddingBottom: 10\n }\n});\n\nconst WEEKDAYS = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n 'Sunday',\n];\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n];\nconst PERIODS = {\n 'minutes': 'minutes',\n 'hours': 'hours',\n};\nconst ASTRO = [\n 'sunrise',\n 'sunriseEnd',\n 'goldenHourEnd',\n 'solarNoon',\n 'goldenHour',\n 'sunsetStart',\n 'sunset',\n 'dusk',\n 'nauticalDusk',\n 'night',\n 'nightEnd',\n 'nauticalDawn',\n 'dawn',\n 'nadir',\n];\n\nfunction padding(num) {\n if (num < 10) return '0' + num;\n return '' + num;\n}\n\nfunction TextTime(props) {\n const { inputRef, ...other } = props;\n\n return (\n
\n );\n}\n\nTextTime.propTypes = {\n inputRef: PropTypes.func.isRequired,\n};\n\nfunction TextDate(props) {\n const { inputRef, ...other } = props;\n\n return (\n
\n );\n}\n\nTextDate.propTypes = {\n inputRef: PropTypes.func.isRequired,\n};\n\nconst DEFAULT = {\n time: {\n exactTime: false,\n\n start: '00:00',\n end: '23:59',\n\n mode: 'hours',\n interval: 1,\n },\n period: {\n once: '',\n days: 1,\n dows: '',\n dates: '',\n weeks: 0,\n months: '',\n\n years: 0,\n yearMonth: 0,\n yearDate: 0,\n },\n valid: {\n from: '',\n to: ''\n }\n};\nfunction string2USdate(date) {\n const parts = date.split('.');\n if (parts.length === 3) {\n return parts[2] + '-' + parts[1] + '-' + parts[0];\n }\n\n}\nclass Schedule extends React.Component {\n constructor(props) {\n super(props);\n let schedule;\n if (this.props.schedule && typeof this.props.schedule === 'string' && this.props.schedule[0] === '{') {\n try {\n schedule = JSON.parse(this.props.schedule);\n } catch (e) {\n\n }\n }\n\n if ((!schedule || !Object.keys(schedule).length) && this.props.onChange) {\n setTimeout(() => this.onChange(this.state.schedule, true), 200);\n }\n schedule = schedule || {};\n schedule = Object.assign({}, DEFAULT, schedule);\n schedule.valid.from = schedule.valid.from || this.now2string();\n\n this.refFrom = React.createRef();\n this.refTo = React.createRef();\n this.refOnce = React.createRef();\n\n this.state = {\n schedule,\n desc: this.state2text(schedule)\n };\n\n if (JSON.stringify(schedule) !== this.props.schedule) {\n setTimeout(() => this.props.onChange && this.props.onChange(JSON.stringify(schedule)), 100);\n }\n }\n\n onChange(schedule, force) {\n const isDiff = JSON.stringify(schedule) !== JSON.stringify(this.state.schedule);\n if (force || isDiff) {\n isDiff && this.setState({schedule, desc: this.state2text(schedule)});\n const copy = JSON.parse(JSON.stringify(schedule));\n if (copy.period.once) {\n let once = copy.period.once;\n delete copy.period;\n copy.period = {once};\n delete copy.valid;\n } else\n if (copy.period.days) {\n let days = copy.period.days;\n let dows = copy.period.dows;\n delete copy.period;\n copy.period = {days};\n if (dows && dows !== '[]') {\n copy.period.dows = dows;\n }\n } else\n if (copy.period.weeks) {\n let weeks = copy.period.weeks;\n let dows = copy.period.dows;\n delete copy.period;\n copy.period = {weeks};\n if (dows && dows !== '[]') {\n copy.period.dows = dows;\n }\n } else\n if (copy.period.months) {\n let months = copy.period.months;\n let dates = copy.period.dates;\n delete copy.period;\n copy.period = {months};\n if (dates && dates !== '[]') {\n copy.period.dates = dates;\n }\n } else\n if (copy.period.years) {\n let years = copy.period.years;\n let yearMonth = copy.period.yearMonth;\n let yearDate = copy.period.yearDate;\n delete copy.period;\n copy.period = {years, yearDate};\n if (yearMonth) {\n copy.period.yearMonth = yearMonth;\n }\n }\n\n if (copy.time.exactTime) {\n delete copy.time.end;\n delete copy.time.mode;\n delete copy.time.interval;\n } else {\n delete copy.time.exactTime;\n }\n if (copy.valid) {\n if (!copy.valid.to) {\n delete copy.valid.to;\n }\n if (copy.period.days === 1 || copy.period.weeks === 1 || copy.period.months === 1 || copy.period.years === 1) {\n const from = this.string2date(copy.valid.from);\n const today = new Date();\n today.setHours(0);\n today.setMinutes(0);\n today.setSeconds(0);\n today.setMilliseconds(0);\n if (from <= today) {\n delete copy.valid.from;\n }\n }\n if (!copy.valid.from && !copy.valid.to) {\n delete copy.valid;\n }\n }\n\n this.props.onChange && this.props.onChange(JSON.stringify(copy));\n }\n }\n\n state2text(schedule) {\n let desc = [];\n let validFrom = this.string2date(schedule.valid.from);\n if (schedule.period.once) {\n // once\n let once = this.string2date(schedule.period.once);\n let now = new Date();\n now.setMilliseconds(0);\n now.setSeconds(0);\n now.setMinutes(0);\n now.setHours(0);\n\n //\n if (once < now) {\n // will ne be not executed any more, because start is in the past\n return I18n.t('sch_desc_onceInPast');\n } else {\n // only once\n desc.push(I18n.t('sch_desc_once_on', schedule.period.once));\n }\n } else\n if (schedule.period.days) {\n if (schedule.period.days === 1) {\n if (schedule.period.dows) {\n const dows = JSON.parse(schedule.period.dows);\n if (dows.length === 2 && dows[0] === 0 && dows[1] === 6) {\n // on weekends\n desc.push(I18n.t('sch_desc_onWeekends'));\n } else if (dows.length === 5 && dows[0] === 1 && dows[1] === 2 && dows[2] === 3 && dows[3] === 4 && dows[4] === 5) {\n // on workdays\n desc.push(I18n.t('sch_desc_onWorkdays'));\n } else {\n const tDows = dows.map(day => I18n.t(WEEKDAYS[day]));\n if (tDows.length === 1) {\n // on Monday\n desc.push(I18n.t('sch_desc_onWeekday', tDows[0]));\n } else if (tDows.length === 7) {\n // on every day\n desc.push(I18n.t('sch_desc_everyDay'));\n } else {\n const last = tDows.pop();\n // on Monday and Sunday\n desc.push(I18n.t('sch_desc_onWeekdays', tDows.join(', '), last));\n }\n }\n } else {\n desc.push(I18n.t('sch_desc_everyDay'));\n }\n } else {\n desc.push(I18n.t('sch_desc_everyNDay', schedule.period.days));\n }\n } else\n if (schedule.period.weeks) {\n if (schedule.period.weeks === 1) {\n desc.push(I18n.t('sch_desc_everyWeek'));\n } else {\n desc.push(I18n.t('sch_desc_everyNWeeks', schedule.period.weeks));\n }\n\n if (schedule.period.dows) {\n const dows = JSON.parse(schedule.period.dows);\n if (dows.length === 2 && dows[0] === 0 && dows[1] === 6) {\n // on weekends\n desc.push(I18n.t('sch_desc_onWeekends'));\n } else if (dows.length === 5 && dows[0] === 1 && dows[1] === 2 && dows[2] === 3 && dows[3] === 4 && dows[4] === 5) {\n // on workdays\n desc.push(I18n.t('sch_desc_onWorkdays'));\n } else {\n const tDows = dows.map(day => I18n.t(WEEKDAYS[day]));\n if (tDows.length === 1) {\n // on Monday\n desc.push(I18n.t('sch_desc_onWeekday', tDows[0]));\n } else if (tDows.length === 7) {\n // on every day\n desc.push(I18n.t('sch_desc_everyDay'));\n } else {\n const last = tDows.pop();\n // on Monday and Sunday\n desc.push(I18n.t('sch_desc_onWeekdays', tDows.join(', '), last));\n }\n }\n } else {\n return I18n.t('sch_desc_never');\n }\n } else\n if (schedule.period.months) {\n if (schedule.period.dates) {\n const dates = JSON.parse(schedule.period.dates);\n if (dates.length === 1) {\n // in 1 of month\n desc.push(I18n.t('sch_desc_onDate', dates[0]));\n } else if (dates.length === 31) {\n desc.push(I18n.t('sch_desc_onEveryDate'));\n } else if (!dates.length) {\n return I18n.t('sch_desc_never');\n } else {\n const last = dates.pop();\n // in 1 and 4 of month\n desc.push(I18n.t('sch_desc_onDates', dates.join(', '), last));\n }\n } else {\n desc.push(I18n.t('sch_desc_onEveryDate'));\n }\n\n if (schedule.period.months === 1) {\n desc.push(I18n.t('sch_desc_everyMonth'));\n } else if (typeof schedule.period.months === 'number') {\n desc.push(I18n.t('sch_desc_everyNMonths', schedule.period.months));\n } else {\n const months = JSON.parse(schedule.period.months);\n const tMonths = months.map(month => I18n.t(MONTHS[month - 1]));\n if (!tMonths.length) {\n // in January\n return I18n.t('sch_desc_never');\n } else if (tMonths.length === 1) {\n // in January\n desc.push(I18n.t('sch_desc_onMonth', tMonths[0]));\n } else if (tMonths.length === 12) {\n // every month\n desc.push(I18n.t('sch_desc_everyMonth'));\n } else {\n const last = tMonths.pop();\n // in January and May\n desc.push(I18n.t('sch_desc_onMonths', tMonths.join(', '), last));\n }\n }\n }\n else\n if (schedule.period.years) {\n if (schedule.period.years === 1) {\n desc.push(I18n.t('sch_desc_everyYear'));\n } else {\n desc.push(I18n.t('sch_desc_everyNYears', schedule.period.years));\n }\n desc.push(I18n.t('sch_desc_onDate', schedule.period.yearDate, schedule.period.yearMonth ? I18n.t(MONTHS[schedule.period.yearMonth - 1]) : I18n.t('sch_desc_everyMonth')));\n }\n\n // time\n if (schedule.time.exactTime) {\n if (ASTRO.indexOf(schedule.time.start) !== -1) {\n // at sunset\n desc.push(I18n.t('sch_desc_atTime', I18n.t('sch_astro_' + schedule.time.start)));\n } else {\n // at HH:MM\n desc.push(I18n.t('sch_desc_atTime', schedule.time.start));\n }\n } else {\n if (schedule.time.mode === PERIODS.minutes) {\n if (schedule.time.interval === 1) {\n // every minute\n desc.push(I18n.t('sch_desc_everyMinute'));\n } else {\n // every N minutes\n desc.push(I18n.t('sch_desc_everyNMinutes', schedule.time.interval));\n }\n } else {\n if (schedule.time.interval === 1) {\n // every minute\n desc.push(I18n.t('sch_desc_everyHour'));\n } else {\n // every N minutes\n desc.push(I18n.t('sch_desc_everyNHours', schedule.time.interval));\n }\n }\n const start = ASTRO.indexOf(schedule.time.start) !== -1 ? I18n.t('sch_astro_' + schedule.time.start) : schedule.time.start;\n const end = ASTRO.indexOf(schedule.time.end) !== -1 ? I18n.t('sch_astro_' + schedule.time.end) : schedule.time.end;\n if (start !== '00:00' || (end !== '24:00' && end !== '23:59')) {\n // from HH:mm to HH:mm\n desc.push(I18n.t('sch_desc_intervalFromTo', start, end));\n }\n }\n\n if (!schedule.period.once) {\n // valid\n if (validFrom.getTime() > Date.now() && schedule.valid.to) {\n // from XXX to XXXX\n desc.push(I18n.t('sch_desc_validFromTo', schedule.valid.from, schedule.valid.to));\n } else if (validFrom.getTime() > Date.now()) {\n // from XXXX\n desc.push(I18n.t('sch_desc_validFrom', schedule.valid.from));\n } else if (schedule.valid.to) {\n // till XXXX\n desc.push(I18n.t('sch_desc_validTo', schedule.valid.to));\n }\n }\n return desc.join(' ');\n }\n\n getTimePeriodElements() {\n const schedule = this.state.schedule;\n let wholeDay = false;\n let day = false;\n let night = false;\n let fromTo = true;\n if (schedule.time.start === '00:00' && schedule.time.end === '24:00') {\n wholeDay = true;\n fromTo = false;\n } else if (schedule.time.start === 'sunrise') {\n day = true;\n fromTo = false;\n } else if (schedule.time.start === 'sunset') {\n night = true;\n fromTo = false;\n }\n\n return (\n
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.exactTime = false;\n this.onChange(_schedule);\n }}/>} label={I18n.t('sch_intervalTime')} />\n
\n
\n
\n {!schedule.time.exactTime && (
\n
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = '00:00';\n _schedule.time.end = '23:59';\n this.onChange(_schedule);\n }}/>} label={!fromTo ? I18n.t('sch_fromTo') : ''} />\n {fromTo && [\n ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = e.target.value;\n this.onChange(_schedule);\n }}\n InputLabelProps={{shrink: true,}}\n label={I18n.t('sch_from')}\n margin=\"normal\"\n />),\n ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.end = e.target.value;\n this.onChange(_schedule);\n }}\n InputLabelProps={{shrink: true,}}\n label={I18n.t('sch_to')}\n margin=\"normal\"\n />)\n ]}\n
\n
)}\n\n {!schedule.time.exactTime && (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = '00:00';\n _schedule.time.end = '24:00';\n this.onChange(_schedule);\n }}/>} label={I18n.t('sch_wholeDay')} />
) }\n\n {!schedule.time.exactTime && (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = 'sunrise';\n _schedule.time.end = 'sunset';\n this.onChange(_schedule);\n }}/>} label={I18n.t('sch_astroDay')} />
) }\n\n {!schedule.time.exactTime && (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = 'sunset';\n _schedule.time.end = 'sunrise';\n this.onChange(_schedule);\n }}/>} label={I18n.t('sch_astroNight')} />
) }\n
\n {!schedule.time.exactTime && this.getPeriodSettingsMinutes()}\n
\n
);\n }\n\n getTimeExactElements() {\n const isAstro = ASTRO.indexOf(this.state.schedule.time.start) !== -1;\n\n return (
\n
\n {\n const schedule = JSON.parse(JSON.stringify(this.state.schedule));\n schedule.time.exactTime = true;\n this.onChange(schedule);\n }}/>} label={I18n.t('sch_exactTime')} />\n
\n {this.state.schedule.time.exactTime &&\n (
)\n }\n {this.state.schedule.time.exactTime && !isAstro &&\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = e.target.value;\n this.onChange(_schedule);\n }}\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />
)\n }\n
)\n }\n\n getDivider() {\n return (
);\n }\n\n getPeriodModes() {\n const schedule = this.state.schedule;\n const isOnce = !schedule.period.dows && !schedule.period.months && !schedule.period.dates && !schedule.period.years && !schedule.period.days && !schedule.period.weeks;\n if (isOnce && !schedule.period.once) {\n schedule.period.once = this.now2string(true);\n }\n\n return [\n // ----- once ---\n (
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.once = _schedule.period.once || this.now2string(true);\n _schedule.period.dows = '';\n _schedule.period.months = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodOnce')} />\n
\n {isOnce && (
\n { {\n this.timerOnce && clearTimeout(this.timerOnce);\n\n this.refOnce.current.style.background = '#ff000030';\n this.timerOnce = setTimeout(value => {\n this.timerOnce = null;\n this.refOnce.current.style.background = '';\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const date = this.string2date(value);\n if (date.toString() !== 'Invalid Date') {\n _schedule.period.once = padding(date.getDate()) + '.' + padding(date.getMonth() + 1) + '.' + date.getFullYear();\n this.onChange(_schedule);\n }\n }, 1500, e.target.value);\n }}\n InputLabelProps={{shrink: true,}}\n label={I18n.t('sch_at')}\n margin=\"normal\"\n />}\n
)}\n
),\n\n\n // ----- days ---\n (
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = 1;\n _schedule.period.dows = '';\n _schedule.period.months = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodDaily')} />\n
\n
\n {this.getPeriodSettingsDaily()}\n {schedule.period.days ? this.getPeriodSettingsWeekdays() : null}\n
\n
),\n\n\n // ----- days of weeks ---\n /*!schedule.period.days && (\n
\n
\n {\n const schedule = JSON.parse(JSON.stringify(this.state.schedule));\n schedule.period.dows = schedule.period.dows ? '' : '[0,1,2,3,4,5,6]';\n this.onChange(schedule);\n }}/>)}\n label={I18n.t('sch_periodWeekdays')} />\n
\n
\n {this.getPeriodSettingsWeekdays()}\n
\n
),\n*/\n // ----- weeks ---\n (
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = schedule.period.weeks ? 0 : 1;\n _schedule.period.dows = schedule.period.dows || '[0]';\n _schedule.period.months = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodWeekly')} />\n
\n
\n
{this.getPeriodSettingsWeekly()}
\n
{this.state.schedule.period.weeks ? this.getPeriodSettingsWeekdays() : null}
\n
\n
),\n\n\n // ----- months ---\n (
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = 1;\n _schedule.period.dows = '';\n _schedule.period.dates = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodMonthly')} />\n
\n
\n {this.getPeriodSettingsMonthly()}\n {schedule.period.months ? (
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = _schedule.period.months || 1;\n const dates = [];\n for (let i = 1; i <= 31; i++) {\n dates.push(i);\n }\n _schedule.period.dates = _schedule.period.dates || JSON.stringify(dates);\n _schedule.period.dows = '';\n _schedule.period.years = 0;\n _schedule.period.yearDate = 0;\n _schedule.period.yearMonth = 0;\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodDates')} />
\n
\n {this.getPeriodSettingsDates()}\n
\n
) : null}\n
\n
),\n\n\n // ----- years ---\n (
\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = 1;\n _schedule.period.yearDate = 1;\n _schedule.period.yearMonth = 1;\n _schedule.period.dows = '';\n _schedule.period.months = 0;\n _schedule.period.dates = '';\n _schedule.period.weeks = 0;\n _schedule.period.days = 0;\n _schedule.period.once = '';\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodYearly')} />\n
\n
\n
{this.getPeriodSettingsYearly()}
\n {!!schedule.period.years && (
\n {I18n.t('sch_on')}\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.yearDate = parseInt(e.target.value, 10);\n if (_schedule.period.yearDate < 1) _schedule.period.yearDate = 31;\n if (_schedule.period.yearDate > 31) _schedule.period.yearDate = 1;\n this.onChange(_schedule);\n }} />\n \n
)}\n
\n
),\n ];\n }\n\n getPeriodSettingsMinutes() {\n return (
\n \n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.interval = parseInt(e.target.value, 10);\n this.onChange(_schedule);\n }} />\n \n
);\n }\n\n getPeriodSettingsWeekdays() {\n // || this.state.schedule.period.dows === '[1, 2, 3, 4, 5]' || this.state.schedule.period.dows === '[0, 6]'\n const schedule = this.state.schedule;\n const isSpecific = schedule.period.dows && schedule.period.dows !== '[1, 2, 3, 4, 5]' && schedule.period.dows !== '[0, 6]';\n return [\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dows = '[1, 2, 3, 4, 5]';\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodWorkdays')} />
),\n\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dows = '[0, 6]';\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodWeekend')} />
),\n\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dows = '[0,1,2,3,4,5,6]';\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodWeekdays')} />\n {isSpecific && (schedule.period.days === 1 || schedule.period.weeks) && (\n {[1,2,3,4,5,6,0].map(i =>\n ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n let dows;\n try {\n dows = JSON.parse(_schedule.period.dows);\n } catch (e) {\n dows = [];\n }\n if (e.target.checked && dows.indexOf(i) === -1) {\n dows.push(i);\n } else if (!e.target.checked && dows.indexOf(i) !== -1) {\n dows.splice(dows.indexOf(i), 1);\n }\n dows.sort((a, b) => a - b);\n _schedule.period.dows = JSON.stringify(dows);\n if (_schedule.period.days) {\n _schedule.period.days = 1;\n }\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t(WEEKDAYS[i])}\n />))}\n )}\n
),\n ];\n }\n\n getPeriodSettingsDaily() {\n if (!this.state.schedule.period.days) {\n return;\n }\n const schedule = this.state.schedule;\n return [\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = 1;\n _schedule.period.dows = '';\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodEveryDay')} />
),\n (
1} onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = 2;\n _schedule.period.dows = '';\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_periodEvery')} />\n {schedule.period.days > 1 && [( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.days = parseInt(e.target.value, 10);\n _schedule.period.dows = '';\n this.onChange(_schedule);\n }} />), ({I18n.t('sch_periodDay')})]}\n
),\n ];\n }\n\n getPeriodSettingsWeekly() {\n if (!this.state.schedule.period.weeks) {\n return;\n }\n const schedule = this.state.schedule;\n return [\n (
\n
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = 1;\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodEveryWeek')} />
\n
\n 1} onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = 2;\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodEvery')} />\n {schedule.period.weeks > 1 && [( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = parseInt(e.target.value, 10);\n this.onChange(_schedule);\n }} />), ({I18n.t('sch_periodWeek')})]}\n
\n
),\n ];\n }\n\n getPeriodSettingsDates() {\n if (!this.state.schedule.period.dates) {\n return;\n }\n const schedule = this.state.schedule;\n\n const dates = [];\n for (let i = 1; i <= 31; i++) {\n dates.push(i);\n }\n\n const parsedDates = JSON.parse(schedule.period.dates);\n\n return (\n
\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const dates = [];\n for (let i = 1; i <= 31; i++) {\n dates.push(i);\n }\n _schedule.period.dates = JSON.stringify(dates);\n this.onChange(_schedule);\n }}\n />\n } label={I18n.t('sch_all')}\n />\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.dates = '[]';\n this.onChange(_schedule);\n }}\n />\n } label={I18n.t('sch_no_one')}\n />\n {parsedDates.length !== 31 && !!parsedDates.length && ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const result = [];\n const parsedDates = JSON.parse(_schedule.period.dates);\n for (let i = 1; i <= 31; i++) {\n if (parsedDates.indexOf(i) === -1) {\n result.push(i);\n }\n }\n result.sort((a, b) => a - b);\n _schedule.period.dates = JSON.stringify(result);\n this.onChange(_schedule);\n }}\n />\n } label={I18n.t('sch_invert')}\n />)}\n \n {dates.map(i =>\n ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n let dates;\n try {\n dates = JSON.parse(_schedule.period.dates);\n } catch (e) {\n dates = [];\n }\n if (e.target.checked && dates.indexOf(i) === -1) {\n dates.push(i);\n } else if (!e.target.checked && dates.indexOf(i) !== -1) {\n dates.splice(dates.indexOf(i), 1);\n }\n dates.sort((a, b) => a - b);\n _schedule.period.dates = JSON.stringify(dates);\n this.onChange(_schedule);\n }}\n />\n } label={i < 10 ? [(0), ({i})] : i}\n />))}\n );\n }\n\n getPeriodSettingsMonthly() {\n if (!this.state.schedule.period.months) {\n return;\n }\n const schedule = this.state.schedule;\n const parsedMonths = typeof schedule.period.months === 'string' ? JSON.parse(schedule.period.months) : [];\n\n return [\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = 1;\n this.onChange(schedule);\n }}/>)\n }\n label={I18n.t('sch_periodEveryMonth')} />
),\n (
1} onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = 2;\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodEvery')} />\n {typeof schedule.period.months === 'number' && schedule.period.months > 1 && [( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = parseInt(e.target.value, 10);\n if (_schedule.period.months < 1) _schedule.period.months = 1;\n this.onChange(_schedule);\n }} />), ({I18n.t('sch_periodMonth')})]}\n
),\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = '[1,2,3,4,5,6,7,8,9,10,11,12]';\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodSpecificMonths')} />\n {typeof schedule.period.months === 'string' &&\n (\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const months = [];\n for (let i = 1; i <= 12; i++) {\n months.push(i);\n }\n _schedule.period.months = JSON.stringify(months);\n this.onChange(_schedule);\n }}\n />\n } label={I18n.t('sch_all')}\n />\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.months = '[]';\n this.onChange(_schedule);\n }}\n />\n } label={I18n.t('sch_no_one')}\n />\n {parsedMonths.length !== 12 && !!parsedMonths.length && ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const result = [];\n const parsedMonths = JSON.parse(_schedule.period.months);\n for (let i = 1; i <= 12; i++) {\n if (parsedMonths.indexOf(i) === -1) {\n result.push(i);\n }\n }\n result.sort((a, b) => a - b);\n _schedule.period.months = JSON.stringify(result);\n this.onChange(_schedule);\n }}\n />\n } label={I18n.t('sch_invert')}\n />)}\n \n {MONTHS.map((month, i) => ( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n let months;\n try {\n months = JSON.parse(_schedule.period.months);\n } catch (e) {\n months = [];\n }\n if (e.target.checked && months.indexOf(i + 1) === -1) {\n months.push(i + 1);\n } else if (!e.target.checked && months.indexOf(i + 1) !== -1) {\n months.splice(months.indexOf(i + 1), 1);\n }\n months.sort((a, b) => a - b);\n _schedule.period.months = JSON.stringify(months);\n this.onChange(_schedule);\n }}\n />\n }\n label={I18n.t(month)}\n />))}\n )}\n ),\n ];\n }\n\n getPeriodSettingsYearly() {\n if (!this.state.schedule.period.years) {\n return;\n }\n const schedule = this.state.schedule;\n return [\n (
{\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = 1;\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodEveryYear')} />
),\n (
1} onClick={() => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = 2;\n this.onChange(_schedule);\n }}/>)\n }\n label={I18n.t('sch_periodEvery')} />\n {schedule.period.years > 1 && [( {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.years = parseInt(e.target.value, 10);\n if (_schedule.period.years < 1) _schedule.period.years = 1;\n this.onChange(_schedule);\n }} />), ({I18n.t('sch_periodYear')})]}\n
),\n ];\n }\n\n now2string(isEnd) {\n const d = new Date();\n d.setHours(0);\n d.setMinutes(0);\n d.setSeconds(0);\n d.setMilliseconds(0);\n if (isEnd) {\n d.setDate(d.getDate() + 2);\n d.setMilliseconds(d.getMilliseconds() - 1);\n }\n\n return padding(d.getDate()) + '.' + padding(d.getMonth() + 1) + '.' + padding(d.getFullYear());\n }\n\n string2date(str) {\n let parts = str.split('.'); // 31.12.2019\n if (parts.length === 1) {\n parts = str.split('-'); // 2018-12-31\n return new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10));\n } else {\n return new Date(parseInt(parts[2], 10), parseInt(parts[1], 10) - 1, parseInt(parts[0], 10));\n }\n }\n\n getValidSettings() {\n const schedule = this.state.schedule;\n // ----- from ---\n return (\n
\n
\n {I18n.t('sch_valid')}\n {I18n.t('sch_validFrom')}\n
\n
\n {\n this.timerFrom && clearTimeout(this.timerFrom);\n\n this.refFrom.current.style.background = '#ff000030';\n\n this.timerFrom = setTimeout(value => {\n this.timerFrom = null;\n this.refFrom.current.style.background = '';\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const date = this.string2date(value);\n if (date.toString() !== 'Invalid Date') {\n _schedule.valid.from = padding(date.getDate()) + '.' + padding(date.getMonth() + 1) + '.' + date.getFullYear();\n this.onChange(_schedule);\n }\n }, 1500, e.target.value);\n }}\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />\n {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.valid.to = _schedule.valid.to ? '' : this.now2string(true);\n this.onChange(_schedule);\n }}/>)}\n label={I18n.t('sch_validTo')} />\n {!!schedule.valid.to && (\n {\n this.timerTo && clearTimeout(this.timerTo);\n\n this.refTo.current.style.background = '#ff000030';\n this.timerTo = setTimeout(value => {\n this.timerTo = null;\n this.refTo.current.style.background = '';\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n const date = this.string2date(value);\n if (date.toString() !== 'Invalid Date') {\n _schedule.valid.to = padding(date.getDate()) + '.' + padding(date.getMonth() + 1) + '.' + date.getFullYear();\n this.onChange(_schedule);\n }\n }, 1500, e.target.value);\n }}\n InputLabelProps={{shrink: true,}}\n margin=\"normal\"\n />)}\n
\n
\n );\n }\n\n render() {\n return (
\n
{this.state.desc}
\n
\n
{I18n.t('sch_time')}
\n {this.getTimePeriodElements()}\n {this.getTimeExactElements()}\n {this.getDivider()}\n {I18n.t('sch_period')}
\n {this.getPeriodModes()}\n {!this.state.schedule.period.once && this.getDivider()}\n {!this.state.schedule.period.once && this.getValidSettings()}\n \n
);\n }\n}\n\nSchedule.propTypes = {\n schedule: PropTypes.string,\n onChange: PropTypes.func\n};\n\nexport default withStyles(styles)(Schedule);\n\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from '@material-ui/core/styles/index';\nimport Button from '@material-ui/core/Button';\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 Radio from '@material-ui/core/Radio';\n\nimport IconOk from '@material-ui/icons/Check';\nimport IconCancel from '@material-ui/icons/Cancel';\n\nimport ComplexCron from '../Components/ComplexCron';\nimport SimpleCron from '../Components/simple-cron/SimpleCron';\nimport Schedule from '../Components/Schedule';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\n// Generate cron expression\n\nconst styles = theme => ({\n headerID: {\n fontWeight: 'bold',\n fontStyle: 'italic'\n },\n radio: {\n display: 'inline-block'\n },\n dialogPaper: {\n height: 'calc(100% - 96px)'\n },\n buttonIcon: {\n marginRight: theme.spacing(1),\n }\n});\n\nclass DialogCron extends React.Component {\n constructor(props) {\n super(props);\n let cron;\n if (this.props.cron && typeof this.props.cron === 'string' && this.props.cron.replace(/^[\"']/, '')[0] !== '{') {\n cron = this.props.cron.replace(/['\"]/g, '').trim();\n } else {\n cron = this.props.cron || '{}';\n if (typeof cron === 'string') {\n cron = cron.replace(/^[\"']/, '').replace(/[\"']\\n?$/, '');\n }\n }\n\n this.state = {\n cron,\n mode: this.props.simple ?\n 'simple' :\n (typeof cron === 'object' || cron[0] === '{' ?\n 'wizard' :\n (SimpleCron.cron2state(this.props.cron || '* * * * *') ? 'simple' : 'complex'))\n };\n }\n\n handleCancel() {\n this.props.onClose();\n }\n\n handleOk() {\n this.props.onOk(this.state.cron);\n this.props.onClose();\n }\n\n setMode(mode) {\n this.setState({mode});\n }\n\n render() {\n return (\n
\n );\n }\n}\n\nDialogCron.propTypes = {\n classes: PropTypes.object,\n onClose: PropTypes.func,\n onOk: PropTypes.func.isRequired,\n title: PropTypes.string,\n cron: PropTypes.string,\n cancel: PropTypes.string,\n ok: PropTypes.string,\n simple: PropTypes.bool,\n language: PropTypes.string\n\n};\n\nexport default withStyles(styles)(DialogCron);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\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';\n\nimport IconSave from '@material-ui/icons/Save';\nimport IconCancel from '@material-ui/icons/Cancel';\n\nimport ScriptEditorComponent from '../Components/ScriptEditorVanilaMonaco';\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n textArea: {\n width: 'calc(100% - 10px)',\n resize: 'none'\n },\n dialog: {\n height: '95%'\n },\n fullHeight: {\n height: '100%',\n overflow: 'hidden'\n },\n args: {\n color: theme.palette.type === 'dark' ? 'white' : 'black',\n height: 30,\n width: '100%',\n fontSize: 16\n },\n argsTitle: {\n color: theme.palette.type === 'dark' ? 'white' : 'black',\n fontWeight: 'bold'\n },\n buttonIcon: {\n marginRight: theme.spacing(1),\n }\n});\n\nclass DialogScriptEditor extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n source: this.props.source,\n };\n if (!this.state.source && this.props.isReturn) {\n this.state.source = '\\nreturn false';\n }\n\n }\n\n componentDidMount() {\n setTimeout(() => {\n try {\n window.document.getElementById('source-text-area').focus();\n } catch (e) {\n\n }\n }, 100);\n }\n\n handleCancel () {\n this.props.onClose(false);\n }\n\n handleOk () {\n if (this.props.isReturn && this.state.source.indexOf('return ') === -1) {\n\n } else {\n this.props.onClose(this.state.source);\n }\n }\n\n onChange(value) {\n this.setState({source: value});\n }\n\n render() {\n const classes = this.props.classes;\n\n return
;\n }\n}\n\nDialogScriptEditor.propTypes = {\n classes: PropTypes.object.isRequired,\n adapterName: PropTypes.string.isRequired,\n runningInstances: PropTypes.object.isRequired,\n onClose: PropTypes.func,\n source: PropTypes.string,\n args: PropTypes.string,\n isReturn: PropTypes.bool,\n themeType: PropTypes.string,\n socket: PropTypes.object\n};\n\nexport default withStyles(styles)(DialogScriptEditor);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\n\nimport Toolbar from '@material-ui/core/Toolbar';\nimport {withStyles} from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport Badge from '@material-ui/core/Badge';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Checkbox from '@material-ui/core/Checkbox';\n\nimport {MdSave as IconSave} from 'react-icons/md';\nimport {MdCancel as IconCancel} from 'react-icons/md';\nimport {MdClose as IconClose} from 'react-icons/md';\nimport {MdRefresh as IconRestart} from 'react-icons/md';\nimport {MdInput as IconDoEdit} from 'react-icons/md';\nimport {FaClock as IconCron} from 'react-icons/fa';\nimport {FaClipboardList as IconSelectId} from 'react-icons/fa';\nimport {FaFileExport as IconExport} from 'react-icons/fa';\nimport {FaFileImport as IconImport} from 'react-icons/fa';\nimport {FaFlagCheckered as IconCheck} from 'react-icons/fa';\nimport {MdGpsFixed as IconLocate} from 'react-icons/md';\nimport {MdClearAll as IconCloseAll} from 'react-icons/md';\nimport {MdBuild as IconDebugMenu} from 'react-icons/md';\nimport {MdBugReport as IconDebug} from 'react-icons/md';\nimport {MdPlaylistAddCheck as IconVerbose} from 'react-icons/md';\n\nimport ImgJS from './assets/js.png';\nimport ImgBlockly from './assets/blockly.png';\nimport ImgTypeScript from './assets/typescript.png';\nimport ImgBlockly2Js from './assets/blockly2js.png'\n\nimport I18n from '@iobroker/adapter-react/i18n';\nimport ScriptEditorComponent from './Components/ScriptEditorVanilaMonaco';\nimport BlocklyEditor from './Components/BlocklyEditor';\nimport DialogConfirm from '@iobroker/adapter-react/Dialogs/Confirm';\nimport DialogSelectID from '@iobroker/adapter-react/Dialogs/SelectID';\nimport DialogCron from './Dialogs/Cron';\nimport DialogScriptEditor from './Dialogs/ScriptEditor';\n\n\nconst images = {\n 'Blockly': ImgBlockly,\n 'Javascript/js': ImgJS,\n def: ImgJS,\n 'TypeScript/ts': ImgTypeScript,\n};\n\nconst MENU_ITEM_HEIGHT = 48;\nconst COLOR_DEBUG = '#02a102';\nconst COLOR_VERBOSE = '#70aae9';\n\nconst styles = theme => ({\n\n toolbar: {\n minHeight: 38,//Theme.toolbar.height,\n boxShadow: '0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12)'\n },\n toolbarButtons: {\n padding: 4,\n marginLeft: 4\n },\n editorDiv: {\n height: `calc(100% - ${theme.toolbar.height + 38/*Theme.toolbar.height */ + 5}px)`,\n width: '100%',\n overflow: 'hidden',\n position: 'relative'\n },\n textButton: {\n marginRight: 10,\n minHeight: 24,\n padding: '6px 16px'\n },\n saveButton: {\n background: '#ff9900'\n },\n textIcon: {\n marginLeft: theme.spacing(1),\n },\n tabIcon: {\n width: 24,\n height: 24,\n verticalAlign: 'middle',\n marginBottom: 2,\n marginRight: 2,\n borderRadius: 3\n },\n hintIcon: {\n //fontSize: 32,\n padding: '0 8px 0 8px'\n },\n hintText: {\n //fontSize: 18\n },\n hintButton: {\n marginTop: 8,\n marginLeft: 20\n },\n tabMenuButton: {\n position: 'absolute',\n top: 0,\n right: 0,\n },\n tabChanged: {\n color: theme.palette.secondary.main\n },\n tabText: {\n maxWidth: 130,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n display: 'inline-block',\n verticalAlign: 'middle',\n },\n tabChangedIcon: {\n color: '#FF0000',\n fontSize: 16\n },\n closeButton: {\n position: 'absolute',\n top: 8,\n right: 0,\n zIndex: 10,\n padding: 8,\n cursor: 'pointer'\n },\n notRunning: {\n color: '#ffbc00',\n marginRight: theme.spacing(1)\n },\n tabButton: {\n\n },\n tabButtonWrapper: {\n display: 'inline-block',\n },\n menuIcon: {\n width: 18,\n height: 18,\n borderRadius: 2,\n marginRight: 5\n },\n});\n\nclass Editor extends React.Component {\n constructor(props) {\n super(props);\n\n const selected = window.localStorage.getItem('Editor.selected') || '';\n let editing = window.localStorage.getItem('Editor.editing') || '[]';\n try {\n editing = JSON.parse(editing);\n } catch (e) {\n editing = [];\n }\n if (selected && editing.indexOf(selected) === -1) {\n editing.push(selected);\n }\n\n this.tabsRef = React.createRef();\n\n this.state = {\n selected: selected,\n editing: editing, // array of opened scripts\n changed: {}, // for every script\n blockly: null,\n debugEnabled: false,\n verboseEnabled: false,\n showBlocklyCode: false,\n showSelectId: false,\n showCron: false,\n showScript: false,\n insert: '',\n searchText: '',\n themeType: this.props.themeType,\n visible: props.visible,\n cmdToBlockly: '',\n menuOpened: !!this.props.menuOpened,\n menuTabsOpened: false,\n menuTabsAnchorEl: null,\n runningInstances: this.props.runningInstances || {},\n showDebugMenu: false,\n toast: '',\n instancesLoaded: false,\n };\n\n this.setChangedInAdmin();\n\n /* ----------------------- */\n // required by selectIdDialog in Blockly\n this.selectId = {\n initValue: null,\n callback: null\n };\n this.cron = {\n initValue: null,\n callback: null\n };\n this.scriptDialog = {\n initValue: null,\n callback: null,\n args: null,\n isReturn: false\n };\n\n window.systemLang = I18n.getLanguage();\n window.main = {\n objects: {},\n getObject: (id, cb) => this.props.socket.getObject(id).then(obj => cb && cb(null, obj)).catch(err => cb && cb(err)),\n instances: [],\n selectIdDialog: (initValue, cb) => {\n this.selectId.callback = cb;\n this.selectId.initValue = initValue;\n this.setState({showSelectId: true});\n },\n cronDialog: (initValue, cb) => {\n this.cron.callback = cb;\n this.cron.initValue = initValue;\n this.setState({showCron: true});\n },\n showScriptDialog: (value, args, isReturn, cb) => {\n this.scriptDialog.callback = cb;\n this.scriptDialog.initValue = value;\n this.scriptDialog.args = args;\n this.scriptDialog.isReturn = isReturn || false;\n this.setState({showScript: true});\n }\n };\n\n this.objects = props.objects;\n /* ----------------------- */\n\n this.scripts = {};\n\n if (!this.state.selected && this.state.editing.length) {\n this.state.selected = this.state.editing[0];\n }\n\n this.getAllAdapterInstances()\n .then(() => {\n // to enable logging\n if (this.props.onSelectedChange && this.state.selected) {\n setTimeout(() => this.props.onSelectedChange(this.state.selected, this.state.editing), 100);\n }\n });\n }\n\n getAllAdapterInstances() {\n return this.props.socket.getAdapterInstances(true)\n .then(instanceObjects => {\n const objects = {};\n const instances = instanceObjects.map(obj => {\n objects[obj._id] = obj;\n return obj._id;\n });\n window.main.objects = objects;\n window.main.instances = instances;\n this.setState({instancesLoaded: true});\n });\n }\n\n onInstanceChanged = (id, obj) => {\n if (!id) {\n return;\n }\n\n if (!obj && window.main.instances.includes[id]) {\n delete window.main.objects[id];\n const pos = window.main.instances.indexOf(id);\n window.main.instances.splice(pos, 1);\n } else\n if (obj && obj.type === 'instance') {\n // update instances\n if (!window.main.instances.includes(id)) {\n window.main.instances.push(id);\n window.main.instances.sort();\n }\n window.main.objects[id] = obj;\n }\n };\n\n setChangedInAdmin() {\n const isChanged = Object.keys(this.state.changed).find(id => this.state.changed[id]);\n\n if (typeof window.parent !== 'undefined' && window.parent) {\n window.parent.configNotSaved = isChanged;\n }\n }\n\n componentDidMount() {\n window.addEventListener('beforeunload', this.onBrowserClose, false);\n this.props.socket.subscribeObject('system.adapter.*', this.onInstanceChanged);\n }\n\n componentWillUnmount() {\n window.removeEventListener('beforeunload', this.onBrowserClose);\n this.props.socket.unsubscribeObject('system.adapter.*', this.onInstanceChanged);\n }\n\n onBrowserClose = e => {\n const isChanged = Object.keys(this.scripts).find(id =>\n JSON.stringify(this.scripts[id]) !== JSON.stringify(this.props.objects[id].common));\n\n if (!!isChanged) {\n console.log('Script ' + console.log('Script ' + JSON.stringify(this.scripts[isChanged])));\n const message = I18n.t('Configuration not saved.');\n e = e || window.event;\n // For IE and Firefox\n if (e) {\n e.returnValue = message;\n }\n\n // For Safari\n return message;\n }\n };\n\n removeNonExistingScripts(nextProps, newState) {\n nextProps = nextProps || this.props;\n newState = newState || {};\n\n let _changed = false;\n if (this.state.editing) {\n const isAnyNonExists = this.state.editing.find(id => !nextProps.objects[id]);\n\n if (isAnyNonExists) {\n // remove non-existing scripts\n const editing = JSON.parse(JSON.stringify(this.state.editing));\n for (let i = editing.length - 1; i >= 0; i--) {\n if (!this.objects[editing[i]]) {\n _changed = true;\n editing.splice(i, 1);\n }\n }\n if (_changed) {\n newState.editing = editing;\n }\n if (this.state.selected && !this.objects[this.state.selected]) {\n _changed = true;\n newState.selected = editing[0] || '';\n if (this.scripts[newState.selected]) {\n if (this.state.blockly !== (this.scripts[newState.selected].engineType === 'Blockly')) {\n newState.blockly = this.scripts[newState.selected].engineType === 'Blockly';\n _changed = true;\n }\n if (this.state.verboseEnabled !== this.scripts[newState.selected].verbose) {\n newState.verboseEnabled = this.scripts[newState.selected].verbose;\n _changed = true;\n }\n if (this.state.debugEnabled !== this.scripts[newState.selected].debug) {\n newState.debugEnabled = this.scripts[newState.selected].debug;\n _changed = true;\n }\n }\n }\n }\n }\n return _changed;\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n const newState = {};\n let _changed = false;\n if (JSON.stringify(nextProps.runningInstances) !== JSON.stringify(this.state.runningInstances)) {\n _changed = true;\n newState.runningInstances = nextProps.runningInstances;\n }\n\n if (this.state.menuOpened !== nextProps.menuOpened) {\n newState.menuOpened = nextProps.menuOpened;\n _changed = true;\n }\n\n if (this.state.themeType !== nextProps.themeType) {\n newState.themeType = nextProps.themeType;\n _changed = true;\n }\n\n // check if all opened files still exists\n if (this.removeNonExistingScripts(nextProps, newState)) {\n _changed = true;\n }\n\n // update search text\n if (this.state.searchText !== nextProps.searchText) {\n newState.searchText = nextProps.searchText;\n _changed = true;\n }\n\n // if objects read\n if (this.objects !== nextProps.objects) {\n this.objects = nextProps.objects;\n window.main.objects = nextProps.objects;\n\n // update all scripts\n Object.keys(this.scripts).forEach(id => {\n const source = this.scripts[id].source;\n this.scripts[id] = JSON.parse(JSON.stringify(this.objects[id].common));\n this.scripts[id].source = source;\n });\n\n // if script is blockly\n if (this.state.selected && this.objects[this.state.selected]) {\n this.scripts[this.state.selected] = this.scripts[this.state.selected] || JSON.parse(JSON.stringify(this.objects[this.state.selected].common));\n if (this.state.blockly !== (this.scripts[this.state.selected].engineType === 'Blockly')) {\n newState.blockly = this.scripts[this.state.selected].engineType === 'Blockly';\n _changed = true;\n }\n if (this.state.verboseEnabled !== this.scripts[this.state.selected].verbose) {\n newState.verboseEnabled = this.scripts[this.state.selected].verbose;\n _changed = true;\n }\n if (this.state.debugEnabled !== this.scripts[this.state.selected].debug) {\n newState.debugEnabled = this.scripts[this.state.selected].debug;\n _changed = true;\n }\n }\n\n // remove non-existing scripts\n const editing = JSON.parse(JSON.stringify(this.state.editing));\n for (let i = editing.length - 1; i >= 0; i--) {\n if (!this.objects[editing[i]]) {\n _changed = true;\n editing.splice(i, 1);\n if (this.state.changed[editing[i]] !== undefined) {\n newState.changed = newState.changed || JSON.parse(JSON.stringify(this.state.changed));\n delete newState.changed[editing[i]];\n }\n }\n }\n if (this.state.selected && !this.objects[this.state.selected]) {\n newState.selected = editing[0] || '';\n }\n if (_changed) {\n newState.editing = editing;\n }\n } else {\n // update all scripts\n for (const id in this.scripts) {\n if (!this.scripts.hasOwnProperty(id)) continue;\n if (this.objects[id] && this.objects[id].common) {\n const oldSource = this.scripts[id].source;\n const commonLocal = JSON.parse(JSON.stringify(this.scripts[id]));\n commonLocal.source = this.objects[id].common.source;\n // if anything except source was changed\n if (JSON.stringify(commonLocal) !== JSON.stringify(this.objects[id].common)) {\n this.scripts[id] = JSON.parse(JSON.stringify(this.objects[id].common));\n this.scripts[id].source = oldSource;\n }\n\n if (oldSource !== this.objects[id].common.source) {\n // take new script if it not yet changed\n if (!this.state.changed[id]) {\n // just use new value\n this.scripts[id].source = this.objects[id].common.source;\n } else {\n if (this.objects[id].from && this.objects[id].from.startsWith('system.adapter.javascript.')) {\n this.objects[id].from = 'system.adapter.admin.0';\n // show that script was changed from outside\n this.setState({toast: I18n.t('Script %s was modified on disk.', id.split('.').pop())});\n }\n }\n } else {\n if (this.state.changed[id]) {\n newState.changed = newState.changed || JSON.parse(JSON.stringify(this.state.changed));\n newState.changed[id] = false;\n _changed = true;\n }\n }\n } else {\n delete this.scripts[id];\n if (this.state.selected === id) {\n if (this.state.editing.indexOf(id) !== -1) {\n const editing = JSON.parse(JSON.stringify(this.state.editing));\n const pos = editing.indexOf(id);\n if (pos !== -1) {\n editing.splice(pos, 1);\n newState.editing = editing;\n _changed = true;\n }\n }\n newState.selected = this.state.editing[0] || '';\n _changed = true;\n }\n }\n }\n }\n\n if (this.state.selected !== nextProps.selected && nextProps.selected) {\n if (nextProps.selected) {\n this.scripts[nextProps.selected] = this.scripts[nextProps.selected] || JSON.parse(JSON.stringify(this.props.objects[nextProps.selected].common));\n }\n\n const nextCommon = this.props.objects[nextProps.selected] && this.props.objects[nextProps.selected].common;\n\n const changed = nextCommon && JSON.stringify(this.scripts[nextProps.selected]) !== JSON.stringify(nextCommon);\n\n const editing = JSON.parse(JSON.stringify(this.state.editing));\n if (nextProps.selected && editing.indexOf(nextProps.selected) === -1) {\n editing.push(nextProps.selected);\n this.props.onSelectedChange(nextProps.selected, editing);\n window.localStorage && window.localStorage.setItem('Editor.editing', JSON.stringify(editing));\n }\n\n _changed = true;\n newState.changed = newState.changed || JSON.parse(JSON.stringify(this.state.changed));\n newState.changed[nextProps.selected] = changed;\n newState.editing = editing;\n newState.selected = nextProps.selected;\n newState.blockly = this.scripts[nextProps.selected].engineType === 'Blockly';\n newState.verboseEnabled = this.scripts[nextProps.selected].verbose;\n newState.debugEnabled = this.scripts[nextProps.selected].debug;\n newState.showBlocklyCode = false;\n } else {\n\n }\n\n if (this.state.visible !== nextProps.visible) {\n _changed = true;\n newState.visible = nextProps.visible;\n }\n _changed && this.setState(newState, () => this.setChangedInAdmin());\n }\n\n onRestart() {\n this.props.onRestart && this.props.onRestart(this.state.selected);\n }\n\n onSave() {\n if (this.state.changed[this.state.selected]) {\n const changed = JSON.parse(JSON.stringify(this.state.changed));\n changed[this.state.selected] = false;\n this.setState({changed}, () => {\n this.setChangedInAdmin();\n this.props.onChange && this.props.onChange(this.state.selected, this.scripts[this.state.selected]);\n });\n }\n }\n\n onSaveAll() {\n const changed = JSON.parse(JSON.stringify(this.state.changed));\n Object.keys(changed)\n .forEach(id => {\n if (changed[id]) {\n changed[id] = false;\n this.props.onChange && this.props.onChange(id, this.scripts[id]);\n }\n });\n\n this.setState({ changed }, () =>\n this.setChangedInAdmin());\n }\n\n onCancel() {\n this.scripts[this.state.selected] = JSON.parse(JSON.stringify(this.props.objects[this.state.selected].common));\n\n const changed = JSON.parse(JSON.stringify(this.state.changed));\n changed[this.state.selected] = false;\n\n this.setState({changed}, () => this.setChangedInAdmin());\n }\n\n onRegisterSelect(func) {\n this.getSelect = func;\n }\n\n onConvert2JS() {\n this.showConfirmDialog(I18n.t('It will not be possible to revert this operation.'), result => {\n if (result) {\n this.scripts[this.state.selected].engineType = 'Javascript/js';\n let source = this.scripts[this.state.selected].source;\n const lines = source.split('\\n');\n lines.pop();\n this.scripts[this.state.selected].source = lines.join('\\n');\n const nowSelected = this.state.selected;\n\n const changed = JSON.parse(JSON.stringify(this.state.changed));\n changed[this.state.selected] = true;\n\n this.setState({changed, blockly: false, selected: ''}, () => {\n this.setChangedInAdmin();\n // force update of the editor\n setTimeout(() => this.setState({selected: nowSelected}), 100);\n });\n }\n });\n }\n\n onChange(options) {\n options = options || {};\n if (options.script !== undefined) {\n this.scripts[this.state.selected].source = options.script;\n }\n if (options.debug !== undefined) {\n this.scripts[this.state.selected].debug = options.debug;\n }\n if (options.verbose !== undefined) {\n this.scripts[this.state.selected].verbose = options.verbose;\n }\n const _changed = JSON.stringify(this.scripts[this.state.selected]) !== JSON.stringify(this.props.objects[this.state.selected].common);\n if (_changed !== (this.state.changed[this.state.selected] || false)) {\n\n const changed = JSON.parse(JSON.stringify(this.state.changed));\n changed[this.state.selected] = _changed;\n this.objects[this.state.selected].from = 'system.adapter.admin.0';\n this.setState({changed}, () => this.setChangedInAdmin());\n\n }\n }\n\n onTabChange(event, selected) {\n window.localStorage && window.localStorage.setItem('Editor.selected', selected);\n const common = this.scripts[selected] || (this.props.objects[selected] && this.props.objects[selected].common);\n this.setState({selected, blockly: common.engineType === 'Blockly', showBlocklyCode: false, verboseEnabled: common.verbose, debugEnabled: common.debug});\n this.props.onSelectedChange && this.props.onSelectedChange(selected, this.state.editing);\n }\n\n isScriptChanged(id) {\n return this.scripts[id] && this.props.objects[id] && JSON.stringify(this.scripts[id]) !== JSON.stringify(this.props.objects[id].common);\n }\n\n onTabClose(id, e) {\n e && e.stopPropagation();\n\n const pos = this.state.editing.indexOf(id);\n if (this.state.editing.indexOf(id) !== -1) {\n if (this.isScriptChanged(id)) {\n this.showConfirmDialog(I18n.t('Discard changes for %s', this.props.objects[id].common.name), ok => {\n if (ok) {\n delete this.scripts[id];\n this.onTabClose(id);\n }\n });\n } else {\n const editing = JSON.parse(JSON.stringify(this.state.editing));\n editing.splice(pos, 1);\n const newState = {editing};\n if (id === this.state.selected) {\n if (editing.length) {\n if (pos === 0 || editing.length === 1) {\n newState.selected = editing[0];\n } else {\n newState.selected = editing[pos - 1];\n }\n } else {\n newState.selected = '';\n }\n } else if (this.state.selected && !editing.length) {\n newState.selected = '';\n }\n window.localStorage && window.localStorage.setItem('Editor.editing', JSON.stringify(editing));\n if (newState.selected !== undefined) {\n newState.changed = newState.changed || JSON.parse(JSON.stringify(this.state.changed));\n newState.changed[newState.selected] = this.isScriptChanged(newState.selected);\n const common = newState.selected && (this.scripts[newState.selected] || (this.props.objects[newState.selected] && this.props.objects[newState.selected].common));\n newState.blockly = common ? common.engineType === 'Blockly' : false;\n newState.verboseEnabled = common ? common.verbose : false;\n newState.debugEnabled = common ? common.debug : false;\n newState.showBlocklyCode = false;\n }\n\n this.setState(newState, () => {\n this.setChangedInAdmin();\n\n if (newState.selected !== undefined) {\n this.props.onSelectedChange && this.props.onSelectedChange(newState.selected, this.state.editing);\n window.localStorage && window.localStorage.setItem('Editor.selected', newState.selected);\n } else {\n this.props.onSelectedChange && this.props.onSelectedChange(this.state.selected, this.state.editing);\n }\n });\n }\n }\n }\n\n showConfirmDialog(question, cb) {\n this.confirmCallback = cb;\n this.setState({confirm: question});\n }\n\n sendCommandToBlockly(cmd) {\n this.setState({cmdToBlockly: cmd}, () =>\n setTimeout(() =>\n this.setState({cmdToBlockly: ''}), 200));\n }\n\n getTabs() {\n if (this.state.editing.length) {\n return [
this.onTabChange(event, value)}\n indicatorColor=\"primary\"\n style={{position: 'relative', width: this.state.editing.length > 1 ? 'calc(100% - 50px)' : '100%', display: 'inline-block'}}\n textColor=\"primary\"\n variant=\"scrollable\"\n scrollButtons=\"auto\"\n >\n {this.state.editing.map(id => {\n if (!this.props.objects[id]) {\n const label = [\n {id.split('.').pop()}
,\n this.onTabClose(id, e)} fontSize=\"small\"/>];\n return ;\n } else {\n let text = this.props.objects[id].common.name;\n let title = '';\n if (text.length > 18) {\n title = text;\n text = text.substring(0, 15) + '...';\n }\n const changed = this.props.objects[id].common && this.scripts[id] && this.props.objects[id].common.source !== this.scripts[id].source;\n const label = [\n ,\n {text}
,\n changed ? ▣ : null,\n this.onTabClose(id, e)} fontSize=\"small\"/>\n ];\n\n return ;\n }\n })}\n ,\n this.state.editing.length > 1 ?
{\n const editing = [this.state.selected];\n // Do not close not saved tabs\n Object.keys(this.scripts).forEach(id =>\n id !== this.state.selected &&\n JSON.stringify(this.scripts[id]) !== JSON.stringify(this.props.objects[id].common) &&\n editing.push(id)\n );\n\n window.localStorage && window.localStorage.setItem('Editor.editing', JSON.stringify(editing));\n this.setState({menuTabsOpened: false, menuTabsAnchorEl: null, editing: editing});\n }}\n >\n \n : null\n ];\n } else {\n return
\n \n
;\n }\n }\n\n getDebugMenu() {\n if (!this.state.showDebugMenu) return null;\n\n return ;\n }\n\n getDebugBadge() {\n return [\n this.state.debugEnabled && this.state.verboseEnabled && (
),\n this.state.debugEnabled && !this.state.verboseEnabled && (
),\n !this.state.debugEnabled && this.state.verboseEnabled && (
),\n ]\n }\n\n getToolbar() {\n const isInstanceRunning = this.state.selected && this.scripts[this.state.selected] && this.scripts[this.state.selected].engine && this.state.runningInstances[this.scripts[this.state.selected].engine];\n const isScriptRunning = this.state.selected && this.scripts[this.state.selected] && this.scripts[this.state.selected].enabled;\n\n if (this.state.selected) {\n const changedAll = Object.keys(this.state.changed).filter(id => this.state.changed[id]).length;\n const changed = this.state.changed[this.state.selected];\n return
\n {this.state.menuOpened && this.props.onLocate && ( this.props.onLocate(this.state.selected)}>)}\n {!changed && isInstanceRunning && this.onRestart()} title={I18n.t('Restart')}>}\n {!changed && !isScriptRunning && {I18n.t('Script is not running')}}\n {!changed && isScriptRunning && !isInstanceRunning && {I18n.t('Instance is disabled')}}\n {changed && }\n {(changedAll > 1 || (changedAll === 1 && !changed)) && ()}\n {changed && ()}\n \n\n {this.state.blockly && !this.state.showBlocklyCode &&\n ( this.sendCommandToBlockly('export')}>\n )}\n\n {this.state.blockly && !this.state.showBlocklyCode &&\n ( this.sendCommandToBlockly('import')}>\n )}\n\n {this.state.blockly && !this.state.showBlocklyCode &&\n ( this.sendCommandToBlockly('check')}>\n )}\n\n {!this.state.blockly && !this.state.showBlocklyCode && ( this.setState({showCron: true})}>)}\n\n {!this.state.blockly && !this.state.showBlocklyCode && ( this.setState({showSelectId: true})}>)}\n\n {this.state.blockly && this.state.showBlocklyCode && ()}\n\n {this.state.blockly && ()}\n\n {!this.state.showBlocklyCode && ( this.setState({showDebugMenu: true, menuDebugAnchorEl: e.currentTarget})}>\n \n \n \n )}\n\n ;\n } else {\n return null;\n }\n }\n\n getScriptEditor() {\n if (this.state.selected && this.props.objects[this.state.selected] && this.state.blockly !== null && (!this.state.blockly || this.state.showBlocklyCode)) {\n this.scripts[this.state.selected] = this.scripts[this.state.selected] || JSON.parse(JSON.stringify(this.props.objects[this.state.selected].common));\n\n return
\n this.setState({insert: ''})}\n onForceSave={() => this.onSave()}\n searchText={this.state.searchText}\n onRegisterSelect={func => this.onRegisterSelect(func)}\n readOnly={this.state.showBlocklyCode}\n changed={this.state.changed[this.state.selected]}\n code={this.scripts[this.state.selected].source || ''}\n isDark={this.state.themeType === 'dark'}\n socket={this.props.socket}\n runningInstances={this.state.runningInstances}\n onChange={newValue => this.onChange({script: newValue})}\n language={this.scripts[this.state.selected].engineType === 'TypeScript/ts' ? 'typescript' : 'javascript'}\n />\n
;\n } else {\n return null;\n }\n }\n\n getBlocklyEditor() {\n if (this.state.instancesLoaded && this.state.selected && this.props.objects[this.state.selected] && (this.state.blockly && !this.state.showBlocklyCode) && this.state.visible) {\n this.scripts[this.state.selected] = this.scripts[this.state.selected] || JSON.parse(JSON.stringify(this.props.objects[this.state.selected].common));\n\n return (
\n this.onChange({script: newValue})}\n />\n
);\n } else {\n return null;\n }\n }\n\n getConfirmDialog() {\n if (this.state.confirm) {\n return (
{\n if (this.confirmCallback) {\n const cb = this.confirmCallback;\n this.confirmCallback = null;\n cb(result);\n }\n this.setState({confirm: ''});\n }}\n />);\n } else {\n return null;\n }\n }\n\n getSelectIdDialog() {\n if (this.state.showSelectId) {\n let selectedId = this.selectId.callback ? this.selectId.initValue || '' : this.getSelect ? this.getSelect() : '';\n // it could be:\n // - 'id.xx'/* aksjdhsdf*/\n // - \"id.xx\"/* aksjdhsdf*/\n // - \"id.xx\"//\n let pos = selectedId.indexOf('/*');\n if (pos !== -1) {\n selectedId = selectedId.substring(0, pos);\n }\n pos = selectedId.indexOf('//');\n if (pos !== -1) {\n selectedId = selectedId.substring(0, pos);\n }\n let m = selectedId.match(/\"([^\"]+)\"/);\n if (m) {\n selectedId = m[1];\n }\n m = selectedId.match(/'([^']+)'/);\n if (m) {\n selectedId = m[1];\n }\n\n return {\n this.setState({showSelectId: false});\n if (this.selectId.callback) {\n this.selectId.callback = null;\n }\n }}\n onOk={(selected, name) => {\n this.selectId.initValue = null;\n if (this.selectId.callback) {\n this.selectId.callback(selected);\n this.selectId.callback = null;\n } else {\n this.setState({insert: `'${selected}'/*${name}*/`})\n }\n }}\n />;\n } else {\n return null;\n }\n }\n\n getCronDialog() {\n if (this.state.showCron) {\n return ( this.setState({showCron: false})}\n onOk={cron => {\n this.cron.initValue = null;\n if (this.cron.callback) {\n this.cron.callback(cron);\n this.cron.callback = null;\n } else {\n this.setState({insert: `'${cron}'`})\n }\n }}\n />);\n } else {\n return null;\n }\n }\n\n getEditorDialog() {\n if (this.state.showScript) {\n return {\n this.scriptDialog.initValue = null;\n if (this.scriptDialog.callback) {\n result !== false && this.scriptDialog.callback(result || '');\n this.scriptDialog.callback = null;\n }\n this.setState({showScript: false});\n }}\n />;\n } else {\n return null;\n }\n }\n\n getToast() {\n return this.setState({toast: ''})}\n ContentProps={{'aria-describedby': 'message-id',}}\n message={{this.state.toast}}\n action={[\n this.setState({toast: ''})}\n >\n ,\n ]}\n />;\n }\n\n render() {\n if (this.state.selected && this.props.objects[this.state.selected] && this.state.blockly === null) {\n this.scripts[this.state.selected] = this.scripts[this.state.selected] || JSON.parse(JSON.stringify(this.props.objects[this.state.selected].common));\n setTimeout(() => {\n const newState = {\n blockly: this.scripts[this.state.selected].engineType === 'Blockly',\n showBlocklyCode: false,\n debugEnabled: this.scripts[this.state.selected].debug,\n verboseEnabled: this.scripts[this.state.selected].verbose,\n };\n\n // check if all opened files still exists\n this.removeNonExistingScripts(null, newState);\n this.setState(newState);\n }, 100);\n }\n\n return [\n this.getTabs(),\n this.getToolbar(),\n this.getScriptEditor(),\n this.getBlocklyEditor(),\n this.getConfirmDialog(),\n this.getSelectIdDialog(),\n this.getCronDialog(),\n this.getEditorDialog(),\n this.getDebugMenu(),\n this.getToast(),\n ];\n }\n}\n\nEditor.propTypes = {\n objects: PropTypes.object.isRequired,\n instances: PropTypes.array.isRequired,\n adapterName: PropTypes.string.isRequired,\n selected: PropTypes.string.isRequired,\n onSelectedChange: PropTypes.func.isRequired,\n onRestart: PropTypes.func,\n onChange: PropTypes.func.isRequired,\n visible: PropTypes.bool,\n menuOpened: PropTypes.bool,\n onLocate: PropTypes.func,\n runningInstances: PropTypes.object,\n socket: PropTypes.object,\n searchText: PropTypes.string,\n themeName: PropTypes.string,\n themeType: PropTypes.string,\n};\n\nexport default withStyles(styles)(Editor);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\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 Dropzone from 'react-dropzone';\nimport DialogError from './Error';\nimport {MdFileUpload as IconUpload} from 'react-icons/md';\nimport {MdCancel as IconNo} from 'react-icons/md';\nimport {MdPlusOne as IconPlus} from 'react-icons/md';\n\nimport IconCancel from '@material-ui/icons/Cancel';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = theme => ({\n dialog: {\n height: '95%'\n },\n fullHeight: {\n height: '100%',\n overflow: 'hidden'\n },\n dropzone: {\n marginTop: 20,\n width: '100%',\n borderWidth: 5,\n borderStyle: 'dashed',\n borderColor: '#d0cccc',\n textAlign: 'center',\n boxSizing: 'border-box',\n paddingTop: 45,\n borderRadius: 10,\n height: 'calc(100% - 10px)'\n },\n dropzoneDiv: {\n width: '100%',\n height: '100%'\n },\n dropzoneRejected: {\n borderColor: '#970000',\n },\n dropzoneAccepted: {\n borderColor: '#17cd02',\n },\n icon: {\n height: '30%',\n width: '30%',\n color: '#eeeeee',\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%,-50%)',\n zIndex: 0,\n },\n iconError: {\n color: '#ffc3c6',\n },\n iconOk: {\n color: '#aaeebc',\n },\n text: {\n top: '50%',\n left: '50%',\n transform: 'translate(-50%,-50%)',\n color: '#868686',\n position: 'absolute',\n zIndex: 1,\n },\n buttonIcon: {\n marginRight: theme.spacing(1),\n },\n});\nclass DialogImportFile extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n error: '',\n imageStatus: ''\n };\n }\n\n componentDidMount() {\n setTimeout(() => {\n try {\n window.document.getElementById('import-text-area').focus();\n } catch (e) {\n\n }\n }, 100);\n }\n\n handleCancel () {\n this.props.onClose();\n }\n\n onChange(e) {\n this.setState({text: e.target.value});\n }\n\n static readFileDataUrl(file, cb) {\n const reader = new FileReader();\n reader.onload = () => {\n cb(null, {data: reader.result, name: file.name});\n };\n reader.onabort = () => {\n console.error('file reading was aborted');\n cb(I18n.t('file reading was aborted'));\n };\n reader.onerror = (e) => {\n console.error('file reading has failed');\n cb(I18n.t('file reading has failed: %s', e));\n };\n\n reader.readAsDataURL(file)\n }\n\n handleDropFile(files) {\n if (files && files.hasOwnProperty('target')) {\n files = files.target.files;\n }\n\n if (!files && !files.length) {\n return;\n }\n\n const file = files[files.length - 1];\n\n if (!file) {\n return;\n }\n DialogImportFile.readFileDataUrl(file, (err, result) => {\n if (err) {\n this.setState({error: err})\n } else {\n this.props.onClose(result && result.data);\n }\n });\n }\n\n render() {\n const classes = this.props.classes;\n const className = classes.dropzone + ' ' + (this.state.imageStatus === 'accepted' ? classes.dropzoneAccepted : (this.state.imageStatus === 'rejected' ? classes.dropzoneRejected : ''));\n\n return (\n \n );\n }\n}\n\nDialogImportFile.propTypes = {\n classes: PropTypes.object.isRequired,\n onClose: PropTypes.func,\n};\n\nexport default withStyles(styles)(DialogImportFile);\n","import React from 'react';\nimport {withStyles} from '@material-ui/core/styles';\nimport SplitterLayout from 'react-splitter-layout';\nimport {MdMenu as IconMenuClosed} from 'react-icons/md';\nimport {MdArrowBack as IconMenuOpened} from 'react-icons/md';\n\nimport 'react-splitter-layout/lib/index.css';\n\nimport GenericApp from '@iobroker/adapter-react/GenericApp';\nimport Loader from '@iobroker/adapter-react/Components/Loader'\nimport I18n from '@iobroker/adapter-react/i18n';\nimport DialogMessage from '@iobroker/adapter-react/Dialogs/Message';\nimport DialogConfirm from '@iobroker/adapter-react/Dialogs/Confirm';\nimport Utils from '@iobroker/adapter-react/Components/Utils';\n\nimport SideMenu from './SideMenu';\nimport Log from './Log';\nimport Editor from './Editor';\nimport DialogError from './Dialogs/Error';\nimport DialogImportFile from './Dialogs/ImportFile';\nimport BlocklyEditor from './Components/BlocklyEditor';\n\nconst styles = theme => ({\n root: {\n flexGrow: 1,\n display: 'flex',\n width: '100%',\n height: '100%'\n },\n menuDiv: {\n overflow: 'hidden',\n },\n splitterDivs: {\n '&>div': {\n overflow: 'hidden',\n width: '100%',\n height: '100%',\n },\n '& .layout-splitter': {\n background: theme.palette.type === 'dark' ? '#595858' : '#ccc;'\n }\n },\n mainDiv: {\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n },\n /*appBarWithMenu: {\n width: `calc(100% - ${Theme.menu.width}px)`,\n marginLeft: Theme.menu.width,\n },\n appBarWithoutMenu: {\n width: `100%`,\n marginLeft: 0,\n },*/\n content: {\n width: '100%',\n height: '100%',\n backgroundColor: theme.palette.background && theme.palette.background.default,\n position: 'relative'\n },\n splitterDivWithMenu: {\n width: `calc(100% - 300px)`,\n height: '100%'\n },\n menuDivWithoutMenu: {\n '&>div:first-child': {\n display: 'none'\n },\n '&>.layout-splitter': {\n display: 'none'\n },\n },\n progress: {\n margin: 100\n },\n menuOpenCloseButton: {\n position: 'absolute',\n left: 0,\n borderRadius: '0 5px 5px 0',\n top: 6,\n paddingTop: 8,\n cursor: 'pointer',\n zIndex: 1,\n height: 25,\n width: 20,\n background: theme.palette.secondary.main,\n color: theme.palette.primary.main,\n paddingLeft: 3,\n '&:hover': {\n color: 'white'\n }\n }\n});\n\nclass App extends GenericApp {\n constructor(props) {\n super(props, {\n translations: {\n 'en': require('./i18n/en'),\n 'de': require('./i18n/de'),\n 'es': require('./i18n/es'),\n 'fr': require('./i18n/fr'),\n 'it': require('./i18n/it'),\n 'nl': require('./i18n/nl'),\n 'pl': require('./i18n/pl'),\n 'pt': require('./i18n/pt'),\n 'ru': require('./i18n/ru'),\n 'zh-cn': require('./i18n/zh-cn'),\n },\n bottomButtons: false,\n socket: {\n autoSubscribeLog: true,\n },\n });\n\n // this.logIndex = 0;\n this.logSize = window.localStorage ? parseFloat(window.localStorage.getItem('App.logSize')) || 150 : 150;\n this.menuSize = window.localStorage ? parseFloat(window.localStorage.getItem('App.menuSize')) || 500 : 500;\n this.hosts = [];\n this.importFile = null;\n this.scripts = {};\n\n window.alert = message => {\n console.error(message);\n this.showError(message.toString());\n };\n }\n\n onScriptsChanged = (id, obj) => {\n if (!id) {\n return;\n }\n let changed = false;\n const newState = {};\n if (id.startsWith('script.js.')) {\n if (obj) {\n if (JSON.stringify(this.scripts[id]) !== JSON.stringify(obj)) {\n this.scripts[id] = obj;\n changed = true;\n newState.scriptsHash = this.state.scriptsHash + 1;\n }\n } else if (this.scripts[id]) {\n delete this.scripts[id];\n changed = true;\n newState.scriptsHash = this.state.scriptsHash + 1;\n }\n }\n\n changed && this.setState(newState);\n };\n\n onInstanceChanged = (id, obj) => {\n if (!id) {\n return;\n }\n let changed = false;\n const newState = {};\n\n if (id.match(/^system\\.adapter\\.[-_\\w\\d]+\\$/)) {\n // update instances\n if (id.startsWith('system.adapter.' + this.adapterName + '.')) {\n if (obj && obj.type === 'instance') {\n if (!this.state.instances.includes(id)) {\n newState.instances = [...this.state.instances];\n newState.instances.push(id);\n newState.instances.sort();\n changed = true;\n // request alive\n this.socket.subscribeState(obj._id + '.alive', this.onInstanceAliveChange());\n }\n } else if (!obj && this.state.instances.includes(id)) {\n this.socket.unsubscribeState(id + '.alive', this.onInstanceAliveChange());\n newState.instances = [...this.state.instances];\n const pos = newState.instances.indexOf(id);\n newState.instances.splice(pos, 1);\n changed = true;\n }\n }\n\n\n\n\n if (obj && obj[id].common && obj[id].common.blockly) {\n this.confirmCallback = result => result && window.location.reload();\n newState.confirm = I18n.t('Some blocks were updated. Reload admin?');\n changed = true;\n }\n }\n changed && this.setState(newState);\n };\n\n onHostChanged = (id, obj) => {\n if (!id) {\n return;\n }\n let changed = false;\n const newState = {};\n\n if (id.startsWith('system.host.')) {\n if (obj && obj.type === 'host') {\n if (!this.hosts.includes(id)) {\n this.hosts.push(id);\n this.hosts.sort();\n }\n } else if (!obj && this.hosts.includes(id)) {\n const pos = this.hosts.indexOf(id);\n this.hosts.splice(pos, 1);\n }\n }\n\n changed && this.setState(newState);\n };\n\n onConnectionReady() {\n window.systemLang = this.socket.systemLang;\n this.setState({\n ready: false,\n updateScripts: 0,\n scriptsHash: 0,\n instances: [],\n updating: false,\n resizing: false,\n selected: null,\n logMessage: {},\n editing: [],\n menuOpened: window.localStorage ? window.localStorage.getItem('App.menuOpened') !== 'false' : true,\n menuSelectId: '',\n expertMode: window.localStorage ? window.localStorage.getItem('App.expertMode') === 'true' : false,\n logHorzLayout: window.localStorage ? window.localStorage.getItem('App.logHorzLayout') === 'true' : false,\n runningInstances: {},\n confirm: '',\n importFile: false,\n message: '',\n searchText: '',\n });\n\n const newState = {};\n\n // load instances & scripts\n // Read all instances\n this.subscribeOnInstances()\n .then(result => {\n newState.instances = result.instances;\n newState.runningInstances = result.runningInstances;\n return this.readAdaptersWithBlockly();\n })\n .then(() => this.socket.getHosts())\n .then(hosts => {\n this.hosts = hosts.map(obj => obj._id);\n // load all scripts\n return this.readAllScripts();\n })\n .then(scripts => {\n if (window.localStorage && window.localStorage.getItem('App.expertMode') !== 'true' && window.localStorage.getItem('App.expertMode') !== 'false') {\n // detect if some global scripts exists\n if (Object.keys(scripts).find(id => id.startsWith('script.js.global.') && scripts.type === 'script')) {\n newState.expertMode = true;\n }\n }\n this.scripts = scripts;\n\n let scriptsHash = this.state.scriptsHash;\n if (this.compareScripts(scripts)) {\n scriptsHash++;\n }\n newState.scriptsHash = scriptsHash;\n newState.ready = true;\n this.socket.subscribeObject('script.*', this.onScriptsChanged);\n this.socket.subscribeObject('system.adapter.*', this.onInstanceChanged);\n this.socket.subscribeObject('system.host.*', this.onHostChanged);\n\n this.setState(newState);\n });\n }\n\n subscribeOnInstances() {\n return this.socket.getAdapterInstances(this.adapterName)\n .then(instancesArray => {\n const instances = instancesArray.map(obj => parseInt(obj._id.split('.').pop())).sort();\n const runningInstances = {};\n instances.forEach(id => runningInstances['system.adapter.' + this.adapterName + '.' + id] = false);\n\n const promises = [];\n\n // subscribe on instances\n instances.forEach(instance => {\n const instanceId = `system.adapter.${this.adapterName}.${instance}`;\n const id = `${instanceId}.alive`;\n promises.push(this.socket.getState(id)\n .then(state => {\n runningInstances[instanceId] = state ? state.val : false;\n this.socket.subscribeState(id, this.onInstanceAliveChange);\n }));\n });\n\n return Promise.all(promises)\n .then(() => ({instances, runningInstances}));\n })\n }\n\n readAllScripts() {\n return this.socket.getObjectView('script.js.', 'script.js.\\u9999', 'channel')\n .then(folders =>\n this.socket.getObjectView('script.js.', 'script.js.\\u9999', 'script')\n .then(scripts => {\n Object.keys(scripts).forEach(id => folders[id] = scripts[id]);\n return folders;\n }));\n }\n\n readAdaptersWithBlockly() {\n return this.socket.getObjectView('system.adapter.', 'system.adapter.\\u9999', 'adapter')\n .then(adapters =>\n new Promise(resolve =>\n BlocklyEditor.loadCustomBlockly(adapters, () => resolve())));\n }\n\n onInstanceAliveChange = (id, state) => {\n if (id) {\n id = id && id.substring(0, id.length - 6); // - .alive\n\n if (this.state.runningInstances[id] !== (state ? state.val : false)) {\n const runningInstances = JSON.parse(JSON.stringify(this.state.runningInstances));\n runningInstances[id] = state ? state.val : false;\n this.setState({runningInstances});\n }\n }\n };\n\n compareScripts(newScripts) {\n const oldIds = Object.keys(this.scripts);\n const newIds = Object.keys(newScripts);\n if (oldIds.length !== newIds.length) {\n this.scripts = this.newScripts;\n return true;\n }\n if (JSON.stringify(oldIds) !== JSON.stringify(newIds)) {\n this.scripts = this.newScripts;\n return true;\n }\n for (let i = 0; i < oldIds.length; i++) {\n let oldScript = this.scripts[oldIds[i]].common;\n let newScript = newScripts[oldIds[i]].common;\n if (oldScript.name !== newScript.name) {\n this.scripts = this.newScripts;\n return true;\n }\n if (oldScript.engine !== newScript.engine) {\n this.scripts = this.newScripts;\n return true;\n }\n if (oldScript.engineType !== newScript.engineType) {\n this.scripts = this.newScripts;\n return true;\n }\n if (oldScript.enabled !== newScript.enabled) {\n this.scripts = this.newScripts;\n return true;\n }\n }\n }\n\n onRename(oldId, newId, newName, newInstance) {\n console.log(`Rename ${oldId} => ${newId}`);\n let promise;\n this.setState({updating: true});\n\n // Rename script.js.common.Skript_1 => script.js.common.New folder.Skript_1\n\n if (this.scripts[oldId] && this.scripts[oldId].type === 'script') {\n const common = JSON.parse(JSON.stringify(this.scripts[oldId].common));\n common.name = newName || common.name;\n if (newInstance !== undefined) {\n common.engine = 'system.adapter.javascript.' + newInstance;\n }\n // Check if the script is not a children of other script\n const parts = newId.split('.');\n parts.pop();\n const parentID = parts.join('.');\n\n if (this.scripts[parentID] && this.scripts[parentID].type === 'script') {\n parts.pop();\n newId = parts.join('.') + '.' + newId.split('.').pop();\n }\n\n promise = this.updateScript(oldId, newId, common);\n } else {\n promise = this.renameGroup(oldId, newId, newName);\n }\n\n promise\n .then(() => this.setState({updating: false}))\n .catch(err => err !== 'canceled' && this.showError(err));\n }\n\n renameGroup(id, newId, newName, _list) {\n if (!_list) {\n _list = [];\n\n // collect all elements to rename\n // find all elements\n _list = Object.keys(this.scripts).filter(_id => _id.startsWith(id + '.'));\n\n return this.socket.getObject(id)\n .then(obj => {\n obj = obj || {common: {}};\n obj.common.name = newName || obj.common.name || id.split('.').pop();\n obj._id = newId;\n\n this.socket.delObject(id)\n .catch(() => {})\n .then(() => this.socket.setObject(newId, obj))\n .then(() => this.renameGroup(id, newId, newName, _list))\n .catch(e => {\n console.log(e);\n });\n })\n .catch(e => {\n console.log(e);\n const obj = {\n _id: newId,\n type: 'channel',\n common: {\n name: newName || id.split('.').pop()\n },\n native: {}\n };\n // may be it is virtual folder\n return this.socket.setObject(newId, obj)\n .then(() => this.renameGroup(id, newId, newName, _list));\n });\n } else if (_list.length) {\n let nId = _list.pop();\n\n return this.socket.getObject(nId)\n .then(obj =>\n this.socket.delObject(nId)\n .catch(() => {})\n .then(() => {\n nId = newId + nId.substring(id.length);\n obj._id = nId;\n return this.socket.setObject(nId, obj);\n })\n .then(() => this.renameGroup(id, newId, newName, _list))\n );\n } else {\n return Promise.resolve();\n }\n }\n\n onUpdateScript(id, common) {\n if (this.scripts[id] && this.scripts[id].type === 'script') {\n this.updateScript(id, id, common)\n .then(() => {})\n .catch(err => err !== 'canceled' && this.showError(err));\n }\n }\n\n onSelect(selected) {\n if (this.scripts[selected] && this.scripts[selected].common && this.scripts[selected].type === 'script') {\n this.setState({selected, menuSelectId: selected}, () =>\n setTimeout(() => this.setState({menuSelectId: ''})), 300);\n }\n }\n\n onExpertModeChange(expertMode) {\n if (this.state.expertMode !== expertMode) {\n window.localStorage && window.localStorage.setItem('App.expertMode', expertMode ? 'true' : 'false');\n this.setState({ expertMode });\n }\n }\n\n showError(err) {\n this.setState({ errorText: err ? err.toString() : '' });\n }\n\n showMessage(message) {\n this.setState({ message: message ? message.toString() : '' });\n }\n\n onDelete(id) {\n this.socket.delObject(id)\n .then(() => {})\n .catch(err =>\n this.showError(err));\n }\n\n onEdit(id) {\n if (this.state.selected !== id) {\n this.setState({selected: id});\n }\n }\n\n onAddNew(id, name, isFolder, instance, type, source) {\n const reg = new RegExp(`^${id}\\\\.`);\n\n if (Object.keys(this.scripts).find(_id => id === _id || reg.test(id))) {\n return this.showError(I18n.t('Yet exists!'));\n }\n\n if (isFolder) {\n this.socket.setObject(id, {\n common: {\n name,\n expert: true\n },\n type: 'channel'\n })\n .then(() =>\n setTimeout(() => this.setState({menuSelectId: id}, () =>\n setTimeout(() => this.setState({menuSelectId: ''})), 300), 1000))\n .catch(err => this.showError(err));\n } else {\n this.socket.setObject(id, {\n common: {\n name,\n expert: true,\n engineType: type,\n engine: 'system.adapter.javascript.' + (instance || 0),\n source: source || '',\n debug: false,\n verbose: false\n },\n type: 'script'\n })\n .then(() => setTimeout(() => this.onSelect(id), 1000))\n .catch(err => this.showError(err));\n }\n }\n\n updateScript(oldId, newId, newCommon) {\n return this.socket.getObject(oldId)\n .then(_obj => {\n const obj = {common: {}};\n\n if (newCommon.engine !== undefined) obj.common.engine = newCommon.engine;\n if (newCommon.enabled !== undefined) obj.common.enabled = newCommon.enabled;\n if (newCommon.source !== undefined) obj.common.source = newCommon.source;\n if (newCommon.debug !== undefined) obj.common.debug = newCommon.debug;\n if (newCommon.verbose !== undefined) obj.common.verbose = newCommon.verbose;\n\n obj.from = 'system.adapter.admin.0'; // we must distinguish between GUI(admin.0) and disk(javascript.0)\n\n if (oldId === newId && _obj && _obj.common && newCommon.name === _obj.common.name) {\n if (!newCommon.engineType || newCommon.engineType !== _obj.common.engineType) {\n if (newCommon.engineType !== undefined) {\n obj.common.engineType = newCommon.engineType || 'Javascript/js';\n }\n\n return new Promise((resolve, reject) =>\n this.socket.getRawSocket().emit('extendObject', oldId, obj, err =>\n err ? reject(err) : resolve()));\n } else {\n return new Promise((resolve, reject) =>\n this.socket.getRawSocket().emit('extendObject', oldId, obj, err =>\n err ? reject(err) : resolve()));\n }\n } else {\n // let prefix;\n\n // let parts = _obj.common.engineType.split('/');\n\n // prefix = 'script.' + (parts[1] || parts[0]) + '.';\n\n if (_obj && _obj.common) {\n _obj.common.engineType = newCommon.engineType || _obj.common.engineType || 'Javascript/js';\n return this.socket.delObject(oldId)\n .then(() => {\n if (obj.common.engine !== undefined) _obj.common.engine = obj.common.engine;\n if (obj.common.enabled !== undefined) _obj.common.enabled = obj.common.enabled;\n if (obj.common.source !== undefined) _obj.common.source = obj.common.source;\n if (obj.common.name !== undefined) _obj.common.name = obj.common.name;\n if (obj.common.debug !== undefined) _obj.common.debug = obj.common.debug;\n if (obj.common.verbose !== undefined) _obj.common.verbose = obj.common.verbose;\n\n delete _obj._rev;\n\n // Name must always exist\n _obj.common.name = newCommon.name;\n\n _obj._id = newId; // prefix + newCommon.name.replace(/[\\s\"']/g, '_');\n\n this.socket.setObject(newId, _obj);\n });\n } else {\n _obj = obj;\n }\n\n // Name must always exist\n _obj.common.name = newCommon.name;\n\n _obj._id = newId; // prefix + newCommon.name.replace(/[\\s\"']/g, '_');\n\n return this.socket.setObject(newId, _obj);\n }\n });\n }\n\n onEnableDisable(id, enabled) {\n if (this.scripts[id] && this.scripts[id].type === 'script') {\n const common = this.scripts[id].common;\n common.enabled = enabled;\n common.expert = true;\n this.updateScript(id, id, common)\n .catch(err => err !== 'canceled' && this.showError(err));\n }\n }\n\n getLiveHost(cb, _list) {\n if (!_list) {\n _list = this.hosts ? [...this.hosts] : [];\n }\n\n if (_list.length) {\n const id = _list.shift();\n this.socket.getState(id + '.alive')\n .then(state => {\n if (state && state.val) {\n cb(id);\n } else {\n setTimeout(() => this.getLiveHost(cb, _list));\n }\n });\n } else {\n cb();\n }\n }\n\n onExport() {\n this.getLiveHost(host => {\n if (!host) {\n return this.showError(I18n.t('No active host found'));\n }\n\n const d = new Date();\n let date = d.getFullYear();\n let m = d.getMonth() + 1;\n if (m < 10) {\n m = '0' + m;\n }\n date += '-' + m;\n m = d.getDate();\n if (m < 10) {\n m = '0' + m;\n }\n date += '-' + m + '-';\n\n this.socket.getRawSocket().emit('sendToHost', host, 'readObjectsAsZip', {\n adapter: 'javascript',\n id: 'script.js',\n link: date + 'scripts.zip' // request link to file and not the data itself\n }, data => {\n if (typeof data === 'string') {\n // it is a link to created file\n const a = document.createElement('a');\n // the data is \"system.host.HOST.zip.2020-01-26-scripts.zip\"\n const parts = data.split('.zip.');\n a.href = '/zip/' + parts[0] + '/' + parts[1];\n document.body.appendChild(a);\n a.click();\n a.remove();\n } else {\n data.error && this.showError(data.error);\n if (data.data) {\n const a = document.createElement('a');\n a.href = 'data: application/zip;base64,' + data.data;\n a.download = date + 'scripts.zip';\n document.body.appendChild(a);\n a.click();\n a.remove();\n }\n }\n });\n });\n }\n\n onImport(data) {\n this.importFile = data;\n if (data) {\n this.confirmCallback = this.onImportConfirmed.bind(this);\n this.setState({importFile: false, confirm: I18n.t('Existing scripts will be overwritten.')});\n } else {\n this.setState({importFile: false});\n }\n }\n\n onImportConfirmed(ok) {\n let data = this.importFile;\n this.importFile = null;\n if (ok && data) {\n data = data.split(',')[1];\n this.getLiveHost(host => {\n if (!host) {\n this.showError(I18n.t('No active host found'));\n return;\n }\n this.socket.getRawSocket().emit('sendToHost', host, 'writeObjectsAsZip', {\n data: data,\n adapter: 'javascript',\n id: 'script.js'\n }, data => {\n if (data === 'permissionError') {\n this.showError(I18n.t(data));\n } else if (!data || data.error) {\n this.showError(data ? I18n.t(data.error) : I18n.t('Unknown error'));\n } else {\n this.showMessage(I18n.t('Done'));\n }\n });\n });\n }\n }\n\n toggleLogLayout() {\n window.localStorage && window.localStorage.setItem('App.logHorzLayout', this.state.logHorzLayout ? 'false' : 'true');\n this.setState({logHorzLayout: !this.state.logHorzLayout});\n }\n\n renderMain() {\n const {classes} = this.props;\n const errorDialog = this.state.errorText ? this.setState({errorText: ''})} text={this.state.errorText}/> : null;\n return [\n this.state.message ? this.setState({message: ''})} text={this.state.message}/> : null,\n errorDialog,\n this.state.importFile ? this.onImport(data)} /> : null,\n this.state.confirm ? {\n this.state.confirm && this.setState({confirm: ''});\n this.confirmCallback && this.confirmCallback(result);\n this.confirmCallback = null;\n }}\n text={this.state.confirm}/> : null,\n \n
{\n window.localStorage && window.localStorage.setItem('App.menuOpened', this.state.menuOpened ? 'false' : 'true');\n this.setState({menuOpened: !this.state.menuOpened, resizing: true});\n setTimeout(() => this.setState({resizing: false}), 300);\n }}>\n {this.state.menuOpened ? () : ()}\n
\n
this.setState({resizing: true})}\n onSecondaryPaneSizeChange={size => this.logSize = parseFloat(size)}\n onDragEnd={() => {\n this.setState({resizing: false});\n window.localStorage && window.localStorage.setItem('App.logSize', this.logSize.toString());\n }}\n >\n this.setState({menuSelectId})}\n runningInstances={this.state.runningInstances}\n menuOpened={this.state.menuOpened}\n searchText={this.state.searchText}\n themeType={this.state.themeType}\n themeName={this.state.themeName}\n onChange={(id, common) => this.onUpdateScript(id, common)}\n onSelectedChange={(id, editing) => {\n const newState = {};\n let changed = false;\n if (id !== this.state.selected) {\n changed = true;\n newState.selected = id;\n }\n if (JSON.stringify(editing) !== JSON.stringify(this.state.editing)) {\n changed = true;\n newState.editing = JSON.parse(JSON.stringify(editing));\n }\n changed && this.setState(newState);\n }}\n onRestart={id => this.socket.extendObject(id, {common: {enabled: true}})}\n selected={this.state.selected && this.scripts[this.state.selected] && this.scripts[this.state.selected].type === 'script' ? this.state.selected : ''}\n objects={this.scripts}\n instances={this.state.instances}\n />\n this.toggleLogLayout()} editing={this.state.editing} socket={this.socket} selected={this.state.selected}/>\n \n
,\n ];\n }\n\n render() {\n const {classes} = this.props;\n\n if (!this.state.ready) {\n // return ();\n return ;\n }\n\n return \n
this.setState({resizing: true})}\n onSecondaryPaneSizeChange={size => this.menuSize = parseFloat(size)}\n onDragEnd={() => {\n this.setState({resizing: false});\n window.localStorage && window.localStorage.setItem('App.menuSize', this.menuSize.toString());\n }}\n >\n \n {\n Utils.setThemeName(themeName);\n const themeType = Utils.getThemeType(themeName);\n this.setState({themeName, themeType}, () => this.props.onThemeChange(themeName))\n }}\n runningInstances={this.state.runningInstances}\n onExpertModeChange={this.onExpertModeChange.bind(this)}\n onDelete={this.onDelete.bind(this) }\n onAddNew={ this.onAddNew.bind(this) }\n onEnableDisable={this.onEnableDisable.bind(this)}\n onExport={this.onExport.bind(this)}\n width={this.menuSize}\n onImport={() => this.setState({importFile: true})}\n onSearch={searchText => this.setState({searchText})}\n />\n
\n {this.renderMain()}\n \n
;\n }\n}\n\nexport default withStyles(styles)(App);\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);\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 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 if (\n response.status === 404 ||\n response.headers.get('content-type').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';\nimport ReactDOM from 'react-dom';\nimport * as Sentry from '@sentry/browser';\nimport * as SentryIntegrations from '@sentry/integrations';\nimport { MuiThemeProvider} from '@material-ui/core/styles';\n\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\nimport {version} from '../package.json';\nimport theme from '@iobroker/adapter-react/Theme';\nimport Utils from '@iobroker/adapter-react/Components/Utils';\n\nwindow.adapterName = 'javascript';\nlet themeName = Utils.getThemeName();\n\nconsole.log('iobroker.' + window.adapterName + '@' + version + ' using theme \"' + themeName + '\"');\n\nfunction build() {\n if (typeof Map === 'undefined') {\n console.log('Something is wrong')\n }\n return ReactDOM.render(\n {\n themeName = _theme;\n build();\n }}/>\n , document.getElementById('root'));\n\n}\n\n// if not local development\nif (window.location.host !== 'localhost:3000') {\n Sentry.init({\n dsn: 'https://504499a725eb4898930d3b9e9da95740@sentry.iobroker.net/56',\n release: 'iobroker.' + window.adapterName + '@' + version,\n integrations: [\n new SentryIntegrations.Dedupe()\n ]\n });\n}\n\nbuild();\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: http://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","module.exports = \"data:image/png;base64,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\""],"sourceRoot":""}
\ No newline at end of file
diff --git a/admin/tab.html b/admin/tab.html
index 9def9f567..742b93bff 100644
--- a/admin/tab.html
+++ b/admin/tab.html
@@ -1 +1 @@
-Scripts%%CUSTOM_BLOCKS%%10110111945013.13.1234264105011001100abc{textVariable}abc{textVariable}{textVariable}abcabc5{listVariable}{listVariable}{listVariable}{listVariable},100500#ff0000#3333ff0.5
\ No newline at end of file
+Scripts%%CUSTOM_BLOCKS%%10110111945013.13.1234264105011001100abc{textVariable}abc{textVariable}{textVariable}abcabc5{listVariable}{listVariable}{listVariable}{listVariable},100500#ff0000#3333ff0.5
\ No newline at end of file
diff --git a/admin/vs/base/browser/ui/codicons/codicon/codicon.ttf b/admin/vs/base/browser/ui/codicons/codicon/codicon.ttf
index 4c16209d6..b0d83b1f6 100644
Binary files a/admin/vs/base/browser/ui/codicons/codicon/codicon.ttf and b/admin/vs/base/browser/ui/codicons/codicon/codicon.ttf differ
diff --git a/io-package.json b/io-package.json
index 6f8b9744e..4c435958c 100644
--- a/io-package.json
+++ b/io-package.json
@@ -20,8 +20,20 @@
"Apollon77 ",
"AlCalzone"
],
- "version": "4.10.4",
+ "version": "4.10.5",
"news": {
+ "4.10.5": {
+ "en": "null timeouts are checked now",
+ "de": "Null-Timeouts werden jetzt überprüft",
+ "ru": "нулевые таймауты проверены сейчас",
+ "pt": "tempos limites nulos são verificados agora",
+ "nl": "null-time-outs worden nu gecontroleerd",
+ "fr": "les délais d'expiration nuls sont vérifiés maintenant",
+ "it": "i timeout nulli sono controllati ora",
+ "es": "los tiempos de espera nulos están marcados ahora",
+ "pl": "zerowe limity czasu są teraz sprawdzane",
+ "zh-cn": "现在检查空超时"
+ },
"4.10.4": {
"en": "null timeouts are checked now\nCorrection for the typescript with async functions",
"de": "Null-Timeouts werden jetzt überprüft\nKorrektur für das Typoskript mit asynchronen Funktionen",
diff --git a/lib/sandbox.js b/lib/sandbox.js
index 0cc3bced6..f0bbbc632 100644
--- a/lib/sandbox.js
+++ b/lib/sandbox.js
@@ -1293,14 +1293,18 @@ function sandBox(script, name, verbose, debug, context) {
errorInCallback(e); //adapter.log.error('Error in callback: ' + e)
}
});
- schedule._ioBroker = {
- type: 'cron',
- pattern,
- scriptName: sandbox.name,
- id: 'cron_' + Date.now() + '_' + Math.round((Math.random() * 100000))
- };
+ if (schedule) {
+ schedule._ioBroker = {
+ type: 'cron',
+ pattern,
+ scriptName: sandbox.name,
+ id: 'cron_' + Date.now() + '_' + Math.round((Math.random() * 100000))
+ };
- script.schedules.push(schedule);
+ script.schedules.push(schedule);
+ } else {
+ sandbox.log('schedule(cron=' + pattern + '): cannot create schedule', 'error');
+ }
sandbox.verbose && sandbox.log('schedule(cron=' + pattern + ')', 'info');
diff --git a/package.json b/package.json
index d5ab1af40..4687e5a3f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "iobroker.javascript",
- "version": "4.10.4",
+ "version": "4.10.5",
"description": "Javascript/Coffescript Script Engine for ioBroker",
"author": "bluefox ",
"contributors": [
diff --git a/src/package.json b/src/package.json
index af0ef0415..cecedbe60 100644
--- a/src/package.json
+++ b/src/package.json
@@ -1,6 +1,6 @@
{
"name": "js",
- "version": "4.10.4",
+ "version": "4.10.5",
"private": true,
"dependencies": {
"@material-ui/core": "^4.11.0",
diff --git a/src/public/vs/base/browser/ui/codicons/codicon/codicon.ttf b/src/public/vs/base/browser/ui/codicons/codicon/codicon.ttf
index 4c16209d6..b0d83b1f6 100644
Binary files a/src/public/vs/base/browser/ui/codicons/codicon/codicon.ttf and b/src/public/vs/base/browser/ui/codicons/codicon/codicon.ttf differ