-
Notifications
You must be signed in to change notification settings - Fork 120
/
main.57c53a5f.chunk.js.map
1 lines (1 loc) · 581 KB
/
main.57c53a5f.chunk.js.map
1
{"version":3,"sources":["assets/tileJS.png","assets/tileTS.png","assets/tileBlockly.png","assets/blockly2js.png","Theme.js","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","assets/blockly.png","assets/typescript.png"],"names":["module","exports","type","root","flexGrow","display","width","height","menu","depthOffset","colors","primary","secondary","selected","background","color","error","toolbar","tabs","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","label","value","onKeyPress","ev","key","preventDefault","setTimeout","onChange","e","target","margin","disabled","FormControl","InputLabel","htmlFor","Select","parseInt","inputProps","map","MenuItem","DialogActions","Button","onClick","React","Component","DialogDelete","onDelete","fontSize","fontWeight","DialogAddNew","html","lang","getLanguage","window","focus","Card","className","classes","card","CardActionArea","CardMedia","media","image","ImgJS","title","CardContent","text","CardActions","size","openHtml","ImgTS","ImgBlockly","textAlign","getJSCard","getBlocklyCard","getTSCard","withStyles","DialogNew","onAdd","existingItems","indexOf","parent","helperText","minWidth","parents","splice","names","forEach","n","i","el","find","item","push","DialogError","console","log","aria-describedby","titleBackground","titleColor","DialogContentText","autoFocus","theme","Themes","COLOR_RUN","green","COLOR_PROBLEM","yellow","COLOR_PAUSE","red","images","def","ImgTypeScript","getItemStyle","isDragging","draggableStyle","userSelect","getObjectName","obj","common","en","prepareList","data","modified","result","ids","Object","keys","sort","a","b","enabled","depth","engineType","engine","startsWith","index","it","parentIndex","SideDrawer","onDragUpdate","update","provided","destination","listItems","dragDepth","expanded","localStorage","getItem","JSON","parse","inputRef","createRef","scripts","problems","reorder","draggedId","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","connection","getState","err","readProblems","subscribeState","unsubscribeState","stringify","changed","val","pos","isSearchEnabled","newState","filterListStatic","objects","ensureSelectedIsVisibleStatic","getIsAllZeroInstancesStatic","setItem","stopPropagation","concat","saveExpanded","source","newId","draggableId","event","children","IconButton","iconButtons","onEnableDisable","onEdit","Promise","resolve","isExpanded","gripHandle","noGripHandle","expandButton","onCollapse","onExpand","whiteSpace","padding","overflow","flex","filtered","filteredPartly","items","childrenFiltered","filter","isFilteredOut","depthPx","Theme","toLowerCase","assign","marginLeft","cursor","opacity","iconStyle","inner","ListItem","element","onDoubleClick","onDblClick","renderFolderButtons","ListItemIcon","scriptIcon","alt","src","ListItemText","undefined","getTextStyle","childrenCount","ListItemSecondaryAction","renderItemButtons","isDragDisabled","snapshot","ref","innerRef","draggableProps","dragHandleProps","renderOneItem","dragging","List","dense","disablePadding","copyId","word","m","menuAnchorFilterEl","filterIcon","selectedItem","Menu","anchorEl","PaperProps","maxHeight","MENU_ITEM_HEIGHT","showError","then","iconDropdownMenu","onCloseMenu","onExpertModeChange","onExport","onImport","onThemeChange","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","paper","drawerPaper","anchor","getToolbarButtons","Divider","onDragStart","onDragEnd","droppableId","innerMenu","renderAllItems","footer","getBottomButtons","newName","newInstance","getUniqueName","getFolders","getUniqueFolderName","found","lastIndexOf","nState","selectId","position","palette","lineHeight","paddingRight","iconOnTheRight","right","top","overflowX","overflowY","borderRadius","marginRight","backgroundColor","gText","Log","lines","goBottom","editing","lastIndex","messagesEnd","logHandlerBound","logHandler","message","ts","severity","trTime","d","getHours","toString","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","paddingLeft","hasOwnProperty","info","warn","debug","silly","fontFamily","left","boxShadow","toolboxXml","ScriptEditor","isDark","language","readOnly","alive","check","monacoDiv","editor","monaco","insert","originalCode","code","globalTypingHandles","typings","lastSearch","monacoCounter","waitForMonaco","componentDidMount","onRegisterSelect","getModel","getValueInRange","getSelection","compilerOptions","languages","typescript","typescriptDefaults","ScriptTarget","ES2015","allowJs","checkJs","noLib","lib","moduleResolution","ModuleResolutionKind","NodeJs","setCompilerOptions","setTypeCheck","create","lineNumbers","scrollBeyondLastLine","automaticLayout","onDidChangeModelContent","getValue","scriptAdapterInstance","getScripts","sendTo","setEditorTypings","addCommand","KeyMod","CtrlCmd","KeyCode","KEY_S","onForceSave","highlightText","options","selectOnLineNumbers","setEditorOptions","setValue","setEditorLanguage","updateOptions","lineWrap","wordWrap","typeCheck","setTheme","dispose","model","uri","path","filenameWithoutExtension","substr","extension","newLanguage","newModel","createModel","Uri","from","setModel","noSemanticValidation","noSyntaxValidation","setDiagnosticsOptions","isGlobal","handle","addExtraLib","isGlobalScript","test","partialDeclarationsPath","addTypingsToEditor","selection","range","Range","startLineNumber","startColumn","endLineNumber","endColumn","executeEdits","forceMoveMarkers","findMatches","r","setSelection","revealLine","row","getPosition","lineNumber","col","column","insertTextIntoEditor","onInserted","newValue","Fab","bottom","zIndex","forceUpdate","DialogExport","popper","getElementById","dialog","textArea","textAreaLight","Popper","placement","transition","TransitionProps","Fade","timeout","Paper","typography","tabIndex","aria-hidden","spacing","unit","DialogImport","fullHeight","resize","languageBlocklyLoaded","languageOwnLoaded","toolboxText","scriptsLoaded","BlocklyEditor","blockly","blocklyWorkspace","exportText","importText","someSelected","changeTimer","onResizeBind","onResize","lastCommand","blinkBlock","loadLanguages","dom","Xml","workspaceToDom","searchXml","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","domToText","btoa","encodeURIComponent","xmlBlock","blockToDom","dragMode_","DRAG_FREE","deleteNext","xy","getRelativeToSurfaceXY","RTL","x","y","domToPrettyText","trim","xmlBlocks","textToDom","nodeName","paste","onBlocklyChanged","ignoreChanges","jsCode2Blockly","domToWorkspace","alert","blocklyRemoveOrphanedShadows","didUpdate","addEventListener","getToolbox","inject","zoom","controls","wheel","startScale","maxScale","minScale","scaleSpeed","trashcan","grid","colour","snap","addChangeListener","masterEvent","Events","UI","CREATE","getElementsByClassName","classList","darkBackground","add","remove","removeEventListener","blocklyCode2JSCode","outerHTML","p1","MSG","CustomBlocks","_b","Words","HUE","componentDidUpdate","onImportBlocks","url","callback","location","scriptTag","onerror","adapter","loadJS","loadScripts","toLoad","DOMParser","xmlStr","parseFromString","ActiveXObject","xmlDoc","async","loadXML","_result","tagName","attributes","innerText","childNodes","node","stroke","fill","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","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","onToggle","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","SimpleCron","time","timeFrom","timeTo","weekdays","settings","day","marginBottom","formControl","formControlMarginRight","getDate","getMonth","formControlPaddingTop","getControlsTime","getControlsDate","getControlsPeriodElements","hour","getControlsWeekdaysElements","onModeChange","getOnceElements","getIntervalElements","getIntervalBetweenElements","getSpecificTimeElements","list","part","_parts","dow","text2weekdays","periodArray2text","partsDate","month","paddingTop","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","paddingBottom","DialogCron","simple","onOk","dialogPaper","setMode","ok","cancel","headerID","fontStyle","radio","DialogScriptEditor","isReturn","args","argsTitle","Editor","tabsRef","debugEnabled","verboseEnabled","showBlocklyCode","showSelectId","showCron","showScript","visible","cmdToBlockly","menuTabsOpened","menuTabsAnchorEl","showDebugMenu","toast","setChangedInAdmin","initValue","scriptDialog","systemLang","main","selectIdDialog","cronDialog","showScriptDialog","onSelectedChange","onBrowserCloseBound","onBrowserClose","isChanged","configNotSaved","returnValue","_changed","verbose","removeNonExistingScripts","oldSource","commonLocal","nextCommon","onRestart","func","getSelect","showConfirmDialog","nowSelected","script","isScriptChanged","onTabClose","question","confirmCallback","confirm","cmd","onTabChange","indicatorColor","textColor","scrollButtons","tabIcon","tabText","tabChanged","tabChangedIcon","closeButton","href","tabButton","wrapper","tabButtonWrapper","tabMenuButton","_event","hintButton","hintIcon","menuDebugAnchorEl","menuIcon","isInstanceRunning","isScriptRunning","Toolbar","onLocate","notRunning","textButton","onSave","onCancel","sendCommandToBlockly","onConvert2JS","ImgBlockly2Js","Badge","badgeMargin","badgeContent","getDebugBadge","editorDiv","resizing","statesOnly","Snackbar","anchorOrigin","vertical","horizontal","autoHideDuration","ContentProps","action","closeToast","getTabs","getToolbar","getScriptEditor","getBlocklyEditor","getConfirmDialog","getSelectIdDialog","getCronDialog","getEditorDialog","getDebugMenu","getToast","minHeight","hintText","textOverflow","DialogImportFile","imageStatus","files","file","readFileDataUrl","dropzone","dropzoneAccepted","dropzoneRejected","maxSize","acceptClassName","rejectClassName","onDrop","handleDropFile","multiple","accept","getRootProps","getInputProps","isDragActive","isDragReject","dropzoneDiv","icon","iconError","iconOk","reader","FileReader","onabort","readAsDataURL","borderWidth","borderStyle","borderColor","boxSizing","transform","App","setTranslations","require","connected","progress","ready","updateScripts","updating","logMessage","menuSelectId","logHorzLayout","importFile","themeType","logSize","parseFloat","menuSize","hosts","socket","Connection","autoSubscribes","autoSubscribeLog","onProgress","PROGRESS","CONNECTING","READY","round","onReady","setLanguage","onObjectChange","onError","onBlocklyChanges","reload","onLog","isReady","nScripts","groups","compareScripts","loadCustomBlockly","newScripts","oldIds","newIds","oldScript","newScript","promise","updateScript","renameGroup","catch","delObject","isFolder","reg","RegExp","setObject","expert","onSelect","_list","getLiveHost","host","emit","link","click","download","onImportConfirmed","showMessage","errorDialog","content","menuOpenCloseButton","primaryMinSize","secondaryInitialSize","onSecondaryPaneSizeChange","onUpdateScript","extendObject","toggleLogLayout","primaryIndex","secondaryMinSize","customClassName","splitterDivs","menuDivWithoutMenu","SideMenu","renderMain","menuDiv","default","splitterDivWithMenu","Boolean","hostname","build","Map","ReactDOM","render","MuiThemeProvider","createTheme","_theme","navigator","serviceWorker","registration","unregister"],"mappings":"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,CACH,SACA,UACA,UACA,QACA,MACA,OACA,OACA,SACA,YACA,UACA,WACA,YAEJD,IAAK,CACD,UACA,SACA,WACA,WACA,aACA,UACA,WAEJ,MAAoB,UACpB,IAAoB,MACpB,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,MAAwB,OACxB,IAAwB,IACxB,YAAwB,cACxB,kBAAwB,mBACxB,KAAwB,OACxB,OAAwB,SACxB,YAAwB,YACxB,OAAwB,UACxB,mBAAwB,oBACxB,kBAAwB,kBACxB,oBAAwB,mBACxB,SAAwB,WACxB,iBAAwB,cACxB,YAAwB,SACxB,GAAwB,IACxB,GAAwB,KACxB,GAAwB,MAG5BqB,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,KACA,KACA,MACA,OACA,MAEJ,MAAwB,OACxB,IAAwB,KACxB,YAAwB,WACxB,kBAAwB,oBACxB,KAAwB,MACxB,OAAwB,SACxB,YAAwB,aACxB,OAAwB,SACxB,mBAAwB,mBACxB,kBAAwB,mBACxB,oBAAwB,iBACxB,SAAwB,QACxB,iBAAwB,iBACxB,YAAwB,UACxB,GAAwB,KACxB,GAAwB,KACxB,GAAwB,MAG5BqB,QAA8B,CAC1B9B,SAAU,CACNC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,IAERM,MAAO,CACH,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,qBACA,sBAEJD,IAAK,CACD,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,sBAEJ,MAAoB,SACpB,IAAoB,SACpB,YAAoB,eACpB,kBAAoB,uCACpB,KAAoB,eACpB,OAAoB,eACpB,YAAoB,qBACpB,OAAoB,SACpB,mBAAoB,2BACpB,kBAAoB,qBACpB,oBAAqB,6CACrB,SAAoB,SACpB,iBAAoB,2BACpB,YAAoB,eACpB,GAAoB,SACpB,GAAoB,SACpB,GAAoB,WAGTqB,MCxbAC,OANf,SAA2BC,EAAM1uB,GAC7B,IAAM2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","file":"static/js/main.57c53a5f.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAM0AAABkCAYAAAAlr7RPAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwgAADsIBFShKgAAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC41ZYUyZQAAB1RJREFUeF7tnWtv2zYUhvdz+lP2/4q0w74V277t0qZthq3Yl+7Sot2AFRuGYmuxYXM7N7YTK74kjp2j6TBk4HiyzSNSFGW+B3hQNLEpMTqPSIkU9V7+7EYOALAH0gAgBNIAIATSACAE0gAgBNIAIATSACAE0gAgBNIAIATSACAE0gAgBNIAIATSACAE0gAgBNIAIATSACAE0gAgBNIAIATSACAE0oA4efF+nnduboc/V/b9GoE0KWKbkGXUlaRL+0Rvbs/z0z+HuU2cvc3o3zuT2vdvCUiTIr17fZ1y8uDELCuzKloWOno001twCsqeTqhmeSBNisQgjZHl5MeRLtlr0Hw4qqvlgTQp0rQ0RSJT/2CuS6w16OT52Lc4kCZFmpSGhRn/eqJLCxK0mF5e83iSB9KkSFPSsDCL0ViXFD4OP/MiDqRJkSakYWFm3UyX0lx4EAfSpEhoaViY0c+1XPBXCscuJqRJkZDSsDC9u6S/HUUUAp+4tDaQJkVCSsOfjzCod4+qigNpUiSUNNzKDL72MmhZS1TspkGaFAklTaStDIe6KYGWBljTMmlo+nqYdz8a5d07E/6Xpq+c7sJR/8EC1zRARiBp6O2HTl0zyp6N1fZWE5z/X/ycBg9Fswpo9i4rLU8IpEmRENJwYl6cnupvycNmPIV/z5+zCU8DmwykSZEQ0vDnKoZqEWwTfIs4qmvnoXVZBtKkSOTSWG/DsEYc6u1f+JTFAGlSZNekYQo51NhLETR5mdX5TA2kSZFdlIZhcTp7lQctbYE0KbKr0gQC0qRI7DcC+vVci/gC0qRI7C0NR8StDaRJkRZIo9YOiLS1gTQpEkIaviifvHSb7sKDo7y9yOSBNCkSQhrGsbUxQdkTr8/4uwJpUqRl0phQa6NFIA+kSZFQ0nAX7bznfeUZOutcTrxsSCBIkyKhpGH48zWGmioTWB5IkyIhpeHWZnZY+zpndPx4GkoeSJMiIaUpUPPAAgWd/FTbcrQGSJMigaVRrU2gZWhN0KC+mwaQJkVCS8OwOOPfgi8WSP2Hc9/iQJoUaUIahsWZ/B5enHk29vmoAKRJkaakYVSL80vQBdCvwnFBDQOkSZEmpWFYnP6DoNc4JtQbCxzFgTQp0rQ0DCfu4ee60LChuogO4kCaFIlBGoYTl8s7+uZMlx4siN/pWVEcSJMisUhjMPIcfzvVWwkSNCy2V0EcSJMisUlj0PKoRQIDRZWF0CFNisQqjcHI4+mNz1tDWCdIkyKxS2Mw3TYW6LxX2/gODQ5EA6CQJkXaIs0yRVLzAGVtg6OCekGaFGmjNAbTdfP93htIAzbSZmkMRp7hd17uuNFRIaFlFw3SpMguSGPgRLd9c8C2sKwbpEmRXZKGMa3OzPFmAaQBa9k1aQy8by4BacBadlWaosWhwVfnek/lAWnAOqj/8FCniTxcpNHdqLz7yUneu39oe+EtgsuvGOqNA2VlrgBp2oRJusHBu8oJx2fj2dvqff8q0uj9psGX1x8H6N/38nzLNVykeXN7UVrmCpCmDZiky55O9PHNqXe32ntYHJIqn2dj8TaLz1NvwyMAHt+FqXCSZu+itMwVIE3sqKTbv9DH9XpwgpR9ZxMu0mRPOqVllsEisOinfw31t9dHlXqsw6V+lvsBaWKFZencJFpMrlqX1aDh9xPpWZo6t9Qr9qoEHX56XFbmNYwswx/W7vdq0Nk/Tg+FXcF/s+mr2ruekCY2rpLO7tkS6n1h301zTCq1OEVZuQbej4oDjbQYj1XS2tZlFYdtXwWkaSGc1KsXyzZh80wIl92/X97Ns41NScXlc+I7hlo7QCoPf5ZnKrsGpGkRnHBFt4kWo8pJp7pDfNCXE47/1T9TXTnX2JRU/DuPQfwItN73/wm0XK/OrQsfy96q8Z3V7awB0sSA74Q7/Tujo0ddmnW9TaNXT1NuSqrid95nHuug+fGIevs96t6ZUPfjUS2PB/AxKKtXCZAmBjjhRi+aWQvMMujNre23Y7kei6l7i9ZEQJoW4rm18R62SRV7PUpCuk4ApIkFPkvznbAIQ40T2SYV14NXsmxJqPd6CoRhIE1McMJ5vA7xFoKui4KTsIG1zKrE1tvoJUCa2Iise1N5ug6fAPh1FxGHev1HhbpBmtjgg+jrSUTHUN2sKsIYWJzjx6e6uKiCsufyeXQaSBMjEYiz9RazLSzOpgmbDYR0yaZVIE2s8EEtump03g9+K1oNlPoQxmDqMnvX+PWaZBBzHZAmdooDbDsPzUv4nqq/DJfbUAvKL3ZS14se6gZp2gCLw2fqycvaztTq2sNTUm2Ey+e68ANoAYLnw/FUG5/1gjRtwiScx2kkaiZCCFlWMXVhpq+9nwzU36imekGaNqIT7jLpPpirATrLoMVoQp29C/P94LKUsVQfVafpH2KJ6KxzKYmhxnpBml1gJek2EoMk25DUxxCwXpAGACGQBgAhkAYAIZAGACGQBgAhkAYAIZAGACGQBgAhkAYAIZAGABE38v8Aj0qLiUXOUdYAAAAASUVORK5CYII=\"","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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\"","export default {\r\n type: 'dark',\r\n root: {\r\n flexGrow: 1,\r\n display: 'flex',\r\n width: '100%',\r\n height: '100%'\r\n },\r\n menu: {\r\n width: 300,\r\n depthOffset: 20\r\n },\r\n colors: {\r\n primary: '#3399CC',\r\n secondary: '#164477',\r\n selected: {\r\n background: '#164477',\r\n color: 'white'\r\n },\r\n error: {\r\n background: '#dc0300',\r\n color: '#FFFFFF'\r\n }\r\n },\r\n toolbar: {\r\n height: 48\r\n },\r\n tabs: {\r\n height: 48\r\n }\r\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 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\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 <Dialog\n disableBackdropClick\n disableEscapeKeyDown\n maxWidth=\"md\"\n fullWidth={true}\n open={true}\n aria-labelledby=\"confirmation-dialog-title\"\n >\n <DialogTitle id=\"confirmation-dialog-title\">{I18n.t('Rename')}</DialogTitle>\n <DialogContent>\n <form noValidate autoComplete=\"off\">\n <TextField\n style={{width: '100%'}}\n id=\"standard-name\"\n label={I18n.t('Name')}\n value={this.state.name}\n onKeyPress={(ev) => {\n if (ev.key === 'Enter') {\n // Do code here\n ev.preventDefault();\n setTimeout(() => this.handleOk(), 200);\n }\n }}\n onChange={e => this.handleChange(e.target.value)}\n margin=\"normal\"\n />\n <TextField\n id=\"standard-name-id\"\n style={{width: '100%'}}\n label={I18n.t('ID')}\n value={this.state.id}\n disabled={true}\n margin=\"normal\"\n />\n {\n this.isShowInstance && (\n <FormControl>\n <InputLabel htmlFor=\"instance\">{I18n.t('Instance')}</InputLabel>\n <Select\n value={this.state.instance}\n onChange={e => this.setState({instance: parseInt(e.target.value, 10)})}\n inputProps={{name: 'instance', id: 'instance'}}\n >\n {this.props.instances.map(instance => (<MenuItem key={instance} value={instance}>{instance || '0'}</MenuItem>))}\n </Select>\n </FormControl>)\n }\n </form>\n </DialogContent>\n <DialogActions>\n <Button onClick={this.handleOk} color=\"primary\">{I18n.t('Ok')}</Button>\n <Button onClick={this.handleCancel} color=\"primary\">{I18n.t('Cancel')}</Button>\n </DialogActions>\n </Dialog>\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 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 I18n from '@iobroker/adapter-react/i18n';\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 <Dialog\n disableBackdropClick\n disableEscapeKeyDown\n maxWidth=\"md\"\n fullWidth={true}\n open={true}\n aria-labelledby=\"confirmation-dialog-title\"\n >\n <DialogTitle id=\"confirmation-dialog-title\">{I18n.t('Are you sure?')}</DialogTitle>\n <DialogContent>\n <IconDelete/>\n <span style={{fontSize: 14, fontWeight: 'bold'}}>{I18n.t('Delete %s', this.state.name)}</span>\n </DialogContent>\n <DialogActions>\n <Button onClick={this.handleOk} color=\"primary\">{I18n.t('Ok')}</Button>\n <Button onClick={this.handleCancel} color=\"primary\">{I18n.t('Cancel')}</Button>\n </DialogActions>\n </Dialog>\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 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';\n\nimport I18n from '@iobroker/adapter-react/i18n';\n\nconst styles = {\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};\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 (<Card className={this.props.classes.card}>\n <CardActionArea\n onClick={() => this.props.onClose && this.props.onClose('Javascript/js')}>\n <CardMedia\n className={this.props.classes.media}\n image={ImgJS}\n title=\"Javascript\"\n />\n <CardContent>\n <h2>Javascript</h2>\n <div className={this.props.classes.text}>{I18n.t('JS description')}</div>\n </CardContent>\n </CardActionArea>\n <CardActions>\n <Button size=\"small\" color=\"primary\" onClick={() => this.props.onClose && this.props.onClose('Javascript/js')}>{I18n.t('Add')}</Button>\n <Button size=\"small\" color=\"primary\" onClick={() => this.openHtml('https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md')}>{I18n.t('Learn More')}</Button>\n </CardActions>\n </Card>);\n }\n getTSCard() {\n return (<Card className={this.props.classes.card}>\n <CardActionArea\n onClick={() => this.props.onClose && this.props.onClose('TypeScript/ts')}>\n <CardMedia\n className={this.props.classes.media}\n image={ImgTS}\n title=\"Typescript\"\n />\n <CardContent>\n <h2>Typescript</h2>\n <div className={this.props.classes.text}>{I18n.t('TS description')}</div>\n </CardContent>\n </CardActionArea>\n <CardActions>\n <Button size=\"small\" color=\"primary\" onClick={() => this.props.onClose && this.props.onClose('TypeScript/ts')}>{I18n.t('Add')}</Button>\n <Button size=\"small\" color=\"primary\" onClick={() => this.openHtml('https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#global-functions')}>{I18n.t('Learn More')}</Button>\n </CardActions>\n </Card>);\n }\n getBlocklyCard() {\n return (<Card className={this.props.classes.card}>\n <CardActionArea onClick={() => this.props.onClose && this.props.onClose('Blockly')}>\n <CardMedia\n className={this.props.classes.media}\n image={ImgBlockly}\n title=\"Blockly\"\n />\n <CardContent>\n <h2>Blockly</h2>\n <div className={this.props.classes.text}>{I18n.t('Blockly description')}</div>\n </CardContent>\n </CardActionArea>\n <CardActions>\n <Button size=\"small\" color=\"primary\" onClick={() => this.props.onClose && this.props.onClose('Blockly')}>{I18n.t('Add')}</Button>\n <Button size=\"small\" color=\"primary\" onClick={() => this.openHtml('https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/blockly.md')}>{I18n.t('Learn More')}</Button>\n </CardActions>\n </Card>);\n }\n render() {\n return (\n <Dialog\n disableBackdropClick\n disableEscapeKeyDown\n maxWidth=\"md\"\n fullWidth={true}\n open={true}\n aria-labelledby=\"confirmation-dialog-title\"\n >\n <DialogTitle id=\"confirmation-dialog-title\">{I18n.t('Add new script')}</DialogTitle>\n <DialogContent style={{textAlign: 'center'}}>\n {this.getJSCard()}\n {this.getBlocklyCard()}\n {this.getTSCard()}\n </DialogContent>\n <DialogActions>\n <Button onClick={this.handleCancel} color=\"primary\">{I18n.t('Cancel')}</Button>\n </DialogActions>\n </Dialog>\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 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\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 <Dialog\n disableBackdropClick\n disableEscapeKeyDown\n maxWidth=\"md\"\n fullWidth={true}\n open={true}\n aria-labelledby=\"confirmation-dialog-title\"\n >\n <DialogTitle id=\"confirmation-dialog-title\">{this.props.title || I18n.t('Create new')}</DialogTitle>\n <DialogContent>\n <form noValidate autoComplete=\"off\">\n <TextField\n style={{width: '100%'}}\n id=\"standard-name\"\n error={!!this.state.error}\n label={I18n.t('Name')}\n value={this.state.name}\n helperText={this.state.error}\n onKeyPress={(ev) => {\n if (ev.key === 'Enter') {\n // Do code here\n ev.preventDefault();\n setTimeout(() => this.handleOk(), 200);\n }\n }}\n onChange={e => this.handleChange(e.target.value)}\n margin=\"normal\"\n />\n <FormControl style={{minWidth: 100}}>\n <InputLabel htmlFor=\"parent\">{I18n.t('Folder')}</InputLabel>\n <Select\n style={{width: '100%'}}\n value={this.state.parent}\n onChange={e => this.setState({parent: e.target.value})}\n inputProps={{name: 'parent', id: 'parent',}}\n >\n {this.props.parents.map(parent => {\n const parts = parent.id.split('.');\n parts.splice(0, 2); // remove script.js\n const names = [];\n let id = 'script.js';\n parts.forEach((n, i) => {\n id += '.' + n;\n const el = this.props.parents.find(item => item.id === id);\n if (el) {\n names.push(el.name);\n } else {\n names.push(n);\n }\n });\n if (!names.length) {\n names.push(parent.name);\n }\n return (<MenuItem key={parent.id} value={parent.id}>{names.join(' / ')}</MenuItem>)\n })}\n </Select>\n </FormControl>\n <TextField\n id=\"standard-name-id\"\n style={{width: '100%'}}\n label={I18n.t('ID')}\n value={this.getId()}\n disabled={true}\n margin=\"normal\"\n />\n {\n this.isShowInstance && (\n <FormControl>\n <InputLabel htmlFor=\"instance\">{I18n.t('Instance')}</InputLabel>\n <Select\n value={this.state.instance}\n onChange={e => this.setState({instance: parseInt(e.target.value, 10)})}\n inputProps={{name: 'instance', id: 'instance',}}\n >\n {this.props.instances.map(instance => (<MenuItem key={'instance' + instance} value={instance}>{instance || '0'}</MenuItem>))}\n </Select>\n </FormControl>)\n }\n </form>\n </DialogContent>\n <DialogActions>\n <Button onClick={this.handleOk} disabled={!!this.state.error} color=\"primary\">{I18n.t('Ok')}</Button>\n <Button onClick={this.handleCancel} color=\"primary\">{I18n.t('Cancel')}</Button>\n </DialogActions>\n </Dialog>\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 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 I18n from '@iobroker/adapter-react/i18n';\nimport Themes from '../Theme';\n\nconst styles = theme => ({\n titleBackground: {\n background: Themes.colors.error.background\n },\n titleColor: {\n color: Themes.colors.error.color,\n '&>h2': {\n color: Themes.colors.error.color,\n }\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 <Dialog\n open={true}\n maxWidth=\"sm\"\n fullWidth={true}\n onClose={() => this.handleOk()}\n aria-labelledby=\"alert-dialog-title\"\n aria-describedby=\"alert-dialog-description\"\n >\n <DialogTitle className={this.props.classes.titleBackground}\n classes={{root: this.props.classes.titleColor}}\n id=\"alert-dialog-title\">{this.props.title || I18n.t('Error')}</DialogTitle>\n <DialogContent>\n <DialogContentText id=\"alert-dialog-description\">\n {this.props.text || I18n.t('Unknown error!')}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => this.handleOk()} color=\"primary\" autoFocus>{I18n.t('Ok')}</Button>\n </DialogActions>\n </Dialog>\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 {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 {DragDropContext, Droppable, Draggable} from 'react-beautiful-dnd';\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 {MdDragHandle as IconGrip} from 'react-icons/md';\nimport {MdExpandMore as IconCollapse} from 'react-icons/md';\nimport {MdKeyboardArrowRight as IconExpand} 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 Theme from './Theme';\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];\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 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 },\n gripHandle: {\n paddingRight: 13\n },\n noGripHandle: {\n width: 29\n },\n folder: {\n background: theme.palette.type === 'dark' ? '#6a6a6a' : '#e2e2e2',\n cursor: 'pointer',\n padding: 0,\n userSelect: 'none'\n },\n element: {\n cursor: 'pointer',\n padding: 0,\n userSelect: 'none'\n },\n reorder: {\n padding: '9px 16px 9px 9px',\n },\n expandButton: {\n width: 37,\n height: 37\n },\n selected: Theme.colors.selected,\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\nconst images = {\n 'Blockly': ImgBlockly,\n 'Javascript/js': ImgJS,\n def: ImgJS,\n 'TypeScript/ts': ImgTypeScript,\n};\n\nconst getItemStyle = (isDragging, draggableStyle) => ({\n userSelect: 'none',\n background: isDragging ? 'lightgreen' : 'inherit',\n ...draggableStyle,\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;\n } else {\n return obj.common.name;\n }\n } else {\n return id.replace(/^script\\.js./, '');\n }\n};\n\nconst prepareList = data => {\n const result = [];\n const ids = Object.keys(data);\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 - 2,\n type: obj.type === 'script' ? obj.common.engineType : 'folder',\n parent: parts.length > 2 ? 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) return 0;\n return a.id > b.id ? 1 : -1;\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) return 0;\n return a.id > b.id ? 1 : -1;\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) return 0;\n return a.id > b.id ? 1 : -1;\n }\n }\n });\n\n // Fill all index\n result.forEach((item, i) => item.index = i);\n\n let modified;\n do {\n modified = false;\n // check if all parents exists\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.replace(/^script\\.js./, ''),\n depth: parts.length - 2,\n type: 'folder',\n parent: parts.length > 2 ? parts.join('.') : null\n });\n modified = true;\n }\n }\n });\n } while(modified);\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\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 theme: this.props.theme,\n dragDepth: 0,\n draggedId: null,\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\\./)\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('script.js.'.length);\n\n this.props.connection.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.connection.subscribeState('javascript.' + instance + '.scriptProblem.*', this.onProblemUpdatedBound);\n });\n });\n }\n\n componentWillUnmount() {\n this.props.instances.forEach(instance => {\n this.props.connection.unsubscribeState('javascript.' + instance + '.scriptProblem.*', this.onProblemUpdatedBound);\n });\n }\n\n onProblemUpdated(id, state) {\n if (!state || !id) return;\n id = 'script.js.' + 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 console.log(item.id + ' filtered out');\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) {\n changed = true;\n listItems[it.parentIndex].filteredPartly = true;\n }\n it = it.parent ? 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.objects\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.objects);\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.theme !== props.theme) {\n changed = true;\n newState.theme = props.theme;\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 onExpand(id, e) {\n e && e.stopPropagation();\n if (this.state.expanded.indexOf(id) === -1) {\n const expanded = this.state.expanded.concat([id]);\n this.setState({expanded});\n this.saveExpanded(expanded);\n }\n }\n\n onCollapse(id, e) {\n e && e.stopPropagation();\n const pos = this.state.expanded.indexOf(id);\n if (pos !== -1) {\n const expanded = this.state.expanded.concat([]);\n expanded.splice(pos, 1);\n if (this.state.selected && this.state.selected.startsWith(id + '.')) {\n this.setState({expanded, selected: id});\n window.localStorage && window.localStorage.setItem('SideMenu.selected', id);\n } else {\n this.setState({expanded});\n }\n this.saveExpanded(expanded);\n }\n }\n\n onDragEnd(result) {\n // dropped outside the list\n if (!result.destination) {\n return;\n }\n let item = result.destination.index > result.source.index ? this.state.listItems[result.destination.index] : this.state.listItems[result.destination.index - 1];\n while (item && (item.type !== 'folder' && item.parent)) {\n item = this.state.listItems[item.parentIndex];\n }\n let parent = item ? item.id : 'script.js';\n let newId = parent + '.' + result.draggableId.split('.').pop();\n if (this.props.scripts[newId]) {\n newId += '_' + I18n.t('copy');\n }\n this.props.onRename && this.props.onRename(result.draggableId, newId);\n }\n\n onDragStart(event) {\n // fill the drag depth\n this.setState({\n dragDepth: this.state.listItems.find(i => i.id === event.draggableId).depth,\n draggedId: event.draggableId\n });\n }\n\n onDragUpdate = (update, provided) => {\n if (!update.destination) return;\n let item = this.state.listItems[update.destination.index - 1];\n while (item && (item.type !== 'folder' || item.parent)) {\n item = this.state.listItems[item.parentIndex];\n }\n if (item) {\n this.setState({dragDepth: item.depth + 1});\n console.log(`depth ${item.depth + 1}`);\n } else {\n console.log(`depth 0`);\n this.setState({dragDepth: 0});\n }\n };\n\n renderItemButtons(item, children) {\n if (this.state.reorder) return null;\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 (<IconButton className={this.props.classes.iconButtons}\n onClick={e => {\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 ? (<IconPause/>) : (<IconPlay/>)}\n </IconButton>),\n this.state.width > 350 ? (<IconButton\n key=\"delete\"\n title={I18n.t('Delete script')}\n disabled={item.id === 'script.js.global' || item.id === 'script.js.common'}\n onClick={e => this.onDelete(item, e)}><IconDelete/></IconButton>) : null,\n (<IconButton key=\"openInEdit\" title={I18n.t('Edit script or just double click')} onClick={e => this.onEdit(item, e)}><IconDoEdit/></IconButton>),\n ];\n } else if (this.state.width > 350) {\n if (item.id !== 'script.js' && item.id !== 'script.js.common' && item.id !== 'script.js.global' && (!children || !children.length)) {\n return (<IconButton\n key=\"delete\"\n title={I18n.t('Delete folder')}\n disabled={item.id === 'script.js.global' || item.id === 'script.js.common'}\n onClick={e => this.onDelete(item, e)}><IconDelete/></IconButton>);\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 renderFolderButtons(item, children, isExpanded) {\n if (this.state.reorder) {\n if (item.type !== 'folder') {\n return (<IconGrip className={this.props.classes.gripHandle}/>);\n } else {\n return (<div className={this.props.classes.noGripHandle}/>);\n }\n }\n if (children && children.length) {\n return (\n <IconButton className={this.props.classes.expandButton}\n onClick={isExpanded ? e => this.onCollapse(item.id, e) : e => this.onExpand(item.id, e)}>\n {isExpanded ? (<IconCollapse fontSize=\"small\"/>) : (<IconExpand fontSize=\"small\"/>)}\n </IconButton>\n );\n } else {\n return (<div className={this.props.classes.expandButton}/>);\n }\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 > 350 ? 245 : 197}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) return;\n if (item.type === 'folder') {\n const isExpanded = this.state.expanded.indexOf(item.id) !== -1;\n if (isExpanded) {\n this.onCollapse(item.id);\n } else {\n this.onExpand(item.id);\n }\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 === 'script.js.global' && !this.state.expertMode);\n }\n\n renderOneItem(items, item) {\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 depthPx = this.state.reorder ?\n 8 + (this.state.draggedId === item.id ? this.state.dragDepth : item.depth) * Theme.menu.depthOffset :\n item.depth * Theme.menu.depthOffset;\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 (<span key=\"first\">{title.substring(0, pos)}</span>),\n (<span key=\"second\" style={{color: 'orange'}}>{title.substring(pos, pos + this.state.searchText.length)}</span>),\n (<span key=\"third\">{title.substring(pos + this.state.searchText.length)}</span>),\n ];\n }\n }\n\n if (!this.state.isAllZeroInstances && item.type !== 'folder') {\n title = [(<span key=\"instance\" title={I18n.t('Instance')} className={this.props.classes.instances}>[{item.instance}] </span>), (\n <span key=\"title\">{title}</span>)];\n }\n\n const style = Object.assign({\n marginLeft: depthPx,\n cursor: item.type === 'folder' && this.state.reorder ? 'default' : 'inherit',\n opacity: item.filteredPartly ? 0.5 : 1,\n width: `calc(100% - ${depthPx}px)`\n }, item.id === this.state.selected && !this.state.reorder ? Theme.colors.selected : {});\n\n if (item.id === 'script.js.global' && item.id !== this.state.selected) {\n style.color = '#00a200';\n }\n\n let isExpanded = false;\n if (children && children.length) {\n isExpanded = this.state.expanded.indexOf(item.id) !== -1;\n }\n\n let iconStyle = {};\n if (item.id === 'script.js.global') {\n iconStyle.color = '#356956';\n } else if (item.id === 'script.js.common') {\n iconStyle.color = '#4899e1';\n }\n\n const inner =\n (<ListItem\n key={item.id}\n style={style}\n className={(item.type === 'folder' ? this.props.classes.folder : this.props.classes.element) + ' ' + (this.state.reorder ? this.props.classes.reorder : '')}\n onClick={e => this.onClick(item, e)}\n onDoubleClick={e => this.onDblClick(item, e)}\n >\n {this.renderFolderButtons(item, children, isExpanded)}\n <ListItemIcon>{item.type === 'folder' ? (isExpanded ? (<IconFolderOpened style={iconStyle}/>) : (<IconFolder style={iconStyle}/>)) : (\n <img className={this.props.classes.scriptIcon} alt={item.type} src={images[item.type] || images.def}/>)}</ListItemIcon>\n <ListItemText\n classes={{primary: item.id === this.state.selected && !this.state.reorder ? this.props.classes.selected : undefined}}\n style={this.getTextStyle(item)} primary={(<span>{title}{(childrenFiltered && childrenFiltered.length) || children.length ? (<span className={this.props.classes.childrenCount}>{childrenFiltered && childrenFiltered.length !== children.length ? `${childrenFiltered.length}(${children.length})` : children.length}</span>) : null}</span>)}/>\n <ListItemSecondaryAction>{this.renderItemButtons(item, children)}</ListItemSecondaryAction>\n </ListItem>);\n\n const result = [this.state.reorder ? (\n <Draggable key={item.id} draggableId={item.id} index={item.index} isDragDisabled={item.type === 'folder'}>\n {(provided, snapshot) => (\n <div ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n style={getItemStyle(\n snapshot.isDragging,\n provided.draggableProps.style\n )}>\n {inner}\n </div>\n )}\n </Draggable>) : inner];\n\n if (children && (this.state.reorder || this.state.expanded.indexOf(item.id) !== -1)) {\n children.forEach(it => result.push(this.renderOneItem(items, it)));\n }\n return result;\n }\n\n renderAllItems(items, dragging) {\n const result = [];\n items.forEach(item => !item.parent && result.push(this.renderOneItem(items, item, dragging)));\n\n return (<List dense={true} disablePadding={true}>{result}</List>);\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 = 'script.js';\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 = 'script.js';\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 = 'script.js';\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.objects[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 && (<IconPlay className={this.props.classes.filterIcon} style={{color: COLOR_RUN}}/>),\n this.state.statusFilter === false && (<IconPause className={this.props.classes.filterIcon} style={{color: COLOR_PAUSE}}/>),\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 (<Menu\n key=\"menu\"\n id=\"long-menu\"\n anchorEl={this.state.menuAnchorEl}\n open={this.state.menuOpened}\n onClose={() => this.setState({menuOpened: false, menuAnchorEl: null})}\n PaperProps={{\n style: {\n maxHeight: MENU_ITEM_HEIGHT * 7.5,\n //width: 200,\n },\n }}\n >\n {this.state.width <= 350 ? (<MenuItem\n key=\"deleted\"\n disabled={!this.state.selected || this.state.selected === 'script.js.global' || this.state.selected === 'script.js.common' || (children && children.length)}\n onClick={event => {\n event.stopPropagation();\n event.preventDefault();\n if (this.state.listItems.find(item => item.parent === this.state.selected)) {\n this.showError(I18n.t('Cannot delete non empty item!'));\n return;\n }\n\n this.setState({menuOpened: false, menuAnchorEl: null}, () =>\n this.onDelete(this.state.selected).then(() => {}));\n }}><IconDelete className={this.props.classes.iconDropdownMenu} style={{color: 'red'}}/>{I18n.t('Delete')}\n </MenuItem>) : null}\n <MenuItem key=\"expertMode\" selected={this.state.expertMode}\n onClick={event => {\n event.stopPropagation();\n event.preventDefault();\n this.onCloseMenu(() =>\n this.props.onExpertModeChange && this.props.onExpertModeChange(!this.state.expertMode));\n }}><IconExpert className={this.props.classes.iconDropdownMenu} style={{color: 'orange'}}/>{I18n.t('Expert mode')}\n </MenuItem>\n {this.props.onExport && (<MenuItem key=\"exportAll\"\n onClick={event => {\n event.stopPropagation();\n event.preventDefault();\n this.onCloseMenu(() => this.props.onExport());\n }}><IconExport className={this.props.classes.iconDropdownMenu} />{I18n.t('Export all scripts')}\n </MenuItem>)}\n {this.props.onImport && (<MenuItem key=\"import\"\n onClick={event => {\n event.stopPropagation();\n event.preventDefault();\n this.onCloseMenu(() => this.props.onImport());\n }}><IconImport className={this.props.classes.iconDropdownMenu} />{I18n.t('Import scripts')}\n </MenuItem>)}\n {this.props.onThemeChange && (<MenuItem key=\"dark\"\n onClick={event => {\n //event.stopPropagation();\n //event.preventDefault();\n this.onCloseMenu(() =>\n this.props.onThemeChange(this.state.theme === 'dark' ? 'light' : 'dark'));\n }}><IconDark className={this.props.classes.iconDropdownMenu} />{this.state.theme === 'dark' ? I18n.t('Light style') : I18n.t('Dark style')}\n </MenuItem>)}\n {this.props.onAddNew && (<MenuItem key=\"copy\"\n disabled={!this.state.selected || !selectedItem || selectedItem.type === 'folder'}\n onClick={event => {\n const selected = this.state.selected;\n this.onCloseMenu(() => this.onCopy(event, selected))\n }}>\n <IconCopy className={this.props.classes.iconDropdownMenu} />{I18n.t('Copy script')}\n </MenuItem>)}\n </Menu>);\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((<RootRef key=\"searchInputRoof\" rootRef={this.inputRef}><Input\n key=\"searchInput\"\n value={this.state.searchText}\n className={classes.toolbarSearch}\n ref={this.inputRef}\n autoFocus={true}\n placeholder={I18n.t('Search...')}\n onChange={e => {\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 /></RootRef>));\n result.push((<IconButton\n key=\"disableSearch\"\n className={classes.toolbarButtons}\n style={{float: 'right'}}\n title={I18n.t('End search mode')}\n onClick={e => {\n e.stopPropagation();\n this.filterList(false, () => this.props.onSearch && this.props.onSearch(this.state.searchText));\n }}\n ><IconClose /></IconButton>));\n this.state.searchText && result.push((<IconButton\n key=\"cleanSearch\"\n mini=\"true\"\n title={I18n.t('Clear search input')}\n className={classes.toolbarButtons}\n style={{marginTop: 7, float: 'right'}}\n onClick={e => {\n e.stopPropagation();\n this.setState({searchText: ''}, () => {\n this.filterList(true);\n this.props.onSearch && this.props.onSearch(this.state.searchText);\n });\n }}\n ><IconClear fontSize=\"small\"/></IconButton>));\n } else {\n if (!this.state.reorder) {\n // Open Menu\n result.push((\n <IconButton\n key=\"menuButton\"\n aria-label=\"More\"\n aria-owns={this.state.menuOpened ? 'long-menu' : undefined}\n title={I18n.t('Menu')}\n aria-haspopup=\"true\"\n onClick={event => {\n event.stopPropagation();\n event.preventDefault();\n this.setState({menuOpened: true, menuAnchorEl: event.currentTarget});\n }}\n >\n {/*<Badge className={classes.margin} badgeContent={this.getFilterBadge()}>*/}\n <IconMore />\n {/*</Badge>*/}\n </IconButton>));\n\n const selectedItem = this.state.listItems.find(it => it.id === this.state.selected);\n let children;\n if (selectedItem && this.state.width <= 350 && 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((<IconButton\n key=\"new-script\"\n title={I18n.t('Create new script')}\n className={classes.toolbarButtons}\n style={{color: this.state.reorder ? 'red' : 'inherit'}}\n onClick={e => this.onAddNew(e)}\n ><IconAdd/></IconButton>));\n\n // New Folder\n result.push((<IconButton\n key=\"new-folder\"\n title={I18n.t('Create new folder')}\n className={classes.toolbarButtons}\n style={{color: this.state.reorder ? 'red' : 'inherit'}}\n onClick={() => this.onAddNewFolder()}\n ><IconAddFolder/></IconButton>));\n }\n\n // Search\n result.push((<IconButton\n key=\"search\"\n disabled={this.state.reorder}\n className={classes.toolbarButtons}\n title={I18n.t('Search in scripts')}\n style={{float: 'right'}}\n onClick={e => {\n e.stopPropagation();\n this.setState({searchMode: true});\n }}\n ><IconFind/></IconButton>));\n\n // Reorder button\n result.push((<IconButton\n key=\"reorder\"\n title={I18n.t('Reorder scripts in folders')}\n className={classes.toolbarButtons}\n style={{color: this.state.reorder ? 'red' : 'inherit', float: 'right'}}\n onClick={e => {\n e.stopPropagation();\n this.setState({reorder: !this.state.reorder, draggedId: ''});\n }}\n ><IconReorder/></IconButton>));\n\n if (!this.state.reorder && this.state.selected && this.state.selected !== 'script.js.global' && this.state.selected !== 'script.js.common') {\n // Rename\n result.push((<IconButton className={classes.toolbarButtons}\n title={I18n.t('Rename')}\n key=\"rename\"\n onClick={e => this.onRename(e)}\n ><IconEdit/></IconButton>));\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((<IconButton className={classes.toolbarButtons}\n // key=\"restart\"\n // onClick={e => {\n // e.stopPropagation();\n // this.props.onEnableDisable && this.props.onEnableDisable();\n // }}\n // ><IconRestart/></IconButton>));\n // }\n }\n\n }\n return result;\n }\n\n getFolders() {\n const folders = [{id: 'script.js', name: I18n.t('Root folder')}];\n this.state.listItems.forEach(item => item.type === 'folder' && folders.push({id: item.id, name: item.title}));\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 if (this.state.listItems.find(it => it.parent === item.id)) {\n expanded.push(item.id);\n }\n });\n this.setState({expanded});\n this.saveExpanded(expanded);\n }\n\n getBottomButtons() {\n return [\n (<IconPause\n key=\"filterByRunning\"\n className={this.props.classes.footerButtons}\n style={{color: COLOR_RUN, opacity: this.state.statusFilter === 'running' ? 1 : 0.3, background: this.state.statusFilter === 'running' ? 'gray' : 'inherit'}}\n title={I18n.t('Show only running scripts')}\n onClick={event => {\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 (<IconPlay\n key=\"filterByPaused\"\n title={I18n.t('Show only paused scripts')}\n className={this.props.classes.footerButtons}\n style={{color: COLOR_PAUSE, opacity: this.state.statusFilter === 'paused' ? 1 : 0.3, background: this.state.statusFilter === 'paused' ? 'gray' : 'inherit'}}\n onClick={event => {\n const statusFilter = this.state.statusFilter === 'paused' ? '' : 'paused';\n window.localStorage && window.localStorage.setItem('SideMenu.statusFilter', statusFilter);\n this.setState({statusFilter});\n }}\n />),\n (<IconPause\n key=\"filterByProblem\"\n title={I18n.t('Show only scripts with problems')}\n className={this.props.classes.footerButtons}\n style={{color: COLOR_PROBLEM, opacity: this.state.statusFilter === 'problems' ? 1 : 0.3, background: this.state.statusFilter === 'problems' ? 'gray' : 'inherit'}}\n onClick={event => {\n const statusFilter = this.state.statusFilter === 'problems' ? '' : 'problems';\n window.localStorage && window.localStorage.setItem('SideMenu.statusFilter', statusFilter);\n this.setState({statusFilter});\n }}\n />),\n (<img\n key=\"filterBlockly\"\n className={this.props.classes.footerButtons}\n alt=\"Blockly\"\n style={{opacity: this.state.typeFilter === 'Blockly' ? 1 : 0.3, background: this.state.typeFilter === 'Blockly' ? 'gray' : 'inherit'}}\n src={images.Blockly || images.def}\n onClick={event => {\n const typeFilter = this.state.typeFilter === 'Blockly' ? '' : 'Blockly';\n window.localStorage && window.localStorage.setItem('SideMenu.typeFilter', typeFilter);\n this.setState({typeFilter});\n }}\n />),\n (<img\n key=\"filterJS\"\n className={this.props.classes.footerButtons}\n alt=\"Javascript\"\n style={{opacity: this.state.typeFilter === 'Javascript/js' ? 1 : 0.3, background: this.state.typeFilter === 'Javascript/js' ? 'gray' : 'inherit'}}\n src={images['Javascript/js'] || images.def}\n onClick={event => {\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 (<img\n key=\"filterTS\"\n className={this.props.classes.footerButtons}\n alt=\"TypeScript\"\n style={{opacity: this.state.typeFilter === 'TypeScript/ts' ? 1 : 0.3, background: this.state.typeFilter === 'TypeScript/ts' ? 'gray' : 'inherit'}}\n src={images['TypeScript/ts'] || images.def}\n onClick={event => {\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 (<IconExpandAll key=\"expandAll\" className={this.props.classes.footerButtons + ' ' + this.props.classes.footerButtonsRight} title={I18n.t('Expand all')} onClick={() => this.onExpandAll()}/>),\n this.state.expanded.length ? (<IconCollapseAll key=\"collapseAll\" className={this.props.classes.footerButtons + ' ' + this.props.classes.footerButtonsRight} title={I18n.t('Collapse all')} onClick={() => 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.objects[this.state.copingScript];\n\n return [(\n <Drawer\n key=\"drawer\"\n variant=\"permanent\"\n className={classes.menu}\n classes={{paper: classes.drawerPaper}}\n anchor='left'\n onClick={() => this.onClick({id: ''})}\n >\n <div className={classes.toolbar}>\n {this.getToolbarButtons()}\n </div>\n <Divider/>\n <DragDropContext\n onDragStart={e => this.onDragStart(e)}\n onDragEnd={e => this.onDragEnd(e)}\n onDragUpdate={e => this.onDragUpdate(e)}\n >\n <Droppable droppableId=\"droppable\">\n {(provided, snapshot) => (\n <div ref={provided.innerRef}\n //style={getListStyle(snapshot.isDraggingOver)}\n className={classes.innerMenu}>\n {this.renderAllItems(this.state.listItems)}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n <Divider/>\n <div className={classes.footer}>{\n this.getBottomButtons()\n }</div>\n </Drawer>),\n renamingItem ? (<DialogRename\n key=\"dialog-rename\"\n name={renamingItem.title}\n title={I18n.t('Rename')}\n id={this.state.renaming}\n folder={renamingItem.type === 'folder'}\n instance={renamingItem.instance}\n instances={this.props.instances}\n onClose={() => this.setState({renaming: false})}\n onRename={(oldId, newName, newId, newInstance) => this.props.onRename && this.props.onRename(oldId, newName, newId, newInstance)}\n />) : null,\n this.state.deleting ? (<DialogDelete\n key=\"dialog-delete\"\n name={this.state.listItems.find(i => 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 this.state.choosingType ? (<DialogAddNewScript\n key=\"dialog-script-type\"\n onClose={type => {\n this.setState({choosingType: false});\n type && this.setState({creatingScript: type})\n }}\n />) : null,\n this.state.creatingScript ? (<DialogNew\n key=\"dialog-new-script\"\n onClose={() => 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 this.state.copingScript ? (<DialogNew\n key=\"dialog-copy-script\"\n onClose={() => 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.objects[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 this.state.creatingFolder ? (<DialogNew\n key=\"dialog-new-folder\"\n onClose={() => 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 ? (<DialogError onClose={() => 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 connection: PropTypes.object,\n theme: 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 objects: PropTypes.object,\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 (<tr key={'tr_' + message.ts} className={this.props.classes[message.severity]}>\n <td key=\"tdTime\" className={this.props.classes.trTime}>{getTimeString(new Date(message.ts))}</td>\n <td key=\"tdSeverity\" className={this.props.classes.trSeverity}>{message.severity}</td>\n <td key=\"tdMessage\">{message.message}</td>\n </tr>);\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.connection.registerLogHandler(this.logHandlerBound);\n }\n\n componentWillUnmount() {\n this.props.connection.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 <div className={this.props.classes.logBox}>\n <div className={this.props.classes.toolbox} key=\"toolbox\">\n <IconButton className={this.props.classes.iconButtons} onClick={() => this.setState({goBottom: !this.state.goBottom})} color={this.state.goBottom ? 'secondary' : ''}><IconBottom/></IconButton>\n {lines && lines.length ? (<IconButton className={this.props.classes.iconButtons} onClick={() => this.clearLog()}><IconDelete/></IconButton>) : null}\n {lines && lines.length ? (<IconButton className={this.props.classes.iconButtons} onClick={() => this.onCopy()}><IconCopy/></IconButton>) : null}\n {this.props.onLayoutChange ? (<IconButton className={this.props.classes.iconButtons} onClick={() => this.props.onLayoutChange()} title={I18n.t('Change layout')}><img className={this.props.classes.layoutIcon} alt=\"split\" src={this.props.verticalLayout ? IconVerticalSplit : IconHorizontalSplit} /></IconButton>) : null}\n </div>\n {this.state.selected && lines && lines.length ?\n (<div className={this.props.classes.logBoxInner} key=\"logList\">\n <table key=\"logTable\" className={this.props.classes.table}><tbody>{lines}</tbody></table>\n <div key=\"logScrollPoint\" ref={this.messagesEnd} style={{float: 'left', clear: 'both'}}/>\n </div>) :\n (<div key=\"logList\" className={this.props.classes.logBoxInner} style={{paddingLeft: 10}}>{I18n.t('Log outputs')}</div>)\n }\n </div>\n );\n }\n}\n\nLog.propTypes = {\n selected: PropTypes.string,\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 };\n this.monacoDiv = null; //ref\n this.editor = null;\n this.monaco = window.monaco;\n this.insert = '';\n this.originalCode = props.code || '';\n this.globalTypingHandles = [];\n this.typings = {}; // TypeScript declarations\n this.lastSearch = '';\n }\n\n waitForMonaco(cb) {\n if (!this.monaco) {\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 componentDidMount() {\n if (!this.monaco) {\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 let scriptAdapterInstance = this.props.connection.getScripts().instances[0];\n if (scriptAdapterInstance || scriptAdapterInstance === 0) {\n this.props.connection.sendTo('javascript.' + scriptAdapterInstance, 'loadTypings', null, result => {\n this.setState({alive: true, check: true});\n this.setTypeCheck(true);\n if (result.typings) {\n this.typings = result.typings;\n this.setEditorTypings();\n } else {\n console.error(`failed to load typings: ${result.error}`);\n }\n });\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 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) return;\n if (options.language) this.setEditorLanguage(options.language);\n if (options.readOnly !== undefined) this.editor.updateOptions({readOnly: options.readOnly});\n if (options.lineWrap !== undefined) this.editor.updateOptions({wordWrap: options.lineWrap ? 'on' : 'off'});\n if (options.typeCheck !== undefined) this.setTypeCheck(options.typeCheck);\n if (options.isDark !== undefined) this.monaco.editor.setTheme(options.isDark ? 'vs-dark' : 'vs');\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 {monaco.editor.IStandaloneCodeEditor} editorInstance The editor instance to change the options for\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 const filenameWithoutExtension =\n typeof uri === 'string' && uri.indexOf('.') > -1\n ? uri.substr(0, uri.lastIndexOf('.'))\n : 'index';\n const extension =\n language === 'javascript' ? 'js'\n : language === 'typescript' ? 'ts'\n : language === 'coffee' ? 'coffee'\n : language;\n // get rid of the original model\n model.dispose();\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, newLanguage, this.monaco.Uri.from({path: `${filenameWithoutExtension}${index++}.${extension}`})\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 * Adds the given declaration file to the editor\n * @param {string} path The file path of the typings to add\n * @param {string} typings The declaration file to add\n * @param {boolean} [isGlobal=false] Whethere the file is a global declaration file\n * @returns {void}\n */\n addTypingsToEditor(path, typings, isGlobal) {\n try {\n const handle = this.monaco.languages.typescript.typescriptDefaults.addExtraLib(typings, path);\n if (isGlobal) this.globalTypingHandles.push(handle);\n } catch (e) { /* might be added already */}\n }\n\n setEditorTypings() {\n // clear previously added global typings\n for (const handle of this.globalTypingHandles) {\n handle && handle.dispose();\n }\n\n const isGlobalScript = isIdOfGlobalScript(this.state.name);\n // The filename of the declarations this script can see if it is a global script\n const partialDeclarationsPath = this.state.name + '.d.ts';\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 this.addTypingsToEditor(path, this.typings[path], isGlobalScript);\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 {\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 UNSAFE_componentWillReceiveProps(nextProps) {\n const options = {};\n if (this.state.name !== nextProps.name) {\n this.setState({name: nextProps.name});\n this.originalCode = nextProps.code || '';\n this.editor && this.editor.setValue(nextProps.code);\n this.highlightText(this.lastSearch);\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 (nextProps.insert) {\n this.insertTextIntoEditor(nextProps.insert);\n setTimeout(() => this.props.onInserted && this.props.onInserted(), 100);\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) {\n setTimeout(() => {\n this.monaco = window.monaco;\n this.forceUpdate()\n }, 200);\n return null;\n }\n\n return (\n <div ref={el => this.monacoDiv = el} style={{width: '100%', height: '100%', overflow: 'hidden', position: 'relative'}}>\n {!this.state.check && (<Fab\n size=\"small\"\n title={I18n.t('Check is not active, because javascript adapter is disabled')}\n style={{bottom: 10, right: 10, opacity: 0.5, position: 'absolute', zIndex: 1, background: 'red', color: 'white'}}\n color=\"secondary\"><IconNoCheck/></Fab>)}\n </div>\n );\n }\n}\n\nScriptEditor.propTypes = {\n connection: 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';\nimport {withStyles} from '@material-ui/core/styles';\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 = [];\nconst styles = theme => ({\n darkBackground: {\n stroke: '#3a3a3a !important',\n fill: '#515151 !important'\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 theme: this.props.theme,\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(objects, callback) {\n // get all adapters, that can have blockly\n const toLoad = [];\n for (const id in objects) {\n if (!objects.hasOwnProperty(id) || !objects[id]) continue;\n if (!id.match(/^system\\.adapter\\./)) continue;\n if (objects[id].type !== 'adapter') continue;\n if (objects[id].common && objects[id].common.blockly) {\n console.log('Detected custom blockly: ' + objects[id].common.name);\n toLoad.push(objects[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 static searchXml(root, text, _id, _result) {\n _result = _result || [];\n if (root.tagName === 'BLOCK') {\n _id = root.id;\n }\n if (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.innerText.toLowerCase().indexOf(text) !== -1) {\n _result.push(_id);\n }\n }\n }\n }\n root.childNodes.forEach(node => BlocklyEditor.searchXml(node, text, _id, _result));\n return _result;\n }\n\n searchBlocks(text) {\n if (this.blocklyWorkspace) {\n const dom = this.Blockly.Xml.workspaceToDom(this.blocklyWorkspace);\n const ids = BlocklyEditor.searchXml(dom, text.toLowerCase());\n const allBlocks = this.blocklyWorkspace.getAllBlocks();\n const result = [];\n allBlocks.filter(b => ids.indexOf(b.id) !== -1).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.theme !== nextProps.theme) {\n this.setState({theme: nextProps.theme}, () => 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) === '<xml') {\n return xml;\n } else {\n let code;\n try {\n code = window.decodeURIComponent(window.atob(xml));\n } catch (e) {\n code = null;\n console.error('cannot decode: ' + xml);\n console.error(e);\n }\n return code;\n }\n }\n\n blocklyBlinkBlock(block) {\n for (let i = 300; i < 3000; i = i + 300) {\n setTimeout(() => 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) warningText = 'warning on this block';\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('<xml')) {\n xml = '<xml xmlns=\"http://www.w3.org/1999/xhtml\">' + xml + '</xml>';\n }\n xml = xml.replace(/[\\n\\r]/g, '').replace(/<variables>.*<\\/variables>/g, '');\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 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) return;\n\n this.ignoreChanges = true;\n this.blocklyWorkspace.clear();\n\n try {\n const xml = this.jsCode2Blockly(this.originalCode) || '<xml xmlns=\"http://www.w3.org/1999/xhtml\"></xml>';\n const dom = this.Blockly.Xml.textToDom(xml);\n this.Blockly.Xml.domToWorkspace(dom, this.blocklyWorkspace);\n } catch (e) {\n console.error(e);\n window.alert('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) return;\n if (this.didUpdate) {\n clearTimeout(this.didUpdate);\n this.didUpdate = null;\n }\n\n if (this.blocklyWorkspace) return;\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 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.theme === 'dark') {\n let found = 0;\n for (let i = 0; i < background.classList.length; i++) {\n if (background.classList[i] === this.props.classes.darkBackground) {\n found = true;\n break;\n }\n }\n if (!found) {\n background.classList.add(this.props.classes.darkBackground);\n }\n } else {\n background.classList.remove(this.props.classes.darkBackground);\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 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 += '<category name=\"' + this.Blockly.Words[name][lang] + '\" colour=\"' + this.Blockly[name].HUE + '\">';\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 += '</category>';\n }\n toolboxText = toolboxText.replace('<category><block>%%CUSTOM_BLOCKS%%</block></category>', blocks);\n return toolboxText;\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 (<div key=\"blocklyDOM\" ref={el => 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.state.message ?\n (<DialogMessage\n key=\"dialogMessage\"\n text={typeof this.state.message === 'object' ? this.state.message.text : this.state.message}\n title={typeof this.state.message === 'object' ? this.state.message.title : ''}\n onClose={() => this.setState({message: ''})}\n />) :\n null,\n\n this.state.error ?\n (<DialogError\n key=\"dialogError\"\n text={typeof this.state.error === 'object' ? this.state.error.text.toString() : this.state.error}\n title={typeof this.state.error === 'object' ? this.state.error.title : ''}\n onClose={() => {\n if (this.blinkBlock) {\n this.blocklyBlinkBlock(this.blinkBlock);\n this.blinkBlock = null;\n }\n this.setState({error: ''});\n }}/>) :\n null,\n\n this.state.exportText ? (<DialogExport key=\"dialogExport\" theme={this.props.theme} onClose={() => this.setState({exportText: ''})} text={this.state.exportText}/>) : null,\n\n this.state.importText ? (<DialogImport key=\"dialogImport\" theme={this.props.theme} onClose={text => {\n this.setState({importText: false});\n this.onImportBlocks(text);\n }}/>) : null\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 theme: PropTypes.string\n};\n\nexport default withStyles(styles)(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 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.unit * 2,\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 <Dialog\n key=\"export-dialog\"\n disableBackdropClick\n disableEscapeKeyDown\n maxWidth=\"lg\"\n classes={{paper: classes.dialog}}\n fullWidth={true}\n open={true}\n aria-labelledby=\"export-dialog-title\"\n >\n <DialogTitle id=\"export-dialog-title\">{I18n.t('Export selected blocks')}</DialogTitle>\n <DialogContent>\n <pre\n id=\"export-text\"\n className={classes.textArea + ' ' + (this.props.theme === 'dark' ? '' : classes.textAreaLight)}\n >{this.props.text}</pre>\n </DialogContent>\n <DialogActions>\n <Button onClick={event => this.onCopy(event )} color=\"secondary\">{I18n.t('Copy to clipboard')}</Button>\n <Button onClick={() => this.handleCancel()} color=\"primary\">{I18n.t('Close')}</Button>\n\n <Popper\n id=\"popper\"\n style={{zIndex: 10000}}\n open={!!this.state.popper}\n placement=\"top\"\n anchorEl={this.state.anchorEl} transition>\n {({ TransitionProps }) => (\n <Fade {...TransitionProps} timeout={350}>\n <Paper>\n <p className={classes.typography}>{this.state.popper}</p>\n </Paper>\n </Fade>\n )}\n </Popper>\n <textarea id=\"copy_input\" readOnly={true} style={{position: 'absolute', left: -9999}} tabIndex={-1} aria-hidden={true} value={this.props.text}/>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nDialogExport.propTypes = {\n classes: PropTypes.object.isRequired,\n onClose: PropTypes.func,\n text: PropTypes.string,\n theme: 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 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});\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 <Dialog\n disableBackdropClick\n disableEscapeKeyDown\n maxWidth=\"lg\"\n classes={{paper: classes.dialog}}\n fullWidth={true}\n open={true}\n aria-labelledby=\"import-dialog-title\"\n >\n <DialogTitle id=\"import-dialog-title\">{I18n.t('Import blocks')}</DialogTitle>\n <DialogContent className={classes.fullHeight}>\n <textarea\n id=\"import-text-area\"\n className={classes.textArea}\n onChange={e => this.onChange(e)}\n />\n </DialogContent>\n <DialogActions>\n <Button disabled={!this.state.text} onClick={event => this.handleOk()} color=\"primary\">{I18n.t('Import')}</Button>\n <Button onClick={() => this.handleCancel()} color=\"secondary\">{I18n.t('Close')}</Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nDialogImport.propTypes = {\n classes: PropTypes.object.isRequired,\n onClose: PropTypes.func,\n text: PropTypes.string,\n theme: 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 (<Button\n key=\"removeall\"\n variant={'outlined'}\n className={this.props.classes.numberButton}\n //style={{paddingBottom: 20}}\n color={'primary'}\n onClick={() => this.onToggle(false, type, max)}>{I18n.t('Deselect all')}</Button>),\n (<Button\n key=\"addall\"\n variant={'contained'}\n //style={{paddingBottom: 20}}\n className={this.props.classes.numberButton}\n color={'secondary'}\n onClick={() => this.onToggle(true, type, max)}>{I18n.t('Select all')}</Button>),\n (<div key=\"all\">\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 (<div key={'allInner' + i} style={{width: '100%'}}/>) : null,\n (<Button\n key={'_' + i}\n variant={parts.indexOf(i) !== -1 ? 'contained' : 'outlined'}\n className={this.props.classes.numberButton}\n color={parts.indexOf(i) !== -1 ? 'secondary' : 'primary'}\n onClick={() => this.onToggle(i, type, max)}>{max === 7 ? I18n.t(WEEKDAYS[i]) : (max === 12 ? MONTHS[i - 1] : i)}</Button>\n )])}\n </div>)];\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 (<div>\n <Select\n className={this.props.classes.periodSelect}\n style={{verticalAlign: 'bottom'}}\n value={select}\n onChange={e => {\n const modes = JSON.parse(JSON.stringify(this.state.modes));\n modes[type] = e.target.value;\n if (e.target.value === 'every') {\n this.setState({[type]: '*', modes}, () => this.recalcCron());\n } else if (e.target.value === 'everyN') {\n const num = parseInt(this.state[type].toString().replace('*/', ''), 10) || 1;\n this.setState({[type]: '*/' + num, modes}, () => this.recalcCron());\n } else if (e.target.value === 'specific') {\n let num = parseInt(this.state[type].split(',')[0], 10) || 0;\n console.log(num);\n if (!num && (type === 'months' || type === 'dates')) {\n num = 1;\n }\n this.setState({[type]: convertArrayIntoMinus(num, max), modes}, () => this.recalcCron());\n }\n }}>\n <MenuItem key='every' value='every'>{I18n.t('sc_every_' + type)}</MenuItem>\n <MenuItem key='everyN' value='everyN'>{I18n.t('sc_everyN_' + type)}</MenuItem>\n <MenuItem key='specific' value='specific'>{I18n.t('sc_specific_' + type)}</MenuItem>\n </Select>\n {everyN && false && (<span>{value}</span>)}\n {everyN && (<TextField\n key=\"interval\"\n label={I18n.t('sc_' + type)}\n value={value}\n min={1}\n max={max}\n onChange={e => {\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 </div>);\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 <div className={this.props.classes.mainDiv}>\n <div style={{paddingLeft: 8, width: '100%'}}><TextField style={{width: '100%'}} value={this.state.cron} disabled={true}/></div>\n <div style={{paddingLeft: 8, width: '100%', height: 60}}>{this.convertCronToText(this.state.cron, this.props.language || 'en')}</div>\n <FormControlLabel\n control={<Checkbox checked={this.state.seconds}\n onChange={e => this.setState({seconds: e.target.checked ? '*' : false}, () => this.recalcCron())}/>}\n label={I18n.t('use seconds')}\n />\n <AppBar position=\"static\" classes={{root: this.props.classes.appBar}} color=\"secondary\">\n <Tabs value={this.state.tab} className={this.props.classes.appBar} color=\"secondary\" onChange={(active, tab) =>\n this.setState({tab})}>\n {this.state.seconds !== false && <Tab id=\"sc_seconds\" label={I18n.t('sc_seconds')}/>}\n <Tab id=\"minutes\" label={I18n.t('sc_minutes')}/>\n <Tab id=\"hours\" label={I18n.t('sc_hours')}/>\n <Tab id=\"dates\" label={I18n.t('sc_dates')}/>\n <Tab id=\"months\" label={I18n.t('sc_months')}/>\n <Tab id=\"dows\" label={I18n.t('sc_dows')}/>\n </Tabs>\n </AppBar>\n {tab === 0 && (<div className={this.props.classes.tabContent}>{this.getPeriodsTab('seconds', 60)}</div>)}\n {tab === 1 && (<div className={this.props.classes.tabContent}>{this.getPeriodsTab('minutes', 60)}</div>)}\n {tab === 2 && (<div className={this.props.classes.tabContent}>{this.getPeriodsTab('hours', 24)}</div>)}\n {tab === 3 && (<div className={this.props.classes.tabContent}>{this.getPeriodsTab('dates', 31)}</div>)}\n {tab === 4 && (<div className={this.props.classes.tabContent}>{this.getPeriodsTab('months', 12)}</div>)}\n {tab === 5 && (<div className={this.props.classes.tabContent}>{this.getPeriodsTab('dows', 7)}</div>)}\n </div>\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 (<div key=\"weekdays\" style={{paddingLeft: 8, width: '100%', maxWidth: 600}}>\n <h5>{I18n.t('On weekdays')}</h5>\n {[1,2,3,4,5,6,0].map(day => (\n <FormControlLabel\n key={WEEKDAYS[day]}\n control={\n <Checkbox\n checked={settings.weekdays.indexOf(day) !== -1}\n onChange={e => {\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 }</div>);\n }\n\n getControlsPeriodElements(type) {\n const settings = this.state[type];\n\n if (this.state.extended) {\n return (<div key=\"period\" style={{paddingLeft: 8, display: 'inline-block'}}>\n <h5 style={{marginBottom: 5}}>{I18n.t('sc_period')}</h5>\n <TextField\n style={{marginTop: 0, marginBottom: 0, verticalAlign: 'bottom'}}\n key=\"value\"\n label={I18n.t('sc_minutes')}\n value={settings.minutes}\n onChange={e => {\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 <TextField\n style={{marginTop: 0, marginBottom: 0, verticalAlign: 'bottom'}}\n key=\"value\"\n label={I18n.t('sc_hours')}\n value={settings.hours}\n onChange={e => {\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 </div>);\n } else {\n return (<div key=\"period\" style={{paddingLeft: 8, display: 'inline-block'}}>\n <h5 style={{marginBottom: 5}}>{I18n.t('sc_period')}</h5>\n <TextField\n style={{marginTop: 0, marginBottom: 0, verticalAlign: 'bottom'}}\n key=\"value\"\n label={I18n.t('sc_every')}\n value={settings.period}\n onChange={e => {\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 /><Select\n style={{verticalAlign: 'bottom'}}\n value={settings.unit}\n onChange={e => {\n const settings = JSON.parse(JSON.stringify(this.state[type]));\n settings.unit = e.target.value;\n this.setState({[type]: settings}, () => this.recalcCron());\n }}>\n {Object.keys(PERIODIC_TYPES).map(mode => (<MenuItem key={PERIODIC_TYPES[mode]} value={PERIODIC_TYPES[mode]}>{I18n.t('sc_' + PERIODIC_TYPES[mode])}</MenuItem>))}\n </Select></div>);\n }\n }\n\n getControlsTime(type) {\n const settings = this.state[type];\n return (<FormControl className={this.props.classes.formControl} classes={{root: this.props.classes.formControlMarginRight}}>\n <TextField\n key=\"at\"\n label={I18n.t('sc_time')}\n value={settings.time}\n type=\"time\"\n onChange={e => {\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 </FormControl>);\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 //<InputLabel htmlFor=\"formatted-text-mask-input\">{I18n.t('sc_at')}</InputLabel>\n return (<FormControl className={this.props.classes.formControl}>\n <TextField\n key=\"date\"\n label={I18n.t('sc_date')}\n value={settings.date}\n type=\"text\"\n inputProps={{className: this.props.classes.formControlPaddingTop}}\n onChange={e => {\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 </FormControl>);\n }\n\n getOnceElements() {\n return (<div style={{marginLeft: 8}}>\n {this.getControlsTime('once')}\n {this.getControlsDate('once')}\n </div>);\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 (<div key=\"between\" style={{paddingLeft: 8, display: 'inline-block', verticalAlign: 'top'}}>\n <h5 style={{marginBottom: 5}}>{I18n.t('sc_hours')}</h5>\n <FormControl className={this.props.classes.formControl}>\n <InputLabel shrink htmlFor=\"age-label-placeholder\">{I18n.t('sc_from')}</InputLabel>\n <Select\n style={{width: 100}}\n value={settings.timeFrom}\n onChange={e => {\n const settings = JSON.parse(JSON.stringify(this.state.intervalBetween));\n settings.timeFrom = parseInt(e.target.value, 10);\n this.setState({intervalBetween: settings}, () => this.recalcCron());\n }}>\n {[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23].map(hour => (<MenuItem key={'B_' + hour} value={hour}>{padding(hour) + ':00'}</MenuItem>))}\n </Select>\n </FormControl>\n <FormControl className={this.props.classes.formControl}>\n <InputLabel shrink htmlFor=\"age-label-placeholder\">{I18n.t('sc_to')}</InputLabel>\n <Select\n style={{width: 100}}\n value={settings.timeTo}\n onChange={e => {\n const settings = JSON.parse(JSON.stringify(this.state.intervalBetween));\n settings.timeTo = parseInt(e.target.value, 10);\n this.setState({intervalBetween: settings}, () => this.recalcCron());\n }}>\n {[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24].map(hour => (<MenuItem key={'A_' + hour} value={hour}>{padding(hour) + ':00'}</MenuItem>))}\n </Select>\n </FormControl>\n </div>),\n this.getControlsWeekdaysElements('intervalBetween')\n ];\n }\n\n getSpecificTimeElements() {\n return [\n (<div key=\"time\" style={{marginLeft: 8}}>{this.getControlsTime('specific')}</div>),\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 <div className={this.props.classes.mainDiv}>\n <div style={{paddingLeft: 8, width: '100%'}}><TextField style={{width: '100%'}} value={this.state.cron} disabled={true}/></div>\n <div style={{paddingLeft: 8, width: '100%', height: 60}}>{convertCronToText(this.state.cron, this.props.language || 'en')}</div>\n <div><FormControl style={{marginLeft: 8, marginTop: 8}} className={this.props.classes.formControl}>\n <InputLabel>{I18n.t('Repeat')}</InputLabel>\n <Select\n value={this.state.mode}\n onChange={e => this.onModeChange(e.target.value)}\n inputProps={{name: 'mode', id: 'mode',}}>\n {Object.keys(PERIODIC).map(mode => (<MenuItem key={PERIODIC[mode]} value={PERIODIC[mode]}>{I18n.t('sc_' + PERIODIC[mode])}</MenuItem>))}\n </Select>\n </FormControl></div>\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 </div>\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 <MaskedInput\n {...other}\n ref={inputRef}\n mask={[/[0-2]/, /[0-9]/, ':', /[0-5]/, /[0-9]/]}\n placeholderChar={props.placeholder || '00:00'}\n showMask\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 <MaskedInput\n {...other}\n ref={inputRef}\n mask={[/[0-3]/, /[0-9]/, '.', /[0-1]/, /[0-9]/, '.', '2', '0', /[0-9]/, /[0-9]/]}\n placeholderChar={props.placeholder || '01.01.2019'}\n showMask\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 <div key=\"timePeriod\" className={this.props.classes.rowDiv}>\n <div className={this.props.classes.modeDiv}>\n <FormControlLabel control={<Radio className={this.props.classes.inputRadio} checked={!schedule.time.exactTime} onClick={() => {\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 </div>\n <div className={this.props.classes.settingsDiv}>\n <div className={this.props.classes.settingsDiv}>\n {!schedule.time.exactTime && (<div>\n <div><FormControlLabel control={<Radio className={this.props.classes.inputRadio} checked={fromTo} onClick={() => {\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 (<TextField\n className={this.props.classes.inputTime}\n style={{marginRight: 10}}\n key=\"exactTimeFrom\"\n type=\"time\"\n value={this.state.schedule.time.start}\n //InputProps={{inputComponent: TextTime}}\n onChange={e => {\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 (<TextField\n className={this.props.classes.inputTime}\n key=\"exactTimeTo\"\n type=\"time\"\n value={this.state.schedule.time.end}\n //InputProps={{inputComponent: TextTime}}\n onChange={e => {\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 </div>\n </div>)}\n\n {!schedule.time.exactTime && (<div><FormControlLabel control={<Radio className={this.props.classes.inputRadio} checked={wholeDay} onClick={() => {\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')} /></div>) }\n\n {!schedule.time.exactTime && (<div><FormControlLabel control={<Radio className={this.props.classes.inputRadio} checked={day} onClick={() => {\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')} /></div>) }\n\n {!schedule.time.exactTime && (<div><FormControlLabel control={<Radio className={this.props.classes.inputRadio} checked={night} onClick={() => {\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')} /></div>) }\n </div>\n {!schedule.time.exactTime && this.getPeriodSettingsMinutes()}\n </div>\n </div>);\n }\n\n getTimeExactElements() {\n const isAstro = ASTRO.indexOf(this.state.schedule.time.start) !== -1;\n\n return (<div key=\"timeExact\" className={this.props.classes.rowDiv}>\n <div className={this.props.classes.modeDiv}>\n <FormControlLabel control={<Radio className={this.props.classes.inputRadio} checked={this.state.schedule.time.exactTime} onClick={() => {\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 </div>\n {this.state.schedule.time.exactTime &&\n (<Select value={isAstro ? this.state.schedule.time.start : '00:00'}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.start = e.target.value;\n this.onChange(_schedule);\n }}\n >\n <MenuItem key=\"specific\" value={'00:00'}>{I18n.t('sch_specificTime')}</MenuItem>\n {ASTRO.map(event => (<MenuItem key={event} value={event}>{I18n.t('sch_astro_' + event)}</MenuItem>))}\n </Select>)\n }\n {this.state.schedule.time.exactTime && !isAstro &&\n (<div className={this.props.classes.settingsDiv}><TextField\n className={this.props.classes.inputTime}\n key=\"exactTimeValue\"\n value={this.state.schedule.time.start}\n type=\"time\"\n // inputComponent={TextTime}\n onChange={e => {\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 /></div>)\n }\n </div>)\n }\n\n getDivider() {\n return (<hr className={this.props.classes.hr}/>);\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 (<div key=\"once\" className={this.props.classes.rowDiv + ' ' + this.props.classes.rowOnce}>\n <div className={this.props.classes.modeDiv}>\n <FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={isOnce} onClick={() => {\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 </div>\n {isOnce && (<div className={this.props.classes.settingsDiv}>\n {<TextField\n className={this.props.classes.inputDate}\n type=\"date\"\n ref={this.refOnce}\n key=\"exactDateAt\"\n defaultValue={string2USdate(schedule.period.once)}\n //InputProps={{inputComponent: TextTime}}\n onChange={e => {\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 </div>)}\n </div>),\n\n\n // ----- days ---\n (<div key=\"days\" className={this.props.classes.rowDiv + ' ' + this.props.classes.rowDays}>\n <div className={this.props.classes.modeDiv}>\n <FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={!!schedule.period.days} onClick={() => {\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 </div>\n <div className={this.props.classes.settingsDiv}>\n {this.getPeriodSettingsDaily()}\n {schedule.period.days ? this.getPeriodSettingsWeekdays() : null}\n </div>\n </div>),\n\n\n // ----- days of weeks ---\n /*!schedule.period.days && (\n <div key=\"dows\" className={this.props.classes.rowDiv + ' ' + this.props.classes.rowDows}>\n <div className={this.props.classes.modeDiv}>\n <FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={!!schedule.period.dows} onClick={() => {\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 </div>\n <div className={this.props.classes.settingsDiv}>\n {this.getPeriodSettingsWeekdays()}\n </div>\n </div>),\n*/\n // ----- weeks ---\n (<div key=\"weeks\" className={this.props.classes.rowDiv + ' ' + this.props.classes.rowDows}>\n <div className={this.props.classes.modeDiv}>\n <FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={!!schedule.period.weeks} onClick={() => {\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 </div>\n <div className={this.props.classes.settingsDiv}>\n <div className={this.props.classes.settingsDiv}>{this.getPeriodSettingsWeekly()}</div>\n <div className={this.props.classes.settingsDiv + ' ' + this.props.classes.rowDowsDows}>{this.state.schedule.period.weeks ? this.getPeriodSettingsWeekdays() : null}</div>\n </div>\n </div>),\n\n\n // ----- months ---\n (<div key=\"months\" className={this.props.classes.rowDiv + ' ' + this.props.classes.rowMonths}>\n <div className={this.props.classes.modeDiv}>\n <FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={!!schedule.period.months} onClick={() => {\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 </div>\n <div className={this.props.classes.settingsDiv}>\n {this.getPeriodSettingsMonthly()}\n {schedule.period.months ? (<div>\n <div className={this.props.classes.settingsDiv + ' ' + this.props.classes.rowMonthsDates}>\n <FormControlLabel control={(<Checkbox className={this.props.classes.inputRadio} checked={!!schedule.period.dates} onClick={() => {\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')} /></div>\n <div className={this.props.classes.settingsDiv + ' ' + this.props.classes.rowMonthsDates}>\n {this.getPeriodSettingsDates()}\n </div>\n </div>) : null}\n </div>\n </div>),\n\n\n // ----- years ---\n (<div key=\"years\" className={this.props.classes.rowDiv + ' ' + this.props.classes.rowYears}>\n <div className={this.props.classes.modeDiv}>\n <FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={!!schedule.period.years} onClick={() => {\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 </div>\n <div className={this.props.classes.settingsDiv}>\n <div className={this.props.classes.settingsDiv}>{this.getPeriodSettingsYearly()}</div>\n {!!schedule.period.years && (<div className={this.props.classes.settingsDiv}>\n <span>{I18n.t('sch_on')}</span>\n <Input key=\"input\" value={this.state.schedule.period.yearDate} className={this.props.classes.inputEvery} type=\"number\" min=\"1\" max=\"31\" onChange={e => {\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 <Select value={schedule.period.yearMonth}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.yearMonth = e.target.value;\n this.onChange(_schedule);\n }}\n >\n <MenuItem key=\"every\" value={0}>{I18n.t('sch_yearEveryMonth')}</MenuItem>\n {MONTHS.map((month, i) => (<MenuItem key={month} value={i + 1}>{I18n.t(month)}</MenuItem>))}\n </Select>\n </div>)}\n </div>\n </div>),\n ];\n }\n\n getPeriodSettingsMinutes() {\n return (<div style={{display: 'inline-block'}}>\n <label>{I18n.t('sch_every')}</label>\n <Input value={this.state.schedule.time.interval}\n style={{ verticalAlign: 'bottom'}}\n className={this.props.classes.inputEvery} type=\"number\" min=\"1\" onChange={e => {\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 <Select value={this.state.schedule.time.mode}\n onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.time.mode = e.target.value;\n this.onChange(_schedule);\n }}\n >\n <MenuItem value={PERIODS.minutes}>{I18n.t('sch_periodMinutes')}</MenuItem>\n <MenuItem value={PERIODS.hours}>{I18n.t('sch_periodHours')}</MenuItem>\n </Select>\n </div>);\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 (<div key=\"workdays\"><FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={schedule.period.dows === '[1, 2, 3, 4, 5]'} onClick={() => {\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')} /></div>),\n\n (<div key=\"weekend\"><FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={schedule.period.dows === '[0, 6]'} onClick={() => {\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')} /></div>),\n\n (<div key=\"specific\" style={{verticalAlign: 'top'}}><FormControlLabel style={{verticalAlign: 'top'}}\n control={(<Radio className={this.props.classes.inputRadio} checked={isSpecific} onClick={() => {\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) && (<FormGroup row className={this.props.classes.inputGroup} style={{width: 150}}>\n {[1,2,3,4,5,6,0].map(i =>\n (<FormControlLabel key={'specific_' + i} className={this.props.classes.inputGroupElement} control={\n <Checkbox className={this.props.classes.inputSmallCheck} checked={schedule.period.dows.indexOf('' + i) !== -1}\n onChange={e => {\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 </FormGroup>)}\n </div>),\n ];\n }\n\n getPeriodSettingsDaily() {\n if (!this.state.schedule.period.days) {\n return;\n }\n const schedule = this.state.schedule;\n return [\n (<div key=\"every_day\"><FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={schedule.period.days === 1 && !schedule.period.dows} onClick={() => {\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')} /></div>),\n (<div key=\"everyN_day\"><FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={schedule.period.days > 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 && [(<Input key=\"input\" value={this.state.schedule.period.days} className={this.props.classes.inputEvery} type=\"number\" min=\"2\" onChange={e => {\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 }} />), (<span key=\"span\" style={{paddingRight: 10}}>{I18n.t('sch_periodDay')}</span>)]}\n </div>),\n ];\n }\n\n getPeriodSettingsWeekly() {\n if (!this.state.schedule.period.weeks) {\n return;\n }\n const schedule = this.state.schedule;\n return [\n (<div key=\"radios\" style={{display: 'inline-block', verticalAlign: 'top'}}>\n <div><FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={schedule.period.weeks === 1} onClick={() => {\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')} /></div>\n <div>\n <FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={schedule.period.weeks > 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 && [(<Input value={this.state.schedule.period.weeks} className={this.props.classes.inputEvery} type=\"number\" min=\"2\" onChange={e => {\n const _schedule = JSON.parse(JSON.stringify(this.state.schedule));\n _schedule.period.weeks = parseInt(e.target.value, 10);\n this.onChange(_schedule);\n }} />), (<span>{I18n.t('sch_periodWeek')}</span>)]}\n </div>\n </div>),\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 <FormGroup row className={this.props.classes.inputGroup} style={{maxWidth: 620}}>\n <FormControlLabel className={this.props.classes.inputDateDay}\n control={\n <Checkbox className={this.props.classes.inputDateDayCheck} checked={parsedDates.length === 31}\n onChange={e => {\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 <FormControlLabel className={this.props.classes.inputDateDay}\n control={\n <Checkbox className={this.props.classes.inputDateDayCheck} checked={!parsedDates.length}\n onChange={e => {\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 && (<FormControlLabel className={this.props.classes.inputDateDay}\n control={\n <Checkbox className={this.props.classes.inputDateDayCheck} checked={false}\n onChange={e => {\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 <div/>\n {dates.map(i =>\n (<FormControlLabel key={'date_' + i} className={this.props.classes.inputDateDay} style={!i ? {opacity: 0, cursor: 'default', userSelect: 'none', pointerEvents: 'none'}: {}}\n control={\n <Checkbox className={this.props.classes.inputDateDayCheck} checked={JSON.parse(schedule.period.dates).indexOf(i) !== -1}\n onChange={e => {\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 ? [(<span key=\"0\" style={{opacity: 0}}>0</span>), (<span key=\"num\">{i}</span>)] : i}\n />))}\n </FormGroup>);\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 (<div key=\"every\"><FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={typeof schedule.period.months === 'number' && schedule.period.months === 1} onClick={() => {\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')} /></div>),\n (<div key=\"everyN\"><FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={typeof schedule.period.months === 'number' && schedule.period.months > 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 && [(<Input value={schedule.period.months} className={this.props.classes.inputEvery} type=\"number\" min=\"2\" onChange={e => {\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 }} />), (<span>{I18n.t('sch_periodMonth')}</span>)]}\n </div>),\n (<div key=\"specific\" style={{verticalAlign: 'top'}}><FormControlLabel style={{verticalAlign: 'top'}} control={(<Radio className={this.props.classes.inputRadio} checked={typeof schedule.period.months === 'string'} onClick={() => {\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 (<FormGroup row className={this.props.classes.inputGroup}>\n <FormControlLabel className={this.props.classes.inputDateDay}\n control={\n <Checkbox className={this.props.classes.inputDateDayCheck} checked={parsedMonths.length === 12}\n onChange={e => {\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 <FormControlLabel className={this.props.classes.inputDateDay}\n control={\n <Checkbox className={this.props.classes.inputDateDayCheck} checked={!parsedMonths.length}\n onChange={e => {\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 && (<FormControlLabel className={this.props.classes.inputDateDay}\n control={\n <Checkbox className={this.props.classes.inputDateDayCheck} checked={false}\n onChange={e => {\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 <div/>\n {MONTHS.map((month, i) => (<FormControlLabel className={this.props.classes.inputGroupElement}\n control={\n <Checkbox className={this.props.classes.inputSmallCheck} checked={JSON.parse(schedule.period.months).indexOf(i + 1) !== -1}\n onChange={e => {\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 </FormGroup>)}\n </div>),\n ];\n }\n\n getPeriodSettingsYearly() {\n if (!this.state.schedule.period.years) {\n return;\n }\n const schedule = this.state.schedule;\n return [\n (<div><FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={schedule.period.years === 1} onClick={() => {\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')} /></div>),\n (<div><FormControlLabel control={(<Radio className={this.props.classes.inputRadio} checked={schedule.period.years > 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 && [(<Input value={this.state.schedule.period.years} className={this.props.classes.inputEvery} type=\"number\" min=\"2\" onChange={e => {\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 }} />), (<span>{I18n.t('sch_periodYear')}</span>)]}\n </div>),\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 <div className={this.props.classes.rowDiv}>\n <div className={this.props.classes.modeDiv} style={{verticalAlign: 'middle'}}>\n <span style={{fontWeight: 'bold', paddingRight: 10}}>{I18n.t('sch_valid')}</span>\n <span>{I18n.t('sch_validFrom')}</span>\n </div>\n <div className={this.props.classes.settingsDiv}>\n <TextField\n className={this.props.classes.inputDate}\n style={{marginRight: 10}}\n key=\"exactTimeFrom\"\n inputRef={this.refFrom}\n defaultValue={string2USdate(schedule.valid.from)}\n type=\"date\"\n //inputComponent={TextDate}\n onChange={e => {\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 <FormControlLabel control={(<Checkbox className={this.props.classes.inputRadio} checked={!!schedule.valid.to} onClick={() => {\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 <TextField\n inputRef={this.refTo}\n className={this.props.classes.inputDate}\n style={{marginRight: 10}}\n key=\"exactTimeFrom\"\n type=\"date\"\n defaultValue={string2USdate(schedule.valid.to)}\n //inputComponent={TextDate}\n onChange={e => {\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 </div>\n </div>\n );\n }\n\n render() {\n return (<div style={{height: 'calc(100% - 48px)', width: '100%', overflow: 'hidden'}}>\n <div>{this.state.desc}</div>\n <div className={this.props.classes.scrollWindow}>\n <h5>{I18n.t('sch_time')}</h5>\n {this.getTimePeriodElements()}\n {this.getTimeExactElements()}\n {this.getDivider()}\n <h5>{I18n.t('sch_period')}</h5>\n {this.getPeriodModes()}\n {!this.state.schedule.period.once && this.getDivider()}\n {!this.state.schedule.period.once && this.getValidSettings()}\n </div>\n </div>);\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 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});\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 <Dialog\n disableBackdropClick\n disableEscapeKeyDown\n maxWidth=\"md\"\n fullWidth={true}\n classes={{paper: this.props.classes.dialogPaper}}\n open={true}\n aria-labelledby=\"cron-dialog-title\"\n >\n <DialogTitle id=\"cron-dialog-title\">{this.props.title || I18n.t('Define schedule...')}</DialogTitle>\n <DialogContent style={{height: '100%', overflow: 'hidden'}}>\n {!this.props.simple && (<div>\n <Radio\n key=\"wizard\"\n checked={this.state.mode === 'wizard'}\n onChange={e => this.setMode('wizard')}\n /><label onClick={e => this.setMode('wizard')}\n style={this.state.mode !== 'wizard' ? {color: 'lightgrey'} : {}}>{I18n.t('sc_wizard')}</label>\n\n <Radio\n key=\"simple\"\n checked={this.state.mode === 'simple'}\n onChange={e => this.setMode('simple')}\n /><label onClick={e => this.setMode('simple')}\n style={this.state.mode !== 'simple' ? {color: 'lightgrey'} : {}}>{I18n.t('sc_simple')}</label>\n <Radio\n key=\"complex\"\n checked={this.state.mode === 'complex'}\n onChange={e => this.setMode('complex')}\n /><label onClick={e => this.setMode('complex')} style={this.state.mode !== 'complex' ? {color: 'lightgrey'} : {}}>{I18n.t('sc_cron')}</label></div>)}\n\n {this.state.mode === 'simple' &&\n (<SimpleCron\n cronExpression={this.state.cron}\n onChange={cron => this.setState({cron})}\n language={I18n.getLanguage()}\n />)}\n {this.state.mode === 'wizard' &&\n (<Schedule\n schedule={this.state.cron}\n onChange={cron => this.setState({cron})}\n language={I18n.getLanguage()}\n />)}\n {this.state.mode === 'complex' &&\n (<ComplexCron\n cronExpression={this.state.cron}\n onChange={cron => this.setState({cron})}\n language={I18n.getLanguage()}\n />)}\n </DialogContent>\n <DialogActions>\n <Button onClick={() => this.handleOk()} color=\"primary\">{this.props.ok || I18n.t('Ok')}</Button>\n <Button onClick={() => this.handleCancel()} color=\"secondary\">{this.props.cancel || I18n.t('Cancel')}</Button>\n </DialogActions>\n </Dialog>\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 ScriptEditorComponent from '../Components/ScriptEditorVanilaMonaco';\n\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});\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 <Dialog\n disableBackdropClick\n disableEscapeKeyDown\n maxWidth=\"lg\"\n classes={{paper: classes.dialog}}\n fullWidth={true}\n open={true}\n aria-labelledby=\"source-dialog-title\"\n >\n <DialogTitle id=\"source-dialog-title\">{I18n.t('Function editor')}</DialogTitle>\n <DialogContent className={classes.fullHeight}>\n {this.props.args && (<div key=\"arguments\" className={classes.args}>\n <span className={classes.argsTitle}>{I18n.t('function (')}</span>\n {this.props.args}\n <span className={classes.argsTitle}>)</span>\n </div>)}\n <ScriptEditorComponent\n className={classes.textArea}\n style={{height: this.props.args ? 'calc(100% - 30px)' : '100%'}}\n key=\"scriptEditor\"\n name={'blockly'}\n connection={this.props.connection}\n readOnly={false}\n checkJs={false}\n code={this.state.source}\n isDark={this.props.theme === 'dark'}\n onChange={newValue => this.onChange(newValue)}\n language={'javascript'}\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={event => this.handleOk()} color=\"primary\">{I18n.t('Save')}</Button>\n <Button onClick={event => this.handleCancel()} color=\"secondary\">{I18n.t('Cancel')}</Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nDialogScriptEditor.propTypes = {\n classes: PropTypes.object.isRequired,\n onClose: PropTypes.func,\n source: PropTypes.string,\n args: PropTypes.string,\n isReturn: PropTypes.bool,\n theme: PropTypes.string,\n connection: PropTypes.object\n};\n\nexport default withStyles(styles)(DialogScriptEditor);\n","import React from 'react';\nimport PropTypes from 'prop-types';\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 Theme from './Theme';\nimport ScriptEditor 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\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 */ + 1}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 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 },\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 theme: this.props.theme,\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 };\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 const instances = [];\n if (this.props.objects) {\n for (let id in this.props.objects) {\n if (this.props.objects.hasOwnProperty(id) && id.startsWith('system.adapter.') && this.props.objects[id] && this.props.objects[id].type === 'instance') {\n instances.push(id);\n }\n }\n }\n\n window.systemLang = I18n.getLanguage();\n window.main = {\n objects: this.props.objects,\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 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 // 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 this.onBrowserCloseBound = this.onBrowserClose.bind(this);\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.onBrowserCloseBound, false);\n }\n\n componentWillUnmount() {\n window.removeEventListener('beforeunload', this.onBrowserCloseBound);\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 && nextProps.objects['system.config']) {\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.theme !== nextProps.theme) {\n newState.theme = nextProps.theme;\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 for (const id in this.scripts) {\n if (!this.scripts.hasOwnProperty(id)) continue;\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 const instances = [];\n for (let id in window.main.objects) {\n if (window.main.objects.hasOwnProperty(id) && id.startsWith('system.adapter.') && window.main.objects[id] && window.main.objects[id].type === 'instance') {\n instances.push(id);\n }\n }\n window.main.instances = instances;\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 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 [(<Tabs\n component={'div'}\n key=\"tabs1\"\n value={this.state.selected}\n onChange={(event, value) => 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 (<div key=\"text\" className={this.props.classes.tabText + ' ' + (this.isScriptChanged(id) ? this.props.classes.tabChanged : '')}>{id.split('.').pop()}</div>),\n (<span key=\"icon\" className={this.props.classes.closeButton}><IconClose key=\"close\" onClick={e => this.onTabClose(id, e)} fontSize=\"small\"/></span>)];\n return (<Tab\n component={'div'}\n href={'#' + id}\n key={id}\n label={label}\n value={id}\n classes={{wrapper: this.props.classes.tabButtonWrapper}}\n />);\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 (<img key=\"icon\" alt={\"\"} src={images[this.props.objects[id].common.engineType] || images.def} className={this.props.classes.tabIcon}/>),\n (<div key=\"text\" className={this.props.classes.tabText + ' ' + (this.isScriptChanged(id) ? this.props.classes.tabChanged : '')}>{text}</div>),\n changed ? (<span key=\"changedSign\" className={this.props.classes.tabChangedIcon}>▣</span>) : null,\n (<span key=\"icon2\" className={this.props.classes.closeButton}><IconClose key=\"close\" onClick={e => this.onTabClose(id, e)} fontSize=\"small\"/></span>)];\n\n return (<Tab\n component={'div'}\n href={'#' + id}\n key={id}\n label={label}\n className={this.props.classes.tabButton}\n value={id}\n title={title}\n classes={{wrapper: this.props.classes.tabButtonWrapper}}\n />);\n }\n })}\n </Tabs>),\n this.state.editing.length > 1 ? (<IconButton\n key=\"menuButton\"\n href=\"#\"\n aria-label=\"Close all but current\"\n className={this.props.classes.tabMenuButton}\n title={I18n.t('Close all but current')}\n aria-haspopup=\"false\"\n onClick={_event => {\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 <IconCloseAll />\n </IconButton>) : null\n ];\n } else {\n return (<div key=\"tabs2\" className={this.props.classes.toolbar}>\n <Button key=\"select1\" disabled={true} className={this.props.classes.hintButton} href=\"\">\n <span key=\"select2\">{I18n.t('Click on this icon')}</span>\n <IconDoEdit key=\"select3\" className={this.props.classes.hintIcon}/>\n <span key=\"select4\">{I18n.t('for edit or create script')}</span>\n </Button>\n </div>);\n }\n }\n\n getDebugMenu() {\n if (!this.state.showDebugMenu) return null;\n\n return (<Menu\n key=\"menuDebug\"\n id=\"menu-debug\"\n anchorEl={this.state.menuDebugAnchorEl}\n open={this.state.showDebugMenu}\n onClose={() => this.setState({showDebugMenu: false, menuDebugAnchorEl: null})}\n PaperProps={{\n style: {\n maxHeight: MENU_ITEM_HEIGHT * 7.5,\n },\n }}\n >\n <MenuItem key=\"debugEnabled\"\n title={I18n.t('debug_help')}\n onClick={event => {\n event.stopPropagation();\n event.preventDefault();\n this.setState({showDebugMenu: false, menuDebugAnchorEl: null, debugEnabled: !this.state.debugEnabled}, () => this.onChange({debug: this.state.debugEnabled}));\n }}>\n <Checkbox checked={this.state.debugEnabled}/>\n <IconDebug className={this.props.classes.menuIcon} style={{color: COLOR_DEBUG}}/>\n {I18n.t('debug')}\n </MenuItem>\n <MenuItem key=\"verboseEnabled\"\n title={I18n.t('verbose_help')}\n onClick={event => {\n event.stopPropagation();\n event.preventDefault();\n this.setState({showDebugMenu: false, menuDebugAnchorEl: null, verboseEnabled: !this.state.verboseEnabled}, () => this.onChange({verbose: this.state.verboseEnabled}));\n }}>\n <Checkbox checked={this.state.verboseEnabled}/>\n <IconVerbose className={this.props.classes.menuIcon} style={{color: COLOR_VERBOSE}}/>\n {I18n.t('verbose')}\n </MenuItem>\n </Menu>);\n }\n\n getDebugBadge() {\n return [\n this.state.debugEnabled && this.state.verboseEnabled && (<IconDebug key=\"DebugVerbose\" className={this.props.classes.menuIcon} style={{color: COLOR_VERBOSE}}/>),\n this.state.debugEnabled && !this.state.verboseEnabled && (<IconDebug key=\"DebugNoVerbose\" className={this.props.classes.menuIcon} style={{color: COLOR_DEBUG}}/>),\n !this.state.debugEnabled && this.state.verboseEnabled && (<IconVerbose key=\"noDebugVerbose\" className={this.props.classes.menuIcon} style={{color: COLOR_VERBOSE}}/>),\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 changed = this.state.changed[this.state.selected];\n return (\n <Toolbar variant=\"dense\" className={this.props.classes.toolbar} key=\"toolbar1\">\n {this.state.menuOpened && this.props.onLocate && (<IconButton className={this.props.classes.toolbarButtons} key=\"locate\" title={I18n.t('Locate file')} onClick={() => this.props.onLocate(this.state.selected)}><IconLocate/></IconButton>)}\n {!changed && isInstanceRunning && (<IconButton key=\"restart\" variant=\"contained\" className={this.props.classes.toolbarButtons} onClick={() => this.onRestart()} title={I18n.t('Restart')}><IconRestart /></IconButton>)}\n {!changed && !isScriptRunning && (<span className={this.props.classes.notRunning}>{I18n.t('Script is not running')}</span>)}\n {!changed && isScriptRunning && !isInstanceRunning && (<span className={this.props.classes.notRunning}>{I18n.t('Instance is disabled')}</span>)}\n {changed && (<Button key=\"save\" variant=\"contained\" color=\"secondary\" className={this.props.classes.textButton} onClick={() => this.onSave()}>{I18n.t('Save')}<IconSave /></Button>)}\n {changed && (<Button key=\"cancel\" variant=\"contained\" className={this.props.classes.textButton} onClick={() => this.onCancel()}>{I18n.t('Cancel')}<IconCancel /></Button>)}\n <div style={{flex: 2}}/>\n\n {this.state.blockly && !this.state.showBlocklyCode &&\n (<IconButton key=\"export\" aria-label=\"Export Blocks\"\n title={I18n.t('Export blocks')}\n className={this.props.classes.toolbarButtons}\n onClick={() => this.sendCommandToBlockly('export')}>\n <IconExport /></IconButton>)}\n\n {this.state.blockly && !this.state.showBlocklyCode &&\n (<IconButton key=\"import\" aria-label=\"Import Blocks\"\n title={I18n.t('Import blocks')}\n className={this.props.classes.toolbarButtons}\n onClick={() => this.sendCommandToBlockly('import')}>\n <IconImport /></IconButton>)}\n\n {this.state.blockly && !this.state.showBlocklyCode &&\n (<IconButton key=\"check\" aria-label=\"Check code\"\n title={I18n.t('Check blocks')}\n className={this.props.classes.toolbarButtons}\n onClick={() => this.sendCommandToBlockly('check')}>\n <IconCheck /></IconButton>)}\n\n {!this.state.blockly && !this.state.showBlocklyCode && (<IconButton key=\"select-cron\" aria-label=\"create CRON\"\n title={I18n.t('Create or edit CRON or time wizard')}\n className={this.props.classes.toolbarButtons}\n onClick={() => this.setState({showCron: true})}><IconCron/></IconButton>)}\n\n {!this.state.blockly && !this.state.showBlocklyCode && (<IconButton key=\"select-id\" aria-label=\"select ID\"\n title={I18n.t('Insert object ID')}\n className={this.props.classes.toolbarButtons}\n onClick={() => this.setState({showSelectId: true})}><IconSelectId/></IconButton>)}\n\n {this.state.blockly && this.state.showBlocklyCode && (<Button key=\"convert2js\" aria-label=\"convert to javascript\"\n title={I18n.t('Convert blockly to javascript for ever.')}\n onClick={() => this.onConvert2JS()}\n >Blockly=>JS</Button>)}\n\n {this.state.blockly && (<Button key=\"blockly-code\" aria-label=\"blockly\"\n title={I18n.t('Show javascript code')}\n className={this.props.classes.toolbarButtons}\n color={this.state.showBlocklyCode ? 'secondary' : 'inherit'}\n style={{padding: '0 5px'}}\n onClick={() => this.setState({showBlocklyCode: !this.state.showBlocklyCode})}>\n <img alt=\"blockly2js\" src={ImgBlockly2Js} /></Button>)}\n\n {!this.state.showBlocklyCode && (<IconButton key=\"debug\" aria-label=\"Debug menu\"\n title={I18n.t('Debug options')}\n className={this.props.classes.toolbarButtons}\n onClick={e => this.setState({showDebugMenu: true, menuDebugAnchorEl: e.currentTarget})}>\n <Badge className={this.props.classes.badgeMargin} badgeContent={this.getDebugBadge()}>\n <IconDebugMenu />\n </Badge>\n </IconButton>)}\n\n </Toolbar>);\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 (<div className={this.props.classes.editorDiv} key=\"scriptEditorDiv\">\n <ScriptEditor\n key=\"scriptEditor\"\n name={this.state.selected}\n insert={this.state.insert}\n onInserted={() => 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.theme === 'dark'}\n connection={this.props.connection}\n onChange={newValue => this.onChange({script: newValue})}\n language={this.scripts[this.state.selected].engineType === 'TypeScript/ts' ? 'typescript' : 'javascript'}\n />\n </div>);\n } else {\n return null;\n }\n }\n\n getBlocklyEditor() {\n if (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 (<div className={this.props.classes.editorDiv} key=\"blocklyEditorDiv\">\n <BlocklyEditor\n command={this.state.cmdToBlockly}\n key=\"BlocklyEditor\"\n theme={this.state.theme}\n searchText={this.state.searchText}\n resizing={this.props.resizing}\n code={this.scripts[this.state.selected].source || ''}\n onChange={newValue => this.onChange({script: newValue})}\n />\n </div>);\n } else {\n return null;\n }\n }\n\n getConfirmDialog() {\n if (this.state.confirm) {\n return (<DialogConfirm\n key=\"dialogConfirm1\"\n text={this.state.confirm}\n onClose={result => {\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 return (<DialogSelectID\n key=\"dialogSelectID1\"\n prefix={'../..'}\n theme={this.props.theme}\n connection={this.props.connection}\n selected={this.selectId.callback ? this.selectId.initValue || '' : this.getSelect ? this.getSelect() : ''}\n statesOnly={true}\n onClose={() => this.setState({showSelectId: false})}\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 (<DialogCron\n key=\"dialogCron1\"\n cron={this.cron.callback ? this.cron.initValue || '' : this.getSelect ? this.getSelect() : '* * * * *'}\n onClose={() => 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 (<DialogScriptEditor\n key=\"scriptEditorDialog\"\n source={this.scriptDialog.initValue}\n args={this.scriptDialog.args ? this.scriptDialog.args.join(', ') : ''}\n isReturn={this.scriptDialog.isReturn}\n connection={this.props.connection}\n theme={this.state.theme}\n onClose={result => {\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 (<Snackbar\n key=\"toast\"\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n open={!!this.state.toast}\n autoHideDuration={6000}\n onClose={() => this.setState({toast: ''})}\n ContentProps={{'aria-describedby': 'message-id',}}\n message={<span id=\"message-id\">{this.state.toast}</span>}\n action={[\n <IconButton\n key=\"close\"\n aria-label=\"close\"\n color=\"inherit\"\n className={this.props.classes.closeToast}\n onClick={() => this.setState({toast: ''})}\n ><IconClose />\n </IconButton>,\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 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 connection: PropTypes.object,\n searchText: PropTypes.string,\n theme: 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 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});\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 <Dialog\n disableBackdropClick\n disableEscapeKeyDown\n maxWidth=\"lg\"\n classes={{paper: classes.dialog}}\n fullWidth={true}\n open={true}\n aria-labelledby=\"import-dialog-title\"\n >\n <DialogTitle id=\"import-dialog-title\">{I18n.t('Import scripts')}</DialogTitle>\n <DialogContent className={classes.fullHeight}>\n <Dropzone key='image-drop'\n\n maxSize={50000000}\n acceptClassName={classes.dropzoneAccepted}\n rejectClassName={classes.dropzoneRejected}\n onDrop={files => this.handleDropFile(files)}\n multiple={false}\n accept='application/zip,application/x-zip-compressed'\n className={className}>\n {\n ({ getRootProps, getInputProps, isDragActive, isDragReject}) => {\n if (isDragReject) {\n if (this.state.imageStatus !== 'rejected') {\n this.setState({imageStatus: 'rejected'});\n }\n return (\n <div className={this.props.classes.dropzoneDiv} {...getRootProps()}>\n <input {...getInputProps()} />\n <span key=\"text\" className={this.props.classes.text}>{I18n.t('Some files will be rejected')}</span>\n <IconNo key=\"icon\" className={this.props.classes.icon + ' ' + this.props.classes.iconError}/>\n </div>);\n } else if (isDragActive) {\n if (this.state.imageStatus !== 'accepted') {\n this.setState({imageStatus: 'accepted'});\n }\n\n return (\n <div className={this.props.classes.dropzoneDiv} {...getRootProps()}>\n <input {...getInputProps()} />\n <span key=\"text\" className={this.props.classes.text}>{I18n.t('All files will be accepted')}</span>\n <IconPlus key=\"icon\" className={this.props.classes.icon + ' ' + this.props.classes.iconOk}/>\n </div>);\n } else {\n if (this.state.imageStatus !== 'wait') {\n this.setState({imageStatus: 'wait'});\n }\n return (\n <div className={this.props.classes.dropzoneDiv} {...getRootProps()}>\n <input {...getInputProps()} />\n <span key=\"text\" className={this.props.classes.text}>{I18n.t('Drop some files here or click...')}</span>\n <IconUpload key=\"icon\" className={this.props.classes.icon}/>\n </div>);\n }\n }\n }\n </Dropzone>\n {this.state.error ? (<DialogError text={this.state.error} onClose={() => this.setState({error: ''})}/>) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={() => this.handleCancel()} color=\"secondary\">{I18n.t('Close')}</Button>\n </DialogActions>\n </Dialog>\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, {Component} 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 Connection from '@iobroker/adapter-react/Connection';\nimport {PROGRESS} from '@iobroker/adapter-react/Connection';\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';\n\nimport SideMenu from './SideMenu';\nimport Log from './Log';\nimport Editor from './Editor';\nimport Theme from './Theme';\nimport DialogError from './Dialogs/Error';\nimport DialogImportFile from './Dialogs/ImportFile';\nimport BlocklyEditor from './Components/BlocklyEditor';\n\nconst styles = theme => ({\n root: Theme.root,\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.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.default,\n position: 'relative'\n },\n splitterDivWithMenu: {\n width: `calc(100% - ${Theme.menu.width}px)`,\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.colors.secondary,\n color: Theme.colors.primary,\n paddingLeft: 3,\n '&:hover': {\n color: 'white'\n }\n }\n});\n\nclass App extends Component {\n constructor(props) {\n super(props);\n this.objects = {};\n\n // init translations\n I18n.setTranslations({\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\n this.state = {\n connected: false,\n progress: 0,\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 errorText: '',\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 themeType: window.localStorage ? window.localStorage.getItem('App.theme') || 'light' : 'light',\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.scripts = {};\n this.hosts = [];\n this.importFile = null;\n\n this.socket = new Connection({\n autoSubscribes: ['script.*', 'system.adapter.javascript.*'],\n autoSubscribeLog: true,\n onProgress: progress => {\n if (progress === PROGRESS.CONNECTING) {\n this.setState({connected: false});\n } else if (progress === PROGRESS.READY) {\n this.setState({connected: true, progress: 100});\n } else {\n this.setState({connected: true, progress: Math.round(PROGRESS.READY / progress * 100)});\n }\n },\n onReady: (objects, scripts) => {\n I18n.setLanguage(this.socket.systemLang);\n window.systemLang = this.socket.systemLang;\n this.onObjectChange(objects, scripts, true);\n },\n onObjectChange: (objects, scripts) => this.onObjectChange(objects, scripts),\n onError: err => {\n console.error(err);\n },\n onBlocklyChanges: () => {\n this.confirmCallback = result => result && window.location.reload();\n this.setState({confirm: I18n.t('Some blocks were updated. Reload admin?')});\n },\n onLog: message => {\n //this.logIndex++;\n //this.setState({logMessage: {index: this.logIndex, message}})\n }\n });\n\n this.socket.subscribeState('system.adapter.javascript.*.alive', (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\n onObjectChange(objects, scripts, isReady) {\n this.objects = objects;\n // extract scripts and instances\n const nScripts = {};\n const newState = {};\n\n scripts.list.forEach(id => nScripts[id] = objects[id]);\n scripts.groups.forEach(id => nScripts[id] = objects[id]);\n this.hosts = scripts.hosts;\n\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 (scripts.list.find(id => id.startsWith('script.js.global.'))) {\n newState.expertMode = true;\n }\n }\n\n let scriptsHash = this.state.scriptsHash;\n if (this.compareScripts(scripts)) {\n scriptsHash++;\n }\n scripts.instances.sort();\n this.scripts = nScripts;\n newState.instances = scripts.instances;\n newState.scriptsHash = scriptsHash;\n\n if (isReady !== undefined) {\n newState.ready = isReady;\n }\n\n BlocklyEditor.loadCustomBlockly(objects, () => this.setState(newState));\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 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 promise = this.socket.updateScript(oldId, newId, common);\n } else {\n promise = this.socket.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 onUpdateScript(id, common) {\n if (this.scripts[id] && this.scripts[id].type === 'script') {\n this.socket.updateScript(id, id, common)\n .then(() => {})\n .catch(err => err !== 'canceled' && this.showError(err));\n }\n }\n\n onSelect(selected) {\n if (this.objects[selected] && this.objects[selected].common && this.objects[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});\n }\n\n showMessage(message) {\n this.setState({message});\n }\n\n onDelete(id) {\n this.socket.delObject(id)\n .then(() => {})\n .catch(err => {\n this.showError(err);\n });\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.objects).find(_id => id === _id || reg.test(id))) {\n this.showError(I18n.t('Yet exists!'));\n return;\n }\n\n if (isFolder) {\n this.socket.setObject(id, {\n common: {\n name,\n expert: true\n },\n type: 'channel'\n }).then(() => {\n setTimeout(() => this.setState({menuSelectId: id}, () =>\n setTimeout(() => this.setState({menuSelectId: ''})), 300), 1000);\n }).catch(err => {\n this.showError(err);\n });\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 }).then(() => {\n setTimeout(() => this.onSelect(id), 1000);\n }).catch(err => {\n this.showError(err);\n });\n }\n }\n\n onEnableDisable(id, enabled) {\n if (this.scripts[id] && this.scripts[id].type === 'script') {\n const common = this.objects[id].common;\n common.enabled = enabled;\n common.expert = true;\n this.socket.updateScript(id, id, common)\n .then(() => {})\n .catch(err => err !== 'canceled' && this.showError(err));\n }\n }\n\n getLiveHost(cb, _list) {\n if (!_list) {\n _list = JSON.parse(JSON.stringify(this.hosts)) || [];\n }\n\n if (_list.length) {\n const id = _list.shift();\n this.socket.getState(id + '.alive', (err, state) => {\n if (!err && 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 this.showError(I18n.t('No active host found'));\n return;\n }\n\n const d = new Date();\n let date = d.getFullYear();\n let m = d.getMonth() + 1;\n if (m < 10) m = '0' + m;\n date += '-' + m;\n m = d.getDate();\n if (m < 10) m = '0' + m;\n date += '-' + m + '-';\n\n this.socket.socket.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 a.href = '/zip/' + date + 'scripts.zip';\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.socket.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 ? (<DialogError key=\"dialogError\" onClose={() => this.setState({errorText: ''})} text={this.state.errorText}/>) : null;\n return [\n this.state.message ? (<DialogMessage key=\"dialogMessage\" onClose={() => this.setState({message: ''})} text={this.state.message}/>) : null,\n errorDialog,\n this.state.importFile ? (<DialogImportFile key=\"dialogImportFile\" onClose={data => this.onImport(data)} />) : null,\n this.state.confirm ? (<DialogConfirm\n key=\"dialogConfirm\"\n onClose={result => {\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 (<div className={classes.content + ' iobVerticalSplitter'} key=\"main\">\n <div key=\"closeMenu\" className={classes.menuOpenCloseButton} onClick={() => {\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 ? (<IconMenuOpened />) : (<IconMenuClosed />)}\n </div>\n <SplitterLayout\n key=\"splitterLayout\"\n vertical={!this.state.logHorzLayout}\n primaryMinSize={100}\n secondaryInitialSize={this.logSize}\n //customClassName={classes.menuDiv + ' ' + classes.splitterDivWithoutMenu}\n onDragStart={() => 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 <Editor\n key=\"editor\"\n visible={!this.state.resizing}\n connection={this.socket}\n\n onLocate={menuSelectId => this.setState({menuSelectId})}\n runningInstances={this.state.runningInstances}\n menuOpened={this.state.menuOpened}\n searchText={this.state.searchText}\n theme={this.state.themeType}\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, {})}\n selected={this.state.selected && this.objects[this.state.selected] && this.objects[this.state.selected].type === 'script' ? this.state.selected : ''}\n objects={this.objects}\n />\n <Log key=\"log\" verticalLayout={!this.state.logHorzLayout} onLayoutChange={() => this.toggleLogLayout()} editing={this.state.editing} connection={this.socket} selected={this.state.selected}/>\n </SplitterLayout>\n </div>),\n ];\n }\n\n render() {\n const {classes} = this.props;\n\n if (!this.state.ready) {\n // return (<CircularProgress className={classes.progress} size={50} />);\n return (<Loader theme={this.state.themeType}/>);\n }\n\n return (\n <div className={classes.root}>\n <SplitterLayout\n key=\"menuSplitter\"\n vertical={false}\n primaryMinSize={300}\n primaryIndex={1}\n secondaryMinSize={300}\n secondaryInitialSize={this.menuSize}\n customClassName={classes.splitterDivs + ' ' + (!this.state.menuOpened ? classes.menuDivWithoutMenu : '')}\n onDragStart={() => 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 <div className={classes.mainDiv} key=\"menu\">\n <SideMenu\n key=\"sidemenu\"\n scripts={this.scripts}\n objects={this.objects}\n scriptsHash={this.state.scriptsHash}\n instances={this.state.instances}\n update={this.state.updateScripts}\n onRename={this.onRename.bind(this)}\n onSelect={this.onSelect.bind(this)}\n connection={this.socket}\n selectId={this.state.menuSelectId}\n onEdit={this.onEdit.bind(this)}\n expertMode={this.state.expertMode}\n theme={this.state.themeType}\n onThemeChange={theme => {\n window.localStorage && window.localStorage.setItem('App.theme', theme);\n this.setState({themeType: theme}, () => this.props.onThemeChange(theme))\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 </div>\n {this.renderMain()}\n </SplitterLayout>\n </div>\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 { MuiThemeProvider} from '@material-ui/core/styles';\nimport createTheme from '@iobroker/adapter-react/createTheme';\n\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nlet theme = window.localStorage ? window.localStorage.getItem('App.theme') || 'light' : 'light';\n\nfunction build() {\n if (typeof Map === 'undefined') {\n console.log('Something is wrong')\n }\n return ReactDOM.render(<MuiThemeProvider theme={createTheme(theme)}>\n <App onThemeChange={_theme => {\n theme = _theme;\n build();\n }}/>\n </MuiThemeProvider>, document.getElementById('root'));\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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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\""],"sourceRoot":""}