diff --git a/build/asset-manifest.json b/build/asset-manifest.json index a453a4e647f4a5326f36b004a4ec9975bdc6a3c1..61e0437150bbdd435fb0226e5787f5f659205cbd 100644 --- a/build/asset-manifest.json +++ b/build/asset-manifest.json @@ -1,22 +1,22 @@ { "files": { "main.css": "/autosubmitapp/static/css/main.eb7077de.chunk.css", - "main.js": "/autosubmitapp/static/js/main.a6d3bcb4.chunk.js", - "main.js.map": "/autosubmitapp/static/js/main.a6d3bcb4.chunk.js.map", - "runtime-main.js": "/autosubmitapp/static/js/runtime-main.02ce37e3.js", - "runtime-main.js.map": "/autosubmitapp/static/js/runtime-main.02ce37e3.js.map", - "static/js/2.169d6f54.chunk.js": "/autosubmitapp/static/js/2.169d6f54.chunk.js", - "static/js/2.169d6f54.chunk.js.map": "/autosubmitapp/static/js/2.169d6f54.chunk.js.map", + "main.js": "/autosubmitapp/static/js/main.9c9fefa2.chunk.js", + "main.js.map": "/autosubmitapp/static/js/main.9c9fefa2.chunk.js.map", + "runtime-main.js": "/autosubmitapp/static/js/runtime-main.46102c2b.js", + "runtime-main.js.map": "/autosubmitapp/static/js/runtime-main.46102c2b.js.map", + "static/js/2.022452db.chunk.js": "/autosubmitapp/static/js/2.022452db.chunk.js", + "static/js/2.022452db.chunk.js.map": "/autosubmitapp/static/js/2.022452db.chunk.js.map", "index.html": "/autosubmitapp/index.html", - "precache-manifest.97a9e64fc8d10fc463fe7e56a1f515df.js": "/autosubmitapp/precache-manifest.97a9e64fc8d10fc463fe7e56a1f515df.js", + "precache-manifest.3c629a9018b9249927f9ebb22a078445.js": "/autosubmitapp/precache-manifest.3c629a9018b9249927f9ebb22a078445.js", "service-worker.js": "/autosubmitapp/service-worker.js", "static/css/main.eb7077de.chunk.css.map": "/autosubmitapp/static/css/main.eb7077de.chunk.css.map", - "static/js/2.169d6f54.chunk.js.LICENSE.txt": "/autosubmitapp/static/js/2.169d6f54.chunk.js.LICENSE.txt" + "static/js/2.022452db.chunk.js.LICENSE.txt": "/autosubmitapp/static/js/2.022452db.chunk.js.LICENSE.txt" }, "entrypoints": [ - "static/js/runtime-main.02ce37e3.js", - "static/js/2.169d6f54.chunk.js", + "static/js/runtime-main.46102c2b.js", + "static/js/2.022452db.chunk.js", "static/css/main.eb7077de.chunk.css", - "static/js/main.a6d3bcb4.chunk.js" + "static/js/main.9c9fefa2.chunk.js" ] } \ No newline at end of file diff --git a/build/index.html b/build/index.html index efd6865fdb041f3b2300a398c2b8523f31e88928..d0c92105caf1f772bb5498d907fb4de8732a35d0 100644 --- a/build/index.html +++ b/build/index.html @@ -1 +1 @@ -Autosubmit GUI
\ No newline at end of file +Autosubmit GUI
\ No newline at end of file diff --git a/build/precache-manifest.3c629a9018b9249927f9ebb22a078445.js b/build/precache-manifest.3c629a9018b9249927f9ebb22a078445.js new file mode 100644 index 0000000000000000000000000000000000000000..7a9840f11a33faa1cddae9f45cf00ff12bd45f2b --- /dev/null +++ b/build/precache-manifest.3c629a9018b9249927f9ebb22a078445.js @@ -0,0 +1,26 @@ +self.__precacheManifest = (self.__precacheManifest || []).concat([ + { + "revision": "cafb45f8bd458210c54056c5c0a9e015", + "url": "/autosubmitapp/index.html" + }, + { + "revision": "c988cfd15e40243a6053", + "url": "/autosubmitapp/static/css/main.eb7077de.chunk.css" + }, + { + "revision": "9f094269a4bd0225cb0c", + "url": "/autosubmitapp/static/js/2.022452db.chunk.js" + }, + { + "revision": "29c9350298f331027ed2ef29970beedd", + "url": "/autosubmitapp/static/js/2.022452db.chunk.js.LICENSE.txt" + }, + { + "revision": "c988cfd15e40243a6053", + "url": "/autosubmitapp/static/js/main.9c9fefa2.chunk.js" + }, + { + "revision": "a1a1fc51578f1f863459", + "url": "/autosubmitapp/static/js/runtime-main.46102c2b.js" + } +]); \ No newline at end of file diff --git a/build/precache-manifest.97a9e64fc8d10fc463fe7e56a1f515df.js b/build/precache-manifest.97a9e64fc8d10fc463fe7e56a1f515df.js deleted file mode 100644 index 80bc6102fa85e975844ad604be89626877a45d8c..0000000000000000000000000000000000000000 --- a/build/precache-manifest.97a9e64fc8d10fc463fe7e56a1f515df.js +++ /dev/null @@ -1,26 +0,0 @@ -self.__precacheManifest = (self.__precacheManifest || []).concat([ - { - "revision": "a75159ce3126a844a8613bd2498b470f", - "url": "/autosubmitapp/index.html" - }, - { - "revision": "7af645ee66d419dda604", - "url": "/autosubmitapp/static/css/main.eb7077de.chunk.css" - }, - { - "revision": "0e858ce714d7f653ecf8", - "url": "/autosubmitapp/static/js/2.169d6f54.chunk.js" - }, - { - "revision": "29c9350298f331027ed2ef29970beedd", - "url": "/autosubmitapp/static/js/2.169d6f54.chunk.js.LICENSE.txt" - }, - { - "revision": "7af645ee66d419dda604", - "url": "/autosubmitapp/static/js/main.a6d3bcb4.chunk.js" - }, - { - "revision": "cb75873c535fdb6ecc71", - "url": "/autosubmitapp/static/js/runtime-main.02ce37e3.js" - } -]); \ No newline at end of file diff --git a/build/service-worker.js b/build/service-worker.js index 1d6eeeac49d6f3e40fa04ac5087018b57bcb414b..1d5daed4e72e2aab9fbeb0299edc6d2889b1059c 100644 --- a/build/service-worker.js +++ b/build/service-worker.js @@ -14,7 +14,7 @@ importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); importScripts( - "/autosubmitapp/precache-manifest.97a9e64fc8d10fc463fe7e56a1f515df.js" + "/autosubmitapp/precache-manifest.3c629a9018b9249927f9ebb22a078445.js" ); self.addEventListener('message', (event) => { diff --git a/build/static/js/2.169d6f54.chunk.js b/build/static/js/2.022452db.chunk.js similarity index 98% rename from build/static/js/2.169d6f54.chunk.js rename to build/static/js/2.022452db.chunk.js index 52d328a97f8a497be343c6e30a66a44d57f9b266..3330ee9d6e7fb6939a08dcfe4741fead686f279a 100644 --- a/build/static/js/2.169d6f54.chunk.js +++ b/build/static/js/2.022452db.chunk.js @@ -1,3 +1,3 @@ -/*! For license information please see 2.169d6f54.chunk.js.LICENSE.txt */ -(this["webpackJsonpreact-api"]=this["webpackJsonpreact-api"]||[]).push([[2],[function(e,t,n){"use strict";e.exports=n(47)},function(e,t,n){"use strict";function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function o(e){for(var t=1;t=0;h--){var f=s[h];"."===f?o(s,h):".."===f?(o(s,h),c++):c&&(o(s,h),c--)}if(!u)for(;c--;c)s.unshift("..");!u||""===s[0]||s[0]&&r(s[0])||s.unshift("");var p=s.join("/");return n&&"/"!==p.substr(-1)&&(p+="/"),p};function a(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}var l=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,i){return e(t,n[i])}));if("object"===typeof t||"object"===typeof n){var i=a(t),r=a(n);return i!==t||r!==n?e(i,r):Object.keys(Object.assign({},t,n)).every((function(i){return e(t[i],n[i])}))}return!1},u=n(12);function d(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function h(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function f(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,i=e.hash,r=t||"/";return n&&"?"!==n&&(r+="?"===n.charAt(0)?n:"?"+n),i&&"#"!==i&&(r+="#"===i.charAt(0)?i:"#"+i),r}function v(e,t,n,r){var o;"string"===typeof e?(o=function(e){var t=e||"/",n="",i="",r=t.indexOf("#");-1!==r&&(i=t.substr(r),t=t.substr(0,r));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===i?"":i}}(e)).state=t:(void 0===(o=Object(i.a)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(a){throw a instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):a}return n&&(o.key=n),r?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=s(o.pathname,r.pathname)):o.pathname=r.pathname:o.pathname||(o.pathname="/"),o}function g(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&l(e.state,t.state)}function y(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,i,r){if(null!=e){var o="function"===typeof e?e(t,n):e;"string"===typeof o?"function"===typeof i?i(o,r):r(!0):r(!1!==o)}else r(!0)},appendListener:function(e){var n=!0;function i(){n&&e.apply(void 0,arguments)}return t.push(i),function(){n=!1,t=t.filter((function(e){return e!==i}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),i=0;it?n.splice(t,n.length-t,i):n.push(i),c({action:"PUSH",location:i,index:t,entries:n})}}))},replace:function(e,t){var i=v(e,t,h(),w.location);d.confirmTransitionTo(i,"REPLACE",n,(function(e){e&&(w.entries[w.index]=i,c({action:"REPLACE",location:i}))}))},go:b,goBack:function(){b(-1)},goForward:function(){b(1)},canGo:function(e){var t=w.index+e;return t>=0&&t"'/]/g,s=/[<>"'/]/g,a={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},l={16:!0,17:!0,18:!0},u={8:"backspace",9:"tab",10:"return",13:"return",19:"pause",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"del",59:";",61:"=",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"numlock",145:"scroll",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},d={16:"shift",17:"ctrl",18:"alt",91:"meta",93:"meta"},c={0:"",1:"left",2:"middle",3:"right"},h="active expanded focus folder lazy radiogroup selected unselectable unselectableIgnore".split(" "),f={},p="columns types".split(" "),v="checkbox expanded extraClasses folder icon iconTooltip key lazy partsel radiogroup refKey selected statusNodeType title tooltip type unselectable unselectableIgnore unselectableStatus".split(" "),g={},y={},m={active:!0,children:!0,data:!0,focus:!0};for(t=0;t=0,"insertBefore must be an existing child"),this.children.splice.apply(this.children,[o,0].concat(u))),a&&!n){for(i=0,r=u.length;i=0;i--)"paging"===(r=this.children[i]).statusNodeType&&this.removeChild(r);this.partload=!1},appendSibling:function(e){return this.addNode(e,"after")},applyCommand:function(e,t){return this.tree.applyCommand(e,this,t)},applyPatch:function(t){if(null===t)return this.remove(),S(this);var n,i,r={children:!0,expanded:!0,parent:!0};for(n in t)t.hasOwnProperty(n)&&(i=t[n],r[n]||e.isFunction(i)||(g[n]?this[n]=i:this.data[n]=i));return t.hasOwnProperty("children")&&(this.removeChildren(),t.children&&this._setChildren(t.children)),this.isVisible()&&(this.renderTitle(),this.renderStatus()),t.hasOwnProperty("expanded")?this.setExpanded(t.expanded):S(this)},collapseSiblings:function(){return this.tree._callHook("nodeCollapseSiblings",this)},copyTo:function(e,t,n){return e.addNode(this.toDict(!0,n),t)},countChildren:function(e){var t,n,i,r=this.children;if(!r)return 0;if(i=r.length,!1!==e)for(t=0,n=i;t=4&&(Array.prototype.unshift.call(arguments,this.toString()),w("log",arguments))},discard:function(){return this.warn("FancytreeNode.discard() is deprecated since 2014-02-16. Use .resetLazy() instead."),this.resetLazy()},discardMarkup:function(e){var t=e?"nodeRemoveMarkup":"nodeRemoveChildMarkup";this.tree._callHook(t,this)},error:function(e){this.tree.options.debugLevel>=1&&(Array.prototype.unshift.call(arguments,this.toString()),w("error",arguments))},findAll:function(t){t=e.isFunction(t)?t:D(t);var n=[];return this.visit((function(e){t(e)&&n.push(e)})),n},findFirst:function(t){t=e.isFunction(t)?t:D(t);var n=null;return this.visit((function(e){if(t(e))return n=e,!1})),n},findRelatedNode:function(e,t){return this.tree.findRelatedNode(this,e,t)},_changeSelectStatusAttrs:function(e){var t=!1,n=this.tree.options,r=i.evalOption("unselectable",this,this,n,!1),o=i.evalOption("unselectableStatus",this,this,n,void 0);switch(r&&null!=o&&(e=o),e){case!1:t=this.selected||this.partsel,this.selected=!1,this.partsel=!1;break;case!0:t=!this.selected||!this.partsel,this.selected=!0,this.partsel=!0;break;case void 0:t=this.selected||!this.partsel,this.selected=!1,this.partsel=!0;break;default:b(!1,"invalid state: "+e)}return t&&this.renderStatus(),t},fixSelection3AfterClick:function(e){var t=this.isSelected();this.visit((function(e){if(e._changeSelectStatusAttrs(t),e.radiogroup)return"skip"})),this.fixSelection3FromEndNodes(e)},fixSelection3FromEndNodes:function(e){var t=this.tree.options;b(3===t.selectMode,"expected selectMode 3"),function e(n){var r,o,s,a,l,u,d,c,h=n.children;if(h&&h.length){for(u=!0,d=!1,r=0,o=h.length;r=0},hasFocus:function(){return this.tree.hasFocus()&&this.tree.focusNode===this},info:function(e){this.tree.options.debugLevel>=3&&(Array.prototype.unshift.call(arguments,this.toString()),w("info",arguments))},isActive:function(){return this.tree.activeNode===this},isBelowOf:function(e){return this.getIndexHier(".",5)>e.getIndexHier(".",5)},isChildOf:function(e){return this.parent&&this.parent===e},isDescendantOf:function(t){if(!t||t.tree!==this.tree)return!1;for(var n=this.parent;n;){if(n===t)return!0;n===n.parent&&e.error("Recursive parent link: "+n),n=n.parent}return!1},isExpanded:function(){return!!this.expanded},isFirstSibling:function(){var e=this.parent;return!e||e.children[0]===this},isFolder:function(){return!!this.folder},isLastSibling:function(){var e=this.parent;return!e||e.children[e.children.length-1]===this},isLazy:function(){return!!this.lazy},isLoaded:function(){return!this.lazy||void 0!==this.hasChildren()},isLoading:function(){return!!this._isLoading},isRoot:function(){return this.isRootNode()},isPartsel:function(){return!this.selected&&!!this.partsel},isPartload:function(){return!!this.partload},isRootNode:function(){return this.tree.rootNode===this},isSelected:function(){return!!this.selected},isStatusNode:function(){return!!this.statusNodeType},isPagingNode:function(){return"paging"===this.statusNodeType},isTopLevel:function(){return this.tree.rootNode===this.parent},isUndefined:function(){return void 0===this.hasChildren()},isVisible:function(){var e,t,n=this.tree.enableFilter,i=this.getParentList(!1,!1);if(n&&!this.match&&!this.subMatchCount)return!1;for(e=0,t=i.length;e=0;n--)r.push(s[n].setExpanded(!0,t));return e.when.apply(e,r).done((function(){u?i.scrollIntoView(l).done((function(){o.resolve()})):o.resolve()})),o.promise()},moveTo:function(t,n,i){void 0===n||"over"===n?n="child":"firstChild"===n&&(t.children&&t.children.length?(n="before",t=t.children[0]):n="child");var r,o=this.tree,s=this.parent,a="child"===n?t:t.parent;if(this!==t){if(this.parent?a.isDescendantOf(this)&&e.error("Cannot move a node to its own descendant"):e.error("Cannot move system root"),a!==s&&s.triggerModifyChild("remove",this),1===this.parent.children.length){if(this.parent===a)return;this.parent.children=this.parent.lazy?[]:null,this.parent.expanded=!1}else b((r=e.inArray(this,this.parent.children))>=0,"invalid source parent"),this.parent.children.splice(r,1);if(this.parent=a,a.hasChildren())switch(n){case"child":a.children.push(this);break;case"before":b((r=e.inArray(t,a.children))>=0,"invalid target parent"),a.children.splice(r,0,this);break;case"after":b((r=e.inArray(t,a.children))>=0,"invalid target parent"),a.children.splice(r+1,0,this);break;default:e.error("Invalid mode "+n)}else a.children=[this];i&&t.visit(i,!0),a===s?a.triggerModifyChild("move",this):a.triggerModifyChild("add",this),o!==t.tree&&(this.warn("Cross-tree moveTo is experimental!"),this.visit((function(e){e.tree=t.tree}),!0)),o._callHook("treeStructureChanged",o,"moveTo"),s.isDescendantOf(a)||s.render(),a.isDescendantOf(s)||a===s||a.render()}},navigate:function(t,n){var i,r=e.ui.keyCode;switch(t){case"left":case r.LEFT:if(this.expanded)return this.setExpanded(!1);break;case"right":case r.RIGHT:if(!this.expanded&&(this.children||this.lazy))return this.setExpanded()}if(i=this.findRelatedNode(t)){try{i.makeVisible({scrollIntoView:!1})}catch(o){}return!1===n?(i.setFocus(),S()):i.setActive()}return this.warn("Could not find related node '"+t+"'."),S()},remove:function(){return this.parent.removeChild(this)},removeChild:function(e){return this.tree._callHook("nodeRemoveChild",this,e)},removeChildren:function(){return this.tree._callHook("nodeRemoveChildren",this)},removeClass:function(e){return this.toggleClass(e,!1)},render:function(e,t){return this.tree._callHook("nodeRender",this,e,t)},renderTitle:function(){return this.tree._callHook("nodeRenderTitle",this)},renderStatus:function(){return this.tree._callHook("nodeRenderStatus",this)},replaceWith:function(n){var i,r=this.parent,o=e.inArray(this,r.children),s=this;return b(this.isPagingNode(),"replaceWith() currently requires a paging status node"),(i=this.tree._callHook("nodeLoadChildren",this,n)).done((function(e){var n=s.children;for(t=0;ty+g-v&&(k=u+f-g+v,_&&(b(_.isRootNode()||_.isVisible(),"topNode must be visible"),li?1:-1},r.sort(e),t)for(n=0,i=r.length;n=0,n=void 0===n?!r:!!n)r||(u+=i+" ",a=!0);else for(;u.indexOf(" "+i+" ")>-1;)u=u.replace(" "+i+" "," ");return this.extraClasses=e.trim(u),a},toggleExpanded:function(){return this.tree._callHook("nodeToggleExpanded",this)},toggleSelected:function(){return this.tree._callHook("nodeToggleSelected",this)},toString:function(){return"FancytreeNode@"+this.key+"[title='"+this.title+"']"},triggerModifyChild:function(t,n,i){var r,o=this.tree.options.modifyChild;o&&(n&&n.parent!==this&&e.error("childNode "+n+" is not a child of "+this),r={node:this,tree:this.tree,operation:t,childNode:n||null},i&&e.extend(r,i),o({type:"modifyChild"},r))},triggerModify:function(e,t){this.parent.triggerModifyChild(e,this,t)},visit:function(e,t){var n,i,r=!0,o=this.children;if(!0===t&&(!1===(r=e(this))||"skip"===r))return r;if(o)for(n=0,i=o.length;n=2&&(Array.prototype.unshift.call(arguments,this.toString()),w("warn",arguments))}},P.prototype={_makeHookContext:function(t,n,i){var r,o;return void 0!==t.node?(n&&t.originalEvent!==n&&e.error("invalid args"),r=t):t.tree?r={node:t,tree:o=t.tree,widget:o.widget,options:o.widget.options,originalEvent:n,typeInfo:o.types[t.type]||{}}:t.widget?r={node:null,tree:t,widget:t.widget,options:t.widget.options,originalEvent:n}:e.error("invalid args"),i&&e.extend(r,i),r},_callHook:function(t,n,i){var r=this._makeHookContext(n),o=this[t],s=Array.prototype.slice.call(arguments,2);return e.isFunction(o)||e.error("_callHook('"+t+"') is not a function"),s.unshift(r),o.apply(this,s)},_setExpiringValue:function(e,t,n){this._tempCache[e]={value:t,expire:Date.now()+(+n||50)}},_getExpiringValue:function(e){var t=this._tempCache[e];return t&&t.expire>Date.now()?t.value:(delete this._tempCache[e],null)},_usesExtension:function(t){return e.inArray(t,this.options.extensions)>=0},_requireExtension:function(t,n,i,r){null!=i&&(i=!!i);var o=this._local.name,s=this.options.extensions,a=e.inArray(t,s)=4&&(Array.prototype.unshift.call(arguments,this.toString()),w("log",arguments))},destroy:function(){this.widget.destroy()},enable:function(e){!1===e?this.widget.disable():this.widget.enable()},enableUpdate:function(e){return e=!1!==e,!!this._enableUpdate===!!e?e:(this._enableUpdate=e,e?(this.debug("enableUpdate(true): redraw "),this._callHook("treeStructureChanged",this,"enableUpdate"),this.render()):this.debug("enableUpdate(false)..."),!e)},error:function(e){this.options.debugLevel>=1&&(Array.prototype.unshift.call(arguments,this.toString()),w("error",arguments))},expandAll:function(e,t){var n=this.enableUpdate(!1);e=!1!==e,this.visit((function(n){!1!==n.hasChildren()&&n.isExpanded()!==e&&n.setExpanded(e,t)})),this.enableUpdate(n)},findAll:function(e){return this.rootNode.findAll(e)},findFirst:function(e){return this.rootNode.findFirst(e)},findNextNode:function(e,t){var n=null,i=this.getFirstChild();function r(i){if(e(i)&&(n=i),n||i===t)return!1}return e="string"===typeof e?function(e){var t=new RegExp("^"+e,"i");return function(e){return t.test(e.title)}}(e):e,t=t||i,this.visitRows(r,{start:t,includeSelf:!1}),n||t===i||this.visitRows(r,{start:i,includeSelf:!0}),n},findRelatedNode:function(t,n,i){var r=null,o=e.ui.keyCode;switch(n){case"parent":case o.BACKSPACE:t.parent&&t.parent.parent&&(r=t.parent);break;case"first":case o.HOME:this.visit((function(e){if(e.isVisible())return r=e,!1}));break;case"last":case o.END:this.visit((function(e){e.isVisible()&&(r=e)}));break;case"left":case o.LEFT:t.expanded?t.setExpanded(!1):t.parent&&t.parent.parent&&(r=t.parent);break;case"right":case o.RIGHT:t.expanded||!t.children&&!t.lazy?t.children&&t.children.length&&(r=t.children[0]):(t.setExpanded(),r=t);break;case"up":case o.UP:this.visitRows((function(e){return r=e,!1}),{start:t,reverse:!0,includeSelf:!1});break;case"down":case o.DOWN:this.visitRows((function(e){return r=e,!1}),{start:t,includeSelf:!1});break;default:this.tree.warn("Unknown relation '"+n+"'.")}return r},generateFormElements:function(t,n,i){i=i||{};var r,o="string"===typeof t?t:"ft_"+this._id+"[]",s="string"===typeof n?n:"ft_"+this._id+"_active",a="fancytree_result_"+this._id,l=e("#"+a),u=3===this.options.selectMode&&!1!==i.stopOnParents;function d(t){l.append(e("",{type:"checkbox",name:o,value:t.key,checked:!0}))}l.length?l.empty():l=e("
",{id:a}).hide().insertAfter(this.$container),!1!==n&&this.activeNode&&l.append(e("",{type:"radio",name:s,value:this.activeNode.key,checked:!0})),i.filter?this.visit((function(e){var t=i.filter(e);if("skip"===t)return t;!1!==t&&d(e)})):!1!==t&&(r=this.getSelectedNodes(u),e.each(r,(function(e,t){d(t)})))},getActiveNode:function(){return this.activeNode},getFirstChild:function(){return this.rootNode.getFirstChild()},getFocusNode:function(){return this.focusNode},getOption:function(e){return this.widget.option(e)},getNodeByKey:function(e,t){var n,i;return!t&&(n=document.getElementById(this.options.idPrefix+e))?n.ftnode?n.ftnode:null:(t=t||this.rootNode,i=null,t.visit((function(t){if(t.key===e)return i=t,!1}),!0),i)},getRootNode:function(){return this.rootNode},getSelectedNodes:function(e){return this.rootNode.getSelectedNodes(e)},hasFocus:function(){return!!this._hasFocus},info:function(e){this.options.debugLevel>=3&&(Array.prototype.unshift.call(arguments,this.toString()),w("info",arguments))},isLoading:function(){var e=!1;return this.rootNode.visit((function(t){if(t._isLoading||t._requestId)return e=!0,!1}),!0),e},loadKeyPath:function(t,n){var i,r,o,s=this,a=new e.Deferred,l=this.getRootNode(),u=this.options.keyPathSeparator,d=[],c=e.extend({},n);for("function"===typeof n?i=n:n&&n.callback&&(i=n.callback),c.callback=function(e,t,n){i&&i.call(e,t,n),a.notifyWith(e,[{node:t,status:n}])},null==c.matchKey&&(c.matchKey=function(e,t){return e.key===t}),e.isArray(t)||(t=[t]),r=0;r=4&&window.console.time(this+" - "+e)},debugTimeEnd:function(e){this.options.debugLevel>=4&&window.console.timeEnd(this+" - "+e)},toDict:function(e,t){var n=this.rootNode.toDict(!0,t);return e?n:n.children},toString:function(){return"Fancytree@"+this._id},_triggerNodeEvent:function(e,t,n,i){var r=this._makeHookContext(t,n,i),o=this.widget._trigger(e,n,r);return!1!==o&&void 0!==r.result?r.result:o},_triggerTreeEvent:function(e,t,n){var i=this._makeHookContext(this,t,n),r=this.widget._trigger(e,t,i);return!1!==r&&void 0!==i.result?i.result:r},visit:function(e){return this.rootNode.visit(e,!1)},visitRows:function(e,t){if(!this.rootNode.hasChildren())return!1;if(t&&t.reverse)return delete t.reverse,this._visitRowsUp(e,t);var n,i,r,o=0,s=!1===(t=t||{}).includeSelf,a=!!t.includeHidden,l=!a&&this.enableFilter,u=t.start||this.rootNode.children[0];for(i=u.parent;i;){for(n=(r=i.children).indexOf(u)+o;n=2&&(Array.prototype.unshift.call(arguments,this.toString()),w("warn",arguments))}},e.extend(P.prototype,{nodeClick:function(e){var t,n,i=e.targetType,r=e.node;if("expander"===i){if(r.isLoading())return void r.debug("Got 2nd click while loading: ignored");this._callHook("nodeToggleExpanded",e)}else if("checkbox"===i)this._callHook("nodeToggleSelected",e),e.options.focusOnSelect&&this._callHook("nodeSetFocus",e,!0);else{if(n=!1,t=!0,r.folder)switch(e.options.clickFolderMode){case 2:n=!0,t=!1;break;case 3:t=!0,n=!0}t&&(this.nodeSetFocus(e),this._callHook("nodeSetActive",e,!0)),n&&this._callHook("nodeToggleExpanded",e)}},nodeCollapseSiblings:function(e,t){var n,i,r,o=e.node;if(o.parent)for(i=0,r=(n=o.parent.children).length;i500&&(l.lastQuicksearchTerm=""),l.lastQuicksearchTime=r,l.lastQuicksearchTerm+=f,(n=l.findNextNode(l.lastQuicksearchTerm,l.getActiveNode()))&&n.setActive(),void s.preventDefault();switch(i.eventToString(s)){case"+":case"=":l.nodeSetExpanded(t,!0);break;case"-":l.nodeSetExpanded(t,!1);break;case"space":a.isPagingNode()?l._triggerNodeEvent("clickPaging",t,s):i.evalOption("checkbox",a,a,c,!1)?l.nodeToggleSelected(t):l.nodeSetActive(t,!0);break;case"return":l.nodeSetActive(t,!0);break;case"home":case"end":case"backspace":case"left":case"right":case"up":case"down":a.navigate(s.which,m);break;default:y=!1}y&&s.preventDefault()},nodeLoadChildren:function(t,n){var i,r,o,s=null,a=!0,l=t.tree,u=t.node,d=u.parent,c="nodeLoadChildren",h=Date.now();return e.isFunction(n)&&(n=n.call(l,{type:"source"},t),b(!e.isFunction(n),"source callback must not return another function")),e.isFunction(n.then)?s=n:n.url?(i=e.extend({},t.options.ajax,n)).debugDelay?(r=i.debugDelay,delete i.debugDelay,e.isArray(r)&&(r=r[0]+Math.random()*(r[1]-r[0])),u.warn("nodeLoadChildren waiting debugDelay "+Math.round(r)+" ms ..."),s=e.Deferred((function(t){setTimeout((function(){e.ajax(i).done((function(){t.resolveWith(this,arguments)})).fail((function(){t.rejectWith(this,arguments)}))}),r)}))):s=e.ajax(i):e.isPlainObject(n)||e.isArray(n)?(s={then:function(e,t){e(n,null,null)}},a=!1):e.error("Invalid source type: "+n),u._requestId&&(u.warn("Recursive load request #"+h+" while #"+u._requestId+" is pending."),u._requestId=h),a&&(l.debugTime(c),l.nodeSetStatus(t,"loading")),o=new e.Deferred,s.then((function(i,r,s){var a,c;if("json"!==n.dataType&&"jsonp"!==n.dataType||"string"!==typeof i||e.error("Ajax request returned a string (did you get the JSON dataType wrong?)."),u._requestId&&u._requestId>h)o.rejectWith(this,["$recursive_request"]);else if(null!==u.parent||null===d){if(t.options.postProcess){try{c=l._triggerNodeEvent("postProcess",t,t.originalEvent,{response:i,error:null,dataType:n.dataType})}catch(f){c={error:f,message:""+f,details:"postProcess failed"}}if(c.error)return a=e.isPlainObject(c.error)?c.error:{message:c.error},a=l._makeHookContext(u,null,a),void o.rejectWith(this,[a]);(e.isArray(c)||e.isPlainObject(c)&&e.isArray(c.children))&&(i=c)}else i&&i.hasOwnProperty("d")&&t.options.enableAspx&&(42===t.options.enableAspx&&l.warn("The default for enableAspx will change to `false` in the fututure. Pass `enableAspx: true` or implement postProcess to silence this warning."),i="string"===typeof i.d?e.parseJSON(i.d):i.d);o.resolveWith(this,[i])}else o.rejectWith(this,["$request_target_invalid"])}),(function(e,t,n){var i=l._makeHookContext(u,null,{error:e,args:Array.prototype.slice.call(arguments),message:n,details:e.status+": "+n});o.rejectWith(this,[i])})),o.done((function(n){var i,r,o;l.nodeSetStatus(t,"ok"),e.isPlainObject(n)?(b(u.isRootNode(),"source may only be an object for root nodes (expecting an array of child objects otherwise)"),b(e.isArray(n.children),"if an object is passed as source, it must contain a 'children' array (all other properties are added to 'tree.data')"),r=n,i=n.children,delete r.children,e.each(p,(function(e,t){void 0!==r[t]&&(l[t]=r[t],delete r[t])})),e.extend(l.data,r)):i=n,b(e.isArray(i),"expected array of children"),u._setChildren(i),l.options.nodata&&0===i.length&&(e.isFunction(l.options.nodata)?o=l.options.nodata.call(l,{type:"nodata"},t):!0===l.options.nodata&&u.isRootNode()?o=l.options.strings.noData:"string"===typeof l.options.nodata&&u.isRootNode()&&(o=l.options.nodata),o&&u.setStatus("nodata",o)),l._triggerNodeEvent("loadChildren",u)})).fail((function(e){var n;"$recursive_request"!==e?"$request_target_invalid"!==e?(e.node&&e.error&&e.message?n=e:"[object Object]"===(n=l._makeHookContext(u,null,{error:e,args:Array.prototype.slice.call(arguments),message:e?e.message||e.toString():""})).message&&(n.message=""),u.warn("Load children failed ("+n.message+")",n),!1!==l._triggerNodeEvent("loadError",n,null)&&l.nodeSetStatus(t,"error",n.message,n.details)):u.warn("Lazy parent node was removed while loading: discarding response."):u.warn("Ignored response for obsolete load request #"+h+" (expected #"+u._requestId+")")})).always((function(){u._requestId=null,a&&l.debugTimeEnd(c)})),o.promise()},nodeLoadKeyPath:function(e,t){},nodeRemoveChild:function(t,n){var i,r=t.node,o=e.extend({},t,{node:n}),s=r.children;if(1===s.length)return b(n===s[0],"invalid single child"),this.nodeRemoveChildren(t);this.activeNode&&(n===this.activeNode||this.activeNode.isDescendantOf(n))&&this.activeNode.setActive(!1),this.focusNode&&(n===this.focusNode||this.focusNode.isDescendantOf(n))&&(this.focusNode=null),this.nodeRemoveMarkup(o),this.nodeRemoveChildren(o),b((i=e.inArray(n,s))>=0,"invalid child"),r.triggerModifyChild("remove",n),n.visit((function(e){e.parent=null}),!0),this._callHook("treeRegisterNode",this,!1,n),s.splice(i,1)},nodeRemoveChildMarkup:function(t){var n=t.node;n.ul&&(n.isRootNode()?e(n.ul).empty():(e(n.ul).remove(),n.ul=null),n.visit((function(e){e.li=e.ul=null})))},nodeRemoveChildren:function(e){var t=e.tree,n=e.node;n.children&&(this.activeNode&&this.activeNode.isDescendantOf(n)&&this.activeNode.setActive(!1),this.focusNode&&this.focusNode.isDescendantOf(n)&&(this.focusNode=null),this.nodeRemoveChildMarkup(e),n.triggerModifyChild("remove",null),n.visit((function(e){e.parent=null,t._callHook("treeRegisterNode",t,!1,e)})),n.lazy?n.children=[]:n.children=null,n.isRootNode()||(n.expanded=!1),this.nodeRenderStatus(e))},nodeRemoveMarkup:function(t){var n=t.node;n.li&&(e(n.li).remove(),n.li=null),this.nodeRemoveChildMarkup(t)},nodeRender:function(t,n,i,r,o){var s,a,l,u,d,c,h,f=t.node,p=t.tree,v=t.options,g=v.aria,y=!1,m=f.parent,w=!m,_=f.children,k=null;if(!1!==p._enableUpdate&&(w||m.ul)){if(b(w||m.ul,"parent UL must exist"),w||(f.li&&(n||f.li.parentNode!==f.parent.ul)&&(f.li.parentNode===f.parent.ul?k=f.li.nextSibling:this.debug("Unlinking "+f+" (must be child of "+f.parent+")"),this.nodeRemoveMarkup(t)),f.li?this.nodeRenderStatus(t):(y=!0,f.li=document.createElement("li"),f.li.ftnode=f,f.key&&v.generateIds&&(f.li.id=v.idPrefix+f.key),f.span=document.createElement("span"),f.span.className="fancytree-node",g&&!f.tr&&e(f.li).attr("role","treeitem"),f.li.appendChild(f.span),this.nodeRenderTitle(t),v.createNode&&v.createNode.call(p,{type:"createNode"},t)),v.renderNode&&v.renderNode.call(p,{type:"renderNode"},t)),_){if(w||f.expanded||!0===i){for(f.ul||(f.ul=document.createElement("ul"),(!0!==r||o)&&f.expanded||(f.ul.style.display="none"),g&&e(f.ul).attr("role","group"),f.li?f.li.appendChild(f.ul):f.tree.$div.append(f.ul)),u=0,d=_.length;u1&&y.push("")):y.push(""),(o=i.evalOption("checkbox",h,h,p,!1))&&!h.isStatusNode()&&(u=v?" role='checkbox'":"",s="fancytree-checkbox",("radio"===o||h.parent&&h.parent.radiogroup)&&(s+=" fancytree-radio"),y.push("")),void 0!==h.data.iconClass&&(h.icon?e.error("'iconClass' node option is deprecated since v2.14.0: use 'icon' only instead"):(h.warn("'iconClass' node option is deprecated since v2.14.0: use 'icon' instead"),h.icon=h.data.iconClass)),!1!==(a=i.evalOption("icon",h,h,p,!0))&&(u=v?" role='presentation'":"",c=(c=i.evalOption("iconTooltip",h,h,p,null))?" title='"+O(c)+"'":"","string"===typeof a?r.test(a)?(a="/"===a.charAt(0)?a:(p.imagePath||"")+a,y.push("")):y.push(""):a.text?y.push(""+i.escapeHtml(a.text)+""):a.html?y.push(""+a.html+""):y.push("")),l="",p.renderTitle&&(l=p.renderTitle.call(f,{type:"renderTitle"},t)||""),l||(!0===(d=i.evalOption("tooltip",h,h,p,null))&&(d=h.title),l=""+(p.escapeTitles?i.escapeHtml(h.title):h.title)+""),y.push(l),h.span.innerHTML=y.join(""),this.nodeRenderStatus(t),p.enhanceTitle&&(t.$title=e(">span.fancytree-title",h.span),l=p.enhanceTitle.call(f,{type:"enhanceTitle"},t)||""))},nodeRenderStatus:function(t){var n,r=t.node,o=t.tree,s=t.options,a=r.hasChildren(),l=r.isLastSibling(),u=s.aria,d=s._classNames,c=[],h=r[o.statusClassPropName];h&&!1!==o._enableUpdate&&(u&&(n=e(r.tr||r.li)),c.push(d.node),o.activeNode===r&&c.push(d.active),o.focusNode===r&&c.push(d.focused),r.expanded&&c.push(d.expanded),u&&(!1===a?n.removeAttr("aria-expanded"):n.attr("aria-expanded",Boolean(r.expanded))),r.folder&&c.push(d.folder),!1!==a&&c.push(d.hasChildren),l&&c.push(d.lastsib),r.lazy&&null==r.children&&c.push(d.lazy),r.partload&&c.push(d.partload),r.partsel&&c.push(d.partsel),i.evalOption("unselectable",r,r,s,!1)&&c.push(d.unselectable),r._isLoading&&c.push(d.loading),r._error&&c.push(d.error),r.statusNodeType&&c.push(d.statusNodePrefix+r.statusNodeType),r.selected?(c.push(d.selected),u&&n.attr("aria-selected",!0)):u&&n.attr("aria-selected",!1),r.extraClasses&&c.push(r.extraClasses),!1===a?c.push(d.combinedExpanderPrefix+"n"+(l?"l":"")):c.push(d.combinedExpanderPrefix+(r.expanded?"e":"c")+(r.lazy&&null==r.children?"d":"")+(l?"l":"")),c.push(d.combinedIconPrefix+(r.expanded?"e":"c")+(r.folder?"f":"")),h.className=c.join(" "),r.li&&e(r.li).toggleClass(d.lastsib,l))},nodeSetActive:function(t,n,i){i=i||{};var r,o=t.node,s=t.tree,a=t.options,l=!0===i.noEvents,u=!0===i.noFocus,d=!1!==i.scrollIntoView;return o===s.activeNode===(n=!1!==n)?S(o):n&&!l&&!1===this._triggerNodeEvent("beforeActivate",o,t.originalEvent)?E(o,["rejected"]):(n?(s.activeNode&&(b(s.activeNode!==o,"node was active (inconsistency)"),r=e.extend({},t,{node:s.activeNode}),s.nodeSetActive(r,!1),b(null===s.activeNode,"deactivate was out of sync?")),a.activeVisible&&o.makeVisible({scrollIntoView:d}),s.activeNode=o,s.nodeRenderStatus(t),u||s.nodeSetFocus(t),l||s._triggerNodeEvent("activate",o,t.originalEvent)):(b(s.activeNode===o,"node was not active (inconsistency)"),s.activeNode=null,this.nodeRenderStatus(t),l||t.tree._triggerNodeEvent("deactivate",o,t.originalEvent)),S(o))},nodeSetExpanded:function(t,n,i){i=i||{};var r,o,s,a,l,u,d=t.node,c=t.tree,h=t.options,f=!0===i.noAnimation,p=!0===i.noEvents;if(n=!1!==n,d.expanded&&n||!d.expanded&&!n)return S(d);if(n&&!d.lazy&&!d.hasChildren())return S(d);if(!n&&d.getLevel()=1||e(r.$container).focus(),s.autoScroll&&o.scrollIntoView(),this._callHook("nodeRenderStatus",t))},nodeSetSelected:function(e,t,n){n=n||{};var r=e.node,o=e.tree,s=e.options,a=!0===n.noEvents,l=r.parent;if(t=!1!==t,!i.evalOption("unselectable",r,r,s,!1)){if(r._lastSelectIntent=t,!!r.selected===t&&(3!==s.selectMode||!r.partsel||t))return t;if(!a&&!1===this._triggerNodeEvent("beforeSelect",r,e.originalEvent))return!!r.selected;t&&1===s.selectMode?(o.lastSelectedNode&&o.lastSelectedNode.setSelected(!1),r.selected=t):3!==s.selectMode||!l||l.radiogroup||r.radiogroup?l&&l.radiogroup?r.visitSiblings((function(e){e._changeSelectStatusAttrs(t&&e===r)}),!0):r.selected=t:(r.selected=t,r.fixSelection3AfterClick(n)),this.nodeRenderStatus(e),o.lastSelectedNode=t?r:null,a||o._triggerNodeEvent("select",e)}},nodeSetStatus:function(t,n,i,r){var o=t.node,s=t.tree;function a(n,i){var r=o.children?o.children[0]:null;return r&&r.isStatusNode()?(e.extend(r,n),r.statusNodeType=i,s._callHook("nodeRenderTitle",r)):(o._setChildren([n]),s._callHook("treeStructureChanged",t,"setStatusNode"),o.children[0].statusNodeType=i,s.render()),o.children[0]}switch(n){case"ok":!function(){var e=o.children?o.children[0]:null;if(e&&e.isStatusNode()){try{o.ul&&(o.ul.removeChild(e.li),e.li=null)}catch(n){}1===o.children.length?o.children=[]:o.children.shift(),s._callHook("treeStructureChanged",t,"clearStatusNode")}}(),o._isLoading=!1,o._error=null,o.renderStatus();break;case"loading":o.parent||a({title:s.options.strings.loading+(i?" ("+i+")":""),checkbox:!1,tooltip:r},n),o._isLoading=!0,o._error=null,o.renderStatus();break;case"error":a({title:s.options.strings.loadError+(i?" ("+i+")":""),checkbox:!1,tooltip:r},n),o._isLoading=!1,o._error={message:i,details:r},o.renderStatus();break;case"nodata":a({title:i||s.options.strings.noData,checkbox:!1,tooltip:r},n),o._isLoading=!1,o._error=null,o.renderStatus();break;default:e.error("invalid node status "+n)}},nodeToggleExpanded:function(e){return this.nodeSetExpanded(e,!e.node.expanded)},nodeToggleSelected:function(e){var t=e.node,n=!t.selected;return t.partsel&&!t.selected&&!0===t._lastSelectIntent&&(n=!1,t.selected=!0),t._lastSelectIntent=n,this.nodeSetSelected(e,n)},treeClear:function(e){var t=e.tree;t.activeNode=null,t.focusNode=null,t.$div.find(">ul.fancytree-container").empty(),t.rootNode.children=null,t._callHook("treeStructureChanged",e,"clear")},treeCreate:function(e){},treeDestroy:function(e){this.$div.find(">ul.fancytree-container").remove(),this.$source&&this.$source.removeClass("fancytree-helper-hidden")},treeInit:function(t){var n=t.tree,i=n.options;n.$container.attr("tabindex",i.tabindex),e.each(p,(function(e,t){void 0!==i[t]&&(n.info("Move option "+t+" to tree"),n[t]=i[t],delete i[t])})),i.checkboxAutoHide&&n.$container.addClass("fancytree-checkbox-auto-hide"),i.rtl?n.$container.attr("DIR","RTL").addClass("fancytree-rtl"):n.$container.removeAttr("DIR").removeClass("fancytree-rtl"),i.aria&&(n.$container.attr("role","tree"),1!==i.selectMode&&n.$container.attr("aria-multiselectable",!0)),this.treeLoad(t)},treeLoad:function(t,n){var r,o,s,a=t.tree,l=t.widget.element,u=e.extend({},t,{node:this.rootNode});if(a.rootNode.children&&this.treeClear(t),n=n||this.options.source)"string"===typeof n&&e.error("Not implemented");else switch(o=l.data("type")||"html"){case"html":(s=l.find(">ul").not(".fancytree-container").first()).length?(s.addClass("ui-fancytree-source fancytree-helper-hidden"),n=e.ui.fancytree.parseHtml(s),this.data=e.extend(this.data,T(s))):(i.warn("No `source` option was passed and container does not contain `
\n \n );\n};\n\nexport default CommandModal;\n","import React, { useContext, Fragment } from \"react\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport CommandModal from \"./CommandModal\";\n\nconst JobSelection = ({ source, target }) => {\n //const util = require(\"util\");\n const experimentContext = useContext(ExperimentContext);\n const { currentSelected, removeSelectedJob, canSelect } = experimentContext;\n\n // const onSelectionMode = (e) => {\n // e.preventDefault();\n // activateSelectionMode();\n // //console.log(\"Sending \" + boolValue);\n // };\n\n // const offSelectionMode = (e) => {\n // e.preventDefault();\n // deactivateSelectionMode();\n // //console.log(\"Sending \" + boolValue);\n // };\n\n const removeSelected = (name) => (e) => {\n e.preventDefault();\n //console.log(\"Sending \" + inputname);\n removeSelectedJob(name);\n };\n\n if (canSelect === true) {\n return (\n \n
\n
\n \n Generate Command\n \n
\n
\n {currentSelected &&\n currentSelected\n .sort((a, b) => (a.name > b.name ? -1 : 1))\n .map((job) => (\n \n {job.name}\n \n ))}\n
\n
\n \n
\n );\n }\n return
;\n};\n\nexport default JobSelection;\n","import React, { Component } from \"react\";\nimport Spinner from \"../layout/Spinner\";\nimport \"jquery.fancytree/dist/modules/jquery.fancytree.clones\";\nimport \"jquery.fancytree/dist/modules/jquery.fancytree.filter\";\nimport \"jquery.fancytree/dist/modules/jquery.fancytree.childcounter\";\nimport \"jquery.fancytree/dist/modules/jquery.fancytree.edit\";\nimport \"jquery.fancytree/dist/modules/jquery.fancytree.multi\";\n// import 'jquery.fancytree/dist/skin-lion/ui.fancytree.less'; // CSS or LESS\nimport { createTree } from \"jquery.fancytree\";\nimport { DEBUG } from \"../context/vars\";\n\n// import 'jquery.fancytree/dist/modules/jquery.fancytree.edit';\n// import 'jquery.fancytree/dist/modules/jquery.fancytree.filter';\n\nexport class TreeNativeRep extends Component {\n shouldComponentUpdate(nextProps, nextState) {\n // if (this.props.shouldUpdateGraph === true){\n // return true\n // }else\n if (nextProps.treedata !== this.props.treedata) {\n DEBUG && console.log(\"Rerendering Tree\");\n return true;\n } else if (nextProps.loadingTree !== this.props.loadingTree) {\n return true;\n } else {\n return false;\n }\n }\n\n componentWillUnmount() {\n DEBUG && console.log(\"Unmounting Tree Rep\");\n this.props.cleanTreeData();\n // this.props.clearStats();\n }\n\n componenteDidMount() {\n DEBUG && console.log(\"In after mount\");\n createTree(\"#tree\", {\n extensions: [\"edit\", \"filter\"],\n source: this.props.treedata,\n });\n }\n\n render() {\n //console.log(this.props.treedata)\n if (this.props.loadingTree) return ;\n if (!this.props.treedata) {\n return (\n
\n

\n Press Show Tree View to\n see the tree view representation of the experiment.\n

\n

\n Repeating subtrees in the tree view are only shown once, use the\n searcher to focus only on those items.\n

\n
\n );\n }\n\n if (this.props.treedata.error === true) {\n return (\n
\n

Something has gone very wrong.

\n

\n {this.props.treedata.error_message}\n

\n
\n );\n }\n\n // if (!this.props.treedata){\n // return (\n //
\n //

Press Show Tree to see the tree representation of the experiment.

\n //

If the experiment is RUNNING and the Tree has been rendered, press Start Job Monitor to start a live tracker of the changes on the experiment's jobs.\n // This process will automatically update the tree's nodes colors and show a log of the detected changes.\n //

\n //
\n // );\n // }\n\n class FancyTree extends Component {\n // shouldComponentUpdate(nextProps, nextState){\n // if (this.props.shouldUpdateGraph === true){\n // return true;\n // } else {\n // return false;\n // }\n // }\n\n componentDidMount() {\n let tree = new createTree(\"#tree\", {\n activate: (event, data) => {\n //console.log(event)\n //console.log(data)\n //console.log(tree)\n //console.log(data);\n if (data) {\n // var thenode = tree.getNodesByRef(\"a2a7_20170427_1\")\n // console.log(thenode)\n // if (thenode){\n // for (var i = 0; i < thenode.length;i++){\n // thenode[i].setTitle(\"a2a7_20170417_1 Honked \")\n // }\n\n // }\n // console.log(tree.activeNode.getParent())\n // console.log(tree.activeNode)\n //data.node.title = \"Honk\";\n //console.log(data);\n //console.log(this);\n this.props.updateSelectionTree(data);\n //console.log(this.props.canSelect);\n //if (this.props.canSelect === true) {\n if (data && data.node && data.node.folder === undefined) {\n this.props.updateCurrentSelected(\n data.node.refKey,\n this.props.originaldata\n );\n }\n\n //}\n\n //this.updateSelection(data);\n }\n },\n // extensions: ['edit', 'filter'],\n // extensions: [\"clones\",\"filter\", \"childcounter\"],\n extensions: [\"filter\", \"childcounter\", \"clones\"],\n filter: {\n autoApply: true, // Re-apply last filter if lazy data is loaded\n autoExpand: true, // Expand all branches that contain matches while filtered\n counter: true, // Show a badge with number of matching child nodes near parent icons\n fuzzy: false, // Match single characters in order, e.g. 'fb' will match 'FooBar'\n hideExpandedCounter: true, // Hide counter badge if parent is expanded\n hideExpanders: false, // Hide expanders if all child nodes are hidden by filter\n highlight: false, // Highlight matches by wrapping inside tags\n leavesOnly: true, // Match end nodes only\n nodata: true, // Display a 'no data' status node if result is empty\n mode: \"hide\", // Grayout unmatched nodes (pass \"hide\" to remove unmatched node instead)\n },\n // clones: {\n // highlightClones: true,\n // highlightActiveClones: true,\n // },\n source: this.props.treedata,\n });\n\n //console.log(tree.activeNode);\n\n DEBUG && console.log(tree);\n this.props.setFancyTree(tree);\n }\n\n componentWillUnmount() {\n DEBUG && console.log(\"Unmounting Tree\");\n //this.props.cleanNavData();\n }\n\n render() {\n return (\n
\n
\n
\n );\n }\n }\n\n return (\n \n );\n\n // if(this.props.treedata){\n // return (\n //
\n //
\n //
\n // );\n // }\n }\n}\n\n// const experimentStyle = {\n// maxHeight: 600,\n// height: 600\n// };\n\nconst experimentStyle = {\n height: 750,\n};\n\nexport default TreeNativeRep;\n","import { createContext } from 'react';\n\nconst statsContext = createContext();\n\nexport default statsContext;","import { createContext } from \"react\";\n\nconst treeContext = createContext();\n\nexport default treeContext;\n","import React, { useContext, Fragment } from \"react\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport GraphContext from \"../context/graph/graphContext\";\nimport { secondsToDelta } from \"../context/utils\";\nimport { DEBUG } from \"../context/vars\";\n\nconst Selection = () => {\n const experimentContext = useContext(ExperimentContext);\n const graphContext = useContext(GraphContext);\n const { experiment } = experimentContext;\n const { data, selection } = graphContext;\n // const { model, branch, hpc } = experiment;\n //var currentSelection = \"Node: \"\n\n // const navigateTo = e => {\n // e.preventDefault();\n // navToLatestCompleted();\n // };\n\n let currentNode = \"\";\n let selectedNode = null;\n\n const copyContent = (inputname) => (e) => {\n e.preventDefault();\n DEBUG && console.log(\"Sending \" + inputname);\n window.copyToClip(inputname);\n };\n\n if (selection) {\n //console.log(\"Current selection \" + selection);\n selection.map((node) => (currentNode = node));\n\n selectedNode = data.nodes.find((node) => node.id === currentNode);\n // If selection mode is activated\n //console.log(\"Selected node\")\n //console.log(\"Data: \" + selectedNode.id + \" \" + selectedNode.platform_name)\n }\n return (\n \n {selectedNode && (\n \n
\n
\n
\n
\n
\n \n {selectedNode.id}\n \n
\n
\n
\n
\n
\n \n Start: {selectedNode.date}\n \n
\n
\n \n End: {selectedNode.date_plus}\n \n
\n
\n
\n
\n
\n \n Section: {selectedNode.section}\n \n
\n
\n
\n
\n
\n
\n \n Member: {selectedNode.member}\n \n
\n
\n \n Chunk: {selectedNode.chunk}\n \n
\n
\n
\n
\n
\n
\n \n Platform:{\" \"}\n {selectedNode.platform_name &&\n selectedNode.platform_name}{\" \"}\n {!selectedNode.platform_name && experiment.hpc}\n \n
\n {/*
\n Chunk: {selectedNode.chunk}\n
*/}\n
\n
\n {/*
\n Priority: {selectedNode.priority}\n
*/}\n
\n
\n
\n \n Processors: {selectedNode.processors}\n \n
\n
\n \n Wallclock: {selectedNode.wallclock}\n \n
\n
\n
\n
\n
\n {\" \"}\n {selectedNode.minutes_queue >= 0 && (\n \n \n {selectedNode.status === \"SUBMITTED\"\n ? \"Submit\"\n : \"Queue\"}\n :\n {\" \"}\n {secondsToDelta(selectedNode.minutes_queue)}\n {/* min. */}\n \n )}\n
\n
\n {selectedNode.minutes >= 0 &&\n [\"RUNNING\", \"COMPLETED\", \"FAILED\"].includes(\n selectedNode.status\n ) && (\n \n Run:{\" \"}\n {secondsToDelta(selectedNode.minutes)}{\" \"}\n {/* min. */}\n \n )}\n
\n
\n\n
\n
\n \n Status:\n {selectedNode.status}\n \n
\n
\n {selectedNode.children_list &&\n selectedNode.children_list.length > 0 && (\n \n \n Out: {selectedNode.children}\n \n \n )}\n {selectedNode.children_list &&\n selectedNode.children_list.length === 0 && (\n \n Out: {selectedNode.children}\n \n )}\n
\n
\n {selectedNode.parent_list &&\n selectedNode.parent_list.length > 0 && (\n \n \n In: {selectedNode.parents}\n \n \n )}\n {selectedNode.parent_list &&\n selectedNode.parent_list.length === 0 && (\n \n In: {selectedNode.parents}\n \n )}\n
\n
\n
\n {selectedNode.out && (\n
\n
\n \n
\n \n
\n \n
\n
\n \n
\n
\n )}\n\n {selectedNode.err && (\n
\n
\n \n
\n \n
\n \n
\n
\n \n
\n
\n )}\n
\n
\n
\n \n \n {selectedNode.submit !== null && (\n \n \n \n \n )}\n {selectedNode.start !== null && (\n \n \n \n \n )}\n {selectedNode.finish !== null && (\n \n \n \n \n )}\n \n
\n Submit:\n \n \n {selectedNode.submit}\n \n
\n Start:\n \n \n {selectedNode.start}\n \n
\n Finish:\n \n \n {selectedNode.finish}\n \n
\n
\n
\n
\n
\n
\n
\n
\n )}\n {!selectedNode && data && (\n
\n
\n
\n
\n Here goes the Job Id\n
\n
\n
\n Select a Node to see more information.\n
\n
\n
\n
\n
\n )}\n {selectedNode &&\n selectedNode.children_list &&\n selectedNode.children_list.length > 0 && (\n
\n );\n};\n\nconst experimentStyle = {\n height: 360,\n};\n\nconst headerCard = {\n height: 30,\n};\n\nexport default Selection;\n","import React, { useContext, Fragment } from \"react\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport TreeContext from \"../context/tree/treeContext\";\nimport { secondsToDelta } from \"../context/utils\";\nimport { DEBUG } from \"../context/vars\";\n\nconst SelectionTreeNode = () => {\n const experimentContext = useContext(ExperimentContext);\n const treeContext = useContext(TreeContext);\n const { experiment } = experimentContext;\n const { selectedTreeNode, treedata } = treeContext;\n\n let selectedNode = null;\n //var currentNode = \"\";\n if (\n selectedTreeNode &&\n selectedTreeNode.node &&\n selectedTreeNode.node.refKey\n ) {\n const currentNode = selectedTreeNode.node.refKey;\n if (treedata && treedata.jobs) {\n selectedNode = treedata.jobs.find((job) => job.id === currentNode);\n //console.log(selectedNode);\n } else {\n selectedNode = null;\n }\n } else {\n selectedNode = null;\n }\n\n const copyContent = (inputname) => (e) => {\n e.preventDefault();\n DEBUG && console.log(\"Sending \" + inputname);\n window.copyToClip(inputname);\n };\n\n //console.log(selectedNode);\n return (\n \n {selectedNode && (\n \n {/*
*/}\n
\n
\n
\n
\n \n {selectedNode.id}\n \n
\n
\n
\n
\n
\n \n Start: {selectedNode.date}\n \n
\n
\n \n End: {selectedNode.date_plus}\n \n
\n
\n
\n
\n
\n \n Section: {selectedNode.section}\n \n
\n
\n
\n
\n
\n
\n \n Member: {selectedNode.member}\n \n
\n
\n \n Chunk: {selectedNode.chunk}\n \n
\n
\n
\n
\n
\n
\n \n Platform:{\" \"}\n {selectedNode.platform_name &&\n selectedNode.platform_name}{\" \"}\n {!selectedNode.platform_name && experiment.hpc}\n \n
\n
\n
\n
\n
\n
\n \n Processors: {selectedNode.processors}\n \n
\n
\n \n Wallclock: {selectedNode.wallclock}\n \n
\n
\n
\n
\n
\n {\" \"}\n {selectedNode.minutes_queue >= 0 && (\n \n \n {selectedNode.status === \"SUBMITTED\"\n ? \"Submit\"\n : \"Queue\"}\n :\n {\" \"}\n {secondsToDelta(selectedNode.minutes_queue)}\n {/* min. */}\n \n )}\n
\n
\n {selectedNode.minutes >= 0 &&\n [\"RUNNING\", \"COMPLETED\", \"FAILED\"].includes(\n selectedNode.status\n ) && (\n \n Run:{\" \"}\n {secondsToDelta(selectedNode.minutes)}{\" \"}\n {/* min. */}\n \n )}\n
\n
\n\n
\n
\n \n Status:\n {selectedNode.status}\n \n
\n
\n {selectedNode.children_list &&\n selectedNode.children_list.length > 0 && (\n \n \n Out: {selectedNode.children}\n \n \n )}\n {selectedNode.children_list &&\n selectedNode.children_list.length === 0 && (\n \n Out: {selectedNode.children}\n \n )}\n
\n
\n {selectedNode.parent_list !== null &&\n selectedNode.parents > 0 && (\n \n \n In: {selectedNode.parents}\n \n \n )}\n {selectedNode.parent_list !== null &&\n selectedNode.parents === 0 && (\n \n In: {selectedNode.parents}\n \n )}\n
\n
\n
\n {selectedNode.out && (\n
\n
\n \n
\n \n
\n \n
\n
\n \n
\n
\n )}\n {selectedNode.err && (\n
\n
\n \n
\n \n
\n \n
\n
\n \n
\n
\n )}\n
\n
\n
\n \n \n {selectedNode.submit !== null && (\n \n \n \n \n )}\n {selectedNode.start !== null && (\n \n \n \n \n )}\n {selectedNode.finish !== null && (\n \n \n \n \n )}\n \n
\n Submit:\n \n \n {selectedNode.submit}\n \n
\n Start:\n \n \n {selectedNode.start}\n \n
\n Finish:\n \n \n {selectedNode.finish}\n \n
\n
\n
\n {selectedNode.wrapper !== null &&\n selectedNode.wrapper.length > 0 && (\n
\n
\n
\n \n Wrapper:\n \n
\n
\n
\n
\n {selectedNode.wrapper}\n
\n
\n
\n )}\n {selectedNode.wrapper_code !== null &&\n selectedNode.wrapper_code.length > 0 && (\n
\n
\n
\n \n Code:\n \n
\n
\n {selectedNode.wrapper_code}\n
\n
\n
\n )}\n
\n
\n
\n \n )}\n {!selectedNode && treedata && treedata.jobs && (\n
\n
\n
\n Here goes the Job Id\n
\n
\n
\n Select a Node to see more information.\n
\n
\n
\n
\n )}\n {selectedNode &&\n selectedNode.children_list &&\n selectedNode.children_list.length > 0 && (\n
\n )}\n {selectedNode &&\n selectedNode.parent_list &&\n selectedNode.parent_list.length > 0 && (\n
\n );\n};\n\nconst experimentStyle = {\n height: 430,\n};\n\nconst headerCard = {\n height: 30,\n};\n\nexport default SelectionTreeNode;\n","import React, { Component, Fragment } from \"react\";\n\nclass Running extends Component {\n constructor(props) {\n super(props);\n this.rundata = null;\n //this.messagesEnd = null;\n //this.messagesEndRef = React.createRef()\n }\n\n componentDidMount() {\n //console.log(this.props.experimentRunning)\n this.props.getExperimentRun(this.props.experiment.expid);\n if (this.props.experimentRunning) {\n this.interval = setInterval(\n () => this.props.getExperimentRun(this.props.experiment.expid),\n this.props.experiment.updateTime * 1000\n );\n }\n //console.log(this.messagesEndRef);\n //this.scrollTo();\n }\n\n componentWillUnmount() {\n //console.log(this.props.experimentRunning)\n this.props.cleanRunData();\n if (this.props.experimentRunning) {\n clearInterval(this.interval);\n }\n }\n\n componentDidUpdate() {\n window.scrollToBottom();\n }\n\n render() {\n if (this.props.rundata === null) {\n return (\n \n
Loading...
\n
\n );\n }\n\n const {\n logcontent,\n error,\n error_message,\n found,\n logfile,\n lastModified,\n timeStamp,\n } = this.props.rundata;\n\n const logitems = logcontent.map((item) => (\n
  • \n {item.content}\n
  • \n ));\n\n if (error) {\n return (\n \n
    {error_message}
    \n

    \n
    \n
    \n );\n }\n if (!found) {\n return (\n \n
    \n Running log not found. This experiment might not be currently\n running on Autosubmit.\n
    \n

    \n
    \n
    \n );\n }\n\n return (\n
    \n
    \n
    \n
    \n Logfile: {logfile}{\" \"}\n ({timeStamp})\n
    \n
    \n Last Modified: {lastModified}\n
    \n
    \n\n {/*

    Showing last 50 lines of the log file:

    */}\n
    \n            
      \n {logitems}\n
    \n {/*
    \n
    */}\n
    \n\n
    \n Showing last 150 lines.\n
    \n
    \n
    \n );\n }\n}\n\nconst pStyle = {\n listStyleType: \"none\",\n};\n\n// const experimentBuffer = {\n// height: 100,\n// };\n\nexport default Running;\n","import React, { Component } from \"react\";\n\nclass JobMonitor extends Component {\n // const experimentContext = useContext(ExperimentContext);\n // const { pkldata, loadingPkl } = experimentContext;\n componentDidMount() {\n if (this.props.experiment) {\n this.props.getExperimentPkl(\n this.props.experiment.expid,\n this.props.experiment.pkl_timestamp\n );\n if (this.props.experimentRunning) {\n this.interval = setInterval(\n () =>\n this.props.getExperimentPkl(\n this.props.experiment.expid,\n this.props.experiment.pkl_timestamp\n ),\n this.props.experiment.updateTime * 2000\n );\n }\n }\n }\n\n componentWillUnmount() {\n this.props.cleanPklData();\n if (this.props.experimentRunning) {\n clearInterval(this.interval);\n }\n }\n\n showNotification() {\n console.log(\"Showing Notification.\");\n new Notification(\"Hey\");\n }\n\n render() {\n const { loadingPkl, pklchanges } = this.props;\n // if (loadingPkl) return
    Loading...
    \n // const currentDate = new Date();\n // const datetime = currentDate.getHours() + \":\"\n // + currentDate.getMinutes() + \":\"\n // + currentDate.getSeconds();\n\n // if (pklchanges) {\n // return
    {pklchanges}
    \n // }\n return (\n
    \n
    \n
    \n
    \n Monitoring jobs...\n
    \n
    \n {pklchanges && (\n
    \n                  {pklchanges}\n                  {/* value={pklchanges} \n                                    className='monitorArea'\n                                    style={monitorStyle}\n                                    readOnly>                                         */}\n                
    \n )}\n {loadingPkl && Loading...}\n
    \n
    \n
    \n
    \n );\n }\n}\n\n// const experimentStyle = {\n// height: 338\n// };\n// const monitorStyle = {\n// height: 310\n// }\n\nexport default JobMonitor;\n","import React, { Component } from \"react\";\n// import Notification from \"react-web-notification\";\n\nclass JobMonitorTree extends Component {\n componentDidMount() {\n if (this.props.experiment) {\n this.props.getExperimentTreePkl(\n this.props.experiment.expid,\n this.props.experiment.pkl_timestamp\n );\n if (this.props.experimentRunning) {\n this.interval = setInterval(\n () =>\n this.props.getExperimentTreePkl(\n this.props.experiment.expid,\n this.props.experiment.pkl_timestamp\n ),\n this.props.experiment.updateTime * 2000\n );\n }\n }\n }\n\n componentWillUnmount() {\n this.props.cleanPklTreeData();\n if (this.props.experimentRunning) {\n clearInterval(this.interval);\n }\n }\n\n render() {\n const { loadingTreePkl, pkltreechanges } = this.props;\n return (\n
    \n
    \n
    \n
    \n Monitoring jobs...\n
    \n
    \n {pkltreechanges && (\n
    {pkltreechanges}
    \n )}\n {loadingTreePkl && Loading...}\n
    \n
    \n
    \n {/* */}\n
    \n );\n }\n}\n\nexport default JobMonitorTree;\n","import React, { useContext } from \"react\";\n//import ExperimentContext from \"../context/experiment/experimentContext\";\nimport GraphContext from \"../context/graph/graphContext\";\nimport {\n WaitingCode,\n waitingColor,\n UnknownCode,\n unknownColor,\n SuspendedCode,\n suspendedColor,\n QueueCode,\n queueColor,\n FailedCode,\n failedColor,\n HoldCode,\n holdColor,\n CompletedCode,\n completedColor,\n SubmittedCode,\n submittedColor,\n RunningCode,\n runningColor,\n ReadyCode,\n readyColor,\n PreparedCode,\n preparedColor,\n} from \"../context/vars\";\n\nconst Navigator = () => {\n //const experimentContext = useContext(ExperimentContext);\n const graphContext = useContext(GraphContext);\n const { navToLatest } = graphContext;\n\n const onLatest = (statusCode, latest = true) => (e) => {\n e.preventDefault();\n navToLatest(statusCode, latest); // Completed\n };\n\n return (\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n {/* job with that status. */}\n ← CLICKABLE \n
    \n
    \n );\n};\n\nexport default Navigator;\n","import React, { useState, useContext, Fragment } from \"react\";\nimport StatsContext from \"../context/statistics/statsContext\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport Chart from \"react-google-charts\";\nimport Spinner from \"../layout/Spinner\";\nimport { DEBUG } from \"../context/vars\";\n\nconst StatsSearch = () => {\n const statsContext = useContext(StatsContext);\n const experimentContext = useContext(ExperimentContext);\n\n const {\n getExperimentStats,\n statdata,\n loading,\n clearStats,\n isError,\n errorMessage,\n totaldata,\n ticksdata,\n } = statsContext;\n const { experiment } = experimentContext;\n\n // const data = [\n // [\"Year\", \"Visitations\", \"Crashes\", { role: \"style\" }],\n // [\"2010\", 10, 30, \"color: gray\"],\n // [\"2020\", 14, 25, \"color: #76A7FA\"],\n // [\"2030\", 16, 24, \"color: blue\"],\n // [\"2040\", 22, 32, \"stroke-color: #703593; stroke-width: 4; fill-color: #C5A5CF\"],\n // [\n // \"2050\",\n // 28,\n // 23,\n // \"stroke-color: #871B47; stroke-opacity: 0.6; stroke-width: 8; fill-color: #BC5679; fill-opacity: 0.2\"\n // ]\n // ];\n\n // const jsonTicks = JSON.stringify({ticksdata});\n // console.log(jsonTicks['ticksdata'])\n const options = {\n chartArea: { width: \"90%\", height: \"700px\" },\n hAxis: {\n title: \"Jobs\",\n ticks: ticksdata, //ticks: [{v:1, f:'job_1-2323'}, {v:2, f:'job_other'}],\n },\n vAxis: {\n title: \"Hours\",\n },\n legend: {\n position: \"top\",\n },\n explorer: {\n actions: [\"dragToZoom\", \"rightClickToReset\"],\n axis: \"horizontal\",\n // maxZoomIn: 4.0,\n },\n };\n\n // console.log(options);\n\n var summary = null;\n if (totaldata && totaldata.stats && totaldata.stats.totals) {\n summary = totaldata.stats.totals.map((item, index) => (\n
  • {item}
  • \n ));\n // console.log(totaldata.stats.totals[0]);\n // for(var i = 0; i < totaldata.stats.totals.length; i++){\n // console.log(totaldata.stats.totals[i]);\n // summary +=
  • {totaldata.stats.totals[i]}
  • \n // }\n }\n\n const onSubmitStats = (e) => {\n e.preventDefault();\n DEBUG && console.log(experiment.expid);\n DEBUG && console.log(\"Hours : \" + hour);\n DEBUG && console.log(\"Type : \" + section);\n getExperimentStats(experiment.expid, hour, section);\n };\n\n const onSubmitClear = (e) => {\n e.preventDefault();\n setHour(\"\");\n setSection(\"\");\n clearStats();\n };\n\n const [hour, setHour] = useState(\"\");\n const [section, setSection] = useState(\"\");\n const onChangeHour = (e) => setHour(e.target.value);\n const onChangeSection = (e) => setSection(e.target.value);\n const pStyle = {\n listStyleType: \"none\",\n };\n\n return (\n \n
    \n
    \n {!statdata && experiment && experimentContext.loading === false && (\n
    \n
    \n \n \n
    \n \n
    \n
    \n
    \n )}\n {statdata && (\n
    \n
    \n \n
    \n
    \n )}\n
    \n
    \n {!statdata && experiment && (\n
    \n

    \n Supply a Section (Type) in the appropriate textbox to filter the\n jobs that will be included in the query. Also, you can also\n supply the Hours value that determines how many hours before the\n current time you want to query. Leave both empty and a query for\n Any Section since the date of creation of the experiment will be\n executed.\n

    \n

    \n Press Get Statistics{\" \"}\n to generate the statistics, this will generate a Bar Chart and\n some extra statistics below. Drag the mouse inside the chart to\n zoom in; however, zoom in capabilities are not unlimited, so try\n to narrow your query.\n

    \n
    \n )}\n {loading && }\n {statdata && !isError && (\n Loading Chart
    }\n width={\"100%\"}\n height={\"700px\"}\n data={statdata}\n options={options}\n />\n )}\n {statdata && isError && (\n
    {errorMessage}
    \n )}\n {totaldata && (\n
    \n {totaldata &&
      {summary && summary}
    }\n
    \n )}\n
    \n \n {/*
    */}\n
    \n );\n};\n\n// const experimentBuffer = {\n// minHeight: \"100%\",\n// };\n\nexport default StatsSearch;\n","import React, { useContext, Fragment } from \"react\";\nimport GraphContext from \"../context/graph/graphContext\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport CommandModal from \"./CommandModal\";\n\nconst GraphNodeSelection = ({ target = \"manual-graph\" }) => {\n const graphContext = useContext(GraphContext);\n const experimentContext = useContext(ExperimentContext);\n const { selection, updateGraphSelectedNodes } = graphContext;\n const { canSelect } = experimentContext;\n\n const onChangeStatus = (e) => {\n e.preventDefault();\n updateGraphSelectedNodes();\n };\n\n if (selection && !canSelect) {\n return (\n \n \n Change Status\n \n \n \n\n // \n // Change Status\n // \n );\n }\n\n return null;\n};\n\nexport default GraphNodeSelection;\n","import React, { useContext, useState } from \"react\";\n//import ExperimentContext from \"../context/experiment/experimentContext\";\nimport GraphContext from \"../context/graph/graphContext\";\nimport GraphNodeSelection from \"./GraphNodeSelection\";\n\nconst JobSearcher = () => {\n //const experimentContext = useContext(ExperimentContext);\n const graphContext = useContext(GraphContext);\n const {\n searchJobInGraph,\n foundNodes,\n loadingSearchJob,\n data,\n navigateTo,\n } = graphContext;\n\n const [jobId, setJobId] = useState(\"\");\n const [currentIndex, setCurrentIndex] = useState(\"\");\n const onChangeId = (e) => setJobId(e.target.value);\n\n const onSubmit = (e) => {\n e.preventDefault();\n searchJobInGraph(jobId);\n setCurrentIndex(0);\n };\n\n const onNext = (index) => (e) => {\n e.preventDefault();\n if (foundNodes) {\n let nextIndex = currentIndex + index;\n //setCurrentIndex(nextIndex);\n //console.log(nextIndex);\n if (nextIndex >= 0 && nextIndex < foundNodes.length) {\n //setCurrentIndex(nextIndex);\n //console.log(foundNodes[currentIndex].id);\n navigateTo(foundNodes[nextIndex].id);\n setCurrentIndex(nextIndex);\n } else {\n if (nextIndex < 0) {\n navigateTo(foundNodes[foundNodes.length - 1].id);\n setCurrentIndex(foundNodes.length - 1);\n } else if (nextIndex >= foundNodes.length) {\n navigateTo(foundNodes[0].id);\n setCurrentIndex(0);\n }\n }\n }\n };\n\n return (\n
    \n
    \n
    \n
    \n \n {/* */}\n {loadingSearchJob && Searching...}\n {!loadingSearchJob && (\n
    \n \n
    \n )}\n
    \n
    \n
    \n
    \n {foundNodes && foundNodes.length > 1 && (\n
    \n \n Previous\n \n \n Next\n \n \n {currentIndex + 1} of {foundNodes.length}\n \n {/*
    \n \n
    \n\n
    \n \n
    */}\n
    \n )}\n
    \n
    \n \n
    \n\n
    \n {data && (\n \n Max out: {data.max_children} | Max in: {data.max_parents} | Total\n #Jobs: {data.total_jobs} | Chunk unit:{\" \"}\n {data.chunk_unit} | Chunk size{\" \"}\n {data.chunk_size}{\" \"}\n \n )}\n
    \n
    \n );\n};\n\nexport default JobSearcher;\n","import React, { useContext, useState } from \"react\";\n//import ExperimentContext from \"../context/experiment/experimentContext\";\nimport TreeContext from \"../context/tree/treeContext\";\n//import GraphNodeSelection from \"./GraphNodeSelection\";\n\nconst JobFilter = () => {\n //const experimentContext = useContext(ExperimentContext);\n const treeContext = useContext(TreeContext);\n const {\n filterTreeView,\n treedata,\n loadingFilterTree,\n clearFilterTreeView,\n returnFilter,\n } = treeContext;\n\n const [filterString, setFilterString] = useState(\"\");\n const onSubmit = (e) => {\n e.preventDefault();\n filterTreeView(filterString);\n };\n\n const onChangeFilter = (e) => setFilterString(e.target.value);\n const onClearFilter = (e) => {\n e.preventDefault();\n clearFilterTreeView();\n };\n\n var clearText = \"Clear\";\n if (returnFilter && returnFilter >= 0) {\n clearText = \"Clear Result\";\n }\n\n return (\n
    \n
    \n
    \n
    \n \n {loadingFilterTree && Searching...}\n {!loadingFilterTree && (\n
    \n \n
    \n )}\n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n {treedata && treedata.jobs && (\n \n Total #Jobs: {treedata.total} | Chunk unit:{\" \"}\n {treedata.reference.chunk_unit} | Chunk size:{\" \"}\n {treedata.reference.chunk_size}{\" \"}\n \n )}\n
    \n
    \n );\n};\n\nexport default JobFilter;\n","import React, { useContext } from \"react\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport GraphContext from \"../context/graph/graphContext\";\n\nconst WrapperList = () => {\n const experimentContext = useContext(ExperimentContext);\n const graphContext = useContext(GraphContext);\n const { experiment } = experimentContext;\n const { data, navigateToGroup } = graphContext;\n var packages = {};\n var wrapperTitles = null;\n var wrapperItems = null;\n const Honk = (id) => (e) => {\n e.preventDefault();\n if (packages) {\n //console.log(id[\"wrapper\"]);\n //console.log(packages[id[\"wrapper\"]]);\n navigateToGroup(packages[id[\"wrapper\"]]);\n }\n\n //navigateToGroup()\n };\n if (\n experiment &&\n data &&\n data.packages &&\n Object.keys(data.packages).length > 0\n ) {\n packages = data.packages;\n wrapperTitles = Object.keys(packages);\n wrapperItems = wrapperTitles.map((wrapper, index) => (\n \n {wrapper.split(\"_\").slice(1).join(\"_\")}\n \n ));\n // for(var key in packages){\n // map += \"\" + key + \"\";\n // }\n // map = packages.map(x => x)\n // console.log(map)\n // for(var key in packages){\n // var value = packages[key]\n // console.log(key + \" : \" + value);\n // }\n }\n\n return (\n
    \n {experiment && packages && (\n
    \n
    \n \n
    \n
    \n \n WRAPPERS\n \n
    \n
    \n
    \n {wrapperTitles && wrapperItems}\n
    \n
    \n
    \n
    \n )}\n \n );\n};\n\nconst experimentStyle = {\n height: 660,\n};\n\nconst headerCard = {\n height: 30,\n};\n\nexport default WrapperList;\n","import React, { useContext } from \"react\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport TreeContext from \"../context/tree/treeContext\";\n\nconst SelectionControl = () => {\n const experimentContext = useContext(ExperimentContext);\n const treeContext = useContext(TreeContext);\n const {\n canSelect,\n activateSelectionMode,\n deactivateSelectionMode,\n } = experimentContext;\n const { setStartSelection } = treeContext;\n // var expid = null;\n // if (experiment) {\n // expid = experiment.expid;\n // }\n\n const onSelectionMode = (e) => {\n e.preventDefault();\n activateSelectionMode();\n setStartSelection();\n //console.log(\"Sending \" + boolValue);\n };\n\n const offSelectionMode = (e) => {\n e.preventDefault();\n deactivateSelectionMode();\n //console.log(\"Sending \" + boolValue);\n };\n\n if (canSelect === true) {\n return (\n
    \n \n \n );\n } else {\n return (\n
    \n \n \n );\n }\n};\n\nexport default SelectionControl;\n","import React, { useContext } from \"react\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport GraphContext from \"../context/graph/graphContext\";\nimport SelectionControl from \"./SelectionControl\";\n\nconst GraphControl = () => {\n const experimentContext = useContext(ExperimentContext);\n const graphContext = useContext(GraphContext);\n const {\n experiment,\n experimentRunning,\n loadingJobMonitor,\n } = experimentContext;\n\n const {\n getExperimentGraph,\n data,\n getExperimentPkl,\n setAutoUpdatePkl,\n startAutoUpdatePkl,\n enabledGraphSearch,\n loadingPkl,\n } = graphContext;\n\n const disableQuery = !enabledGraphSearch || loadingPkl;\n\n const onSubmitGraph = (grouped = \"none\", layout = \"standard\") => (e) => {\n e.preventDefault();\n getExperimentGraph(experiment.expid, grouped, layout);\n //window.showGraphTab();\n };\n\n const onJobMonitor = (e) => {\n e.preventDefault();\n setAutoUpdatePkl(true);\n };\n\n const onNotJobMonitor = (e) => {\n e.preventDefault();\n setAutoUpdatePkl(false);\n };\n\n const onRequestUpdate = (e) => {\n e.preventDefault();\n getExperimentPkl(experiment.expid, experiment.pkl_timestamp);\n };\n\n return (\n
    \n
    \n
    \n {(loadingJobMonitor || loadingPkl) &&
    Querying...
    }\n
    \n
    \n
    \n {experiment && data && (\n
    \n \n
    \n )}\n\n
    \n
    \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n {experiment && data && experimentRunning && !startAutoUpdatePkl && (\n
    \n
    \n \n \n
    \n )}\n {experimentRunning && data && !startAutoUpdatePkl && (\n
    \n
    \n \n \n
    \n )}\n {experimentRunning && data && startAutoUpdatePkl && (\n
    \n
    \n \n \n
    \n )}\n
    \n
    \n
    \n
    \n );\n};\n\nexport default GraphControl;\n","import React, { useContext } from \"react\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\n\nconst LogControl = () => {\n const experimentContext = useContext(ExperimentContext);\n const {\n experiment,\n startAutoUpdateRun,\n setAutoUpdateRun,\n } = experimentContext;\n\n const onSubmitRun = (e) => {\n e.preventDefault();\n setAutoUpdateRun(true);\n };\n\n const onStopSubmitRun = (e) => {\n e.preventDefault();\n setAutoUpdateRun(false);\n };\n\n return (\n
    \n
    \n
    \n {experiment && !startAutoUpdateRun && (\n
    \n \n \n )}\n {experiment && startAutoUpdateRun && (\n
    \n \n \n )}\n
    \n
    \n
    \n );\n};\n\nexport default LogControl;\n","import React, { useContext } from \"react\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport TreeContext from \"../context/tree/treeContext\";\nimport SelectionControl from \"./SelectionControl\";\n\nconst TreeControl = () => {\n const experimentContext = useContext(ExperimentContext);\n const treeContext = useContext(TreeContext);\n const { experiment, experimentRunning } = experimentContext;\n\n const {\n treedata,\n getExperimentTree,\n cleanTreeData,\n enabledTreeSearch,\n getExperimentTreePkl,\n loadingTreeRefresh,\n setAutoUpdateTreePkl,\n startAutoUpdateTreePkl,\n loadingTreePkl,\n } = treeContext;\n\n const onSubmitTree = (e) => {\n e.preventDefault();\n getExperimentTree(experiment.expid);\n };\n\n const onClearTree = (e) => {\n e.preventDefault();\n cleanTreeData();\n };\n\n const onRequestUpdate = (e) => {\n e.preventDefault();\n getExperimentTreePkl(experiment.expid, experiment.pkl_timestamp);\n };\n\n const onJobMonitor = (e) => {\n e.preventDefault();\n setAutoUpdateTreePkl(true);\n };\n\n const onNotJobMonitor = (e) => {\n e.preventDefault();\n setAutoUpdateTreePkl(false);\n };\n\n const disabledQuery = !enabledTreeSearch || loadingTreePkl;\n\n return (\n
    \n
    \n {(loadingTreeRefresh || loadingTreePkl) && (\n
    Querying...
    \n )}\n {experiment && treedata && (\n
    \n \n
    \n )}\n {experiment && !treedata && (\n
    \n
    \n \n \n
    \n )}\n {experiment && treedata && !startAutoUpdateTreePkl && (\n
    \n
    \n \n \n
    \n )}\n {experiment &&\n treedata &&\n experimentRunning &&\n !startAutoUpdateTreePkl && (\n
    \n
    \n \n \n
    \n )}\n {experimentRunning && treedata && !startAutoUpdateTreePkl && (\n
    \n
    \n \n \n
    \n )}\n {experimentRunning && treedata && startAutoUpdateTreePkl && (\n
    \n
    \n \n \n
    \n )}\n
    \n
    \n );\n};\n\nexport default TreeControl;\n","import React, { useContext } from \"react\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport TreeContext from \"../context/tree/treeContext\";\n\nconst PerformanceControl = () => {\n const experimentContext = useContext(ExperimentContext);\n const treeContext = useContext(TreeContext);\n const { getExperimentPerformanceMetrics, experiment } = experimentContext;\n\n const { enabledTreeSearch } = treeContext;\n\n const onSubmitRequest = (e) => {\n e.preventDefault();\n getExperimentPerformanceMetrics(experiment.expid);\n };\n\n return (\n
    \n
    \n
    \n {experiment && (\n
    \n \n \n )}\n
    \n
    \n
    \n );\n};\n\nexport default PerformanceControl;\n","import React, { useContext, Fragment } from \"react\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport { secondsToDelta } from \"../context/utils\";\n\nconst Performance = () => {\n const experimentContext = useContext(ExperimentContext);\n const { performancedata, experiment } = experimentContext;\n\n if (!experiment || !performancedata) {\n return (\n
    \n
    \n
    Experiment not defined.
    \n
    \n
    \n );\n }\n // console.log(performancedata);\n const {\n ASYPD,\n SYPD,\n JPSY,\n Parallelization,\n CHSY,\n considered,\n } = performancedata;\n return (\n \n
    \n
    \n
    \n Parallelization:{\" \"}\n {Parallelization}\n
    \n
    \n JPSY: {JPSY}\n
    \n
    \n SYPD: {SYPD}\n
    \n
    \n ASYPD: {ASYPD}\n
    \n
    \n CHSY: {CHSY}\n
    \n {/* considered: {considered} */}\n
    \n
    \n

    Considered: ({considered.length})

    \n \n \n \n \n \n \n \n \n \n \n \n \n \n {considered\n .sort((a, b) => (a.name > b.name ? 1 : -1))\n .map((item, index) => (\n \n \n \n \n \n \n \n \n \n ))}\n \n
    #Job NameQueueRunCHSYJPSYEnergy
    {index + 1}{item.name}\n {secondsToDelta(item.queue)}\n \n {secondsToDelta(item.running)}\n \n {item.CHSY}\n \n {item.JPSY}\n \n {item.energy}\n
    \n
    \n
    \n
    \n
    \n

    Metrics description:

    \n

    \n Parallelization: Total number of cores allocated\n for the run, per SIM.\n

    \n

    \n JPSY: Energy cost of a simulation, measured in\n Joules per simulated year.\n

    \n

    \n SYPD: Simulated years per day for the model in a 24\n h period.\n

    \n

    \n ASYPD: Actual SYPD, this number should be lower\n than SYPD due to interruptions, queue wait time, data transfer or\n issues with the model workflow. This is collected by measuring the\n time between first submission and the date of arrival of the last\n history file on the storage file system.\n

    \n

    \n CHSY: Core hours per simulated year. This is\n measured as the product of the model runtime for 1 SY and the number\n of cores allocated. This is an average of the CHSY of all SIM jobs.\n

    \n

    \n Considered: Scrollable list where each item in the\n list represents job information showing Job Name,{\" \"}\n QUEUE and RUNNING time in{\" \"}\n HH:mm:ss format, CHSY, JPSY\n , and raw Energy consumption for that job.{\" \"}\n \n Note: Energy values are only collected for those jobs running on\n MareNostrum4 and using the latest version of Autosubmit.\n Subsequent development will expand this feature for other\n platforms.\n \n

    \n

    \n Visit{\" \"}\n \n Performance Metrics Documentation\n {\" \"}\n for more details.\n

    \n
    \n
    \n
    \n );\n};\n\nexport default Performance;\n","import React, { Fragment, useContext, useEffect } from \"react\";\n//import Experiment from \"../experiment/Experiment\";\nimport ExperimentColumn from \"../experiment/ExperimentColumn\";\n// import GraphRepresentation from '../experiment/GraphRepresentation';\nimport GraphNativeRep from \"../experiment/GraphNativeRep\";\nimport JobSelection from \"../experiment/JobSelection\";\nimport TreeNativeRep from \"../experiment/TreeNativeRep\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport StatsContext from \"../context/statistics/statsContext\";\nimport GraphContext from \"../context/graph/graphContext\";\nimport TreeContext from \"../context/tree/treeContext\";\nimport Selection from \"../experiment/Selection\";\nimport SelectionTreeNode from \"../experiment/SelectionTreeNode\";\n// import OpenRun from '../experiment/OpenRun';\nimport Running from \"../experiment/Running\";\nimport JobMonitor from \"../experiment/JobMonitor\";\nimport JobMonitorTree from \"../experiment/JobMonitorTree\";\nimport Navigator from \"../experiment/Navigator\";\nimport StatsSearch from \"../statistics/StatsSearch\";\nimport JobSearcher from \"../experiment/JobSearcher\";\nimport JobFilter from \"../experiment/JobFilter\";\nimport WrapperList from \"../experiment/WrapperList\";\nimport GraphControl from \"../experiment/GraphControl\";\nimport LogControl from \"../experiment/LogControl\";\nimport TreeControl from \"../experiment/TreeControl\";\nimport PerformanceControl from \"../experiment/PerformanceControl\";\nimport Performance from \"../experiment/Performance\";\n\nconst ExperimentCentral = ({ match }) => {\n const expid = match.params.expid;\n const resolve_action = match.params.action;\n const focus_graph =\n resolve_action && resolve_action === \"graph\" ? true : false;\n //console.log(\"Focus: \" + focus_graph);\n const classTree = focus_graph === true ? \"nav-link\" : \"nav-link active\";\n const classGraph = focus_graph === true ? \"nav-link active\" : \"nav-link\";\n const classTabTree =\n focus_graph === true ? \"tab-pane fade\" : \"tab-pane fade show active\";\n const classTabGraph =\n focus_graph === true ? \"tab-pane fade show active\" : \"tab-pane fade\";\n //const isGraph = this.props.isGraph;\n const experimentContext = useContext(ExperimentContext);\n const graphContext = useContext(GraphContext);\n const treeContext = useContext(TreeContext);\n const statsContext = useContext(StatsContext);\n const {\n loadingRun,\n cleanRunData,\n getExperiment,\n getRunningState,\n getExperimentRun,\n getExperimentPerformanceMetrics,\n startAutoUpdateRun,\n setAutoUpdateRun,\n rundata,\n experiment,\n canSelect,\n experimentRunning,\n updateCurrentSelectedGraph,\n updateCurrentSelectedTree,\n } = experimentContext;\n\n const {\n treedata,\n updateSelectionTree,\n loadingTree,\n getExperimentTreePkl,\n getExperimentTree,\n cleanPklTreeData,\n startAutoUpdateTreePkl,\n pkltreechanges,\n setFancyTree,\n cleanTreeData,\n } = treeContext;\n\n const {\n cleanPklData,\n cleanNavData,\n getExperimentGraph,\n setVisData,\n getExperimentPkl,\n updateSelection,\n setVisNetwork,\n data,\n visNetwork,\n navToLatest,\n navigateAfterLoadGraph,\n pklchanges,\n loadingGraph,\n shouldUpdateGraph,\n startAutoUpdatePkl,\n cleanGraphData,\n current_grouped,\n updateGraphSelectedNodes,\n } = graphContext;\n const { clearStats } = statsContext;\n\n useEffect(() => {\n getExperiment(expid);\n getRunningState(expid);\n if (expid && expid.length > 0) {\n if (resolve_action && resolve_action === \"graph\") {\n getExperimentGraph(expid);\n } else {\n getExperimentTree(expid);\n }\n\n getExperimentPerformanceMetrics(expid);\n }\n // getExperimentTree(expid);\n const interval = setInterval(() => getRunningState(expid), 300000);\n return () => clearInterval(interval);\n // eslint-disable-next-line\n }, []);\n\n return (\n \n
    \n {/*
    \n \n
    */}\n
    \n
      \n
    • \n \n Tree View\n \n
    • \n
    • \n \n Graph\n \n
    • \n
    • \n \n Log\n \n
    • \n
    • \n \n Statistics\n \n
    • \n
    • \n \n Performance\n \n
    • \n
    \n
    \n \n
    \n {experiment && }\n {experiment && data && (\n
    \n \n
    \n )}\n
    \n
    \n \n
    \n \n
      \n
    • \n \n Selection\n \n
    • \n
    • \n \n Wrappers\n \n
    • \n
    \n
    \n \n {data && }\n {startAutoUpdatePkl && (\n \n )}\n
    \n \n
    \n \n
    \n
    \n
    \n
    \n {experiment && data && canSelect && (\n
    \n \n
    \n )}\n
    \n
    \n {data && visNetwork && }\n
    \n
    \n \n \n
    \n {experiment && }\n {experiment && treedata && (\n
    \n \n
    \n )}\n
    \n
    \n \n
    \n \n \n {startAutoUpdateTreePkl && (\n \n )}\n
    \n {experiment && treedata && canSelect && (\n
    \n \n
    \n )}\n
    \n \n \n \n
    \n {experiment && }\n
    \n
    \n {startAutoUpdateRun && (\n \n )}\n {!startAutoUpdateRun && (\n
    \n
    \n

    \n Press{\" \"}\n Show Log{\" \"}\n to see the last 50 lines of the running log of this\n experiment. If the experiment is running, the log\n will update automatically.\n

    \n
    \n
    \n )}\n
    \n
    \n
    \n \n \n
    \n
    \n Statistics\n
    \n
    \n
    \n \n
    \n
    \n
    \n \n \n
    \n {experiment && }\n
    \n {experiment && }\n
    \n
    \n \n \n \n \n {/*
    \n
    \n \n
    \n
    */}\n {/*
    */}\n \n
    \n );\n};\n\n// const experimentStyle = {\n// height: 600,\n// };\n\nconst experimentMinStyle = {\n minHeight: \"100%\",\n};\n\nexport default ExperimentCentral;\n","import React, { useState, useContext } from \"react\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport AlertContext from \"../context/alert/alertContext\";\n\nconst Search = ({ setAlert }) => {\n const experimentContext = useContext(ExperimentContext);\n const alertContext = useContext(AlertContext);\n\n const [text, setText] = useState(\"\");\n\n const onSubmit = (e) => {\n e.preventDefault();\n if (text === \"\") {\n alertContext.setAlert(\"Please enter something\", \"light\");\n } else {\n experimentContext.searchExperiments(text);\n //setText('');\n }\n };\n\n const onSubmitRunning = (e) => {\n e.preventDefault();\n experimentContext.getCurrentRunning();\n };\n\n // const onRequestDetail = e => {\n // e.preventDefault();\n // experimentContext.getSummaries();\n // };\n\n const onChange = (e) => setText(e.target.value);\n\n return (\n
    \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n\n {experimentContext.experiments.length > 0 && (\n
    \n
    \n \n Show Detailed Data\n \n
    \n
    \n \n Clear\n \n
    \n
    \n )}\n
    \n );\n};\n\nexport default Search;\n","import React, { useContext } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Link } from \"react-router-dom\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\n\nconst ExperimentItem = ({\n experiment: { name, description, user, hpc, status, completed, total },\n}) => {\n const experimentContext = useContext(ExperimentContext);\n const { getExperimentSummary, summaries } = experimentContext;\n const onGetSummary = (e) => {\n e.preventDefault();\n //console.log(name);\n getExperimentSummary(name);\n };\n return (\n
    \n
    \n
    \n
    \n
    \n

    {name}

    \n
    \n
    \n {\" \"}\n {completed} / {total}{\" \"}\n
    \n 0\n ? \"progress-bar progress-bar-striped progress-bar-animated bg-danger\"\n : \"progress-bar progress-bar-striped progress-bar-animated bg-success\"\n : summaries[name] && summaries[name].n_failed > 0\n ? \"progress-bar bg-danger\"\n : \"progress-bar bg-info\"\n }\n role='progressbar'\n style={{\n width: total > 0 ? (completed / total) * 100 + \"%\" : \"0%\",\n }}\n aria-valuenow={completed}\n aria-valuemin='0'\n aria-valuemax={total}\n >
    \n
    \n {/* \n {\" \"}\n \n */}\n
    \n
    \n {status && status === \"RUNNING\" && (\n {status}\n )}\n {status && status !== \"RUNNING\" && (\n \n {status}\n \n )}\n
    \n
    \n
    \n
    \n {/*

    */}\n
    \n Owner: {user}\n
    \n

    \n {description}\n

    \n
    \n
    \n
    \n \n \n
    \n
    \n \n More\n \n
    \n {summaries[name] && summaries[name].error === true && (\n
    \n
    \n
    \n
    \n
    \n ERROR: {summaries[name].error_message}\n
    \n
    \n
    \n
    \n
    \n )}\n {summaries[name] && summaries[name].error === false && (\n
    \n
    \n
    \n
    \n \n All : avg. queue{\" \"}\n {summaries[name].avg_queue_time} | run{\" \"}\n {summaries[name].avg_run_time}\n \n
    \n
    \n {summaries[name].sim_queue_considered > 0 && (\n
    \n
    \n \n SIM {\" (\"}\n {summaries[name].n_sim}\n {\") \"} : avg. queue{\" \"}\n {summaries[name].avg_sim_queue_time}{\" \"}\n {\" (\"}\n {summaries[name].sim_queue_considered}\n {\") \"}| run{\" \"}\n {summaries[name].avg_sim_run_time}\n {\" (\"}\n {summaries[name].sim_run_considered}\n {\")\"}\n \n
    \n
    \n )}\n
    \n
    \n {summaries[name].n_running > 0 && (\n \n Running: {summaries[name].n_running}\n \n )}{\" \"}\n {summaries[name].n_queuing > 0 && (\n \n Queuing: {summaries[name].n_queuing}\n \n )}{\" \"}\n {summaries[name].n_submitted > 0 && (\n \n Submitted: {summaries[name].n_submitted}\n \n )}{\" \"}\n {summaries[name].n_suspended > 0 && (\n \n Suspended: {summaries[name].n_suspended}\n \n )}\n
    \n
    \n\n {summaries[name].n_failed > 0 && (\n
    \n
    \n \n Failed: {summaries[name].n_failed}\n \n
    \n
    \n \n \n
      \n {summaries[name].failed_jobs.map((item) => (\n
    1. {item}
    2. \n ))}\n
    \n
    \n
    \n
    \n
    \n )}\n
    \n
    \n )}\n
    \n

    \n HPC: {hpc}\n

    \n
    \n \n \n );\n};\n\nExperimentItem.propTypes = {\n experiment: PropTypes.object.isRequired,\n};\n\nexport default ExperimentItem;\n","import React, { useContext } from \"react\";\nimport ExperimentItem from \"./ExperimentItem\";\nimport Spinner from \"../layout/Spinner\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\n\nconst Experiments = () => {\n const experimentContext = useContext(ExperimentContext);\n const { loading, experiments } = experimentContext;\n if (loading) {\n return ;\n } else {\n return (\n
    \n
    \n {experiments &&\n experiments\n .sort((a, b) => (a.status > b.status ? -1 : 1))\n .map(experiment => (\n \n ))}\n
    \n
    \n );\n }\n};\n\n// const experimentStyle = {\n// display: 'grid',\n// gridTemplateColumns: 'repeat(3, 1fr)',\n// gridGap: '1rem'\n// };\n\nexport default Experiments;\n","import React, { Fragment } from 'react';\nimport Search from '../experiment/Search';\nimport Experiments from '../experiment/Experiments';\n\nconst Home = () => {\n return (\n \n \n \n \n )\n}\n\nexport default Home\n","import React, { Fragment } from \"react\";\n\nfunction Footer() {\n return (\n \n
    \n {/*
    \n
    \n
    \n

    Autosubmit Experiment Monitor

    \n

    2019

    \n
    \n
    \n
    */}\n
    \n );\n}\n\nconst footerStyle = {\n height: 40,\n};\n\nexport default Footer;\n","import {\n SEARCH_EXPERIMENTS,\n SET_LOADING,\n CLEAR_EXPERIMENTS,\n GET_EXPERIMENT,\n CLEAN_RUN_DATA,\n SET_LOADING_RUN,\n GET_EXPERIMENT_RUN,\n SET_AUTOUPDATE_RUN,\n GET_RUNNING_STATE,\n SET_LOADING_STATE,\n UPDATE_EXPERIMENT_TS,\n CURRENT_RUNNING,\n GET_EXPERIMENT_SUMMARY,\n CLEAR_SUMMARY_EXP,\n GET_EXPERIMENT_PERFORMANCE,\n CLEAN_PERFORMANCE_METRICS,\n ACTIVATE_SELECTION_MODE,\n DEACTIVATE_SELECTION_MODE,\n UPDATE_SELECTED_JOBS,\n REMOVE_SELECTED_JOB,\n SET_CURRENT_COMMAND,\n} from \"../types\";\n\nexport default (state, action) => {\n switch (action.type) {\n case ACTIVATE_SELECTION_MODE:\n return {\n ...state,\n canSelect: true,\n currentSelected: [],\n currentCommand: null,\n };\n case DEACTIVATE_SELECTION_MODE:\n return {\n ...state,\n canSelect: false,\n currentSelected: [],\n currentCommand: null,\n };\n\n case CLEAN_RUN_DATA:\n return {\n ...state,\n rundata: null,\n startAutoUpdateRun: false,\n };\n case UPDATE_EXPERIMENT_TS:\n //const { experiment } = state;\n const pkl_timestamp = action.payload;\n state.experiment.pkl_timestamp = pkl_timestamp;\n return {\n ...state,\n };\n case SEARCH_EXPERIMENTS:\n return {\n ...state,\n experiments: action.payload,\n loading: false,\n };\n case CURRENT_RUNNING:\n return {\n ...state,\n experiments: action.payload,\n loading: false,\n };\n case SET_AUTOUPDATE_RUN:\n return {\n ...state,\n startAutoUpdateRun: action.payload,\n };\n case SET_LOADING:\n return {\n ...state,\n loading: true,\n };\n case SET_LOADING_STATE:\n return {\n ...state,\n loadingState: true,\n };\n case SET_LOADING_RUN:\n return {\n ...state,\n loadingRun: true,\n };\n case CLEAR_EXPERIMENTS:\n return {\n ...state,\n experiments: [],\n summaries: [],\n loading: false,\n };\n case GET_EXPERIMENT:\n return {\n ...state,\n experiment: action.payload,\n loading: false,\n data: null,\n canSelect: false,\n };\n\n case GET_EXPERIMENT_SUMMARY:\n // const { summaries, summary, expid } = action.payload;\n // summaries.push({ key: expid, value: summary });\n return {\n ...state,\n };\n case CLEAR_SUMMARY_EXP:\n return {\n ...state,\n };\n case GET_EXPERIMENT_PERFORMANCE:\n return {\n ...state,\n performancedata: action.payload,\n };\n case CLEAN_PERFORMANCE_METRICS:\n return {\n ...state,\n performancedata: null,\n };\n\n case GET_EXPERIMENT_RUN:\n return {\n ...state,\n rundata: action.payload,\n loadingRun: false,\n };\n\n case GET_RUNNING_STATE:\n return {\n ...state,\n experimentRunning: action.payload,\n loadingState: false,\n };\n case UPDATE_SELECTED_JOBS:\n const currentNode = action.payload;\n const existingJob = state.currentSelected.find(\n (job) => job.name === currentNode.name\n );\n if (state.canSelect === false || existingJob) {\n return {\n ...state,\n };\n }\n return {\n ...state,\n currentSelected: [...state.currentSelected, currentNode],\n currentCommand: null,\n };\n case SET_CURRENT_COMMAND:\n return {\n ...state,\n currentCommand: action.payload,\n };\n case REMOVE_SELECTED_JOB:\n const name = action.payload;\n let current = [];\n for (var i = 0; i < state.currentSelected.length; i++) {\n if (state.currentSelected[i].name !== name) {\n current.push(state.currentSelected[i]);\n }\n }\n state.currentSelected.find((job) => job.name === name);\n return {\n ...state,\n currentSelected: current,\n currentCommand: null,\n };\n default:\n return null;\n }\n};\n","export const SEARCH_EXPERIMENTS = \"SEARCH_EXPERIMENTS\";\nexport const GET_EXPERIMENT = \"GET_EXPERIMENT\";\nexport const CLEAR_EXPERIMENTS = \"CLEAR_EXPERIMENTS\";\nexport const SET_LOADING = \"SET_LOADING\";\nexport const SET_LOADING_GRAPH = \"SET_LOADING_GRAPH\";\nexport const SET_LOADING_TREE = \"SET_LOADING_TREE\";\nexport const SET_ALERT = \"SET_ALERT\";\nexport const REMOVE_ALERT = \"REMOVE_ALERT\";\nexport const GET_GRAPH = \"GET_GRAPH\";\nexport const GET_TREE = \"GET_TREE\";\nexport const GET_GRAPH_GROUPED = \"GET_GRAPH_GROUPED\";\nexport const CLEAN_GRAPH_DATA = \"CLEAN_GRAPH_DATA\";\nexport const CLEAN_TREE_DATA = \"CLEAN_TREE_DATA\";\nexport const CLEAN_RUN_DATA = \"CLEAN_RUN_DATA\";\nexport const UPDATE_SELECTION = \"UPDATE_SELECTION\";\nexport const GET_EXPERIMENT_RUN = \"GET_EXPERIMENT_RUN\";\nexport const SET_LOADING_RUN = \"SET_LOADING_RUN\";\nexport const SET_AUTOUPDATE_RUN = \"SET_AUTOUPDATE_RUN\";\nexport const SET_LOADING_JOB_MONITOR = \"SET_LOADING_JOB_MONITOR\";\nexport const SET_LOADING_TREE_REFRESH = \"SET_LOADING_TREE_REFRESH\";\nexport const GET_PKL_DATA = \"GET_PKL_DATA\";\nexport const SET_LOADING_PKL = \"SET_LOADING_PKL\";\nexport const SET_LOADING_TREE_PKL = \"SET_LOADING_TREE_PKL\";\nexport const UPDATE_NODES = \"UPDATE_NODES\";\nexport const SHOULD_UPDATE_GRAPH = \"SHOULD_UPDATE_GRAPH\";\nexport const SET_AUTOUPDATE_PKL = \"SET_AUTOUPDATE_PKL\";\nexport const SET_AUTOUPDATE_TREE_PKL = \"SET_AUTOUPDATE_TREE_PKL\";\nexport const CLEAN_PKL_DATA = \"CLEAN_PKL_DATA\";\nexport const CLEAN_TREE_PKL_DATA = \"CLEAN_TREE_PKL_DATA\";\nexport const SET_PKL_CHANGES = \"SET_PKL_CHANGES\";\nexport const UPDATE_EXPERIMENT_TS = \"UPDATE_EXPERIMENT_TS\";\nexport const SET_VIS_DATA = \"SET_VIS_DATA\";\nexport const SET_VIS_NETWORK = \"SET_VIS_NETWORK\";\nexport const GET_EXPERIMENT_STATS = \"GET_EXPERIMENT_STATS\";\nexport const CLEAR_STATS = \"CLEAR_STATS\";\nexport const SET_ERROR_STATS = \"SET_ERROR_STATS\";\nexport const SET_FOUND_NODES = \"SET_FOUND_NODES\";\nexport const SET_LOADING_SEARCH_JOB = \"SET_LOADING_SEARCH_JOB\";\nexport const SET_LOADING_STATE = \"SET_LOADING_STATE\";\nexport const CLEAN_NAV_DATA = \"CLEAN_NAV_DATA\";\nexport const GET_RUNNING_STATE = \"GET_RUNNING_STATE\";\nexport const SET_FANCYTREE = \"SET_FANCYTREE\";\nexport const FILTER_TREEVIEW = \"FILTER_TREEVIEW\";\nexport const SET_LOADING_FILTER = \"SET_LOADING_FILTER\";\nexport const UPDATE_SELECTION_TREE = \"UPDATE_SELECTION_TREE\";\nexport const CLEAR_FILTER_TREE = \"CLEAR_FILTER_TREE\";\nexport const CURRENT_RUNNING = \"CURRENT_RUNNING\";\nexport const PKL_TREE_LOADED = \"PKL_TREE_LOADED\";\nexport const CLEAN_ONLY_GRAH_DATA = \"CLEAN_ONLY_GRAH_DATA\";\nexport const GET_EXPERIMENT_SUMMARY = \"GET_EXPERIMENT_SUMMARY\";\nexport const CLEAR_SUMMARY_EXP = \"CLEAR_SUMMARY_EXP\";\nexport const SET_PKLTREE_CHANGES = \"SET_PKLTREE_CHANGES\";\nexport const GET_EXPERIMENT_PERFORMANCE = \"GET_EXPERIMENT_PERFORMANCE\";\nexport const CLEAN_PERFORMANCE_METRICS = \"CLEAN_PERFORMANCE_METRICS\";\nexport const ACTIVATE_SELECTION_MODE = \"ACTIVATE_SELECTION_MODE\";\nexport const DEACTIVATE_SELECTION_MODE = \"DEACTIVATE_SELECTION_MODE\";\nexport const UPDATE_SELECTED_JOBS = \"UPDATE_SELECTED_JOBS\";\nexport const REMOVE_SELECTED_JOB = \"REMOVE_SELECTED_JOB\";\nexport const SET_CURRENT_COMMAND = \"SET_CURRENT_COMMAND\";\nexport const NAVIGATE_TO_LATEST = \"NAVIGATE_TO_LATEST\";\nexport const NAVIGATE_AFTER_LOADING_GRAPH = \"NAVIGATE_AFTER_LOADING_GRAPH\";\nexport const NAVIGATE_GRAPH_TO = \"NAVIGATE_GRAPH_TO\";\nexport const NAVIGATE_TO_GROUP_GRAPH = \"NAVIGATE_TO_GROUP_GRAPH\";\nexport const SET_START_TREE_SELECTION = \"SET_START_TREE_SELECTION\";\nexport const UPDATE_GRAPH_SELECTED_NODES = \"UPDATE_GRAPH_SELECTED_NODES\";\n//export const DEACTIVATE_COPY_TO = \"DEACTIVATE_COPY_TO\";\n","import React, { useReducer } from \"react\";\nimport axios from \"axios\";\nimport ExperimentContext from \"./experimentContext\";\nimport ExperimentReducer from \"./experimentReducer\";\nimport {\n SEARCH_EXPERIMENTS,\n SET_LOADING,\n CLEAR_EXPERIMENTS,\n GET_EXPERIMENT,\n //GET_TREE,\n //SET_LOADING_TREE,\n GET_EXPERIMENT_RUN,\n SET_LOADING_RUN,\n CLEAN_RUN_DATA,\n SET_AUTOUPDATE_RUN,\n SET_LOADING_STATE,\n GET_RUNNING_STATE,\n UPDATE_EXPERIMENT_TS,\n CURRENT_RUNNING,\n GET_EXPERIMENT_SUMMARY,\n CLEAR_SUMMARY_EXP,\n GET_EXPERIMENT_PERFORMANCE,\n CLEAN_PERFORMANCE_METRICS,\n ACTIVATE_SELECTION_MODE,\n DEACTIVATE_SELECTION_MODE,\n REMOVE_SELECTED_JOB,\n SET_CURRENT_COMMAND,\n UPDATE_SELECTED_JOBS,\n} from \"../types\";\n\nimport { AUTOSUBMIT_API_SOURCE, DEBUG } from \"../vars\";\n\nimport { timeStampToDate } from \"../utils\";\n\nconst ExperimentState = (props) => {\n const initialState = {\n experiments: [],\n summaries: [],\n experiment: {},\n loading: false,\n experimentRunning: false,\n rundata: null,\n performancedata: null,\n loadingRun: false,\n loadingState: false,\n loadingFilterTree: false,\n currentCommand: null,\n currentSelected: [],\n startAutoUpdateRun: false,\n startAutoUpdateTreePkl: false,\n fancyTree: null,\n allowJobMonitor: false,\n canSelect: false,\n };\n\n const [state, dispatch] = useReducer(ExperimentReducer, initialState);\n\n const localserver = AUTOSUBMIT_API_SOURCE;\n //const localserver = \"http://84.88.185.94:8081\";\n const debug = DEBUG;\n\n // Search Experiments\n const searchExperiments = async (text) => {\n setLoading();\n const res = await axios.get(`${localserver}/search/${text}`);\n debug && console.log(res.data);\n dispatch({\n type: SEARCH_EXPERIMENTS,\n payload: res.data.experiment,\n });\n };\n\n const getSummaries = () => {\n const experiments = state.experiments;\n for (var exp in experiments) {\n var exp_name = experiments[exp].name;\n getExperimentSummary(exp_name);\n }\n };\n\n // Get Summary for Search item\n const getExperimentSummary = async (expid) => {\n clearSummary(expid);\n const res = await axios.get(`${localserver}/summary/${expid}`);\n const summary = res.data;\n debug && console.log(summary);\n // console.log(summary);\n // console.log(state.summaries);\n //state.summaries.push({ key: expid, value: summary });\n state.summaries[expid] = summary;\n dispatch({\n type: GET_EXPERIMENT_SUMMARY,\n //payload: { currentSummaries, summary, expid }\n });\n };\n\n const getExperimentPerformanceMetrics = async (expid) => {\n cleanPerformanceMetrics();\n const res = await axios.get(`${localserver}/performance/${expid}`);\n const metrics = res.data;\n debug && console.log(metrics);\n dispatch({\n type: GET_EXPERIMENT_PERFORMANCE,\n payload: metrics,\n });\n };\n\n const clearSummary = (expid) => {\n if (state.summaries[expid]) {\n state.summaries[expid] = null;\n }\n dispatch({\n type: CLEAR_SUMMARY_EXP,\n });\n };\n\n const getCurrentRunning = async () => {\n setLoading();\n const res = await axios.get(`${localserver}/running/`);\n debug && console.log(res.data);\n dispatch({\n type: CURRENT_RUNNING,\n payload: res.data.experiment,\n });\n };\n\n //const updateSelection = async () => {};\n\n // Get Experiment\n const getExperiment = async (expid) => {\n setLoading();\n //cleanGraphData();\n const res = await axios.get(`${localserver}/expinfo/${expid}`);\n debug && console.log(res.data);\n dispatch({\n type: GET_EXPERIMENT,\n payload: res.data,\n });\n };\n\n // Get Experiment Log Run\n const getExperimentRun = async (expid) => {\n setLoadingRun();\n const res = await axios.get(`${localserver}/exprun/${expid}`);\n debug && console.log(res.data);\n dispatch({\n type: GET_EXPERIMENT_RUN,\n payload: res.data,\n });\n };\n\n // Get Running State\n const getRunningState = async (expid) => {\n setLoadingState();\n const res = await axios.get(`${localserver}/ifrun/${expid}`);\n debug && console.log(res.data);\n dispatch({\n type: GET_RUNNING_STATE,\n payload: res.data.running,\n });\n };\n\n const setCurrentCommand = async (command) => {\n // for change status\n dispatch({\n type: SET_CURRENT_COMMAND,\n payload: command,\n });\n //return command;\n };\n\n // Cleaning\n const clearExperiments = () => dispatch({ type: CLEAR_EXPERIMENTS });\n //const cleanGraphData = () => dispatch({ type: CLEAN_GRAPH_DATA });\n\n const cleanRunData = () => dispatch({ type: CLEAN_RUN_DATA });\n\n const cleanPerformanceMetrics = () =>\n dispatch({ type: CLEAN_PERFORMANCE_METRICS });\n\n // Set Loading\n const setLoading = () => dispatch({ type: SET_LOADING });\n\n const setLoadingRun = () => dispatch({ type: SET_LOADING_RUN });\n\n const setLoadingState = () => dispatch({ type: SET_LOADING_STATE });\n\n // Action Things\n const updateExperimentTimeStamp = (timeStamp) => {\n //console.log(timeStamp);\n dispatch({ type: UPDATE_EXPERIMENT_TS, payload: timeStamp });\n };\n\n // Updates for the Selection Tool\n // source: Tree, Graph\n const updateCurrentSelectedTree = (selectedJob, treedata) => {\n debug && console.log(treedata);\n if (treedata) {\n let currentNode = { name: selectedJob, color: \"yellow\", source: \"Tree\" };\n const selectedNode = treedata.jobs.find(\n (job) => job.id === currentNode.name\n );\n currentNode.color = selectedNode.status_color;\n dispatch({\n type: UPDATE_SELECTED_JOBS,\n payload: currentNode,\n });\n }\n };\n\n const updateCurrentSelectedGraph = (selectedJob, data) => {\n // console.log(data);\n // console.log(selectedJob);\n if (data) {\n let currentNode = { name: selectedJob, color: \"yellow\" };\n const selectedNode = data.nodes.find((node) => {\n return node.id === currentNode.name;\n });\n currentNode.color = selectedNode.status_color;\n dispatch({ type: UPDATE_SELECTED_JOBS, payload: currentNode });\n }\n };\n\n const setAutoUpdateRun = (value) =>\n dispatch({ type: SET_AUTOUPDATE_RUN, payload: value });\n\n const activateSelectionMode = () =>\n dispatch({ type: ACTIVATE_SELECTION_MODE });\n const deactivateSelectionMode = () =>\n dispatch({ type: DEACTIVATE_SELECTION_MODE });\n const removeSelectedJob = (name) =>\n dispatch({ type: REMOVE_SELECTED_JOB, payload: name });\n\n return (\n \n {props.children}\n \n );\n};\n\nexport default ExperimentState;\n","import { DEBUG } from \"./vars\";\nexport const navigateGraph = (Id, posx, posy, cScale = 0.9, visNetwork) => {\n DEBUG && console.log(posx + \" \" + posy);\n if (cScale <= 0.05) cScale = 0.05;\n if (visNetwork) {\n visNetwork.moveTo({\n position: { x: posx, y: posy },\n scale: cScale,\n //offset: {x: 30, y: 30},\n animation: false,\n });\n if (Id) {\n visNetwork.selectNodes([Id]);\n }\n }\n};\n\nexport const addFakeEdge = (source, target, state) => {\n let id_edge = source + \"-\" + target;\n DEBUG && console.log(\"Adding fake edge from \" + source + \" to \" + target);\n if (state.visNetwork) {\n state.visNetwork.body.data.edges.add([\n {\n id: id_edge,\n from: source,\n to: target,\n dashes: true,\n background: { enabled: true, color: \"rgba(63, 191, 63, 0.5)\" },\n arrows: { to: { enabled: false } },\n },\n ]);\n }\n};\n\nexport const updateEdgeStyle = (idEdge, state) => {\n if (state.visNetwork) {\n if (Object.keys(state.visNetwork.body.edges).includes(idEdge)) {\n DEBUG && console.log(\"Update style of edge \" + idEdge);\n state.visNetwork.body.edges[idEdge].options.dashes = false;\n state.visNetwork.body.edges[idEdge].options.background.enabled = true;\n state.visNetwork.body.edges[idEdge].options.background.color =\n \"rgba(63, 191, 63, 0.5)\";\n }\n }\n};\n\nexport const updateGraphBorder = (idChange, state) => {\n DEBUG && console.log(\"Upate graph border of \" + idChange);\n if (state.visNetwork) {\n state.visNetwork.body.nodes[\n idChange\n ].options.shapeProperties.borderDashes = true;\n state.visNetwork.selectNodes([idChange]);\n }\n};\n\nexport const updateGraphColor = (idChange, newColor, state) => {\n DEBUG && console.log(\"Upate graph color of \" + idChange);\n if (state.visNetwork) {\n state.visNetwork.body.nodes[idChange].options.color.background = newColor;\n state.visNetwork.selectNodes([idChange]);\n }\n};\n\nexport const updateGraphShape = (idChange, shape, state) => {\n DEBUG && console.log(\"Upate graph shape of \" + idChange);\n if (state.visNetwork) {\n state.visNetwork.body.nodes[idChange].options.shape = shape;\n state.visNetwork.selectNodes([idChange]);\n }\n};\n\nexport const navToLatest = (\n statusCode,\n latest = true,\n cScale = 0.9,\n visNetwork = null,\n data = null,\n state = null\n) => {\n var currentLevel = 0;\n DEBUG && console.log(\"Nav to Latest.\");\n //var currentNode = null;\n var latestId = \"not found\";\n //console.log(state.data.nodes);\n if (data && data.nodes) {\n //console.log(\"Iterate\")\n if (latest === true) {\n for (const node of data.nodes) {\n if (node.status_code === statusCode) {\n if (node.level >= currentLevel) {\n currentLevel = node.level;\n //currentNode = node;\n latestId = node.id;\n }\n }\n }\n } else {\n currentLevel = Number.MAX_VALUE;\n for (const node of data.nodes) {\n if (node.status_code === statusCode) {\n if (node.level <= currentLevel) {\n currentLevel = node.level;\n //currentNode = node;\n latestId = node.id;\n }\n }\n }\n }\n }\n\n //console.log(latestId);\n let currentPosition;\n if (visNetwork) {\n currentPosition = visNetwork.getPositions([latestId]);\n if (currentPosition[latestId]) {\n //console.log(\"So good so far\")\n navigateGraph(\n latestId,\n currentPosition[latestId].x,\n currentPosition[latestId].y,\n cScale,\n visNetwork\n );\n state.selection = [latestId];\n } else {\n state.selection = null;\n }\n }\n if (currentPosition[latestId]) {\n return true;\n } else {\n return false;\n }\n};\n\nexport const findIdinGraph = (Id, state) => {\n if (state.visNetwork) {\n const currentPosition = state.visNetwork.getPositions([Id]);\n if (currentPosition[Id]) {\n return { x: currentPosition[Id].x, y: currentPosition[Id].y };\n }\n }\n return { x: null, y: null };\n};\n\n// export const searchJobInGraph = async (string, state) => {\n// if (state.data && state.data.nodes) {\n// const foundNodes = await state.data.nodes.filter(\n// (node) => node.id.toUpperCase().indexOf(string) >= 0\n// );\n// // console.log(foundNodes);\n// // console.log(foundNodes.length);\n// if (foundNodes && foundNodes.length > 0) {\n// state.foundNodes = foundNodes;\n// state.selection = [foundNodes[0].id]\n// }\n// }\n// }\n","import {\n GET_GRAPH,\n GET_PKL_DATA,\n SET_LOADING_GRAPH,\n CLEAN_ONLY_GRAH_DATA,\n SET_VIS_DATA,\n SET_VIS_NETWORK,\n SET_FOUND_NODES,\n SET_LOADING_SEARCH_JOB,\n SET_LOADING_JOB_MONITOR,\n SET_LOADING_PKL,\n CLEAN_GRAPH_DATA,\n UPDATE_NODES,\n SET_PKL_CHANGES,\n SHOULD_UPDATE_GRAPH,\n CLEAN_PKL_DATA,\n CLEAN_NAV_DATA,\n UPDATE_SELECTION,\n SET_AUTOUPDATE_PKL,\n NAVIGATE_AFTER_LOADING_GRAPH,\n NAVIGATE_GRAPH_TO,\n NAVIGATE_TO_GROUP_GRAPH,\n NAVIGATE_TO_LATEST,\n UPDATE_GRAPH_SELECTED_NODES,\n SET_CURRENT_COMMAND,\n //DEACTIVATE_COPY_TO,\n} from \"../types\";\n\nimport { DEBUG } from \"../vars\";\n\nimport {\n WaitingCode,\n FailedCode,\n CompletedCode,\n RunningCode,\n QueueCode,\n SubmittedCode,\n} from \"../vars\";\n\nimport {\n addFakeEdge,\n updateEdgeStyle,\n updateGraphBorder,\n updateGraphColor,\n updateGraphShape,\n navToLatest,\n navigateGraph,\n findIdinGraph,\n} from \"../graphutils\";\n\nimport { timeStampToDate } from \"../utils\";\n\nexport default (state, action) => {\n switch (action.type) {\n case GET_GRAPH:\n const { resdata, grouped, layout } = action.payload;\n return {\n ...state,\n data: resdata,\n current_grouped: grouped,\n current_layout: layout,\n loadingGraph: false,\n enabledGraphSearch: true,\n graphSelectedNodes: null,\n };\n case GET_PKL_DATA:\n let retrievedPkl = action.payload;\n if (\n state.data !== null &&\n retrievedPkl.has_changed === true &&\n retrievedPkl.pkl_content.length > 0\n ) {\n let current_jobs = {};\n let jobs = {};\n let colorChanges = {};\n let shapeChanges = {};\n let edgeUpdates = {};\n let new_fakeEdges = {};\n let changes = \"\";\n let pkl_packages = retrievedPkl[\"packages\"];\n let current_packages = state.data[\"packages\"];\n\n // Saving current state data into a dictionary\n for (let k = 0, kjob; k < state.data.nodes.length; k++) {\n kjob = state.data.nodes[k];\n current_jobs[kjob.id] = kjob;\n }\n // Saving retrieved jobs into a dictionary\n for (let j = 0, job; j < retrievedPkl.pkl_content.length; j++) {\n job = retrievedPkl.pkl_content[j];\n jobs[job.name] = job;\n }\n\n // Updating list of packages and adding to shape change\n // Shape change currently not working\n for (let pkl_package in pkl_packages) {\n if (!Object.keys(current_packages).includes(pkl_package)) {\n current_packages[pkl_package] = pkl_packages[pkl_package];\n //console.log(pkl_packages[pkl_package]);\n for (let index in pkl_packages[pkl_package]) {\n let index_i = parseInt(index);\n let job_name = pkl_packages[pkl_package][index_i];\n //console.log(job_name);\n shapeChanges[job_name] = \"hexagon\";\n //console.log(index_i);\n //console.log(pkl_packages[pkl_package].length);\n let next = index_i + 1;\n //console.log(next);\n if (next < pkl_packages[pkl_package].length) {\n //console.log(pkl_packages[pkl_package][index_i]);\n //console.log(pkl_packages[pkl_package][next]);\n if (\n current_jobs[pkl_packages[pkl_package][index_i]].level ===\n current_jobs[pkl_packages[pkl_package][next]].level\n ) {\n new_fakeEdges[pkl_packages[pkl_package][index_i]] =\n pkl_packages[pkl_package][next];\n }\n }\n }\n }\n }\n\n let requireUpdate = false;\n DEBUG && console.log(\"Current ts: \" + retrievedPkl.pkl_timestamp);\n\n if (state.data.nodes) {\n for (let i = 0; i < state.data.nodes.length; i++) {\n // console.log(newNodes[i].id);\n //console.log(state.data.nodes[i]);\n // console.log(jobs[ newNodes[i].id ]);\n\n if (\n state.data.nodes[i].status_code !==\n jobs[state.data.nodes[i].id].status_code ||\n state.data.nodes[i].package !==\n jobs[state.data.nodes[i].id].package ||\n state.data.nodes[i].minutes !==\n jobs[state.data.nodes[i].id].minutes ||\n state.data.nodes[i].minutes_queue !==\n jobs[state.data.nodes[i].id].minutes_queue\n ) {\n // changes += state.data.nodes[i].id + \" from \" + state.data.nodes[i].status + \" to \" + jobs[ state.data.nodes[i].id ].status + \" || \";\n if (\n state.data.nodes[i].status_code !==\n jobs[state.data.nodes[i].id].status_code\n ) {\n changes +=\n timeStampToDate(retrievedPkl.pkl_timestamp) +\n \": \" +\n state.data.nodes[i].id +\n \" to \" +\n jobs[state.data.nodes[i].id].status +\n \"\\n\";\n } else {\n // Not decided.\n }\n\n if (\n state.data.nodes[i].package !==\n jobs[state.data.nodes[i].id].package\n ) {\n changes +=\n timeStampToDate(retrievedPkl.pkl_timestamp) +\n \": \" +\n state.data.nodes[i].id +\n \" added to \" +\n jobs[state.data.nodes[i].id].package +\n \"\\n\";\n let current_job = current_jobs[state.data.nodes[i].id];\n let children_current = current_job.children_list;\n for (let child in children_current) {\n if (\n jobs[children_current[child]].package ===\n jobs[state.data.nodes[i].id].package\n ) {\n edgeUpdates[state.data.nodes[i].id] =\n children_current[child];\n }\n }\n }\n // If status change, add to change colors. Set to new status color.\n if (\n state.data.nodes[i].status_code !==\n jobs[state.data.nodes[i].id].status_code\n ) {\n colorChanges[state.data.nodes[i].id] =\n jobs[state.data.nodes[i].id].status_color;\n state.data.nodes[i].status_code =\n jobs[state.data.nodes[i].id].status_code;\n state.data.nodes[i].status_color =\n jobs[state.data.nodes[i].id].status_color;\n state.data.nodes[i].status =\n jobs[state.data.nodes[i].id].status;\n }\n\n state.data.nodes[i].package =\n jobs[state.data.nodes[i].id].package;\n state.data.nodes[i].dashed = jobs[state.data.nodes[i].id].dashed;\n state.data.nodes[i].shape = jobs[state.data.nodes[i].id].shape;\n state.data.nodes[i].out = jobs[state.data.nodes[i].id].out;\n state.data.nodes[i].err = jobs[state.data.nodes[i].id].err;\n state.data.nodes[i].minutes =\n jobs[state.data.nodes[i].id].minutes;\n state.data.nodes[i].minutes_queue =\n jobs[state.data.nodes[i].id].minutes_queue;\n state.data.nodes[i].submit = jobs[state.data.nodes[i].id].submit;\n state.data.nodes[i].start = jobs[state.data.nodes[i].id].start;\n state.data.nodes[i].finish = jobs[state.data.nodes[i].id].finish;\n //console.log(state.data.nodes[i].status_color)\n\n requireUpdate = true;\n }\n }\n\n if (requireUpdate) {\n DEBUG && console.log(\"New ts: \" + retrievedPkl.pkl_timestamp);\n state.data.pkl_timestamp = retrievedPkl.pkl_timestamp;\n\n if (state.pklchanges) {\n state.pklchanges = changes + state.pklchanges;\n } else {\n state.pklchanges = changes;\n }\n\n for (var key in colorChanges) {\n //console.log( key, colorChanges[key] );\n updateGraphColor(key, colorChanges[key], state);\n }\n\n for (var key_shape in shapeChanges) {\n updateGraphShape(key_shape, shapeChanges[key_shape], state);\n updateGraphBorder(key_shape, state);\n }\n\n for (var key_edge in edgeUpdates) {\n updateEdgeStyle(key_edge + \"-\" + edgeUpdates[key_edge], state);\n }\n\n for (var key_added in new_fakeEdges) {\n addFakeEdge(key_added, new_fakeEdges[key_added], state);\n }\n } else {\n DEBUG && console.log(\"No changes but updating pkl anyway.\");\n }\n }\n }\n return {\n ...state,\n pkldata: retrievedPkl,\n loadingPkl: false,\n loadingJobMonitor: false,\n };\n case NAVIGATE_AFTER_LOADING_GRAPH:\n const running = action.payload;\n if (state.visNetwork) {\n var found = false;\n const cScale = 0.5;\n if (running === true) {\n //console.log(\"Search Running\")\n found = navToLatest(\n RunningCode,\n true,\n cScale,\n state.visNetwork,\n state.data,\n state\n );\n if (!found) {\n found = navToLatest(\n QueueCode,\n true,\n cScale,\n state.visNetwork,\n state.data,\n state\n );\n if (!found) {\n found = navToLatest(\n SubmittedCode,\n true,\n cScale,\n state.visNetwork,\n state.data,\n state\n );\n if (!found) {\n found = navToLatest(\n CompletedCode,\n true,\n cScale,\n state.visNetwork,\n state.data,\n state\n );\n }\n }\n }\n } else {\n found = navToLatest(\n FailedCode,\n true,\n cScale,\n state.visNetwork,\n state.data,\n state\n );\n if (!found) {\n found = navToLatest(\n CompletedCode,\n true,\n cScale,\n state.visNetwork,\n state.data,\n state\n );\n }\n }\n if (!found) {\n navToLatest(\n WaitingCode,\n false,\n cScale,\n state.visNetwork,\n state.data,\n state\n );\n }\n }\n return {\n ...state,\n };\n case NAVIGATE_GRAPH_TO:\n const Id = action.payload;\n if (state.visNetwork) {\n const position = findIdinGraph(Id, state);\n //const currentPosition = state.visNetwork.getPositions([Id]);\n if (position.x && position.y) {\n navigateGraph(Id, position.x, position.y, 0.9, state.visNetwork);\n //state.visNetwork.selectNodes([Id]);\n state.selection = [Id];\n }\n }\n return {\n ...state,\n };\n case NAVIGATE_TO_GROUP_GRAPH:\n const IdList = action.payload;\n if (state.visNetwork) {\n state.visNetwork.unselectAll();\n const currentLength = IdList.length;\n const Id = IdList[parseInt(Math.floor(IdList.length / 2))];\n const rescale = Math.sqrt(currentLength) * 0.065;\n var currentPosition = state.visNetwork.getPositions(Id);\n if (currentPosition[Id]) {\n navigateGraph(\n null,\n currentPosition[Id].x,\n currentPosition[Id].y,\n 0.6 - rescale,\n state.visNetwork\n );\n state.visNetwork.selectNodes(IdList);\n }\n }\n return {\n ...state,\n };\n case NAVIGATE_TO_LATEST:\n const { status, latest } = action.payload;\n navToLatest(status, latest, 0.9, state.visNetwork, state.data, state);\n return {\n ...state,\n };\n case SET_LOADING_GRAPH:\n return {\n ...state,\n loadingGraph: true,\n enabledGraphSearch: false,\n };\n case SET_VIS_DATA:\n return {\n ...state,\n visNodes: action.payload,\n };\n case SET_VIS_NETWORK:\n return {\n ...state,\n visNetwork: action.payload,\n };\n case SET_FOUND_NODES:\n const string = action.payload;\n if (state.data && state.data.nodes) {\n const foundNodes = state.data.nodes.filter(\n (node) => node.id.toUpperCase().indexOf(string) >= 0\n );\n\n if (foundNodes && foundNodes.length > 0) {\n state.foundNodes = foundNodes;\n const position = findIdinGraph(foundNodes[0].id, state);\n if (position.x && position.y) {\n navigateGraph(\n foundNodes[0].id,\n position.x,\n position.y,\n 0.9,\n state.visNetwork\n );\n state.selection = [foundNodes[0].id];\n }\n } else {\n state.foundNodes = null;\n }\n }\n return {\n ...state,\n loadingSearchJob: false,\n //foundNodes: action.payload,\n };\n case SET_PKL_CHANGES:\n return {\n ...state,\n pklchanges: action.payload,\n };\n case SET_LOADING_SEARCH_JOB:\n return {\n ...state,\n loadingSearchJob: true,\n };\n case SET_LOADING_JOB_MONITOR:\n return {\n ...state,\n loadingJobMonitor: true,\n };\n case SET_LOADING_PKL:\n return {\n ...state,\n loadingPkl: true,\n };\n case SET_AUTOUPDATE_PKL:\n return {\n ...state,\n startAutoUpdatePkl: action.payload,\n };\n case UPDATE_NODES:\n return {\n ...state,\n data: action.payload,\n };\n case CLEAN_ONLY_GRAH_DATA:\n return {\n ...state,\n data: null,\n selection: null,\n enabledGraphSearch: true,\n visNodes: null,\n visNetwork: null,\n foundNodes: null,\n current_grouped: \"none\",\n current_layout: \"standard\",\n graphSelectedNodes: null,\n };\n case SHOULD_UPDATE_GRAPH:\n return {\n ...state,\n shouldUpdateGraph: action.payload,\n };\n case CLEAN_GRAPH_DATA:\n return {\n ...state,\n data: null,\n selection: null,\n enabledGraphSearch: true,\n loadingGraph: false,\n loadingPkl: false,\n visNodes: null,\n visNetwork: null,\n foundNodes: null,\n experimentRunning: false,\n experiment: null,\n current_grouped: \"none\",\n current_layout: \"standard\",\n //allowJobMonitor: false,\n performancedata: null,\n canSelect: false,\n currentSelected: [],\n currentCommand: null,\n graphSelectedNodes: null,\n //startAutoUpdatePkl: false,\n };\n case CLEAN_PKL_DATA:\n return {\n ...state,\n shouldUpdateGraph: false,\n startAutoUpdatePkl: false,\n pklchanges: null,\n };\n case CLEAN_NAV_DATA:\n return {\n ...state,\n foundNodes: null,\n startAutoUpdatePkl: false,\n selection: null,\n };\n case UPDATE_SELECTION:\n return {\n ...state,\n selection: action.payload,\n };\n case UPDATE_GRAPH_SELECTED_NODES:\n //const selectedNodes = action.payload;\n state.graphSelectedNodes = null;\n state.currentCommandGraph = null;\n if (state.selection) {\n const currentSelectedNodes = state.visNetwork.getSelectedNodes();\n DEBUG && console.log(currentSelectedNodes);\n state.graphSelectedNodes = currentSelectedNodes;\n }\n return {\n ...state,\n };\n case SET_CURRENT_COMMAND:\n return {\n ...state,\n currentCommandGraph: action.payload,\n canCopyToClipboard: true,\n };\n // case DEACTIVATE_COPY_TO:\n // return {\n // ...state,\n // canCopyToClipboard: false,\n // };\n default:\n return null;\n }\n};\n","import React, { useReducer, useContext } from \"react\";\nimport axios from \"axios\";\nimport GraphContext from \"./graphContext\";\nimport GraphReducer from \"./graphReducer\";\nimport ExperimentContext from \"../experiment/experimentContext\";\n\nimport {\n GET_GRAPH,\n GET_PKL_DATA,\n CLEAN_GRAPH_DATA,\n CLEAN_ONLY_GRAH_DATA,\n SET_LOADING_GRAPH,\n SET_AUTOUPDATE_PKL,\n SET_VIS_DATA,\n SET_VIS_NETWORK,\n UPDATE_SELECTION,\n SET_FOUND_NODES,\n SET_LOADING_SEARCH_JOB,\n SET_LOADING_PKL,\n SHOULD_UPDATE_GRAPH,\n SET_LOADING_JOB_MONITOR,\n SET_CURRENT_COMMAND,\n NAVIGATE_GRAPH_TO,\n CLEAN_PKL_DATA,\n CLEAN_NAV_DATA,\n NAVIGATE_AFTER_LOADING_GRAPH,\n NAVIGATE_TO_GROUP_GRAPH,\n NAVIGATE_TO_LATEST,\n UPDATE_GRAPH_SELECTED_NODES,\n //DEACTIVATE_COPY_TO,\n} from \"../types\";\n\nimport { AUTOSUBMIT_API_SOURCE, DEBUG } from \"../vars\";\n\n//import { timeStampToDate } from \"../utils\";\n\nconst GraphState = (props) => {\n const initialState = {\n data: null,\n visNodes: null,\n visNetwork: null,\n loadingGraph: false,\n loadingPkl: false,\n loadingJobMonitor: false,\n enabledGraphSearch: true,\n loadingSearchJob: false,\n startAutoUpdatePkl: false,\n shouldUpdateGraph: false,\n pklchanges: null,\n //currentSelected: [],\n currentCommandGraph: null,\n current_grouped: \"none\",\n current_layout: \"standard\",\n selection: null,\n foundNodes: null,\n graphSelectedNodes: null,\n pkldata: null,\n };\n\n const [state, dispatch] = useReducer(GraphReducer, initialState);\n const localserver = AUTOSUBMIT_API_SOURCE;\n //const localserver = \"http://84.88.185.94:8081\";\n const debug = DEBUG;\n\n const experimentContext = useContext(ExperimentContext);\n const { updateExperimentTimeStamp, experimentRunning } = experimentContext;\n\n // Get Experiment Graph\n const getExperimentGraph = async (\n expid,\n grouped = \"none\",\n layout = \"standard\"\n ) => {\n cleanOnlyGraphData();\n setLoadingGraph();\n const res = await axios.get(\n `${localserver}/graph/${expid}/${layout}/${grouped}`\n );\n debug && console.log(res.data);\n const resdata = res.data;\n dispatch({\n type: GET_GRAPH,\n payload: { resdata, grouped, layout },\n });\n };\n\n // Get Experiment Pkl Data for Graph changes update\n const getExperimentPkl = async (expid, timeStamp) => {\n // if (state.isGrouped === false){\n if (experimentRunning === false) return;\n setLoadingPkl();\n setLoadingJobMonitor();\n //timeStamp = 1000;\n debug &&\n console.log(\n \"Exp: \" + expid + \"\\t\" + timeStamp + \"\\t\" + experimentRunning\n );\n const res = await axios.get(`${localserver}/pklinfo/${expid}/${timeStamp}`);\n debug && console.log(res.data);\n let retrievedPkl = res.data;\n dispatch({\n type: GET_PKL_DATA,\n payload: retrievedPkl,\n });\n\n updateExperimentTimeStamp(retrievedPkl.pkl_timestamp);\n };\n\n const navigateAfterLoadGraph = (running = false) => {\n debug && console.log(\"Nav. After Loading\");\n dispatch({ type: NAVIGATE_AFTER_LOADING_GRAPH, payload: running });\n };\n\n const navigateTo = (Id) => {\n debug && console.log(\"Nav. To\");\n dispatch({ type: NAVIGATE_GRAPH_TO, payload: Id });\n };\n\n const navToLatest = (statusCode, latest) => {\n debug && console.log(\"Nav. To Latest\");\n dispatch({\n type: NAVIGATE_TO_LATEST,\n payload: { status: statusCode, latest: latest },\n });\n };\n\n const navigateToGroup = (IdList) => {\n debug && console.log(\"Nav. To Group.\");\n dispatch({\n type: NAVIGATE_TO_GROUP_GRAPH,\n payload: IdList,\n });\n };\n\n const searchJobInGraph = async (string) => {\n setLoadingSearchJob();\n dispatch({\n type: SET_FOUND_NODES,\n payload: string.toUpperCase(),\n });\n };\n\n const setCurrentCommandGraph = async (command) => {\n // for change status\n //let arrayNames = [];\n\n //console.log(command);\n dispatch({\n type: SET_CURRENT_COMMAND,\n payload: command,\n });\n };\n\n // Clean state data\n const cleanOnlyGraphData = () => dispatch({ type: CLEAN_ONLY_GRAH_DATA });\n const cleanGraphData = () => dispatch({ type: CLEAN_GRAPH_DATA });\n const cleanPklData = () => dispatch({ type: CLEAN_PKL_DATA });\n const cleanNavData = () => dispatch({ type: CLEAN_NAV_DATA });\n // Loading\n const setLoadingGraph = () => dispatch({ type: SET_LOADING_GRAPH });\n const setLoadingSearchJob = () => dispatch({ type: SET_LOADING_SEARCH_JOB });\n const setLoadingPkl = () => dispatch({ type: SET_LOADING_PKL });\n const setLoadingJobMonitor = () =>\n dispatch({ type: SET_LOADING_JOB_MONITOR });\n\n // Set Data\n const setAutoUpdatePkl = (value) =>\n dispatch({ type: SET_AUTOUPDATE_PKL, payload: value });\n const setVisData = (value) =>\n dispatch({ type: SET_VIS_DATA, payload: value });\n const setVisNetwork = (value) =>\n dispatch({ type: SET_VIS_NETWORK, payload: value });\n const setUpdateGraph = (value) =>\n dispatch({ type: SHOULD_UPDATE_GRAPH, payload: value });\n const updateSelection = (currentSelection) =>\n dispatch({ type: UPDATE_SELECTION, payload: currentSelection });\n const updateGraphSelectedNodes = () =>\n dispatch({ type: UPDATE_GRAPH_SELECTED_NODES });\n //const deactivateCanCopyTo = () => dispatch({ type: DEACTIVATE_COPY_TO });\n\n return (\n \n {props.children}\n \n );\n};\n\nexport default GraphState;\n","import {\n GET_TREE,\n SET_LOADING_TREE_PKL,\n SET_LOADING_TREE,\n SET_LOADING_TREE_REFRESH,\n SET_LOADING_FILTER,\n FILTER_TREEVIEW,\n PKL_TREE_LOADED,\n SET_FANCYTREE,\n CLEAN_TREE_DATA,\n CLEAN_TREE_PKL_DATA,\n SET_AUTOUPDATE_TREE_PKL,\n UPDATE_SELECTION_TREE,\n CLEAR_FILTER_TREE,\n SET_START_TREE_SELECTION,\n} from \"../types\";\n\nimport { timeStampToDate } from \"../utils\";\n\nexport default (state, action) => {\n switch (action.type) {\n case GET_TREE:\n return {\n ...state,\n treedata: action.payload,\n loadingTree: false,\n enabledTreeSearch: true,\n };\n case SET_LOADING_TREE_PKL:\n return {\n ...state,\n loadingTreePkl: true,\n };\n case SET_LOADING_TREE:\n return {\n ...state,\n loadingTree: true,\n enabledTreeSearch: false,\n };\n case SET_LOADING_TREE_REFRESH:\n return {\n ...state,\n loadingTreeRefresh: true,\n };\n case SET_LOADING_FILTER:\n return {\n ...state,\n loadingFilterTree: true,\n };\n case PKL_TREE_LOADED:\n const retrievedPklTree = action.payload;\n let jobs = {};\n if (\n state.treedata !== null &&\n retrievedPklTree.has_changed === true &&\n retrievedPklTree.pkl_content.length > 0\n ) {\n // Jobs currently on state\n let changes = \"\";\n let currentJobs = state.treedata.jobs;\n let referenceHeaders = state.treedata.reference;\n let currentPackages = referenceHeaders[\"packages\"];\n const completed_tag = referenceHeaders[\"completed_tag\"];\n const running_tag = referenceHeaders[\"running_tag\"];\n const queuing_tag = referenceHeaders[\"queuing_tag\"];\n const failed_tag = referenceHeaders[\"failed_tag\"];\n const check_mark = referenceHeaders[\"check_mark\"];\n\n // Building dictionary of retrieved jobs\n for (let j = 0, job; j < retrievedPklTree.pkl_content.length; j++) {\n job = retrievedPklTree.pkl_content[j];\n jobs[job.name] = job;\n }\n // Updating current jobs\n for (let i = 0, cjob, ijob; i < currentJobs.length; i++) {\n // Job from current jobs\n cjob = currentJobs[i];\n // Job from pkl. Name is id in treedata.\n ijob = jobs[cjob.id];\n // If there is a difference\n if (\n cjob.status_code !== ijob.status_code ||\n cjob.minutes !== ijob.minutes ||\n cjob.minutes_queue !== ijob.minutes_queue\n ) {\n let is_change_status = false;\n let new_status = cjob.status;\n let old_status = ijob.status;\n // Detecting status change\n if (cjob.status_code !== ijob.status_code) {\n is_change_status = true;\n new_status = ijob.status;\n old_status = cjob.status;\n changes +=\n timeStampToDate(retrievedPklTree.pkl_timestamp) +\n \": \" +\n cjob.id +\n \" to \" +\n new_status +\n \"\\n\";\n }\n cjob.status_code = ijob.status_code;\n cjob.status = ijob.status;\n cjob.status_color = ijob.status_color;\n cjob.minutes = ijob.minutes;\n cjob.minutes_queue = ijob.minutes_queue;\n cjob.wrapper = ijob.wrapper;\n cjob.out = ijob.out;\n cjob.err = ijob.err;\n cjob.submit = ijob.submit;\n cjob.start = ijob.start;\n cjob.finish = ijob.finish;\n // Parents are those groups to which a job belongs in the tree\n let tree_parent_wrapper = \"Wrapper: \" + ijob.wrapper;\n if (!cjob.tree_parents.includes(tree_parent_wrapper)) {\n cjob.tree_parents.push(tree_parent_wrapper);\n }\n // Assign wrapper code to current job\n cjob.wrapper_code = ijob.wrapper_id;\n // Building title according to retrieved data\n let newTitle =\n ijob.title +\n \" \" +\n (cjob.parents === 0 ? retrievedPklTree.source_tag : \"\") +\n (cjob.children === 0 ? retrievedPklTree.target_tag : \"\") +\n (cjob.sync === true ? retrievedPklTree.sync_tag : \"\") +\n (ijob.wrapper_id !== 0 ? ijob.wrapper_tag : \"\");\n cjob.title = newTitle;\n // Find the corresponding node in the existing tree\n let thenode = state.fancyTree.getNodesByRef(cjob.id);\n if (thenode) {\n // Update title of all node ocurrences\n for (let thenode_i in thenode) {\n thenode[thenode_i].setTitle(newTitle);\n }\n // Find all parents of node\n const parents = cjob.tree_parents;\n // Make sure parents contain the children\n let wrapper_parent = state.fancyTree.getNodesByRef(\n tree_parent_wrapper\n );\n //console.log(wrapper_parent);\n if (wrapper_parent && wrapper_parent.length > 0) {\n let children = wrapper_parent[0].children;\n //console.log(children);\n let found_child = false;\n for (let index_j in children) {\n let current_name = children[index_j].refKey;\n //console.log(current_name);\n if (current_name === cjob.id) {\n found_child = true;\n }\n }\n // If the job is not present in the wrapper folder, add it.\n if (found_child === false) {\n wrapper_parent[0].children.push({\n title: cjob.title,\n refKey: cjob.id,\n data: \"Empty\",\n children: [],\n });\n }\n }\n // Traverse parents to update title\n for (let parent in parents) {\n let header_data = referenceHeaders[parents[parent]];\n if (header_data) {\n if (is_change_status === true) {\n if (new_status === \"COMPLETED\") {\n header_data.completed += 1;\n }\n if (new_status === \"RUNNING\") {\n header_data.running += 1;\n }\n if (new_status === \"QUEUING\") {\n header_data.queuing += 1;\n }\n if (new_status === \"FAILED\") {\n header_data.failed += 1;\n }\n if (old_status === \"RUNNING\") {\n header_data.running -= 1;\n }\n if (old_status === \"QUEUING\") {\n header_data.queuing -= 1;\n }\n if (old_status === \"FAILED\") {\n header_data.failed -= 1;\n }\n }\n // Setting new title\n const new_completed_tag = completed_tag\n .replace(\"%C\", header_data.completed)\n .replace(\"%T\", header_data.total)\n .replace(\n \"%B\",\n header_data.completed === header_data.total\n ? \"yellow\"\n : \"#ffffb3\"\n );\n const new_check_mark =\n header_data.completed === header_data.total\n ? check_mark\n : \"\";\n const new_running_tag =\n header_data.running > 0\n ? running_tag.replace(\"%R\", header_data.running)\n : \"\";\n const new_queuing_tag =\n header_data.queuing > 0\n ? queuing_tag.replace(\"%Q\", header_data.queuing)\n : \"\";\n const new_failed_tag =\n header_data.failed > 0\n ? failed_tag.replace(\"%F\", header_data.failed)\n : \"\";\n let theparent = state.fancyTree.getNodesByRef(\n parents[parent]\n );\n //console.log(parent);\n if (theparent) {\n //Sets new title\n let new_title =\n parents[parent] +\n new_completed_tag +\n new_failed_tag +\n new_running_tag +\n new_queuing_tag +\n new_check_mark;\n theparent[0].setTitle(new_title);\n }\n }\n }\n }\n }\n }\n const packages_from_pkl = retrievedPklTree[\"packages\"];\n for (let package_pkl of packages_from_pkl) {\n if (!currentPackages.includes(package_pkl)) {\n changes +=\n timeStampToDate(retrievedPklTree.pkl_timestamp) +\n \": \" +\n package_pkl +\n \" has been added.\";\n // If a new wrapper has been found in the pkl\n // debug && console.log(\"New wrapper found: \" + package_pkl);\n currentPackages.push(package_pkl);\n //console.log(currentPackages);\n let wrapper_pre_title = \"Wrapper: \" + package_pkl;\n referenceHeaders[wrapper_pre_title] = {\n completed: 0,\n failed: 0,\n queuing: 0,\n running: 0,\n total: 0,\n };\n let header_wrapper = referenceHeaders[wrapper_pre_title];\n // eslint-disable-next-line no-loop-func\n let children_jobs = currentJobs.filter(function (x) {\n return x.wrapper === package_pkl;\n });\n let children_list = [];\n for (let k = 0; k < children_jobs.length; k++) {\n if (children_jobs[k].status === \"COMPLETED\") {\n header_wrapper.completed += 1;\n } else if (children_jobs[k].status === \"FAILED\") {\n header_wrapper.failed += 1;\n } else if (children_jobs[k].status === \"QUEUING\") {\n header_wrapper.queuing += 1;\n } else if (children_jobs[k].status === \"RUNNING\") {\n header_wrapper.running += 1;\n }\n children_list.push({\n title: children_jobs[k].title,\n refKey: children_jobs[k].id,\n data: \"Empty\",\n children: [],\n });\n }\n header_wrapper.total = children_jobs.length;\n\n const new_completed_tag = completed_tag\n .replace(\"%C\", header_wrapper.completed)\n .replace(\"%T\", header_wrapper.total)\n .replace(\n \"%B\",\n header_wrapper.completed === header_wrapper.total\n ? \"yellow\"\n : \"#ffffb3\"\n );\n const new_check_mark =\n header_wrapper.completed === header_wrapper.total\n ? check_mark\n : \"\";\n const new_running_tag =\n header_wrapper.running > 0\n ? running_tag.replace(\"%R\", header_wrapper.running)\n : \"\";\n const new_queuing_tag =\n header_wrapper.queuing > 0\n ? queuing_tag.replace(\"%Q\", header_wrapper.queuing)\n : \"\";\n const new_failed_tag =\n header_wrapper.failed > 0\n ? failed_tag.replace(\"%F\", header_wrapper.failed)\n : \"\";\n const wrapper_title =\n wrapper_pre_title +\n new_completed_tag +\n new_failed_tag +\n new_running_tag +\n new_queuing_tag +\n new_check_mark;\n let rootNode = state.fancyTree.getRootNode();\n // eslint-disable-next-line no-unused-vars\n let wrapper_branch_root = rootNode.addChildren({\n title: wrapper_title,\n folder: true,\n refKey: wrapper_pre_title,\n expanded: false,\n children: children_list,\n });\n }\n }\n // if require update\n if (retrievedPklTree.has_changed === true) {\n if (state.pkltreechanges) {\n state.pkltreechanges = changes + state.pkltreechanges;\n //setPklTreeChanges(changes + state.pkltreechanges);\n } else {\n state.pkltreechanges = changes;\n //setPklTreeChanges(changes);\n }\n }\n }\n return {\n ...state,\n loadingTreeRefresh: false,\n loadingTreePkl: false,\n };\n case FILTER_TREEVIEW:\n const string = action.payload;\n if (state.treedata && state.fancyTree) {\n let count = 0;\n if (string.indexOf(\"*\") > -1) {\n const fields = string.split(\"*\");\n let result = false;\n count = state.fancyTree.filterNodes(function (node) {\n let string_test = node.title;\n for (let i = 0; i < fields.length; i++) {\n if (fields[i].length > 0) {\n if (string_test.indexOf(fields[i]) > -1) {\n //debug && console.log(fields[i] + \" found in \" + string_test);\n let found_index =\n string_test.indexOf(fields[i]) + fields[i].length;\n string_test = string_test.substring(found_index);\n //debug && console.log(found_index + \" in \" + string_test);\n result = true;\n } else {\n // debug &&\n // console.log(fields[i] + \" Not found in \" + string_test);\n result = false;\n break;\n }\n }\n }\n return result;\n });\n } else {\n count = state.fancyTree.filterNodes(string);\n }\n //debug && console.log(count);\n state.returnFilter = count;\n } else {\n state.returnFilter = 0;\n }\n return {\n ...state,\n loadingFilterTree: false,\n returnFilter: action.payload,\n };\n case SET_FANCYTREE:\n return {\n ...state,\n fancyTree: action.payload,\n };\n case SET_AUTOUPDATE_TREE_PKL:\n return {\n ...state,\n startAutoUpdateTreePkl: action.payload,\n };\n case CLEAN_TREE_DATA:\n return {\n ...state,\n treedata: null,\n enabledTreeSearch: true,\n loadingTree: false,\n loadingTreePkl: false,\n fancyTree: null,\n returnFiler: 0,\n //canSelect: false,\n };\n case CLEAN_TREE_PKL_DATA:\n return {\n ...state,\n startAutoUpdateTreePkl: false,\n pkltreechanges: null,\n };\n case CLEAR_FILTER_TREE:\n if (state.treedata && state.fancyTree) {\n state.fancyTree.clearFilter();\n }\n return {\n ...state,\n returnFilter: 0,\n };\n case UPDATE_SELECTION_TREE:\n return {\n ...state,\n selectedTreeNode: action.payload,\n };\n case SET_START_TREE_SELECTION:\n if (state.fancyTree) {\n state.fancyTree.activeNode = state.fancyTree.rootNode;\n }\n return {\n ...state,\n };\n default:\n return null;\n }\n};\n","import React, { useReducer } from \"react\";\nimport axios from \"axios\";\nimport TreeContext from \"./treeContext\";\nimport TreeReducer from \"./treeReducer\";\n\nimport {\n GET_TREE,\n SET_LOADING_TREE_REFRESH,\n SET_LOADING_TREE_PKL,\n PKL_TREE_LOADED,\n SET_FANCYTREE,\n SET_LOADING_FILTER,\n CLEAN_TREE_DATA,\n CLEAN_TREE_PKL_DATA,\n SET_AUTOUPDATE_TREE_PKL,\n UPDATE_SELECTION_TREE,\n CLEAR_FILTER_TREE,\n FILTER_TREEVIEW,\n SET_LOADING_TREE,\n SET_START_TREE_SELECTION,\n} from \"../types\";\n\n// import { timeStampToDate } from \"../utils\";\n\nimport { AUTOSUBMIT_API_SOURCE, DEBUG } from \"../vars\";\n\nconst TreeState = (props) => {\n const initialState = {\n treedata: null,\n loadingTree: false,\n enabledTreeSearch: true,\n loadingTreePkl: false,\n loadingTreeRefresh: false,\n loadingFilterTree: false,\n fancyTree: null,\n //canSelect: false,\n startAutoUpdateTreePkl: false,\n pkltreechanges: null,\n selectedTreeNode: null,\n };\n\n const [state, dispatch] = useReducer(TreeReducer, initialState);\n const localserver = AUTOSUBMIT_API_SOURCE;\n const debug = DEBUG;\n\n const getExperimentTree = async (expid) => {\n setLoadingTree();\n\n const res = await axios.get(`${localserver}/tree/${expid}`);\n debug && console.log(res.data);\n dispatch({\n type: GET_TREE,\n payload: res.data,\n });\n };\n\n // Get experiment pkl data for tree\n const getExperimentTreePkl = async (expid, timeStamp) => {\n //console.log(expid, timeStamp);\n setLoadingTreePkl();\n setLoadingTreeRefresh();\n const res = await axios.get(\n `${localserver}/pkltreeinfo/${expid}/${timeStamp}`\n );\n const retrievedPklTree = res.data;\n debug && console.log(retrievedPklTree);\n dispatch({\n type: PKL_TREE_LOADED,\n payload: retrievedPklTree,\n });\n };\n\n const filterTreeView = (string) => {\n setLoadingFilter();\n dispatch({\n type: FILTER_TREEVIEW,\n payload: string,\n });\n };\n\n const setFancyTree = (value) =>\n dispatch({ type: SET_FANCYTREE, payload: value });\n\n const updateSelectionTree = (currentSelected) => {\n dispatch({ type: UPDATE_SELECTION_TREE, payload: currentSelected });\n };\n\n const cleanTreeData = () => dispatch({ type: CLEAN_TREE_DATA });\n const cleanPklTreeData = () => dispatch({ type: CLEAN_TREE_PKL_DATA });\n const clearFilterTreeView = () =>\n dispatch({\n type: CLEAR_FILTER_TREE,\n });\n const setLoadingTree = () => dispatch({ type: SET_LOADING_TREE }); //here\n const setLoadingFilter = () => dispatch({ type: SET_LOADING_FILTER });\n const setLoadingTreeRefresh = () =>\n dispatch({ type: SET_LOADING_TREE_REFRESH });\n const setLoadingTreePkl = () => dispatch({ type: SET_LOADING_TREE_PKL });\n const setAutoUpdateTreePkl = (value) =>\n dispatch({ type: SET_AUTOUPDATE_TREE_PKL, payload: value });\n\n const setStartSelection = () => dispatch({ type: SET_START_TREE_SELECTION });\n\n return (\n \n {props.children}\n \n );\n};\n\nexport default TreeState;\n","import { SET_ALERT, REMOVE_ALERT } from '../types';\n\nexport default (state, action) => {\n switch (action.type) {\n case SET_ALERT:\n return action.payload;\n case REMOVE_ALERT:\n return null;\n default:\n return state;\n }\n};\n","import React, { useReducer } from 'react';\nimport AlertContext from './alertContext';\nimport AlertReducer from './alertReducer';\nimport { SET_ALERT, REMOVE_ALERT } from '../types';\n\nconst AlertState = props => {\n const initialState = null;\n\n const [state, dispatch] = useReducer(AlertReducer, initialState);\n\n // Set Alert\n const setAlert = (msg, type) => {\n dispatch({\n type: SET_ALERT,\n payload: { msg, type }\n });\n\n setTimeout(() => dispatch({ type: REMOVE_ALERT }), 5000);\n };\n\n return (\n \n {props.children}\n \n );\n};\n\nexport default AlertState;\n","import { \n SET_LOADING,\n GET_EXPERIMENT_STATS,\n CLEAR_STATS,\n SET_ERROR_STATS, } from '../types';\n\nexport default (state, action) => {\n switch (action.type) {\n case SET_LOADING:\n return {\n ...state,\n loading: true,\n };\n case GET_EXPERIMENT_STATS:\n const { result, requestResult, ticks } = action.payload;\n return {\n ...state,\n statdata: result,\n totaldata: requestResult,\n ticksdata: ticks,\n loading: false,\n };\n case CLEAR_STATS:\n return {\n ...state,\n statdata: null,\n totaldata: null,\n ticksdata: null,\n loading: false,\n isError: false,\n errorMessage: \"\",\n };\n case SET_ERROR_STATS:\n const { error, msg } = action.payload;\n return {\n ...state,\n isError: error,\n errorMessage: msg,\n }\n default:\n return state;\n }\n };","import React, { useReducer } from \"react\";\nimport axios from \"axios\";\nimport StatsContext from \"./statsContext\";\nimport StatsReducer from \"./statsReducer\";\nimport {\n SET_LOADING,\n GET_EXPERIMENT_STATS,\n CLEAR_STATS,\n SET_ERROR_STATS,\n} from \"../types\";\n\nimport { AUTOSUBMIT_API_SOURCE, DEBUG } from \"../vars\";\n\nconst StatsState = (props) => {\n const initialState = {\n loading: false,\n statdata: null,\n ticksdata: null,\n isError: false,\n totaldata: null,\n errorMessage: \"\",\n };\n\n const localserver = AUTOSUBMIT_API_SOURCE;\n //const localserver = \"https://earth.bsc.es/autosubmitapi/\";\n //const localserver = \"http://84.88.185.94:8081\";\n const debug = DEBUG;\n const [state, dispatch] = useReducer(StatsReducer, initialState);\n\n // Get Experiment Stats\n const getExperimentStats = async (expid, hours, type) => {\n debug && console.log(\"Getting...\");\n if (hours.length === 0) {\n hours = 0;\n }\n if (type.length === 0) {\n type = \"Any\";\n }\n\n setLoading();\n //cleanGraphData();\n const res = await axios.get(\n `${localserver}/stats/${expid}/${hours}/${type}`\n );\n let result = [];\n var requestResult = null;\n let ticks = [];\n debug && console.log(res.data);\n if (res.data) {\n if (res.data.error === true) {\n setIsError(true, res.data.error_message);\n } else {\n setIsError(false, \"\");\n }\n\n result.push([\n \"Jobs\",\n \"Queued\",\n \"Run\",\n \"Failed Jobs\",\n \"Failed Queued\",\n \"Fail Run\",\n ]);\n\n for (var i = 0; i < res.data.jobs.length; i++) {\n result.push([\n { v: i + 1, f: res.data.jobs[i] },\n res.data.stats.queued[i],\n res.data.stats.run[i],\n res.data.stats.failed_jobs[i],\n res.data.stats.fail_queued[i],\n res.data.stats.fail_run[i],\n ]);\n ticks.push({ v: i + 1, f: res.data.jobs[i] });\n }\n requestResult = res.data;\n }\n //console.log(ticks);\n dispatch({\n type: GET_EXPERIMENT_STATS,\n payload: { result, requestResult, ticks },\n });\n };\n\n // Clear stats data\n const clearStats = () => dispatch({ type: CLEAR_STATS });\n\n const setLoading = () => dispatch({ type: SET_LOADING });\n\n const setIsError = (error, msg) => {\n dispatch({\n type: SET_ERROR_STATS,\n payload: { error, msg },\n });\n };\n\n return (\n \n {props.children}\n \n );\n};\n\nexport default StatsState;\n","import React, { Component } from \"react\";\nimport { BrowserRouter as Router, Switch, Route } from \"react-router-dom\";\nimport Navbar from \"./components/layout/Navbar\";\nimport Alert from \"./components/layout/Alert\";\nimport About from \"./components/pages/About\";\nimport NotFound from \"./components/pages/NotFound\";\nimport ExperimentCentral from \"./components/pages/ExperimentCentral\";\nimport Home from \"./components/pages/Home\";\nimport Footer from \"./components/layout/Footer\";\nimport ExperimentState from \"./components/context/experiment/ExperimentState\";\nimport GraphState from \"./components/context/graph/GraphState\";\nimport TreeState from \"./components/context/tree/TreeState\";\nimport AlertState from \"./components/context/alert/AlertState\";\nimport StatsState from \"./components/context/statistics/StatsState\";\n\nimport \"./App.css\";\n\nclass App extends Component {\n render() {\n return (\n \n \n \n \n \n \n
    \n \n
    \n \n \n \n \n \n \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n );\n }\n}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\n\nReactDOM.render(, document.getElementById('root'));\n"],"sourceRoot":""} \ No newline at end of file diff --git a/build/static/js/main.a6d3bcb4.chunk.js b/build/static/js/main.a6d3bcb4.chunk.js deleted file mode 100644 index 8e21fdb48d0a656da9ba6e077a437a0ca78a19e5..0000000000000000000000000000000000000000 --- a/build/static/js/main.a6d3bcb4.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this["webpackJsonpreact-api"]=this["webpackJsonpreact-api"]||[]).push([[0],{40:function(e,t){e.exports="data:image/gif;base64,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"},46:function(e,t,a){e.exports=a(80)},79:function(e,t,a){},80:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),l=a(39),s=a.n(l),c=a(7),o=a(8),i=a(10),m=a(9),u=a(14),d=a(17),p=a(3),E=Object(n.createContext)(),b=a(40),g=a.n(b),h=function(){return r.a.createElement(n.Fragment,null,r.a.createElement("img",{src:g.a,alt:"Loading...",style:{width:"200px",margin:"auto",display:"block"}}))},f=function(e){var t=e.expidToken,a=Object(n.useContext)(E),l=a.loading,s=a.loadingState,c=a.experiment,o=a.experimentRunning;if(Object(n.useEffect)((function(){}),[]),null===c)return r.a.createElement(h,null);var i=c.expid,m=c.error,u=c.error_message;return l?r.a.createElement("span",null,"Loading..."):t?r.a.createElement("span",{className:"navbar-brand ml-4"},r.a.createElement("strong",null,i)," ",m&&r.a.createElement("pre",{className:"text-danger"},u)," ",s&&r.a.createElement("span",{className:"badge badge-dark text-right"},"LOADING..."),o&&!s&&r.a.createElement("span",{className:"badge badge-success text-right"},"RUNNING"),!o&&!s&&r.a.createElement("span",{className:"badge badge-secondary text-right"},"NOT RUNNING")):r.a.createElement("span",null)},N=function(e){var t=e.icon,a=e.title,l=Object(d.f)(),s=Object(n.useContext)(E),c=s.searchExperiments,o=s.experiment,i=Object(n.useState)(""),m=Object(p.a)(i,2),b=m[0],g=m[1],h=null;o&&(h=o.expid);return r.a.createElement("nav",{className:"navbar navbar-expand-sm navbar-dark bg-dark mb-1 p-1"},r.a.createElement("div",{className:"container"},r.a.createElement(u.b,{className:"navbar-brand",to:"/autosubmitapp/"},r.a.createElement("i",{className:t})," ",a),r.a.createElement("ul",{className:"navbar-nav mr-auto mt-2 mt-lg-0"},r.a.createElement("li",{className:"nav-item"},r.a.createElement(u.b,{className:"nav-link",to:"/autosubmitapp/"},"Home")),r.a.createElement("li",{className:"nav-item"},r.a.createElement(u.b,{className:"nav-link",to:"/autosubmitapp/about"},r.a.createElement("u",null,"About"))),r.a.createElement("li",{className:"nav-item"},h&&r.a.createElement(f,{expidToken:h}))),l&&"/autosubmitapp/"!==l.location.pathname&&"/autosubmitapp"!==l.location.pathname&&r.a.createElement("form",{className:"form-inline my-2 my-lg-0",onSubmit:function(e){e.preventDefault(),""!==b&&(c(b),l.push("/autosubmitapp/"))}},r.a.createElement("input",{type:"search",className:"form-control mr-sm-2",placeholder:"Search Experiments","aria-label":"Search",value:b,onChange:function(e){return g(e.target.value)}}),r.a.createElement("button",{className:"btn btn-outline-light my-2 my-sm-0",type:"submit"},"Search"))))};N.defaultProps={title:"Autosubmit Searcher",icon:"fas fa-home"};var A=N,v=Object(n.createContext)(),y=function(){var e=Object(n.useContext)(v).alert;return null!==e&&r.a.createElement("div",{className:"alert alert-".concat(e.type)},r.a.createElement("i",{className:"fas fa-info-circle"})," ",e.msg)},x=function(){return r.a.createElement(n.Fragment,null,r.a.createElement("h3",null,"User Information"),r.a.createElement("p",null,"For user instructions visit our user guide"," ",r.a.createElement("a",{href:"https://autosubmit.readthedocs.io/en/latest/autosubmit-gui.html"},"User Guide"),"."),r.a.createElement("p",null,"To request more information make a post in the issue"," ",r.a.createElement("a",{href:"https://earth.bsc.es/gitlab/es/autosubmit/issues/506"},"Autosubmit User Documentation"),"."),r.a.createElement("h3",null,"Bugs and Requests"),r.a.createElement("p",null,"If you find a bug or want to request some important feature, please open an issue at"," ",r.a.createElement("a",{href:"https://earth.bsc.es/gitlab/es/autosubmit/issues"},"Autosubmit Issues"),"."),r.a.createElement("p",null,"Version: 1.0.0-beta"))},S=function(){return r.a.createElement("div",null,r.a.createElement("h1",null,"Oops!"),r.a.createElement("p",null,"Looks like you are lost. Better go back home."),r.a.createElement(u.b,{to:"/autosubmitapp/",className:"btn btn-light"},"Back Home"))},k=function(e){e.expidToken,e.refTree;var t=Object(n.useContext)(E),a=t.loading,l=t.experiment;if(null===l)return r.a.createElement("div",{className:"footer bg-dark text-white "},r.a.createElement("div",{className:"card-footer p-0 px-2 scroll-x"},r.a.createElement("div",{className:"row text-right"},r.a.createElement("div",{className:"col"},"No data..."))));var s=l.owner,c=l.owner_id,o=l.time_last_mod,i=l.version,m=l.branch,u=l.hpc,d=l.description;return a?r.a.createElement("div",{className:"footer bg-dark text-white "},r.a.createElement("div",{className:"card-footer p-0 px-2 scroll-x"},r.a.createElement("div",{className:"row text-right"},r.a.createElement("div",{className:"col"},"Loading...")))):r.a.createElement("div",{className:"footer bg-dark text-white "},r.a.createElement("div",{className:"card-footer p-0 px-2 scroll-x"},r.a.createElement("div",{className:"row text-right"},r.a.createElement("div",{className:"col"},r.a.createElement("small",{className:"mr-2"},d),"|",r.a.createElement("small",{className:"mx-2"},r.a.createElement("strong",null,"Branch:")," ",m),"|",r.a.createElement("small",{className:"mx-2"},r.a.createElement("strong",null,"Hpc:")," ",u),"|",r.a.createElement("small",{className:"mx-2"},r.a.createElement("strong",null,"Owner:")," ",c," ",s," "),"|",r.a.createElement("small",{className:"mx-2"},r.a.createElement("strong",null,"Version:")," ",i),"|",r.a.createElement("small",{className:"mx-2"},r.a.createElement("strong",null,"Modified:")," ",o)))))},C=a(24),T="https://earth.bsc.es/autosubmitapi/",w={background:"lightpink",fontWeight:"bold"},O={background:"red",fontWeight:"bold",color:"white"},_={background:"yellow",fontWeight:"bold"},R={background:"cyan",fontWeight:"bold"},D={background:"green",fontWeight:"bold",color:"white"},B={background:"lightblue",fontWeight:"bold"},I={background:"gray",fontWeight:"bold",color:"white"},G={background:"white",color:"black",fontWeight:"bold"},j={background:"orange",fontWeight:"bold",color:"white"},U={background:"salmon",fontWeight:"bold",color:"white"},F={background:"lightsalmon",fontWeight:"bold"},P=function(e){Object(i.a)(a,e);var t=Object(m.a)(a);function a(){return Object(c.a)(this,a),t.apply(this,arguments)}return Object(o.a)(a,[{key:"shouldComponentUpdate",value:function(e,t){return!0===this.props.shouldUpdateGraph||(!(!e.data||!this.props.data||e.data.pkl_timestamp===this.props.data.pkl_timestamp)||e.loadingGraph!==this.props.loadingGraph)}},{key:"componentWillUnmount",value:function(){this.props.cleanGraphData(),this.props.clearStats()}},{key:"render",value:function(){if(this.props.loadingGraph)return r.a.createElement(h,null);if(!this.props.data)return r.a.createElement("div",{className:"card-body text-left",style:L},r.a.createElement("p",{className:"lead"},"Press ",r.a.createElement("span",{className:"badge badge-info"},"Classic")," to see the standard graph representation of the experiment."),r.a.createElement("p",null,"For the classic approach, the algorithm will first try to use graphviz, there are some constraints in place that try to identify those instances that could potentially make graphviz run forever. If an experiment is identified to be time-wise out of bounds for graphviz, it will be sent to the regular algorithm. Currently, the regular algorithm does not handle well wrappers; work is being done to developed a general algorithm."),r.a.createElement("p",{className:"lead"},"Press ",r.a.createElement("span",{className:"badge badge-info"},"Grouped")," to see the grouped by date-member graph representation of the experiment."),r.a.createElement("p",null,"If the experiment instance cannot be handled by graphviz, then it would not be possible to group it. Again, work is being done to overcome this."),r.a.createElement("p",{className:"lead"},"If the experiment is"," ",r.a.createElement("span",{className:"badge badge-success"},"RUNNING")," and the Graph has been rendered, press"," ",r.a.createElement("span",{className:"badge badge-dark"},"Start Job Monitor")," to start a live tracker of the changes on the experiment's jobs. This process will automatically update the graph's nodes colors and show a log of the detected changes."),r.a.createElement("p",{className:"lead"},"If there are any defined wrappers, they will be shown on the corresponding tab at the right side of the Graph. You can click on any member of that list and the nodes belonging to that wrapper will be highlighted."));var e=[],t=[],a=this.props.data.graphviz,l=this.props.data.groups,s=this.props.data.groups_data,u=this.props.current_grouped;if(!(this.props.data.nodes.length>0&&null!==this.props.data.edges))return r.a.createElement("div",{className:"card-body text-left",style:L},r.a.createElement("p",{className:"lead"},"Something has gone very wrong."),r.a.createElement("p",{className:"lead text-danger"},this.props.data.error_message));!0===a?this.props.data.nodes.map((function(t){return e.push({id:t.id,label:t.label,shape:t.shape,color:{background:t.status_color,border:"black"},status:t.status,x:t.x,y:t.y,shapeProperties:{borderDashes:t.dashed}})})):this.props.data.nodes.map((function(t){return e.push({id:t.id,label:t.label,shape:t.shape,color:{background:t.status_color,border:"black"},status:t.status,shapeProperties:{borderDashes:t.dashed},x:t.x,y:t.y})})),this.props.data.edges&&this.props.data.edges.map((function(e){return t.push({id:e.id,from:e.from,to:e.to,dashes:e.dashed,background:{enabled:e.is_wrapper,color:"rgba(63, 191, 63, 0.5)"},arrows:{to:{enabled:!e.dashed}}})})),this.props.data.fake_edges&&this.props.data.fake_edges.map((function(e){return t.push({id:e.id,from:e.from,to:e.to,dashes:e.dashed,background:{enabled:e.is_wrapper,color:"rgba(63, 191, 63, 0.5)"},arrows:{to:{enabled:!e.dashed}}})}));var d=new C.a.DataSet(e),p=new C.a.DataSet(t),E=!1;this.props.data.total_jobs<=500&&(E=!0);var b={autoResize:!0,edges:{arrows:{to:{enabled:!0}}},layout:{improvedLayout:!1,hierarchical:{nodeSpacing:190,blockShifting:!1,edgeMinimization:E,parentCentralization:!0,sortMethod:"hubsize",direction:"UD",enabled:!1}},interaction:{dragNodes:!0,hoverConnectedEdges:!0,hideEdgesOnDrag:!0,multiselect:!0,navigationButtons:!0},physics:{enabled:!1,stabilization:{enabled:!0,iterations:1e3}},nodes:{shape:"dot",font:{size:10}}},g={nodes:d,edges:p},f=function(e){Object(i.a)(a,e);var t=Object(m.a)(a);function a(){return Object(c.a)(this,a),t.apply(this,arguments)}return Object(o.a)(a,[{key:"shouldComponentUpdate",value:function(e,t){return!0===this.props.shouldUpdateGraph}},{key:"componentDidMount",value:function(){var e=this,t=new C.a.Network(this.refs.myRef,this.props.graph,this.props.options),a=this.props.groups_data,n=this.props.current_grouped;if(this.props.setVisNetwork(t),t.on("select",(function(a){a.nodes&&1===a.nodes.length&&(t.isCluster(a.nodes[0])||(e.props.updateSelection(a.nodes),e.props.updateCurrentSelected(a.nodes[0],e.props.data)))})),t.on("doubleClick",(function(e){if(e.nodes&&1===e.nodes.length&&t.isCluster(e.nodes[0])){var a={releaseFunction:function(e,t){return t}};t.openCluster(e.nodes[0],a)}})),this.props.clusterGroups){var r=this.props.clusterGroups;if("date-member"===n)for(var l,s=0;s0){var t=e,a=Math.floor(t/3600),n=Math.floor((t-3600*a)/60),r=t-3600*a-60*n;return a<10&&(a="0"+a),n<10&&(n="0"+n),r<10&&(r="0"+r),a+":"+n+":"+r}return"0:00:00"},J=function(e){var t=e.source,a=e.target,l=Object(n.useContext)(Q),s=Object(n.useContext)(E),c=s.currentSelected,o=s.setCurrentCommand,i=s.experiment,m=s.currentCommand,u=l.graphSelectedNodes,d=l.setCurrentCommandGraph,p=l.currentCommandGraph,b=null;i&&(b=i.expid);var g="graph-only"===t?u:c,h="graph-only"===t?p:m,f="graph-only"===t?"Invalid Selection: You have to select at least one job from the Graph. You can select multiple jobs.":"Invalid Selection: You have to select at least one job.",N=function(e){return function(a){a.preventDefault();var n="";"graph-only"===t?(n=function(e,t,a){var n="Invalid Command: You have to select at least one job.";return t.length>0&&(n="autosubmit setstatus "+e+' -fl "'+t.join(" ")+'" -t '+a+" -s -nt -np"),n}(e,g,b),A(n),d(n)):(n=function(e,t,a){var n=[],r="Invalid Command: You have to select at least one job.";return t.map((function(e){return n.push(e.name)})),n.length>0&&(r="autosubmit setstatus "+e+' -fl "'+n.join(" ")+'" -t '+a+" -s -nt -np"),r}(e,g,b),A(n),o(n))}},A=function(e){window.copyTextToClipboard(e)},v=r.a.createElement("div",{className:"col-12"},f);return g&&g.length>0&&(v=r.a.createElement("div",{className:"col-12"},"Set status to:"," ",r.a.createElement("div",{className:"btn-group",role:"group","aria-label":"Status"},r.a.createElement("button",{className:"btn btn-sm",style:{background:"lightblue"},onClick:N("READY")},"Ready"),r.a.createElement("button",{className:"btn btn-sm btn-secondary",onClick:N("WAITING")},"Waiting"),r.a.createElement("button",{className:"btn btn-sm",style:{background:"yellow"},onClick:N("COMPLETED")},"Completed"),r.a.createElement("button",{className:"btn btn-sm",style:{background:"orange"},onClick:N("SUSPENDED")},"Suspended"),r.a.createElement("button",{className:"btn btn-sm btn-danger",onClick:N("FAILED")},"Failed")))),r.a.createElement("div",{className:"modal fade",id:"command"+a,tabIndex:"-1",role:"dialog","aria-labelledby":"commandTitle"+a,"aria-hidden":"true"},r.a.createElement("div",{className:"modal-dialog",role:"document"},r.a.createElement("div",{className:"modal-content",style:{width:"600px"}},r.a.createElement("div",{className:"modal-body pb-1"},r.a.createElement("div",{className:"row"},v),r.a.createElement("div",{className:"row mt-2 mx-1"},r.a.createElement("div",{className:"col-12",style:{fontFamily:"Courier",background:"black",color:"white"}},h&&r.a.createElement("div",{className:"p-2"},JSON.parse(JSON.stringify(h)))))),h&&h.length>0&&r.a.createElement("div",{className:"row mx-1 mb-2 float-left"},r.a.createElement("div",{className:"col-12"},"The command has been copied to the clipboard. Paste it in your terminal.")),r.a.createElement("div",{className:"modal-footer"},r.a.createElement("button",{type:"button",className:"btn btn-sm btn-dark","data-dismiss":"modal"},"Close")))))},K=function(e){var t=e.source,a=e.target,l=Object(n.useContext)(E),s=l.currentSelected,c=l.removeSelectedJob,o=l.canSelect;return!0===o?r.a.createElement(n.Fragment,null,r.a.createElement("div",{className:"card p-0 m-0"},r.a.createElement("div",{className:"card-header text-center p-0 m-0"},r.a.createElement("button",{className:"btn btn-info btn-sm my-0 py-0","data-toggle":"modal","data-target":"#command"+a},r.a.createElement("strong",null,"Generate Command"))),r.a.createElement("div",{className:"card-body"},s&&s.sort((function(e,t){return e.name>t.name?-1:1})).map((function(e){return r.a.createElement("button",{key:e.name,type:"button",className:"btn btn-sm m-1 p-1",style:{background:e.color},onClick:(t=e.name,function(e){e.preventDefault(),c(t)})},r.a.createElement("small",null,e.name));var t})))),r.a.createElement(J,{source:t,target:a})):r.a.createElement("div",{className:"card"})},W=(a(55),a(57),a(58),a(59),a(60),a(16)),q=function(e){Object(i.a)(a,e);var t=Object(m.a)(a);function a(){return Object(c.a)(this,a),t.apply(this,arguments)}return Object(o.a)(a,[{key:"shouldComponentUpdate",value:function(e,t){return e.treedata!==this.props.treedata||e.loadingTree!==this.props.loadingTree}},{key:"componentWillUnmount",value:function(){this.props.cleanTreeData()}},{key:"componenteDidMount",value:function(){Object(W.createTree)("#tree",{extensions:["edit","filter"],source:this.props.treedata})}},{key:"render",value:function(){if(this.props.loadingTree)return r.a.createElement(h,null);if(!this.props.treedata)return r.a.createElement("div",{className:"card-body text-left",style:V},r.a.createElement("p",{className:"lead"},"Press ",r.a.createElement("span",{className:"badge badge-info"},"Show Tree View")," to see the tree view representation of the experiment."),r.a.createElement("p",{className:"lead"},"Repeating subtrees in the tree view are only shown once, use the searcher to focus only on those items."));if(!0===this.props.treedata.error)return r.a.createElement("div",{className:"card-body text-left",style:V},r.a.createElement("p",{className:"lead"},"Something has gone very wrong."),r.a.createElement("p",{className:"lead text-danger"},this.props.treedata.error_message));var e=function(e){Object(i.a)(a,e);var t=Object(m.a)(a);function a(){return Object(c.a)(this,a),t.apply(this,arguments)}return Object(o.a)(a,[{key:"componentDidMount",value:function(){var e=this,t=new W.createTree("#tree",{activate:function(t,a){a&&(e.props.updateSelectionTree(a),a&&a.node&&void 0===a.node.folder&&e.props.updateCurrentSelected(a.node.refKey,e.props.originaldata))},extensions:["filter","childcounter","clones"],filter:{autoApply:!0,autoExpand:!0,counter:!0,fuzzy:!1,hideExpandedCounter:!0,hideExpanders:!1,highlight:!1,leavesOnly:!0,nodata:!0,mode:"hide"},source:this.props.treedata});this.props.setFancyTree(t)}},{key:"componentWillUnmount",value:function(){}},{key:"render",value:function(){return r.a.createElement("div",{className:"card-body p-0"},r.a.createElement("div",{id:"tree"}))}}]),a}(n.Component);return r.a.createElement(e,{treedata:this.props.treedata.tree,originaldata:this.props.treedata,setFancyTree:this.props.setFancyTree,updateSelectionTree:this.props.updateSelectionTree,updateCurrentSelected:this.props.updateCurrentSelected,canSelect:this.props.canSelect})}}]),a}(n.Component),V={height:750},Z=q,z=Object(n.createContext)(),X=Object(n.createContext)(),$={height:360},ee={height:30},te=function(){var e=Object(n.useContext)(E),t=Object(n.useContext)(Q),a=e.experiment,l=t.data,s=t.selection,c="",o=null,i=function(e){return function(t){t.preventDefault(),window.copyToClip(e)}};return s&&(s.map((function(e){return c=e})),o=l.nodes.find((function(e){return e.id===c}))),r.a.createElement(n.Fragment,null,o&&r.a.createElement(n.Fragment,null,r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("div",{className:"card text-white bg-info",style:$},r.a.createElement("div",{className:"card-header text-center p-0",style:ee},r.a.createElement("div",{className:"mh-100 px-0 mx-0"},r.a.createElement("small",null,r.a.createElement("strong",null,o.id)))),r.a.createElement("div",{className:"card-body py-0"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-md-6"},r.a.createElement("small",null,r.a.createElement("strong",null,"Start:")," ",o.date)),r.a.createElement("div",{className:"col-md-6"},r.a.createElement("small",null,r.a.createElement("strong",null,"End:")," ",o.date_plus))),r.a.createElement("div",null,r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("small",null,r.a.createElement("strong",null,"Section:")," ",o.section)))),r.a.createElement("div",null,r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-md-6"},r.a.createElement("small",null,r.a.createElement("strong",null,"Member:")," ",o.member)),r.a.createElement("div",{className:"col-md-6"},r.a.createElement("small",null,r.a.createElement("strong",null,"Chunk:")," ",o.chunk)))),r.a.createElement("div",null,r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("small",null,r.a.createElement("strong",null,"Platform:")," ",o.platform_name&&o.platform_name," ",!o.platform_name&&a.hpc)))),r.a.createElement("div",null,r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-6"},r.a.createElement("small",null,r.a.createElement("strong",null,"Processors:")," ",o.processors)),r.a.createElement("div",{className:"col-6"},r.a.createElement("small",null,r.a.createElement("strong",null,"Wallclock:")," ",o.wallclock)))),r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-md-6"}," ",o.minutes_queue>=0&&r.a.createElement("span",{className:"badge text-center",style:{width:"100%",backgroundColor:"SUBMITTED"===o.status?"cyan":"pink",color:"black"}},r.a.createElement("small",null,"SUBMITTED"===o.status?"Submit":"Queue",":")," ",H(o.minutes_queue))),r.a.createElement("div",{className:"col-md-6"},o.minutes>=0&&["RUNNING","COMPLETED","FAILED"].includes(o.status)&&r.a.createElement("span",{className:"badge badge-success text-center ml-1",style:{width:"100%"}},r.a.createElement("small",null,"Run:")," ",H(o.minutes)," "))),r.a.createElement("div",{className:"row py-1"},r.a.createElement("div",{className:"col-md-6"},r.a.createElement("span",{className:"badge text-center",style:{width:"100%",backgroundColor:o.status_color,color:"RUNNING"===o.status?"white":"black"}},"Status:",r.a.createElement("strong",null," ",o.status))),r.a.createElement("div",{className:"col-md-3 px-1"},o.children_list&&o.children_list.length>0&&r.a.createElement("button",{className:"btn btn-dark btn-sm btn-block","data-toggle":"modal","data-target":"#childrenList"},r.a.createElement("small",null,r.a.createElement("strong",null,"Out:")," ",o.children)),o.children_list&&0===o.children_list.length&&r.a.createElement("small",null,r.a.createElement("strong",null,"Out:")," ",o.children)),r.a.createElement("div",{className:"col-md-3 px-1"},o.parent_list&&o.parent_list.length>0&&r.a.createElement("button",{className:"btn btn-dark btn-sm btn-block","data-toggle":"modal","data-target":"#parentList"},r.a.createElement("small",null,r.a.createElement("strong",null,"In:")," ",o.parents)),o.parent_list&&0===o.parent_list.length&&r.a.createElement("small",null,r.a.createElement("strong",null,"In:")," ",o.parents))),r.a.createElement("div",null,o.out&&r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12 px-0"},r.a.createElement("form",{onSubmit:i("g_out"),className:"form"},r.a.createElement("div",{className:"input-group input-group-sm"},r.a.createElement("input",{className:"form-control py-0",type:"text",value:o.out,id:"g_out",readOnly:!0}),r.a.createElement("div",{className:"input-group-append"},r.a.createElement("input",{type:"submit",className:"btn btn-light btn-sm py-0",value:"Copy out"})))))),o.err&&r.a.createElement("div",{className:"row mt-1"},r.a.createElement("div",{className:"col-12 px-0"},r.a.createElement("form",{onSubmit:i("g_err"),className:"form"},r.a.createElement("div",{className:"input-group input-group-sm"},r.a.createElement("input",{className:"form-control py-0",type:"text",value:o.err,id:"g_err",readOnly:!0}),r.a.createElement("div",{className:"input-group-append"},r.a.createElement("input",{type:"submit",className:"btn btn-light btn-sm py-0",value:"Copy err"}))))))),r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("table",null,r.a.createElement("tbody",null,null!==o.submit&&r.a.createElement("tr",null,r.a.createElement("td",null,r.a.createElement("small",null,"Submit:")),r.a.createElement("td",null,r.a.createElement("span",{className:"badge badge-dark"},o.submit))),null!==o.start&&r.a.createElement("tr",null,r.a.createElement("td",null,r.a.createElement("small",null,"Start:")),r.a.createElement("td",null,r.a.createElement("span",{className:"badge badge-dark"},o.start))),null!==o.finish&&r.a.createElement("tr",null,r.a.createElement("td",null,r.a.createElement("small",null,"Finish:")),r.a.createElement("td",null,r.a.createElement("span",{className:"badge badge-dark"},o.finish)))))))))))),!o&&l&&r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("div",{className:"card text-white bg-info",style:$},r.a.createElement("div",{className:"card-header text-center py-0"},r.a.createElement("small",null,"Here goes the Job Id")),r.a.createElement("div",{className:"card-body"},r.a.createElement("div",{className:"text-center"},r.a.createElement("small",null,"Select a Node to see more information.")))))),o&&o.children_list&&o.children_list.length>0&&r.a.createElement("div",{className:"modal fade",id:"childrenList",tabIndex:"-1",role:"dialog","aria-labelledby":"childrenListTitle","aria-hidden":"true"},r.a.createElement("div",{className:"modal-dialog",role:"document"},r.a.createElement("div",{className:"modal-content"},r.a.createElement("div",{className:"modal-header"},r.a.createElement("h5",{className:"modal-title",id:"childrenListTitle"},"Children List"),r.a.createElement("button",{className:"close",type:"button","data-dismiss":"modal","aria-label":"Close"},r.a.createElement("span",{"aria-hidden":"true"},"\xd7"))),r.a.createElement("div",{className:"modal-body"},r.a.createElement("ul",null,o.children_list.map((function(e,t){return r.a.createElement("li",{key:t},e)})))),r.a.createElement("div",{className:"modal-footer"},r.a.createElement("button",{type:"button",className:"btn btn-secondary","data-dismiss":"modal"},"Close"))))),o&&o.parent_list&&o.parent_list.length>0&&r.a.createElement("div",{className:"modal fade",id:"parentList",tabIndex:"-1",role:"dialog","aria-labelledby":"parentListTitle","aria-hidden":"true"},r.a.createElement("div",{className:"modal-dialog",role:"document"},r.a.createElement("div",{className:"modal-content"},r.a.createElement("div",{className:"modal-header"},r.a.createElement("h5",{className:"modal-title",id:"parentListTitle"},"Parent List"),r.a.createElement("button",{className:"close",type:"button","data-dismiss":"modal","aria-label":"Close"},r.a.createElement("span",{"aria-hidden":"true"},"\xd7"))),r.a.createElement("div",{className:"modal-body"},r.a.createElement("ul",null,o.parent_list.map((function(e,t){return r.a.createElement("li",{key:t},e)})))),r.a.createElement("div",{className:"modal-footer"},r.a.createElement("button",{type:"button",className:"btn btn-secondary","data-dismiss":"modal"},"Close"))))))},ae={height:430},ne={height:30},re=function(){var e=Object(n.useContext)(E),t=Object(n.useContext)(X),a=e.experiment,l=t.selectedTreeNode,s=t.treedata,c=null;if(l&&l.node&&l.node.refKey){var o=l.node.refKey;c=s&&s.jobs?s.jobs.find((function(e){return e.id===o})):null}else c=null;var i=function(e){return function(t){t.preventDefault(),window.copyToClip(e)}};return r.a.createElement(n.Fragment,null,c&&r.a.createElement(n.Fragment,null,r.a.createElement("div",{className:"col-12 px-0"},r.a.createElement("div",{className:"card text-white bg-info",style:ae},r.a.createElement("div",{className:"card-header text-center p-0",style:ne},r.a.createElement("div",{className:"mh-100 px-0 mx-0"},r.a.createElement("small",null,r.a.createElement("strong",null,c.id)))),r.a.createElement("div",{className:"card-body py-0"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-md-6"},r.a.createElement("small",null,r.a.createElement("strong",null,"Start:")," ",c.date)),r.a.createElement("div",{className:"col-md-6"},r.a.createElement("small",null,r.a.createElement("strong",null,"End:")," ",c.date_plus))),r.a.createElement("div",null,r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("small",null,r.a.createElement("strong",null,"Section:")," ",c.section)))),r.a.createElement("div",null,r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-md-6"},r.a.createElement("small",null,r.a.createElement("strong",null,"Member:")," ",c.member)),r.a.createElement("div",{className:"col-md-6"},r.a.createElement("small",null,r.a.createElement("strong",null,"Chunk:")," ",c.chunk)))),r.a.createElement("div",null,r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("small",null,r.a.createElement("strong",null,"Platform:")," ",c.platform_name&&c.platform_name," ",!c.platform_name&&a.hpc)))),r.a.createElement("div",null,r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-6"},r.a.createElement("small",null,r.a.createElement("strong",null,"Processors:")," ",c.processors)),r.a.createElement("div",{className:"col-6"},r.a.createElement("small",null,r.a.createElement("strong",null,"Wallclock:")," ",c.wallclock)))),r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-md-6"}," ",c.minutes_queue>=0&&r.a.createElement("span",{className:"badge text-center",style:{width:"100%",backgroundColor:"SUBMITTED"===c.status?"cyan":"pink",color:"black"}},r.a.createElement("small",null,"SUBMITTED"===c.status?"Submit":"Queue",":")," ",H(c.minutes_queue))),r.a.createElement("div",{className:"col-md-6"},c.minutes>=0&&["RUNNING","COMPLETED","FAILED"].includes(c.status)&&r.a.createElement("span",{className:"badge badge-success text-center ml-1",style:{width:"100%"}},r.a.createElement("small",null,"Run:")," ",H(c.minutes)," "))),r.a.createElement("div",{className:"row py-1"},r.a.createElement("div",{className:"col-md-6"},r.a.createElement("span",{className:"badge text-center",style:{width:"100%",backgroundColor:c.status_color,color:"RUNNING"===c.status?"white":"black"}},"Status:",r.a.createElement("strong",null," ",c.status))),r.a.createElement("div",{className:"col-md-3 px-1"},c.children_list&&c.children_list.length>0&&r.a.createElement("button",{className:"btn btn-dark btn-sm btn-block","data-toggle":"modal","data-target":"#childrenList-tree"},r.a.createElement("small",null,r.a.createElement("strong",null,"Out:")," ",c.children)),c.children_list&&0===c.children_list.length&&r.a.createElement("small",null,r.a.createElement("strong",null,"Out:")," ",c.children)),r.a.createElement("div",{className:"col-md-3 px-1"},null!==c.parent_list&&c.parents>0&&r.a.createElement("button",{className:"btn btn-dark btn-sm btn-block","data-toggle":"modal","data-target":"#parentList-tree"},r.a.createElement("small",null,r.a.createElement("strong",null,"In:")," ",c.parents)),null!==c.parent_list&&0===c.parents&&r.a.createElement("small",null,r.a.createElement("strong",null,"In:")," ",c.parents))),r.a.createElement("div",null,c.out&&r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12 px-0"},r.a.createElement("form",{onSubmit:i("g_out_t"),className:"form"},r.a.createElement("div",{className:"input-group input-group-sm"},r.a.createElement("input",{className:"form-control py-0",type:"text",value:c.out,id:"g_out_t",readOnly:!0}),r.a.createElement("div",{className:"input-group-append"},r.a.createElement("input",{type:"submit",className:"btn btn-light btn-sm py-0",value:"Copy out"})))))),c.err&&r.a.createElement("div",{className:"row mt-1"},r.a.createElement("div",{className:"col-12 px-0"},r.a.createElement("form",{onSubmit:i("g_err_t"),className:"form"},r.a.createElement("div",{className:"input-group input-group-sm"},r.a.createElement("input",{className:"form-control py-0",type:"text",value:c.err,id:"g_err_t",readOnly:!0}),r.a.createElement("div",{className:"input-group-append"},r.a.createElement("input",{type:"submit",className:"btn btn-light btn-sm py-0",value:"Copy err"}))))))),r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("table",null,r.a.createElement("tbody",null,null!==c.submit&&r.a.createElement("tr",null,r.a.createElement("td",null,r.a.createElement("small",null,"Submit:")),r.a.createElement("td",null,r.a.createElement("span",{className:"badge badge-dark"},c.submit))),null!==c.start&&r.a.createElement("tr",null,r.a.createElement("td",null,r.a.createElement("small",null,"Start:")),r.a.createElement("td",null,r.a.createElement("span",{className:"badge badge-dark"},c.start))),null!==c.finish&&r.a.createElement("tr",null,r.a.createElement("td",null,r.a.createElement("small",null,"Finish:")),r.a.createElement("td",null,r.a.createElement("span",{className:"badge badge-dark"},c.finish))))))),null!==c.wrapper&&c.wrapper.length>0&&r.a.createElement("div",null,r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("small",null,r.a.createElement("strong",null,"Wrapper:")))),r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("small",null,c.wrapper)))),null!==c.wrapper_code&&c.wrapper_code.length>0&&r.a.createElement("div",null,r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-6"},r.a.createElement("small",null,r.a.createElement("strong",null,"Code:"))),r.a.createElement("div",{className:"col-6"},r.a.createElement("small",null,c.wrapper_code)))))))),!c&&s&&s.jobs&&r.a.createElement("div",{className:"col-12 px-0"},r.a.createElement("div",{className:"card text-white bg-info",style:ae},r.a.createElement("div",{className:"card-header text-center py-0"},r.a.createElement("small",null,"Here goes the Job Id")),r.a.createElement("div",{className:"card-body"},r.a.createElement("div",{className:"text-center"},r.a.createElement("small",null,"Select a Node to see more information."))))),c&&c.children_list&&c.children_list.length>0&&r.a.createElement("div",{className:"modal fade",id:"childrenList-tree",tabIndex:"-1",role:"dialog","aria-labelledby":"childrenListTitle-tree","aria-hidden":"true"},r.a.createElement("div",{className:"modal-dialog",role:"document"},r.a.createElement("div",{className:"modal-content"},r.a.createElement("div",{className:"modal-header"},r.a.createElement("h5",{className:"modal-title",id:"childrenListTitle-tree"},"Children List"),r.a.createElement("button",{className:"close",type:"button","data-dismiss":"modal","aria-label":"Close"},r.a.createElement("span",{"aria-hidden":"true"},"\xd7"))),r.a.createElement("div",{className:"modal-body"},r.a.createElement("ul",null,c.children_list.map((function(e,t){return r.a.createElement("li",{key:t},e)})))),r.a.createElement("div",{className:"modal-footer"},r.a.createElement("button",{type:"button",className:"btn btn-secondary","data-dismiss":"modal"},"Close"))))),c&&c.parent_list&&c.parent_list.length>0&&r.a.createElement("div",{className:"modal fade",id:"parentList-tree",tabIndex:"-1",role:"dialog","aria-labelledby":"parentListTitle-tree","aria-hidden":"true"},r.a.createElement("div",{className:"modal-dialog",role:"document"},r.a.createElement("div",{className:"modal-content"},r.a.createElement("div",{className:"modal-header"},r.a.createElement("h5",{className:"modal-title",id:"parentListTitle-tree"},"Parent List"),r.a.createElement("button",{className:"close",type:"button","data-dismiss":"modal","aria-label":"Close"},r.a.createElement("span",{"aria-hidden":"true"},"\xd7"))),r.a.createElement("div",{className:"modal-body"},r.a.createElement("ul",null,c.parent_list.map((function(e,t){return r.a.createElement("li",{key:t},e)})))),r.a.createElement("div",{className:"modal-footer"},r.a.createElement("button",{type:"button",className:"btn btn-secondary","data-dismiss":"modal"},"Close"))))))},le=function(e){Object(i.a)(a,e);var t=Object(m.a)(a);function a(e){var n;return Object(c.a)(this,a),(n=t.call(this,e)).rundata=null,n}return Object(o.a)(a,[{key:"componentDidMount",value:function(){var e=this;this.props.getExperimentRun(this.props.experiment.expid),this.props.experimentRunning&&(this.interval=setInterval((function(){return e.props.getExperimentRun(e.props.experiment.expid)}),1e3*this.props.experiment.updateTime))}},{key:"componentWillUnmount",value:function(){this.props.cleanRunData(),this.props.experimentRunning&&clearInterval(this.interval)}},{key:"componentDidUpdate",value:function(){window.scrollToBottom()}},{key:"render",value:function(){if(null===this.props.rundata)return r.a.createElement(n.Fragment,null,r.a.createElement("div",null,"Loading..."));var e=this.props.rundata,t=e.logcontent,a=e.error,l=e.error_message,s=e.found,c=e.logfile,o=e.lastModified,i=e.timeStamp,m=t.map((function(e){return r.a.createElement("li",{key:e.index},r.a.createElement("small",null,e.content))}));return a?r.a.createElement(n.Fragment,null,r.a.createElement("div",null,l),r.a.createElement("br",null),r.a.createElement("hr",null)):s?r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("div",{className:"row px-1"},r.a.createElement("div",{className:"col-6 text-left"},r.a.createElement("small",null,"Logfile: ",c)," ",r.a.createElement("small",{className:"text-muted"},"(",i,")")),r.a.createElement("div",{className:"col-6 text-right"},r.a.createElement("small",null,"Last Modified: ",o))),r.a.createElement("pre",{className:"bash mb-0 scroll",id:"log_scroll"},r.a.createElement("ul",{style:se,className:"p-1 mb-0 ul-2"},m)),r.a.createElement("div",{className:"text-muted text-center"},r.a.createElement("small",null,"Showing last 150 lines.")))):r.a.createElement(n.Fragment,null,r.a.createElement("div",null,"Running log not found. This experiment might not be currently running on Autosubmit."),r.a.createElement("br",null),r.a.createElement("hr",null))}}]),a}(n.Component),se={listStyleType:"none"},ce=le,oe=function(e){Object(i.a)(a,e);var t=Object(m.a)(a);function a(){return Object(c.a)(this,a),t.apply(this,arguments)}return Object(o.a)(a,[{key:"componentDidMount",value:function(){var e=this;this.props.experiment&&(this.props.getExperimentPkl(this.props.experiment.expid,this.props.experiment.pkl_timestamp),this.props.experimentRunning&&(this.interval=setInterval((function(){return e.props.getExperimentPkl(e.props.experiment.expid,e.props.experiment.pkl_timestamp)}),2e3*this.props.experiment.updateTime)))}},{key:"componentWillUnmount",value:function(){this.props.cleanPklData(),this.props.experimentRunning&&clearInterval(this.interval)}},{key:"render",value:function(){var e=this.props,t=e.loadingPkl,a=e.pklchanges;return r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("div",{className:"card"},r.a.createElement("div",{className:"card-header text-center py-0"},r.a.createElement("small",null,"Monitoring jobs...")),r.a.createElement("div",{className:"card-body p-0"},a&&r.a.createElement("pre",{className:"scroll-y mb-0"},a),t&&r.a.createElement("small",null,"Loading...")))))}}]),a}(n.Component),ie=function(e){Object(i.a)(a,e);var t=Object(m.a)(a);function a(){return Object(c.a)(this,a),t.apply(this,arguments)}return Object(o.a)(a,[{key:"componentDidMount",value:function(){var e=this;this.props.experiment&&(this.props.getExperimentTreePkl(this.props.experiment.expid,this.props.experiment.pkl_timestamp),this.props.experimentRunning&&(this.interval=setInterval((function(){return e.props.getExperimentTreePkl(e.props.experiment.expid,e.props.experiment.pkl_timestamp)}),2e3*this.props.experiment.updateTime)))}},{key:"componentWillUnmount",value:function(){this.props.cleanPklTreeData(),this.props.experimentRunning&&clearInterval(this.interval)}},{key:"render",value:function(){var e=this.props,t=e.loadingTreePkl,a=e.pkltreechanges;return r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("div",{className:"card"},r.a.createElement("div",{className:"card-header text-center py-0"},r.a.createElement("small",null,"Monitoring jobs...")),r.a.createElement("div",{className:"card-body p-0"},a&&r.a.createElement("pre",{className:"scroll-y-tree mb-0"},a),t&&r.a.createElement("small",null,"Loading...")))))}}]),a}(n.Component),me=function(){var e=Object(n.useContext)(Q).navToLatest,t=function(t){var a=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return function(n){n.preventDefault(),e(t,a)}};return r.a.createElement("div",{className:"row card-body py-1"},r.a.createElement("div",{className:"col-1 px-1"},r.a.createElement("form",{onSubmit:t(0,!1),className:"form"},r.a.createElement("input",{type:"submit",value:"Waiting",className:"btn btn-block btn-sm",style:I}))),r.a.createElement("div",{className:"col-1 px-1"},r.a.createElement("form",{onSubmit:t(1),className:"form"},r.a.createElement("input",{type:"submit",value:"Ready",className:"btn btn-block btn-sm",style:B}))),r.a.createElement("div",{className:"col-1 px-1"},r.a.createElement("form",{onSubmit:t(7),className:"form"},r.a.createElement("input",{type:"submit",value:"Prepared",className:"btn btn-block btn-sm",style:F}))),r.a.createElement("div",{className:"col-1 px-1"},r.a.createElement("form",{onSubmit:t(2),className:"form"},r.a.createElement("input",{type:"submit",value:"Submitted",className:"btn btn-block btn-sm",style:R}))),r.a.createElement("div",{className:"col-1 px-1"},r.a.createElement("form",{onSubmit:t(3),className:"form"},r.a.createElement("input",{type:"submit",value:"Queue",className:"btn btn-block btn-sm",style:w}))),r.a.createElement("div",{className:"col-1 px-1"},r.a.createElement("form",{onSubmit:t(4),className:"form"},r.a.createElement("input",{type:"submit",value:"Running",className:"btn btn-block btn-sm",style:D}))),r.a.createElement("div",{className:"col-1 px-1"},r.a.createElement("form",{onSubmit:t(5),className:"form"},r.a.createElement("input",{type:"submit",value:"Completed",className:"btn btn-block btn-sm",style:_}))),r.a.createElement("div",{className:"col-1 px-1"},r.a.createElement("form",{onSubmit:t(-1),className:"form"},r.a.createElement("input",{type:"submit",value:"Failed",className:"btn btn-block btn-sm",style:O}))),r.a.createElement("div",{className:"col-1 px-1"},r.a.createElement("form",{onSubmit:t(-3),className:"form"},r.a.createElement("input",{type:"submit",value:"Suspended",className:"btn btn-block btn-sm",style:j}))),r.a.createElement("div",{className:"col-1 px-1"},r.a.createElement("form",{onSubmit:t(-2),className:"form"},r.a.createElement("input",{type:"submit",value:"Unknown",className:"btn btn-block btn-sm",style:G}))),r.a.createElement("div",{className:"col-1 px-1"},r.a.createElement("form",{onSubmit:t(6),className:"form"},r.a.createElement("input",{type:"submit",value:"Hold",className:"btn btn-block btn-sm",style:U}))),r.a.createElement("div",{className:"col-1 px-1 text-left"},r.a.createElement("small",null," \u2190 CLICKABLE ")))},ue=a(43),de=function(){var e=Object(n.useContext)(z),t=Object(n.useContext)(E),a=e.getExperimentStats,l=e.statdata,s=e.loading,c=e.clearStats,o=e.isError,i=e.errorMessage,m=e.totaldata,u=e.ticksdata,d=t.experiment,b={chartArea:{width:"90%",height:"700px"},hAxis:{title:"Jobs",ticks:u},vAxis:{title:"Hours"},legend:{position:"top"},explorer:{actions:["dragToZoom","rightClickToReset"],axis:"horizontal"}},g=null;m&&m.stats&&m.stats.totals&&(g=m.stats.totals.map((function(e,t){return r.a.createElement("li",{key:t},e)})));var f=Object(n.useState)(""),N=Object(p.a)(f,2),A=N[0],v=N[1],y=Object(n.useState)(""),x=Object(p.a)(y,2),S=x[0],k=x[1];return r.a.createElement(n.Fragment,null,r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-md-4 offset-md-4 text-center"},!l&&d&&!1===t.loading&&r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),a(d.expid,A,S)},className:"form"},r.a.createElement("div",{className:"input-group input-group-sm"},r.a.createElement("input",{className:"form-control",type:"text",name:"section",placeholder:"Section",onChange:function(e){return k(e.target.value)}}),r.a.createElement("input",{className:"form-control",type:"text",name:"hours",placeholder:"Hours",onChange:function(e){return v(e.target.value)}}),r.a.createElement("div",{className:"input-group-append"},r.a.createElement("input",{type:"submit",value:"Get Statistics",className:"btn btn-info",disabled:s})))),l&&r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),v(""),k(""),c()},className:"form"},r.a.createElement("div",{className:""},r.a.createElement("input",{type:"submit",value:"Clear Statistics",className:"btn btn-dark btn-sm"})))),r.a.createElement("div",{className:"col-md-12"},!l&&d&&r.a.createElement("div",{className:"col-md-12 p-3"},r.a.createElement("p",{className:"lead"},"Supply a Section (Type) in the appropriate textbox to filter the jobs that will be included in the query. Also, you can also supply the Hours value that determines how many hours before the current time you want to query. Leave both empty and a query for Any Section since the date of creation of the experiment will be executed."),r.a.createElement("p",{className:"lead"},"Press ",r.a.createElement("span",{className:"badge badge-info"},"Get Statistics")," ","to generate the statistics, this will generate a Bar Chart and some extra statistics below. Drag the mouse inside the chart to zoom in; however, zoom in capabilities are not unlimited, so try to narrow your query.")),s&&r.a.createElement(h,null),l&&!o&&r.a.createElement(ue.a,{chartType:"ColumnChart",loader:r.a.createElement("div",null,"Loading Chart"),width:"100%",height:"700px",data:l,options:b}),l&&o&&r.a.createElement("div",{className:"col-md-12 text-center p-3"},i),m&&r.a.createElement("div",{className:"col-md-8 offset-md-4 mt-2"},m&&r.a.createElement("ul",{style:{listStyleType:"none"}},g&&g)))))},pe=function(e){var t=e.target,a=void 0===t?"manual-graph":t,l=Object(n.useContext)(Q),s=Object(n.useContext)(E),c=l.selection,o=l.updateGraphSelectedNodes,i=s.canSelect;return c&&!i?r.a.createElement(n.Fragment,null,r.a.createElement("button",{className:"btn-sm btn-info",type:"button","data-toggle":"modal","data-target":"#command"+a,onClick:function(e){e.preventDefault(),o()}},r.a.createElement("strong",null,"Change Status")),r.a.createElement(J,{source:"graph-only",target:a})):null},Ee=function(){var e=Object(n.useContext)(Q),t=e.searchJobInGraph,a=e.foundNodes,l=e.loadingSearchJob,s=e.data,c=e.navigateTo,o=Object(n.useState)(""),i=Object(p.a)(o,2),m=i[0],u=i[1],d=Object(n.useState)(""),E=Object(p.a)(d,2),b=E[0],g=E[1],h=function(e){return function(t){if(t.preventDefault(),a){var n=b+e;n>=0&&n=a.length&&(c(a[0].id),g(0))}}};return r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-md-4"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),t(m),g(0)},className:"form"},r.a.createElement("div",{className:"input-group input-group-sm"},r.a.createElement("input",{className:"form-control",type:"text",name:"section",placeholder:"Job Name (e.g. fc0_1_CLEAN)",onChange:function(e){return u(e.target.value)}}),l&&r.a.createElement("span",null,"Searching..."),!l&&r.a.createElement("div",{className:"input-group-append"},r.a.createElement("input",{type:"submit",value:"Search by Job Name",className:"btn btn-dark btn-sm"}))))),r.a.createElement("div",{className:"col-md-2 text-center"},a&&a.length>1&&r.a.createElement("div",null,r.a.createElement("button",{className:"btn-sm btn-info",type:"button",onClick:h(-1)},"Previous"),r.a.createElement("button",{className:"btn-sm btn-info",type:"button",onClick:h(1)},"Next"),r.a.createElement("small",{className:"text-muted ml-2"},b+1," of ",a.length))),r.a.createElement("div",{className:"col-md-2"},r.a.createElement(pe,null)),r.a.createElement("div",{className:"col-md-4 text-right text-muted pr-4"},s&&r.a.createElement("small",null,"Max out: ",s.max_children," | Max in: ",s.max_parents," | Total #Jobs: ",s.total_jobs," | Chunk unit:"," ",r.a.createElement("strong",null,s.chunk_unit)," | Chunk size"," ",r.a.createElement("strong",null,s.chunk_size)," ")))},be=function(){var e=Object(n.useContext)(X),t=e.filterTreeView,a=e.treedata,l=e.loadingFilterTree,s=e.clearFilterTreeView,c=e.returnFilter,o=Object(n.useState)(""),i=Object(p.a)(o,2),m=i[0],u=i[1],d="Clear";return c&&c>=0&&(d="Clear Result"),r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-md-4 pr-1"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),t(m)},className:"form",autoComplete:"off"},r.a.createElement("div",{className:"input-group input-group-sm"},r.a.createElement("input",{className:"form-control",type:"text",name:"section",placeholder:"Filter text",onChange:function(e){return u(e.target.value)}}),l&&r.a.createElement("span",null,"Searching..."),!l&&r.a.createElement("div",{className:"input-group-append"},r.a.createElement("input",{type:"submit",value:"Filter",className:"btn btn-dark btn-sm"}))))),r.a.createElement("div",{className:"col-md-4 text-left pl-1"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),s()},className:"form"},r.a.createElement("input",{type:"submit",value:d,className:"btn btn-info btn-sm"}))),r.a.createElement("div",{className:"col-md-4 text-right text-muted pr-4"},a&&a.jobs&&r.a.createElement("small",null,"Total #Jobs: ",a.total," | Chunk unit:"," ",r.a.createElement("strong",null,a.reference.chunk_unit)," | Chunk size:"," ",r.a.createElement("strong",null,a.reference.chunk_size)," ")))},ge={height:660},he={height:30},fe=function(){var e=Object(n.useContext)(E),t=Object(n.useContext)(Q),a=e.experiment,l=t.data,s=t.navigateToGroup,c={},o=null,i=null;return a&&l&&l.packages&&Object.keys(l.packages).length>0&&(c=l.packages,i=(o=Object.keys(c)).map((function(e,t){return r.a.createElement("button",{className:"btn-sm btn-warning btn-block",type:"button",key:t,onClick:(a={wrapper:e},function(e){e.preventDefault(),c&&s(c[a.wrapper])})},r.a.createElement("small",null,e.split("_").slice(1).join("_")));var a}))),r.a.createElement("div",null,a&&c&&r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("div",{className:"card text-white bg-info scroll",style:ge},r.a.createElement("div",{className:"card-header text-center p-0",style:he},r.a.createElement("div",{className:"mh-100 px-0 mx-0"},r.a.createElement("small",null,r.a.createElement("strong",null,"WRAPPERS")))),r.a.createElement("div",{className:"card-body py-0"},o&&i)))))},Ne=function(){var e=Object(n.useContext)(E),t=Object(n.useContext)(X),a=e.canSelect,l=e.activateSelectionMode,s=e.deactivateSelectionMode,c=t.setStartSelection;return!0===a?r.a.createElement("form",{className:"form",onSubmit:function(e){e.preventDefault(),s()}},r.a.createElement("input",{type:"submit",value:"Deactivate Selection Mode",className:"btn btn-danger btn-sm btn-block"})):r.a.createElement("form",{className:"form",onSubmit:function(e){e.preventDefault(),l(),c()}},r.a.createElement("input",{type:"submit",value:"Activate Selection Mode",className:"btn btn-info btn-sm btn-block"}))},Ae=function(){var e=Object(n.useContext)(E),t=Object(n.useContext)(Q),a=e.experiment,l=e.experimentRunning,s=e.loadingJobMonitor,c=t.getExperimentGraph,o=t.data,i=t.getExperimentPkl,m=t.setAutoUpdatePkl,u=t.startAutoUpdatePkl,d=t.enabledGraphSearch,p=t.loadingPkl,b=!d||p,g=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"none",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"standard";return function(n){n.preventDefault(),c(a.expid,e,t)}};return r.a.createElement("div",{className:"card-header p-1"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-md-2"},(s||p)&&r.a.createElement("div",null,"Querying...")),r.a.createElement("div",{className:"col-md-10"},r.a.createElement("div",{className:"row justify-content-end"},a&&o&&r.a.createElement("div",{className:"col-md-2"},r.a.createElement(Ne,null)),r.a.createElement("div",{className:"col-md-2"},r.a.createElement("form",{onSubmit:g(),className:"form"},r.a.createElement("input",{type:"submit",value:"Classic",className:"btn btn-info btn-block btn-sm",disabled:b}))),r.a.createElement("div",{className:"col-md-1"},r.a.createElement("form",{onSubmit:g("none","laplacian"),className:"form"},r.a.createElement("input",{type:"submit",value:"Laplacian",className:"btn btn-info btn-block btn-sm",disabled:b}))),r.a.createElement("div",{className:"col-md-2"},r.a.createElement("form",{onSubmit:g("date-member"),className:"form"},r.a.createElement("input",{type:"submit",value:"Grouped by D-M",className:"btn btn-info btn-block btn-sm",disabled:b}))),r.a.createElement("div",{className:"col-md-2"},r.a.createElement("form",{onSubmit:g("status"),className:"form"},r.a.createElement("input",{type:"submit",value:"Grouped by Status",className:"btn btn-info btn-block btn-sm",disabled:b}))),a&&o&&l&&!u&&r.a.createElement("div",{className:"col-md-1"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),i(a.expid,a.pkl_timestamp)},className:"form"},r.a.createElement("input",{type:"submit",value:"Refresh",className:"btn btn-success btn-block btn-sm",disabled:b}))),l&&o&&!u&&r.a.createElement("div",{className:"col-md-2"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),m(!0)},className:"form"},r.a.createElement("input",{type:"submit",value:"Start Job Monitor",className:"btn btn-success btn-block btn-sm",disabled:b}))),l&&o&&u&&r.a.createElement("div",{className:"col-md-2"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),m(!1)},className:"form"},r.a.createElement("input",{type:"submit",value:"Stop Job Monitor",className:"btn btn-danger btn-block btn-sm",disabled:b})))))))},ve=function(){var e=Object(n.useContext)(E),t=e.experiment,a=e.startAutoUpdateRun,l=e.setAutoUpdateRun;return r.a.createElement("div",{className:"card-header p-1"},r.a.createElement("div",{className:"row justify-content-end"},r.a.createElement("div",{className:"col-md-2"},t&&!a&&r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),l(!0)},className:"form"},r.a.createElement("input",{type:"submit",value:"Show Log",className:"btn btn-dark btn-sm btn-block"})),t&&a&&r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),l(!1)},className:"form"},r.a.createElement("input",{type:"submit",value:"Hide Log",className:"btn btn-secondary btn-sm btn-block"})))))},ye=function(){var e=Object(n.useContext)(E),t=Object(n.useContext)(X),a=e.experiment,l=e.experimentRunning,s=t.treedata,c=t.getExperimentTree,o=t.cleanTreeData,i=t.enabledTreeSearch,m=t.getExperimentTreePkl,u=t.loadingTreeRefresh,d=t.setAutoUpdateTreePkl,p=t.startAutoUpdateTreePkl,b=t.loadingTreePkl,g=!i||b;return r.a.createElement("div",{className:"card-header p-1"},r.a.createElement("div",{className:"row justify-content-end"},(u||b)&&r.a.createElement("div",{className:"col text-left"},"Querying..."),a&&s&&r.a.createElement("div",{className:"col-md-2"},r.a.createElement(Ne,null)),a&&!s&&r.a.createElement("div",{className:"col-md-1"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),c(a.expid)},className:"form"},r.a.createElement("input",{type:"submit",value:"Show",className:"btn btn-info btn-block btn-sm",disabled:g}))),a&&s&&!p&&r.a.createElement("div",{className:"col-md-1"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),o()},className:"form"},r.a.createElement("input",{type:"submit",value:"Clear Tree",className:"btn btn-secondary btn-block btn-sm",disabled:g}))),a&&s&&l&&!p&&r.a.createElement("div",{className:"col-md-1"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),m(a.expid,a.pkl_timestamp)},className:"form"},r.a.createElement("input",{type:"submit",value:"Refresh",className:"btn btn-success btn-block btn-sm",disabled:g}))),l&&s&&!p&&r.a.createElement("div",{className:"col-md-2"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),d(!0)},className:"form"},r.a.createElement("input",{type:"submit",value:"Start Job Monitor",className:"btn btn-success btn-block btn-sm",disabled:g}))),l&&s&&p&&r.a.createElement("div",{className:"col-md-2"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),d(!1)},className:"form"},r.a.createElement("input",{type:"submit",value:"Stop Job Monitor",className:"btn btn-danger btn-block btn-sm",disabled:g})))))},xe=function(){var e=Object(n.useContext)(E),t=Object(n.useContext)(X),a=e.getExperimentPerformanceMetrics,l=e.experiment,s=t.enabledTreeSearch;return r.a.createElement("div",{className:"card-header p-1"},r.a.createElement("div",{className:"row justify-content-end"},r.a.createElement("div",{className:"col-md-2"},l&&r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),a(l.expid)},className:"form"},r.a.createElement("input",{type:"submit",value:"Refresh",className:"btn btn-success btn-block btn-sm",disabled:!s})))))},Se=function(){var e=Object(n.useContext)(E),t=e.performancedata;if(!e.experiment||!t)return r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("div",{className:"lead"},"Experiment not defined.")));var a=t.ASYPD,l=t.SYPD,s=t.JPSY,c=t.Parallelization,o=t.CHSY,i=t.considered;return r.a.createElement(n.Fragment,null,r.a.createElement("div",{className:"row px-3"},r.a.createElement("div",{className:"col-4 p-4"},r.a.createElement("h5",null,"Parallelization:"," ",r.a.createElement("span",{className:"badge badge-secondary"},c)),r.a.createElement("h5",null,"JPSY: ",r.a.createElement("span",{className:"badge badge-secondary"},s)),r.a.createElement("h5",null,"SYPD: ",r.a.createElement("span",{className:"badge badge-secondary"},l)),r.a.createElement("h5",null,"ASYPD: ",r.a.createElement("span",{className:"badge badge-secondary"},a)),r.a.createElement("h5",null,"CHSY: ",r.a.createElement("span",{className:"badge badge-secondary"},o))),r.a.createElement("div",{className:"col-8 p-3 scroll-y-jobs"},r.a.createElement("p",{className:"lead"},"Considered: (",i.length,")"),r.a.createElement("table",{className:"table"},r.a.createElement("thead",null,r.a.createElement("tr",null,r.a.createElement("th",{scope:"col"},"#"),r.a.createElement("th",{scope:"col"},"Job Name"),r.a.createElement("th",{scope:"col"},"Queue"),r.a.createElement("th",{scope:"col"},"Run"),r.a.createElement("th",{scope:"col"},"CHSY"),r.a.createElement("th",{scope:"col"},"JPSY"),r.a.createElement("th",{scope:"col"},"Energy"))),r.a.createElement("tbody",null,i.sort((function(e,t){return e.name>t.name?1:-1})).map((function(e,t){return r.a.createElement("tr",{key:e.name},r.a.createElement("th",{scope:"row"},t+1),r.a.createElement("td",null,e.name),r.a.createElement("td",null,r.a.createElement("strong",null," ",H(e.queue))),r.a.createElement("td",null,r.a.createElement("strong",null,H(e.running))),r.a.createElement("td",null,r.a.createElement("strong",null,e.CHSY)),r.a.createElement("td",null,r.a.createElement("strong",null,e.JPSY)),r.a.createElement("td",null,r.a.createElement("strong",null,e.energy)))})))))),r.a.createElement("div",{className:"row px-3"},r.a.createElement("div",{className:"col-12 px-4"},r.a.createElement("p",{className:"lead"},"Metrics description:"),r.a.createElement("p",null,r.a.createElement("strong",null,"Parallelization"),": Total number of cores allocated for the run, per SIM."),r.a.createElement("p",null,r.a.createElement("strong",null,"JPSY"),": Energy cost of a simulation, measured in Joules per simulated year."),r.a.createElement("p",null,r.a.createElement("strong",null,"SYPD"),": Simulated years per day for the model in a 24 h period."),r.a.createElement("p",null,r.a.createElement("strong",null,"ASYPD"),": Actual SYPD, this number should be lower than SYPD due to interruptions, queue wait time, data transfer or issues with the model workflow. This is collected by measuring the time between first submission and the date of arrival of the last history file on the storage file system."),r.a.createElement("p",null,r.a.createElement("strong",null,"CHSY"),": Core hours per simulated year. This is measured as the product of the model runtime for 1 SY and the number of cores allocated. This is an average of the CHSY of all SIM jobs."),r.a.createElement("p",null,r.a.createElement("strong",null,"Considered"),": Scrollable list where each item in the list represents job information showing ",r.a.createElement("strong",null,"Job Name"),","," ",r.a.createElement("strong",null,"QUEUE")," and ",r.a.createElement("strong",null,"RUNNING")," time in"," ",r.a.createElement("i",null,"HH:mm:ss")," format, ",r.a.createElement("strong",null,"CHSY"),", ",r.a.createElement("strong",null,"JPSY"),", and raw ",r.a.createElement("strong",null,"Energy")," consumption for that job."," ",r.a.createElement("i",null,"Note: Energy values are only collected for those jobs running on MareNostrum4 and using the latest version of Autosubmit. Subsequent development will expand this feature for other platforms.")),r.a.createElement("p",null,"Visit"," ",r.a.createElement("a",{href:"https://earth.bsc.es/gitlab/wuruchi/autosubmitreact/-/wikis/Performance-Metrics",target:"_blank",rel:"noopener noreferrer"},"Performance Metrics Documentation")," ","for more details."))))},ke={minHeight:"100%"},Ce=function(e){var t=e.match,a=t.params.expid,l=t.params.action,s=!(!l||"graph"!==l),c=!0===s?"nav-link":"nav-link active",o=!0===s?"nav-link active":"nav-link",i=!0===s?"tab-pane fade":"tab-pane fade show active",m=!0===s?"tab-pane fade show active":"tab-pane fade",u=Object(n.useContext)(E),d=Object(n.useContext)(Q),p=Object(n.useContext)(X),b=Object(n.useContext)(z),g=u.loadingRun,h=u.cleanRunData,f=u.getExperiment,N=u.getRunningState,A=u.getExperimentRun,v=u.getExperimentPerformanceMetrics,y=u.startAutoUpdateRun,x=u.setAutoUpdateRun,S=u.rundata,C=u.experiment,T=u.canSelect,w=u.experimentRunning,O=u.updateCurrentSelectedGraph,_=u.updateCurrentSelectedTree,R=p.treedata,D=p.updateSelectionTree,B=p.loadingTree,I=p.getExperimentTreePkl,G=p.getExperimentTree,j=p.cleanPklTreeData,U=p.startAutoUpdateTreePkl,F=p.pkltreechanges,P=p.setFancyTree,L=p.cleanTreeData,Y=d.cleanPklData,H=d.cleanNavData,J=d.getExperimentGraph,W=d.setVisData,q=d.getExperimentPkl,V=d.updateSelection,$=d.setVisNetwork,ee=d.data,ae=d.visNetwork,ne=d.navToLatest,le=d.navigateAfterLoadGraph,se=d.pklchanges,ue=d.loadingGraph,pe=d.shouldUpdateGraph,ge=d.startAutoUpdatePkl,he=d.cleanGraphData,Ne=d.current_grouped,Ce=d.updateGraphSelectedNodes,Te=b.clearStats;return Object(n.useEffect)((function(){f(a),N(a),a&&a.length>0&&(l&&"graph"===l?J(a):G(a),v(a));var e=setInterval((function(){return N(a)}),3e5);return function(){return clearInterval(e)}}),[]),r.a.createElement(n.Fragment,null,r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12"},r.a.createElement("ul",{className:"nav nav-tabs",id:"myTab",role:"tablist"},r.a.createElement("li",{className:"nav-item"},r.a.createElement("a",{className:c,id:"treeview-tab","data-toggle":"tab",href:"#treeview",role:"tab","aria-controls":"treeview","aria-selected":"false"},"Tree View")),r.a.createElement("li",{className:"nav-item"},r.a.createElement("a",{className:o,id:"graph-tab","data-toggle":"tab",href:"#graph",role:"tab","aria-controls":"graph","aria-selected":"true"},"Graph")),r.a.createElement("li",{className:"nav-item"},r.a.createElement("a",{className:"nav-link",id:"log-tab","data-toggle":"tab",href:"#log",role:"tab","aria-controls":"log","aria-selected":"false"},"Log")),r.a.createElement("li",{className:"nav-item"},r.a.createElement("a",{className:"nav-link",id:"stats-tab","data-toggle":"tab",href:"#stats",role:"tab","aria-controls":"stats","aria-selected":"false"},"Statistics")),r.a.createElement("li",{className:"nav-item"},r.a.createElement("a",{className:"nav-link",id:"performance-tab","data-toggle":"tab",href:"#performance",role:"tab","aria-controls":"performance","aria-selected":"false"},"Performance"))),r.a.createElement("div",{className:"tab-content",id:"myTabContent"},r.a.createElement("div",{className:m,id:"graph",role:"tabpanel","aria-labelledby":"graph-tab"},r.a.createElement("div",{className:"card"},C&&r.a.createElement(Ae,null),C&&ee&&r.a.createElement("div",{className:"card-header p-1"},r.a.createElement(Ee,null)),r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col pr-0"},r.a.createElement(M,{data:ee,updateSelection:V,loadingGraph:ue,cleanGraphData:he,shouldUpdateGraph:pe,setVisData:W,setVisNetwork:$,navToLatest:ne,clearStats:Te,cleanNavData:H,current_grouped:Ne,experimentRunning:w,navigateAfterLoadGraph:le,updateCurrentSelected:O,canSelect:T,updateGraphSelectedNodes:Ce})),r.a.createElement("div",{className:!0===T?"col-3 px-0":"col-3 pl-0"},r.a.createElement("ul",{className:"nav nav-tabs",id:"myTabSide",role:"tablist"},r.a.createElement("li",{className:"nav-item"},r.a.createElement("a",{className:"nav-link active",id:"selection-tab","data-toggle":"tab",href:"#selection",role:"tab","aria-controls":"selection","aria-selected":"true"},"Selection")),r.a.createElement("li",{className:"nav-item"},r.a.createElement("a",{className:"nav-link",id:"wrapper-tab","data-toggle":"tab",href:"#wrapper",role:"tab","aria-controls":"treeview","aria-selected":"false"},"Wrappers"))),r.a.createElement("div",{className:"tab-content",id:"myTabSideContent"},r.a.createElement("div",{className:"tab-pane fade show active",id:"selection",role:"tabpanel","aria-labelledby":"selection-tab"},ee&&r.a.createElement(te,null),ge&&r.a.createElement(oe,{experiment:C,getExperimentPkl:q,cleanPklData:Y,pklchanges:se,experimentRunning:w})),r.a.createElement("div",{className:"tab-pane fade show",id:"wrapper",role:"tabpanel","aria-labelledby":"wrapper-tab"},r.a.createElement("div",null,r.a.createElement(fe,null))))),C&&ee&&T&&r.a.createElement("div",{className:"col-2 pl-0"},r.a.createElement(K,{target:"graph",source:"experiment"}))),r.a.createElement("div",{className:"card-footer p-0"},ee&&ae&&r.a.createElement(me,null)))),r.a.createElement("div",{className:i,id:"treeview",role:"tabpanel","aria-labelledby":"treeview-tab"},r.a.createElement("div",{className:"card"},C&&r.a.createElement(ye,null),C&&R&&r.a.createElement("div",{className:"card-header p-1"},r.a.createElement(be,null)),r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col pr-0"},r.a.createElement(Z,{treedata:R,loadingTree:B,cleanTreeData:L,setFancyTree:P,updateSelectionTree:D,updateCurrentSelected:_,canSelect:T})),r.a.createElement("div",{className:!0===T?"col-3 px-0":"col-3 pl-0"},r.a.createElement(re,null),U&&r.a.createElement(ie,{experiment:C,getExperimentTreePkl:I,cleanPklTreeData:j,pkltreechanges:F,experimentRunning:w})),C&&R&&T&&r.a.createElement("div",{className:"col-2 pl-0"},r.a.createElement(K,{target:"tree",source:"experiment"}))))),r.a.createElement("div",{className:"tab-pane fade",id:"log",role:"tabpanel","aria-labelledby":"log-tab"},r.a.createElement("div",{className:"card"},C&&r.a.createElement(ve,null),r.a.createElement("div",{className:"card-body p-0",style:ke},r.a.createElement("div",{className:"col-12 p-0"},y&&r.a.createElement(ce,{rundata:S,loadingRun:g,cleanRunData:h,getExperimentRun:A,experiment:C,startAutoUpdateRun:y,setAutoUpdateRun:x,experimentRunning:w}),!y&&r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-12 text-center"},r.a.createElement("p",{className:"lead"},"Press"," ",r.a.createElement("span",{className:"badge badge-dark"},"Show Log")," ","to see the last 50 lines of the running log of this experiment. If the experiment is running, the log will update automatically."))))))),r.a.createElement("div",{className:"tab-pane fade",id:"stats",role:"tabpanel","aria-labelledby":"stats-tab"},r.a.createElement("div",{className:"card mt-2",style:ke},r.a.createElement("div",{className:"card-header py-0 text-muted"},r.a.createElement("small",null,"Statistics")),r.a.createElement("div",{className:"card-body p-1"},r.a.createElement("div",{className:"col-12"},r.a.createElement(de,null))))),r.a.createElement("div",{className:"tab-pane fade",id:"performance",role:"tabpanel","aria-labelledby":"performance-tab"},r.a.createElement("div",{className:"card mt-2"},C&&r.a.createElement(xe,null),r.a.createElement("div",{className:"card-body p-1"},C&&r.a.createElement(Se,null))))))),r.a.createElement(k,{expidToken:a}))},Te=function(e){e.setAlert;var t=Object(n.useContext)(E),a=Object(n.useContext)(v),l=Object(n.useState)(""),s=Object(p.a)(l,2),c=s[0],o=s[1];return r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-11"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),""===c?a.setAlert("Please enter something","light"):t.searchExperiments(c)},className:"form"},r.a.createElement("div",{className:"input-group mb-3"},r.a.createElement("input",{className:"form-control",type:"text",name:"text",placeholder:"If it uses Autosubmit, you will find it. Search by expid, description, or owner.",value:c,onChange:function(e){return o(e.target.value)}}),r.a.createElement("div",{className:"input-group-append"},r.a.createElement("input",{type:"submit",value:"Search",className:"btn btn-dark"}))))),r.a.createElement("div",{className:"col-1"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),t.getCurrentRunning()},className:"form"},r.a.createElement("div",{className:"input-group mb-3"},r.a.createElement("input",{type:"submit",value:"Running",className:"btn btn-success"}))))),t.experiments.length>0&&r.a.createElement("div",{className:"row pb-3"},r.a.createElement("div",{className:"col-md-3"},r.a.createElement("button",{className:"btn btn-info btn-block",onClick:t.getSummaries},"Show Detailed Data")),r.a.createElement("div",{className:"col-md-9"},r.a.createElement("button",{className:"btn btn-light btn-block",onClick:t.clearExperiments},"Clear"))))},we=function(e){var t=e.experiment,a=t.name,l=t.description,s=t.user,c=t.hpc,o=t.status,i=t.completed,m=t.total,d=Object(n.useContext)(E),p=d.getExperimentSummary,b=d.summaries;return r.a.createElement("div",{className:"col mb-4"},r.a.createElement("div",{className:"card"},r.a.createElement("div",{className:"card-header text-center py-1"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-md-3 text-left"},r.a.createElement("h3",{className:"font-weight-bold"},a)),r.a.createElement("div",{className:"col-md-6 text-center"}," ",i," / ",m," ",r.a.createElement("div",{className:"progress border"},r.a.createElement("div",{className:i===m?"progress-bar bg-warning":"RUNNING"===o?b[a]&&b[a].n_failed>0?"progress-bar progress-bar-striped progress-bar-animated bg-danger":"progress-bar progress-bar-striped progress-bar-animated bg-success":b[a]&&b[a].n_failed>0?"progress-bar bg-danger":"progress-bar bg-info",role:"progressbar",style:{width:m>0?i/m*100+"%":"0%"},"aria-valuenow":i,"aria-valuemin":"0","aria-valuemax":m}))),r.a.createElement("div",{className:"col-md-3 text-right"},o&&"RUNNING"===o&&r.a.createElement("span",{className:"badge badge-success text-right"},o),o&&"RUNNING"!==o&&r.a.createElement("span",{className:"badge badge-secondary text-right"},o)))),r.a.createElement("div",{className:"card-body py-1"},r.a.createElement("h6",{className:"card-subtitle text-muted pt-2"},r.a.createElement("small",null,"Owner:")," ",s),r.a.createElement("p",{className:"card-text py-1 mb-1"},r.a.createElement("small",null,l)),r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col-3 px-1"},r.a.createElement("form",{onSubmit:function(e){e.preventDefault(),p(a)},className:"form"},r.a.createElement("input",{className:b[a]?"btn btn-info btn-block btn-sm":"btn btn-outline-info btn-block btn-sm",type:"submit",value:b[a]?"Refresh":"Summary","aria-controls":a}))),r.a.createElement("div",{className:"col-9 px-1"},r.a.createElement(u.b,{to:"/autosubmitapp/experiment/".concat(a),className:"btn btn-outline-primary btn-block btn-sm"},"More")),b[a]&&!0===b[a].error&&r.a.createElement("div",{className:"col-12 pt-2",id:a},r.a.createElement("div",{className:"card card-body py-0 scroll-x"},r.a.createElement("div",{className:"row text-left"},r.a.createElement("div",{className:"col-md-12"},r.a.createElement("div",{className:"small"},r.a.createElement("strong",null,"ERROR: ",b[a].error_message)))))),b[a]&&!1===b[a].error&&r.a.createElement("div",{className:"col-12 pt-2",id:a},r.a.createElement("div",{className:"card card-body py-0 scroll-x"},r.a.createElement("div",{className:"row text-left"},r.a.createElement("div",{className:"col-md-12"},r.a.createElement("small",null,"All : avg. queue"," ",r.a.createElement("strong",null,b[a].avg_queue_time)," | run"," ",r.a.createElement("strong",null,b[a].avg_run_time)))),b[a].sim_queue_considered>0&&r.a.createElement("div",{className:"row text-left"},r.a.createElement("div",{className:"col-md-12"},r.a.createElement("small",null,"SIM "," (",b[a].n_sim,") "," : avg. queue"," ",r.a.createElement("strong",null,b[a].avg_sim_queue_time)," "," (",b[a].sim_queue_considered,") ","| run"," ",r.a.createElement("strong",null,b[a].avg_sim_run_time)," (",b[a].sim_run_considered,")"))),r.a.createElement("div",{className:"row pb-2"},r.a.createElement("div",{className:"col-12"},b[a].n_running>0&&r.a.createElement("span",{className:"badge badge-success"},"Running: ",b[a].n_running)," ",b[a].n_queuing>0&&r.a.createElement("span",{className:"badge",style:{backgroundColor:"pink"}},"Queuing: ",b[a].n_queuing)," ",b[a].n_submitted>0&&r.a.createElement("span",{className:"badge",style:{backgroundColor:"cyan"}},"Submitted: ",b[a].n_submitted)," ",b[a].n_suspended>0&&r.a.createElement("span",{className:"badge",style:{backgroundColor:"orange"}},"Suspended: ",b[a].n_suspended))),b[a].n_failed>0&&r.a.createElement("div",{className:"row px-1"},r.a.createElement("div",{className:"col-md-2 text-center px-2"},r.a.createElement("span",{className:"badge badge-danger"},"Failed: ",b[a].n_failed)),r.a.createElement("div",{className:"col-md-10 text-left"},r.a.createElement("div",{className:"",style:{overflow:"auto",maxHeight:"200px"}},r.a.createElement("small",null,r.a.createElement("ol",null,b[a].failed_jobs.map((function(e){return r.a.createElement("li",{key:e},e)})))))))))),r.a.createElement("p",{className:"card-text text-center"},r.a.createElement("small",{className:"text-muted"},"HPC: ",c)))))},Oe=function(){var e=Object(n.useContext)(E),t=e.loading,a=e.experiments;return t?r.a.createElement(h,null):r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row row-cols-1 row-cols-md-3"},a&&a.sort((function(e,t){return e.status>t.status?-1:1})).map((function(e){return r.a.createElement(we,{key:e.id,experiment:e})}))))},_e=function(){return r.a.createElement(n.Fragment,null,r.a.createElement(Te,null),r.a.createElement(Oe,null))};var Re={height:40},De=function(){return r.a.createElement(n.Fragment,null,r.a.createElement("div",{className:"row",style:Re}))},Be=a(2),Ie=a.n(Be),Ge=a(4),je=a(6),Ue=a.n(je),Fe=a(45),Pe=a(1),Le=function(e,t){switch(t.type){case"ACTIVATE_SELECTION_MODE":return Object(Pe.a)({},e,{canSelect:!0,currentSelected:[],currentCommand:null});case"DEACTIVATE_SELECTION_MODE":return Object(Pe.a)({},e,{canSelect:!1,currentSelected:[],currentCommand:null});case"CLEAN_RUN_DATA":return Object(Pe.a)({},e,{rundata:null,startAutoUpdateRun:!1});case"UPDATE_EXPERIMENT_TS":var a=t.payload;return e.experiment.pkl_timestamp=a,Object(Pe.a)({},e);case"SEARCH_EXPERIMENTS":case"CURRENT_RUNNING":return Object(Pe.a)({},e,{experiments:t.payload,loading:!1});case"SET_AUTOUPDATE_RUN":return Object(Pe.a)({},e,{startAutoUpdateRun:t.payload});case"SET_LOADING":return Object(Pe.a)({},e,{loading:!0});case"SET_LOADING_STATE":return Object(Pe.a)({},e,{loadingState:!0});case"SET_LOADING_RUN":return Object(Pe.a)({},e,{loadingRun:!0});case"CLEAR_EXPERIMENTS":return Object(Pe.a)({},e,{experiments:[],summaries:[],loading:!1});case"GET_EXPERIMENT":return Object(Pe.a)({},e,{experiment:t.payload,loading:!1,data:null,canSelect:!1});case"GET_EXPERIMENT_SUMMARY":case"CLEAR_SUMMARY_EXP":return Object(Pe.a)({},e);case"GET_EXPERIMENT_PERFORMANCE":return Object(Pe.a)({},e,{performancedata:t.payload});case"CLEAN_PERFORMANCE_METRICS":return Object(Pe.a)({},e,{performancedata:null});case"GET_EXPERIMENT_RUN":return Object(Pe.a)({},e,{rundata:t.payload,loadingRun:!1});case"GET_RUNNING_STATE":return Object(Pe.a)({},e,{experimentRunning:t.payload,loadingState:!1});case"UPDATE_SELECTED_JOBS":var n=t.payload,r=e.currentSelected.find((function(e){return e.name===n.name}));return!1===e.canSelect||r?Object(Pe.a)({},e):Object(Pe.a)({},e,{currentSelected:[].concat(Object(Fe.a)(e.currentSelected),[n]),currentCommand:null});case"SET_CURRENT_COMMAND":return Object(Pe.a)({},e,{currentCommand:t.payload});case"REMOVE_SELECTED_JOB":for(var l=t.payload,s=[],c=0;c3&&void 0!==arguments[3]?arguments[3]:.9,r=arguments.length>4?arguments[4]:void 0;n<=.05&&(n=.05),r&&(r.moveTo({position:{x:t,y:a},scale:n,animation:!1}),e&&r.selectNodes([e]))},He=function(e,t,a){var n=e+"-"+t;a.visNetwork&&a.visNetwork.body.data.edges.add([{id:n,from:e,to:t,dashes:!0,background:{enabled:!0,color:"rgba(63, 191, 63, 0.5)"},arrows:{to:{enabled:!1}}}])},Je=function(e,t){t.visNetwork&&Object.keys(t.visNetwork.body.edges).includes(e)&&(t.visNetwork.body.edges[e].options.dashes=!1,t.visNetwork.body.edges[e].options.background.enabled=!0,t.visNetwork.body.edges[e].options.background.color="rgba(63, 191, 63, 0.5)")},Ke=function(e,t){t.visNetwork&&(t.visNetwork.body.nodes[e].options.shapeProperties.borderDashes=!0,t.visNetwork.selectNodes([e]))},We=function(e,t,a){a.visNetwork&&(a.visNetwork.body.nodes[e].options.color.background=t,a.visNetwork.selectNodes([e]))},qe=function(e,t,a){a.visNetwork&&(a.visNetwork.body.nodes[e].options.shape=t,a.visNetwork.selectNodes([e]))},Ve=function(e){var t,a=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:.9,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,l=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null,c=0,o="not found";if(l&&l.nodes)if(!0===a){var i,m=Object(Qe.a)(l.nodes);try{for(m.s();!(i=m.n()).done;){var u=i.value;u.status_code===e&&u.level>=c&&(c=u.level,o=u.id)}}catch(b){m.e(b)}finally{m.f()}}else{c=Number.MAX_VALUE;var d,p=Object(Qe.a)(l.nodes);try{for(p.s();!(d=p.n()).done;){var E=d.value;E.status_code===e&&E.level<=c&&(c=E.level,o=E.id)}}catch(b){p.e(b)}finally{p.f()}}return r&&((t=r.getPositions([o]))[o]?(Ye(o,t[o].x,t[o].y,n,r),s.selection=[o]):s.selection=null),!!t[o]},Ze=function(e,t){if(t.visNetwork){var a=t.visNetwork.getPositions([e]);if(a[e])return{x:a[e].x,y:a[e].y}}return{x:null,y:null}},ze=function(e,t){switch(t.type){case"GET_GRAPH":var a=t.payload,n=a.resdata,r=a.grouped,l=a.layout;return Object(Pe.a)({},e,{data:n,current_grouped:r,current_layout:l,loadingGraph:!1,enabledGraphSearch:!0,graphSelectedNodes:null});case"GET_PKL_DATA":var s=t.payload;if(null!==e.data&&!0===s.has_changed&&s.pkl_content.length>0){for(var c,o={},i={},m={},u={},d={},p={},E="",b=s.packages,g=e.data.packages,h=0;h=0}));if(K&&K.length>0){e.foundNodes=K;var W=Ze(K[0].id,e);W.x&&W.y&&(Ye(K[0].id,W.x,W.y,.9,e.visNetwork),e.selection=[K[0].id])}else e.foundNodes=null}return Object(Pe.a)({},e,{loadingSearchJob:!1});case"SET_PKL_CHANGES":return Object(Pe.a)({},e,{pklchanges:t.payload});case"SET_LOADING_SEARCH_JOB":return Object(Pe.a)({},e,{loadingSearchJob:!0});case"SET_LOADING_JOB_MONITOR":return Object(Pe.a)({},e,{loadingJobMonitor:!0});case"SET_LOADING_PKL":return Object(Pe.a)({},e,{loadingPkl:!0});case"SET_AUTOUPDATE_PKL":return Object(Pe.a)({},e,{startAutoUpdatePkl:t.payload});case"UPDATE_NODES":return Object(Pe.a)({},e,{data:t.payload});case"CLEAN_ONLY_GRAH_DATA":return Object(Pe.a)({},e,{data:null,selection:null,enabledGraphSearch:!0,visNodes:null,visNetwork:null,foundNodes:null,current_grouped:"none",current_layout:"standard",graphSelectedNodes:null});case"SHOULD_UPDATE_GRAPH":return Object(Pe.a)({},e,{shouldUpdateGraph:t.payload});case"CLEAN_GRAPH_DATA":return Object(Pe.a)({},e,{data:null,selection:null,enabledGraphSearch:!0,loadingGraph:!1,loadingPkl:!1,visNodes:null,visNetwork:null,foundNodes:null,experimentRunning:!1,experiment:null,current_grouped:"none",current_layout:"standard",performancedata:null,canSelect:!1,currentSelected:[],currentCommand:null,graphSelectedNodes:null});case"CLEAN_PKL_DATA":return Object(Pe.a)({},e,{shouldUpdateGraph:!1,startAutoUpdatePkl:!1,pklchanges:null});case"CLEAN_NAV_DATA":return Object(Pe.a)({},e,{foundNodes:null,startAutoUpdatePkl:!1,selection:null});case"UPDATE_SELECTION":return Object(Pe.a)({},e,{selection:t.payload});case"UPDATE_GRAPH_SELECTED_NODES":if(e.graphSelectedNodes=null,e.currentCommandGraph=null,e.selection){var q=e.visNetwork.getSelectedNodes();e.graphSelectedNodes=q}return Object(Pe.a)({},e);case"SET_CURRENT_COMMAND":return Object(Pe.a)({},e,{currentCommandGraph:t.payload,canCopyToClipboard:!0});default:return null}},Xe=function(e){var t=Object(n.useReducer)(ze,{data:null,visNodes:null,visNetwork:null,loadingGraph:!1,loadingPkl:!1,loadingJobMonitor:!1,enabledGraphSearch:!0,loadingSearchJob:!1,startAutoUpdatePkl:!1,shouldUpdateGraph:!1,pklchanges:null,currentCommandGraph:null,current_grouped:"none",current_layout:"standard",selection:null,foundNodes:null,graphSelectedNodes:null,pkldata:null}),a=Object(p.a)(t,2),l=a[0],s=a[1],c=T,o=Object(n.useContext)(E),i=o.updateExperimentTimeStamp,m=o.experimentRunning,u=function(){var e=Object(Ge.a)(Ie.a.mark((function e(t){var a,n,r,l,o=arguments;return Ie.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=o.length>1&&void 0!==o[1]?o[1]:"none",n=o.length>2&&void 0!==o[2]?o[2]:"standard",h(),f(),e.next=6,Ue.a.get("".concat(c,"/graph/").concat(t,"/").concat(n,"/").concat(a));case 6:r=e.sent,l=r.data,s({type:"GET_GRAPH",payload:{resdata:l,grouped:a,layout:n}});case 10:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),d=function(){var e=Object(Ge.a)(Ie.a.mark((function e(t,a){var n,r;return Ie.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!1!==m){e.next=2;break}return e.abrupt("return");case 2:return A(),v(),e.next=7,Ue.a.get("".concat(c,"/pklinfo/").concat(t,"/").concat(a));case 7:n=e.sent,r=n.data,s({type:"GET_PKL_DATA",payload:r}),i(r.pkl_timestamp);case 12:case"end":return e.stop()}}),e)})));return function(t,a){return e.apply(this,arguments)}}(),b=function(){var e=Object(Ge.a)(Ie.a.mark((function e(t){return Ie.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:N(),s({type:"SET_FOUND_NODES",payload:t.toUpperCase()});case 2:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),g=function(){var e=Object(Ge.a)(Ie.a.mark((function e(t){return Ie.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s({type:"SET_CURRENT_COMMAND",payload:t});case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),h=function(){return s({type:"CLEAN_ONLY_GRAH_DATA"})},f=function(){return s({type:"SET_LOADING_GRAPH"})},N=function(){return s({type:"SET_LOADING_SEARCH_JOB"})},A=function(){return s({type:"SET_LOADING_PKL"})},v=function(){return s({type:"SET_LOADING_JOB_MONITOR"})};return r.a.createElement(Q.Provider,{value:{visNetwork:l.visNetwork,data:l.data,loadingGraph:l.loadingGraph,loadingPkl:l.loadingPkl,loadingJobMonitor:l.loadingJobMonitor,pklchanges:l.pklchanges,enabledGraphSearch:l.enabledGraphSearch,current_grouped:l.current_grouped,current_layout:l.current_layout,selection:l.selection,foundNodes:l.foundNodes,pkldata:l.pkldata,startAutoUpdatePkl:l.startAutoUpdatePkl,shouldUpdateGraph:l.shouldUpdateGraph,graphSelectedNodes:l.graphSelectedNodes,currentCommandGraph:l.currentCommandGraph,getExperimentGraph:u,getExperimentPkl:d,cleanOnlyGraphData:h,cleanGraphData:function(){return s({type:"CLEAN_GRAPH_DATA"})},setLoadingGraph:f,setUpdateGraph:function(e){return s({type:"SHOULD_UPDATE_GRAPH",payload:e})},setVisData:function(e){return s({type:"SET_VIS_DATA",payload:e})},setVisNetwork:function(e){return s({type:"SET_VIS_NETWORK",payload:e})},updateSelection:function(e){return s({type:"UPDATE_SELECTION",payload:e})},cleanPklData:function(){return s({type:"CLEAN_PKL_DATA"})},searchJobInGraph:b,cleanNavData:function(){return s({type:"CLEAN_NAV_DATA"})},setAutoUpdatePkl:function(e){return s({type:"SET_AUTOUPDATE_PKL",payload:e})},navigateToGroup:function(e){s({type:"NAVIGATE_TO_GROUP_GRAPH",payload:e})},navigateTo:function(e){s({type:"NAVIGATE_GRAPH_TO",payload:e})},navToLatest:function(e,t){s({type:"NAVIGATE_TO_LATEST",payload:{status:e,latest:t}})},navigateAfterLoadGraph:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];s({type:"NAVIGATE_AFTER_LOADING_GRAPH",payload:e})},updateGraphSelectedNodes:function(){return s({type:"UPDATE_GRAPH_SELECTED_NODES"})},setCurrentCommandGraph:g}},e.children)},$e=function(e,t){switch(t.type){case"GET_TREE":return Object(Pe.a)({},e,{treedata:t.payload,loadingTree:!1,enabledTreeSearch:!0});case"SET_LOADING_TREE_PKL":return Object(Pe.a)({},e,{loadingTreePkl:!0});case"SET_LOADING_TREE":return Object(Pe.a)({},e,{loadingTree:!0,enabledTreeSearch:!1});case"SET_LOADING_TREE_REFRESH":return Object(Pe.a)({},e,{loadingTreeRefresh:!0});case"SET_LOADING_FILTER":return Object(Pe.a)({},e,{loadingFilterTree:!0});case"PKL_TREE_LOADED":var a=t.payload,n={};if(null!==e.treedata&&!0===a.has_changed&&a.pkl_content.length>0){for(var r,l="",s=e.treedata.jobs,c=e.treedata.reference,o=c.packages,i=c.completed_tag,m=c.running_tag,u=c.queuing_tag,d=c.failed_tag,p=c.check_mark,E=0;E0){var T=C[0].children,w=!1;for(var O in T){T[O].refKey===b.id&&(w=!0)}!1===w&&C[0].children.push({title:b.title,refKey:b.id,data:"Empty",children:[]})}for(var _ in k){var R=c[k[_]];if(R){!0===f&&("COMPLETED"===N&&(R.completed+=1),"RUNNING"===N&&(R.running+=1),"QUEUING"===N&&(R.queuing+=1),"FAILED"===N&&(R.failed+=1),"RUNNING"===A&&(R.running-=1),"QUEUING"===A&&(R.queuing-=1),"FAILED"===A&&(R.failed-=1));var D=i.replace("%C",R.completed).replace("%T",R.total).replace("%B",R.completed===R.total?"yellow":"#ffffb3"),B=R.completed===R.total?p:"",I=R.running>0?m.replace("%R",R.running):"",G=R.queuing>0?u.replace("%Q",R.queuing):"",j=R.failed>0?d.replace("%F",R.failed):"",U=e.fancyTree.getNodesByRef(k[_]);if(U){var F=k[_]+D+j+I+G+B;U[0].setTitle(F)}}}}}var P,L=a.packages,M=Object(Qe.a)(L);try{var Q=function(){var t=P.value;if(!o.includes(t)){l+=Y(a.pkl_timestamp)+": "+t+" has been added.",o.push(t);var n="Wrapper: "+t;c[n]={completed:0,failed:0,queuing:0,running:0,total:0};for(var r=c[n],E=s.filter((function(e){return e.wrapper===t})),b=[],g=0;g0?m.replace("%R",r.running):"",A=r.queuing>0?u.replace("%Q",r.queuing):"",v=n+h+(r.failed>0?d.replace("%F",r.failed):"")+N+A+f;e.fancyTree.getRootNode().addChildren({title:v,folder:!0,refKey:n,expanded:!1,children:b})}};for(M.s();!(P=M.n()).done;)Q()}catch(q){M.e(q)}finally{M.f()}!0===a.has_changed&&(e.pkltreechanges?e.pkltreechanges=l+e.pkltreechanges:e.pkltreechanges=l)}return Object(Pe.a)({},e,{loadingTreeRefresh:!1,loadingTreePkl:!1});case"FILTER_TREEVIEW":var H=t.payload;if(e.treedata&&e.fancyTree){var J=0;if(H.indexOf("*")>-1){var K=H.split("*"),W=!1;J=e.fancyTree.filterNodes((function(e){for(var t=e.title,a=0;a0){if(!(t.indexOf(K[a])>-1)){W=!1;break}var n=t.indexOf(K[a])+K[a].length;t=t.substring(n),W=!0}return W}))}else J=e.fancyTree.filterNodes(H);e.returnFilter=J}else e.returnFilter=0;return Object(Pe.a)({},e,{loadingFilterTree:!1,returnFilter:t.payload});case"SET_FANCYTREE":return Object(Pe.a)({},e,{fancyTree:t.payload});case"SET_AUTOUPDATE_TREE_PKL":return Object(Pe.a)({},e,{startAutoUpdateTreePkl:t.payload});case"CLEAN_TREE_DATA":return Object(Pe.a)({},e,{treedata:null,enabledTreeSearch:!0,loadingTree:!1,loadingTreePkl:!1,fancyTree:null,returnFiler:0});case"CLEAN_TREE_PKL_DATA":return Object(Pe.a)({},e,{startAutoUpdateTreePkl:!1,pkltreechanges:null});case"CLEAR_FILTER_TREE":return e.treedata&&e.fancyTree&&e.fancyTree.clearFilter(),Object(Pe.a)({},e,{returnFilter:0});case"UPDATE_SELECTION_TREE":return Object(Pe.a)({},e,{selectedTreeNode:t.payload});case"SET_START_TREE_SELECTION":return e.fancyTree&&(e.fancyTree.activeNode=e.fancyTree.rootNode),Object(Pe.a)({},e);default:return null}},et=function(e){var t=Object(n.useReducer)($e,{treedata:null,loadingTree:!1,enabledTreeSearch:!0,loadingTreePkl:!1,loadingTreeRefresh:!1,loadingFilterTree:!1,fancyTree:null,startAutoUpdateTreePkl:!1,pkltreechanges:null,selectedTreeNode:null}),a=Object(p.a)(t,2),l=a[0],s=a[1],c=T,o=function(){var e=Object(Ge.a)(Ie.a.mark((function e(t){var a;return Ie.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return m(),e.next=3,Ue.a.get("".concat(c,"/tree/").concat(t));case 3:a=e.sent,s({type:"GET_TREE",payload:a.data});case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),i=function(){var e=Object(Ge.a)(Ie.a.mark((function e(t,a){var n,r;return Ie.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return E(),d(),e.next=4,Ue.a.get("".concat(c,"/pkltreeinfo/").concat(t,"/").concat(a));case 4:n=e.sent,r=n.data,s({type:"PKL_TREE_LOADED",payload:r});case 8:case"end":return e.stop()}}),e)})));return function(t,a){return e.apply(this,arguments)}}(),m=function(){return s({type:"SET_LOADING_TREE"})},u=function(){return s({type:"SET_LOADING_FILTER"})},d=function(){return s({type:"SET_LOADING_TREE_REFRESH"})},E=function(){return s({type:"SET_LOADING_TREE_PKL"})};return r.a.createElement(X.Provider,{value:{treedata:l.treedata,loadingTree:l.loadingTree,loadingTreePkl:l.loadingTreePkl,loadingFilterTree:l.loadingFilterTree,enabledTreeSearch:l.enabledTreeSearch,returnFilter:l.returnFilter,fancyTree:l.fancyTree,startAutoUpdateTreePkl:l.startAutoUpdateTreePkl,pkltreechanges:l.pkltreechanges,selectedTreeNode:l.selectedTreeNode,getExperimentTree:o,getExperimentTreePkl:i,filterTreeView:function(e){u(),s({type:"FILTER_TREEVIEW",payload:e})},setFancyTree:function(e){return s({type:"SET_FANCYTREE",payload:e})},cleanTreeData:function(){return s({type:"CLEAN_TREE_DATA"})},cleanPklTreeData:function(){return s({type:"CLEAN_TREE_PKL_DATA"})},updateSelectionTree:function(e){s({type:"UPDATE_SELECTION_TREE",payload:e})},setAutoUpdateTreePkl:function(e){return s({type:"SET_AUTOUPDATE_TREE_PKL",payload:e})},clearFilterTreeView:function(){return s({type:"CLEAR_FILTER_TREE"})},setStartSelection:function(){return s({type:"SET_START_TREE_SELECTION"})}}},e.children)},tt=function(e,t){switch(t.type){case"SET_ALERT":return t.payload;case"REMOVE_ALERT":return null;default:return e}},at=function(e){var t=Object(n.useReducer)(tt,null),a=Object(p.a)(t,2),l=a[0],s=a[1];return r.a.createElement(v.Provider,{value:{alert:l,setAlert:function(e,t){s({type:"SET_ALERT",payload:{msg:e,type:t}}),setTimeout((function(){return s({type:"REMOVE_ALERT"})}),5e3)}}},e.children)},nt=function(e,t){switch(t.type){case"SET_LOADING":return Object(Pe.a)({},e,{loading:!0});case"GET_EXPERIMENT_STATS":var a=t.payload,n=a.result,r=a.requestResult,l=a.ticks;return Object(Pe.a)({},e,{statdata:n,totaldata:r,ticksdata:l,loading:!1});case"CLEAR_STATS":return Object(Pe.a)({},e,{statdata:null,totaldata:null,ticksdata:null,loading:!1,isError:!1,errorMessage:""});case"SET_ERROR_STATS":var s=t.payload,c=s.error,o=s.msg;return Object(Pe.a)({},e,{isError:c,errorMessage:o});default:return e}},rt=function(e){var t=Object(n.useReducer)(nt,{loading:!1,statdata:null,ticksdata:null,isError:!1,totaldata:null,errorMessage:""}),a=Object(p.a)(t,2),l=a[0],s=a[1],c=function(){var e=Object(Ge.a)(Ie.a.mark((function e(t,a,n){var r,l,c,m,u;return Ie.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return 0===a.length&&(a=0),0===n.length&&(n="Any"),o(),e.next=6,Ue.a.get("".concat("https://earth.bsc.es/autosubmitapi/","/stats/").concat(t,"/").concat(a,"/").concat(n));case 6:if(r=e.sent,l=[],c=null,m=[],r.data){for(!0===r.data.error?i(!0,r.data.error_message):i(!1,""),l.push(["Jobs","Queued","Run","Failed Jobs","Failed Queued","Fail Run"]),u=0;u \n \"Loading...\"\n \n\nexport default Spinner\n","import React, { useEffect, useContext } from \"react\";\nimport Spinner from \"../layout/Spinner\";\n// import { Link } from \"react-router-dom\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\n\nconst Experiment = ({ expidToken }) => {\n //console.log(expidToken);\n const experimentContext = useContext(ExperimentContext);\n const {\n loading,\n loadingState,\n experiment,\n experimentRunning,\n // getRunningState,\n } = experimentContext;\n //var interval;\n\n useEffect(() => {\n if (expidToken) {\n // getExperiment(expidToken);\n // getRunningState(expidToken);\n // getExperimentTree(expidToken);\n // getExperimentPerformanceMetrics(expidToken);\n // const interval = setInterval(() => getRunningState(expidToken), 300000);\n // return () => clearInterval(interval);\n }\n\n // eslint-disable-next-line\n }, []);\n\n if (experiment === null) return ;\n\n const { expid, error, error_message } = experiment;\n\n if (loading) return Loading...;\n if (!expidToken) return ;\n return (\n \n {expid} {/* {description}{\" \"} */}\n {error &&
    {error_message}
    }{\" \"}\n {loadingState && (\n LOADING...\n )}\n {experimentRunning && !loadingState && (\n RUNNING\n )}\n {!experimentRunning && !loadingState && (\n NOT RUNNING\n )}\n
    \n );\n};\n\nexport default Experiment;\n","import React, { useContext, useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Link, useHistory } from \"react-router-dom\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport Experiment from \"../experiment/Experiment\";\n\nconst Navbar = ({ icon, title }) => {\n const history = useHistory();\n const experimentContext = useContext(ExperimentContext);\n const { searchExperiments, experiment } = experimentContext;\n const [text, setText] = useState(\"\");\n //const expid = match.params.expid;\n const submitSearch = (e) => {\n e.preventDefault();\n if (text !== \"\") {\n searchExperiments(text);\n history.push(\"/autosubmitapp/\");\n }\n };\n var expid = null;\n if (experiment) {\n expid = experiment.expid;\n }\n //const { expid } = experiment;\n const onChange = (e) => setText(e.target.value);\n\n return (\n \n\n // \n );\n};\n\nNavbar.defaultProps = {\n title: \"Autosubmit Searcher\",\n icon: \"fas fa-home\",\n};\n\nNavbar.propTypes = {\n title: PropTypes.string.isRequired,\n icon: PropTypes.string.isRequired,\n};\n\nexport default Navbar;\n","import { createContext } from 'react';\n\nconst alertContext = createContext();\n\nexport default alertContext;\n","import React, { useContext } from 'react';\nimport AlertContext from '../context/alert/alertContext';\n\nconst Alert = () => {\n const alertContext = useContext(AlertContext);\n const { alert } = alertContext;\n return (\n alert !== null && (\n
    \n {alert.msg}\n
    \n )\n );\n};\n\nexport default Alert;\n","import React, { Fragment } from \"react\";\n\nconst About = () => {\n return (\n \n

    User Information

    \n

    \n For user instructions visit our user guide{\" \"}\n \n User Guide\n \n .\n

    \n

    \n To request more information make a post in the issue{\" \"}\n \n Autosubmit User Documentation\n \n .\n

    \n

    Bugs and Requests

    \n

    \n If you find a bug or want to request some important feature, please open\n an issue at{\" \"}\n \n Autosubmit Issues\n \n .\n

    \n

    Version: 1.0.0-beta

    \n
    \n );\n};\n\nexport default About;\n","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nconst NotFound = () => {\n return (\n
    \n

    Oops!

    \n

    Looks like you are lost. Better go back home.

    \n \n Back Home\n \n
    \n )\n}\n\nexport default NotFound\n","import React, { useContext } from \"react\";\n//import Spinner from \"../layout/Spinner\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\n\nconst ExperimentColumn = ({ expidToken, refTree }) => {\n //console.log(expidToken);\n const experimentContext = useContext(ExperimentContext);\n const { loading, experiment } = experimentContext;\n\n if (experiment === null)\n return (\n
    \n
    \n
    \n
    No data...
    \n
    \n
    \n
    \n );\n\n const {\n // expid,\n owner,\n owner_id,\n //path,\n //time_last_access,\n time_last_mod,\n version,\n //updateTime,\n branch,\n hpc,\n description,\n //isGrouped,\n } = experiment;\n\n if (loading)\n return (\n
    \n
    \n
    \n
    Loading...
    \n
    \n
    \n
    \n );\n\n return (\n
    \n
    \n
    \n
    \n {description}|\n \n Branch: {branch}\n \n |\n \n Hpc: {hpc}\n \n |\n \n Owner: {owner_id} {owner}{\" \"}\n \n |\n \n Version: {version}\n \n |\n \n Modified: {time_last_mod}\n \n
    \n {/*
    \n {description}\n
    \n
    \n Version: {version}\n
    \n
    \n Owner: {owner_id} {owner}\n
    */}\n
    \n
    \n {/*
    \n
    \n
    \n
    \n Version: {version}\n
    \n
    \n Owner: {owner_id}{\" \"}\n {owner}\n
    \n
    \n Path:{\" \"}\n {path}\n
    \n
    \n
    \n
    \n SleepTime: {\" \"}\n {updateTime}\n
    \n
    \n Modified:{\" \"}\n {time_last_mod}\n
    \n
    \n
    \n
    \n Branch:\n
    \n
    {branch}
    \n
    \n
    \n
    \n Hpc:\n
    \n
    {hpc}
    \n
    \n
    \n
    */}\n
    \n\n //
    \n //
    \n //
    \n //
    \n //
    \n //
    \n // Version:\n //
    \n //
    {version}
    \n //
    \n // Owner:\n //
    \n //
    \n // {owner_id} {owner}\n //
    \n //
    \n // Path:\n //
    \n //
    \n // {path}\n //
    \n //
    \n // SleepTime: \n //
    \n //
    {updateTime}
    \n //
    \n // Modified:\n //
    \n //
    {time_last_mod}
    \n //
    \n //
    \n //
    \n //
    \n\n //
    \n );\n};\n\nexport default ExperimentColumn;\n","export const AUTOSUBMIT_API_SOURCE = \"https://earth.bsc.es/autosubmitapi/\";\n//export const AUTOSUBMIT_API_SOURCE = \"http://84.88.185.94:8081\";\nexport const DEBUG = false;\nexport const WaitingCode = 0;\nexport const FailedCode = -1;\nexport const CompletedCode = 5;\nexport const RunningCode = 4;\nexport const QueueCode = 3;\nexport const SubmittedCode = 2;\nexport const UnknownCode = -2;\nexport const SuspendedCode = -3;\nexport const HoldCode = 6;\nexport const ReadyCode = 1;\nexport const PreparedCode = 7;\n\nexport const queueColor = {\n background: \"lightpink\",\n fontWeight: \"bold\",\n};\nexport const failedColor = {\n background: \"red\",\n fontWeight: \"bold\",\n color: \"white\",\n};\nexport const completedColor = {\n background: \"yellow\",\n fontWeight: \"bold\",\n};\nexport const submittedColor = {\n background: \"cyan\",\n fontWeight: \"bold\",\n};\nexport const runningColor = {\n background: \"green\",\n fontWeight: \"bold\",\n color: \"white\",\n};\nexport const readyColor = {\n background: \"lightblue\",\n fontWeight: \"bold\",\n};\nexport const waitingColor = {\n background: \"gray\",\n fontWeight: \"bold\",\n color: \"white\",\n};\nexport const unknownColor = {\n background: \"white\",\n color: \"black\",\n fontWeight: \"bold\",\n};\nexport const suspendedColor = {\n background: \"orange\",\n fontWeight: \"bold\",\n color: \"white\",\n};\nexport const holdColor = {\n background: \"salmon\",\n fontWeight: \"bold\",\n color: \"white\",\n};\nexport const preparedColor = {\n background: \"lightsalmon\",\n fontWeight: \"bold\",\n};\n","import React, { Component } from \"react\";\n// import vis from \"vis-network\";\nimport Spinner from \"../layout/Spinner\";\nimport vis from \"vis-network\";\nimport { DEBUG } from \"../context/vars\";\nclass GraphNativeRep extends Component {\n shouldComponentUpdate(nextProps, nextState) {\n if (this.props.shouldUpdateGraph === true) {\n //console.log(\"should Rerender\")\n return true;\n } else if (\n nextProps.data &&\n this.props.data &&\n nextProps.data.pkl_timestamp !== this.props.data.pkl_timestamp\n ) {\n //console.log(\"Rerendering\")\n return true;\n } else if (nextProps.loadingGraph !== this.props.loadingGraph) {\n //console.log(\"Render because changed loading\")\n return true;\n } else {\n //console.log(\"NO RERENDER\")\n return false;\n }\n }\n componentWillUnmount() {\n DEBUG && console.log(\"Unmounting Nav Rep\");\n this.props.cleanGraphData();\n this.props.clearStats();\n }\n\n render() {\n if (this.props.loadingGraph) return ;\n if (!this.props.data) {\n return (\n
    \n

    \n Press Classic to see the\n standard graph representation of the experiment.\n

    \n

    \n For the classic approach, the algorithm will first try to use\n graphviz, there are some constraints in place that try to identify\n those instances that could potentially make graphviz run forever. If\n an experiment is identified to be time-wise out of bounds for\n graphviz, it will be sent to the regular algorithm. Currently, the\n regular algorithm does not handle well wrappers; work is being done\n to developed a general algorithm.\n

    \n

    \n Press Grouped to see the\n grouped by date-member graph representation of the experiment.\n

    \n

    \n If the experiment instance cannot be handled by graphviz, then it\n would not be possible to group it. Again, work is being done to\n overcome this.\n

    \n

    \n If the experiment is{\" \"}\n RUNNING and the Graph\n has been rendered, press{\" \"}\n Start Job Monitor to start\n a live tracker of the changes on the experiment's jobs. This process\n will automatically update the graph's nodes colors and show a log of\n the detected changes.\n

    \n

    \n If there are any defined wrappers, they will be shown on the\n corresponding tab at the right side of the Graph. You can click on\n any member of that list and the nodes belonging to that wrapper will\n be highlighted.\n

    \n
    \n );\n }\n\n var nodes_array = [];\n var edges_array = [];\n const graphviz = this.props.data.graphviz;\n const groups = this.props.data.groups;\n const groups_data = this.props.data.groups_data;\n const current_grouped = this.props.current_grouped;\n\n if (this.props.data.nodes.length > 0 && this.props.data.edges !== null) {\n if (graphviz === true) {\n this.props.data.nodes.map((node) =>\n nodes_array.push({\n id: node.id,\n label: node.label,\n shape: node.shape,\n color: { background: node.status_color, border: \"black\" },\n status: node.status,\n // level: node.level, // receiving x and y from API\n // fixed: { x: true, y: true},\n x: node.x,\n y: node.y,\n shapeProperties: { borderDashes: node.dashed },\n })\n );\n } else {\n this.props.data.nodes.map((node) =>\n nodes_array.push({\n id: node.id,\n label: node.label,\n shape: node.shape,\n color: { background: node.status_color, border: \"black\" },\n status: node.status,\n //level: node.level,\n //y: node.level*80,\n shapeProperties: { borderDashes: node.dashed },\n // fixed: { x: true, y: true},\n x: node.x,\n y: node.y,\n // x: node.x * -90,\n // y: node.y * -100,\n })\n );\n }\n\n if (this.props.data.edges) {\n this.props.data.edges.map((edge) =>\n edges_array.push({\n id: edge.id,\n from: edge.from,\n to: edge.to,\n dashes: edge.dashed,\n background: {\n enabled: edge.is_wrapper,\n color: \"rgba(63, 191, 63, 0.5)\",\n },\n arrows: { to: { enabled: !edge.dashed } },\n })\n );\n }\n\n if (this.props.data.fake_edges) {\n this.props.data.fake_edges.map((edge) =>\n edges_array.push({\n id: edge.id,\n from: edge.from,\n to: edge.to,\n dashes: edge.dashed,\n background: {\n enabled: edge.is_wrapper,\n color: \"rgba(63, 191, 63, 0.5)\",\n },\n arrows: { to: { enabled: !edge.dashed } },\n })\n );\n }\n } else {\n return (\n
    \n

    Something has gone very wrong.

    \n

    {this.props.data.error_message}

    \n
    \n );\n }\n\n var nodes = new vis.DataSet(nodes_array);\n var edges = new vis.DataSet(edges_array);\n\n var shouldEdge = false;\n if (this.props.data.total_jobs <= 500) {\n shouldEdge = true;\n }\n const options = {\n autoResize: true,\n edges: {\n arrows: {\n to: { enabled: true },\n },\n },\n layout: {\n improvedLayout: false,\n hierarchical: {\n nodeSpacing: 190,\n blockShifting: false,\n edgeMinimization: shouldEdge,\n parentCentralization: true,\n sortMethod: \"hubsize\",\n direction: \"UD\",\n enabled: false,\n },\n },\n interaction: {\n dragNodes: true,\n hoverConnectedEdges: true,\n hideEdgesOnDrag: true,\n //hideEdgesOnZoom: true,\n multiselect: true,\n navigationButtons: true,\n },\n physics: {\n enabled: false,\n stabilization: {\n // Determines an initial layout; enabled by default\n enabled: true,\n iterations: 1000,\n },\n },\n nodes: {\n shape: \"dot\",\n font: {\n size: 10,\n },\n },\n };\n\n const graph = {\n nodes: nodes,\n edges: edges,\n };\n\n class VisNetwork extends Component {\n shouldComponentUpdate(nextProps, nextState) {\n if (this.props.shouldUpdateGraph === true) {\n DEBUG && console.log(\"Should rerender form inside\");\n return true;\n } else {\n //console.log(\"No RERENDER\")\n DEBUG && console.log(\"No rerender\");\n return false;\n }\n }\n\n componentDidMount() {\n let network = new vis.Network(\n this.refs.myRef,\n this.props.graph,\n this.props.options\n );\n const groups_data = this.props.groups_data;\n const current_grouped = this.props.current_grouped;\n\n this.props.setVisNetwork(network);\n network.on(\"select\", (params) => {\n if (params.nodes) {\n if (params.nodes.length === 1) {\n if (network.isCluster(params.nodes[0])) {\n } else {\n //console.log(params.nodes);\n this.props.updateSelection(params.nodes);\n // this.props.updateGraphSelectedNodes(params.nodes);\n this.props.updateCurrentSelected(\n params.nodes[0],\n this.props.data\n );\n }\n }\n // } else {\n // this.props.updateSelection(params.nodes);\n // }\n }\n });\n\n // network.on(\"stabilized\", () => {\n // this.props.navigateAfterLoadGraph(this.props.experimentRunning);\n // });\n\n network.on(\"doubleClick\", (params) => {\n if (params.nodes) {\n if (params.nodes.length === 1) {\n if (network.isCluster(params.nodes[0])) {\n var OpenClusterObj = {};\n OpenClusterObj.releaseFunction = function (\n clusterPosition,\n containedNodesPositions\n ) {\n return containedNodesPositions;\n };\n network.openCluster(params.nodes[0], OpenClusterObj);\n }\n }\n }\n });\n\n //network.enableEditMode();\n //console.log(this.props.isGraphViz);\n if (this.props.clusterGroups) {\n const groups = this.props.clusterGroups;\n if (current_grouped === \"date-member\") {\n var clusterOptionsByDateMember;\n for (var i = 0; i < groups.length; i++) {\n var startingName = groups[i];\n // if (positions[startingName]){\n // console.log(positions[startingName]);\n // }\n clusterOptionsByDateMember = {\n // eslint-disable-next-line no-loop-func\n joinCondition: function (options) {\n return options.id.startsWith(startingName);\n },\n processProperties: function (\n clusterOptions,\n childNodes,\n childEdges\n ) {\n var totalMass = 0;\n for (var i = 0; i < childNodes.length; i++) {\n totalMass += childNodes[i].mass;\n }\n clusterOptions.mass = totalMass;\n return clusterOptions;\n },\n clusterNodeProperties: {\n id: \"cluster:\" + startingName,\n borderWidth: 3,\n shape: \"box\",\n label: startingName.split(\"_\").join(\"\\n\"),\n color: groups_data[startingName].color,\n font: { size: 50 },\n x: groups_data[startingName].x,\n y: groups_data[startingName].y,\n },\n };\n network.clustering.cluster(clusterOptionsByDateMember);\n }\n } else if (current_grouped === \"status\") {\n var clusterOptionsByStatus;\n for (var j = 0; j < groups.length; j++) {\n var statusName = groups[j];\n // console.log(statusName);\n clusterOptionsByStatus = {\n // eslint-disable-next-line no-loop-func\n joinCondition: function (options) {\n // console.log(options);\n return (\n options.status === statusName && options.shape === \"dot\"\n );\n },\n processProperties: function (\n clusterOptions,\n childNodes,\n childEdges\n ) {\n var totalMass = 0;\n for (var i = 0; i < childNodes.length; i++) {\n totalMass += childNodes[i].mass;\n }\n clusterOptions.mass = totalMass;\n return clusterOptions;\n },\n clusterNodeProperties: {\n id: statusName,\n borderWidth: 3,\n shape: \"box\",\n label: statusName,\n color: groups_data[statusName].color,\n font: { size: 50 },\n },\n };\n network.clustering.cluster(clusterOptionsByStatus);\n }\n }\n }\n\n this.props.navigateAfterLoadGraph(this.props.experimentRunning);\n }\n\n componentWillUnmount() {\n DEBUG && console.log(\"Unmounting VisNetwork\");\n this.props.cleanNavData();\n }\n\n render() {\n return (\n
    \n
    \n
    \n );\n }\n }\n\n return (\n \n );\n }\n}\n\nconst experimentStyle = {\n height: 755,\n};\n\nexport default GraphNativeRep;\n","import { createContext } from \"react\";\n\nconst graphContext = createContext();\n\nexport default graphContext;\n","export const timeStampToDate = (value) => {\n //console.log('Setting new format: ' + value);\n let formattedDate = \"\";\n var date = new Date(value * 1000);\n var hours = date.getHours();\n var minutes = \"0\" + date.getMinutes();\n var seconds = \"0\" + date.getSeconds();\n var month = date.getMonth() + 1;\n var day = date.getDate();\n //console.log(date)\n formattedDate =\n \"[\" +\n day +\n \"/\" +\n month +\n \"] \" +\n hours +\n \":\" +\n minutes.substr(-2) +\n \":\" +\n seconds.substr(-2);\n // formattedDate = date.toISOString();\n return formattedDate;\n};\n\nexport const hashCode = (value) => {\n var hash = 0,\n i,\n chr;\n if (value.length === 0) return hash;\n for (i = 0; i < value.length; i++) {\n chr = value.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n console.log(hash);\n return hash;\n};\n\nexport const commandGeneratorGraph = (expid, jobs, status) => {\n let command = \"Invalid Command: You have to select at least one job.\";\n //jobs.map((job) => arrayNames.push(job.name));\n if (jobs.length > 0) {\n command =\n \"autosubmit setstatus \" +\n expid +\n ' -fl \"' +\n jobs.join(\" \") +\n '\" -t ' +\n status +\n \" -s -nt -np\";\n }\n return command;\n};\n\nexport const commandGenerator = (expid, jobs, status) => {\n let arrayNames = [];\n let command = \"Invalid Command: You have to select at least one job.\";\n jobs.map((job) => arrayNames.push(job.name));\n if (arrayNames.length > 0) {\n command =\n \"autosubmit setstatus \" +\n expid +\n ' -fl \"' +\n arrayNames.join(\" \") +\n '\" -t ' +\n status +\n \" -s -nt -np\";\n }\n return command;\n};\n\nexport const secondsToDelta = (SECONDS) => {\n if (SECONDS > 0) {\n var sec_num = SECONDS; // don't forget the second param\n var hours = Math.floor(sec_num / 3600);\n var minutes = Math.floor((sec_num - hours * 3600) / 60);\n var seconds = sec_num - hours * 3600 - minutes * 60;\n\n if (hours < 10) {\n hours = \"0\" + hours;\n }\n if (minutes < 10) {\n minutes = \"0\" + minutes;\n }\n if (seconds < 10) {\n seconds = \"0\" + seconds;\n }\n return hours + \":\" + minutes + \":\" + seconds;\n } else {\n return \"0:00:00\";\n }\n};\n","import React, { useContext } from \"react\";\nimport GraphContext from \"../context/graph/graphContext\";\nimport ExperimentContext from \"../context/experiment/experimentContext\";\nimport { DEBUG } from \"../context/vars\";\nimport { commandGenerator, commandGeneratorGraph } from \"../context/utils\";\n\nconst CommandModal = ({ source, target }) => {\n const graphContext = useContext(GraphContext);\n const experimentContext = useContext(ExperimentContext);\n\n const {\n currentSelected,\n setCurrentCommand,\n experiment,\n currentCommand,\n } = experimentContext;\n const {\n graphSelectedNodes,\n setCurrentCommandGraph,\n currentCommandGraph,\n } = graphContext;\n let expid = null;\n if (experiment) {\n expid = experiment.expid;\n }\n const sourceSelection =\n source === \"graph-only\" ? graphSelectedNodes : currentSelected;\n const sourceCommand =\n source === \"graph-only\" ? currentCommandGraph : currentCommand;\n\n const invalidMessage =\n source === \"graph-only\"\n ? \"Invalid Selection: You have to select at least one job from the Graph. You can select multiple jobs.\"\n : \"Invalid Selection: You have to select at least one job.\";\n\n // console.log(sourceSelection);\n // console.log(sourceCommand);\n\n const setStatusCommand = (status) => (e) => {\n e.preventDefault();\n let command = \"\";\n if (source === \"graph-only\") {\n command = commandGeneratorGraph(status, sourceSelection, expid);\n copyContent(command);\n setCurrentCommandGraph(command);\n } else {\n command = commandGenerator(status, sourceSelection, expid);\n copyContent(command);\n setCurrentCommand(command);\n }\n };\n\n const copyContent = (inputname) => {\n //e.preventDefault();\n DEBUG && console.log(\"Sending \" + inputname);\n window.copyTextToClipboard(inputname);\n };\n\n //copying to Clipboard\n // if (sourceCommand && sourceCommand.length > 0) {\n // if (canCopyToClipboard === true) {\n // DEBUG && console.log(sourceCommand);\n // copyContent(JSON.parse(JSON.stringify(sourceCommand)));\n // }\n // }\n\n let modalHeader =
    {invalidMessage}
    ;\n\n if (sourceSelection && sourceSelection.length > 0) {\n modalHeader = (\n
    \n Set status to:{\" \"}\n
    \n \n Ready\n \n \n Waiting\n \n \n Completed\n \n \n Suspended\n \n \n Failed\n \n
    \n
    \n );\n }\n return (\n