Merge remote-tracking branch 'Superalgos/develop' into develop
This commit is contained in:
commit
8656d25616
20 files changed
+1931
-1623
No files matched your search
Generated
+155
-155
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@superalgos/operations-client",
|
||||
"version": "0.0.14",
|
||||
"version": "0.0.18",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -9,7 +9,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz",
|
||||
"integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==",
|
||||
"requires": {
|
||||
"regenerator-runtime": "0.12.1"
|
||||
"regenerator-runtime": "^0.12.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"regenerator-runtime": {
|
||||
@@ -25,31 +25,31 @@
|
||||
"integrity": "sha512-wDTJyR76+OBdlltiPs3lc1gD6zR+dSA6nITtgkBeLf1NvWfNotMWdvldIDnF3bu24ySAX9imfzDfkBu4Edtqww==",
|
||||
"requires": {
|
||||
"@babel/runtime": "7.1.2",
|
||||
"@types/jss": "9.5.6",
|
||||
"@types/react-transition-group": "2.0.14",
|
||||
"brcast": "3.0.1",
|
||||
"classnames": "2.2.6",
|
||||
"csstype": "2.5.7",
|
||||
"debounce": "1.2.0",
|
||||
"deepmerge": "2.2.1",
|
||||
"dom-helpers": "3.3.1",
|
||||
"hoist-non-react-statics": "2.5.5",
|
||||
"is-plain-object": "2.0.4",
|
||||
"jss": "9.8.7",
|
||||
"jss-camel-case": "6.1.0",
|
||||
"jss-default-unit": "8.0.2",
|
||||
"jss-global": "3.0.0",
|
||||
"jss-nested": "6.0.1",
|
||||
"jss-props-sort": "6.0.0",
|
||||
"jss-vendor-prefixer": "7.0.0",
|
||||
"keycode": "2.2.0",
|
||||
"normalize-scroll-left": "0.1.2",
|
||||
"popper.js": "1.14.4",
|
||||
"prop-types": "15.6.2",
|
||||
"react-event-listener": "0.6.4",
|
||||
"react-transition-group": "2.5.0",
|
||||
"recompose": "0.30.0",
|
||||
"warning": "4.0.2"
|
||||
"@types/jss": "^9.5.6",
|
||||
"@types/react-transition-group": "^2.0.8",
|
||||
"brcast": "^3.0.1",
|
||||
"classnames": "^2.2.5",
|
||||
"csstype": "^2.5.2",
|
||||
"debounce": "^1.1.0",
|
||||
"deepmerge": "^2.0.1",
|
||||
"dom-helpers": "^3.2.1",
|
||||
"hoist-non-react-statics": "^2.5.0",
|
||||
"is-plain-object": "^2.0.4",
|
||||
"jss": "^9.3.3",
|
||||
"jss-camel-case": "^6.0.0",
|
||||
"jss-default-unit": "^8.0.2",
|
||||
"jss-global": "^3.0.0",
|
||||
"jss-nested": "^6.0.1",
|
||||
"jss-props-sort": "^6.0.0",
|
||||
"jss-vendor-prefixer": "^7.0.0",
|
||||
"keycode": "^2.1.9",
|
||||
"normalize-scroll-left": "^0.1.2",
|
||||
"popper.js": "^1.14.1",
|
||||
"prop-types": "^15.6.0",
|
||||
"react-event-listener": "^0.6.2",
|
||||
"react-transition-group": "^2.2.1",
|
||||
"recompose": "0.28.0 - 0.30.0",
|
||||
"warning": "^4.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": {
|
||||
@@ -57,7 +57,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz",
|
||||
"integrity": "sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==",
|
||||
"requires": {
|
||||
"regenerator-runtime": "0.12.1"
|
||||
"regenerator-runtime": "^0.12.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -68,7 +68,7 @@
|
||||
"integrity": "sha512-1kNcxYiIT1x8iDPEAlgmKrfRTIV8UyK6fLVcZ9kMHIKGWft9I451V5mvSrbCjbf7MX1TbLWzZjph0aVCRf9MqQ==",
|
||||
"requires": {
|
||||
"@babel/runtime": "7.0.0",
|
||||
"recompose": "0.29.0"
|
||||
"recompose": "^0.29.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"recompose": {
|
||||
@@ -76,12 +76,12 @@
|
||||
"resolved": "https://registry.npmjs.org/recompose/-/recompose-0.29.0.tgz",
|
||||
"integrity": "sha512-J/qLXNU4W+AeHCDR70ajW8eMd1uroqZaECTj6qqDLPMILz3y0EzpYlvrnxKB9DnqcngWrtGwjXY9JeXaW9kS1A==",
|
||||
"requires": {
|
||||
"@babel/runtime": "7.0.0",
|
||||
"change-emitter": "0.1.6",
|
||||
"fbjs": "0.8.17",
|
||||
"hoist-non-react-statics": "2.5.5",
|
||||
"react-lifecycles-compat": "3.0.4",
|
||||
"symbol-observable": "1.2.0"
|
||||
"@babel/runtime": "^7.0.0",
|
||||
"change-emitter": "^0.1.2",
|
||||
"fbjs": "^0.8.1",
|
||||
"hoist-non-react-statics": "^2.3.1",
|
||||
"react-lifecycles-compat": "^3.0.2",
|
||||
"symbol-observable": "^1.0.4"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -97,8 +97,8 @@
|
||||
"resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.5.6.tgz",
|
||||
"integrity": "sha512-7TWmR5y1jYG4ka4wTZt65RR0kw4WgALFUWktQIWbLnDd6/z/0SQZ/4+UeH0rhdp+HEdIfmzPBH0VwE/4Z9Evzw==",
|
||||
"requires": {
|
||||
"csstype": "2.5.7",
|
||||
"indefinite-observable": "1.0.1"
|
||||
"csstype": "^2.0.0",
|
||||
"indefinite-observable": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"@types/prop-types": {
|
||||
@@ -111,8 +111,8 @@
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-16.4.16.tgz",
|
||||
"integrity": "sha512-lxyoipLWweAnLnSsV4Ho2NAZTKKmxeYgkTQ6PaDiPDU9JJBUY2zJVVGiK1smzYv8+ZgbqEmcm5xM74GCpunSEA==",
|
||||
"requires": {
|
||||
"@types/prop-types": "15.5.6",
|
||||
"csstype": "2.5.7"
|
||||
"@types/prop-types": "*",
|
||||
"csstype": "^2.2.0"
|
||||
}
|
||||
},
|
||||
"@types/react-transition-group": {
|
||||
@@ -120,7 +120,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.0.14.tgz",
|
||||
"integrity": "sha512-pa7qB0/mkhwWMBFoXhX8BcntK8G4eQl4sIfSrJCxnivTYRQWjOWf2ClR9bWdm0EUFBDHzMbKYS+QYfDtBzkY4w==",
|
||||
"requires": {
|
||||
"@types/react": "16.4.16"
|
||||
"@types/react": "*"
|
||||
}
|
||||
},
|
||||
"@types/zen-observable": {
|
||||
@@ -133,7 +133,7 @@
|
||||
"resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.17.tgz",
|
||||
"integrity": "sha512-7sp24n2HZO4vXgTaKNomLyIfGxG4gDdDkBB0jkRzRi7HhnKmfwhiF/RCiKNbgLdrPX151INdls0KwIVliD0dHQ==",
|
||||
"requires": {
|
||||
"apollo-utilities": "1.0.21"
|
||||
"apollo-utilities": "^1.0.21"
|
||||
}
|
||||
},
|
||||
"apollo-client": {
|
||||
@@ -142,13 +142,13 @@
|
||||
"integrity": "sha512-g1z23umaVSoKLj9xNl0aAnk2KBF4JeBi7MeKFc9CGTixH7TkqeQUQtxcjrC7j2h4KmDbuhOAHOFUGf8YshN+ag==",
|
||||
"requires": {
|
||||
"@types/async": "2.0.49",
|
||||
"@types/zen-observable": "0.8.0",
|
||||
"@types/zen-observable": "^0.8.0",
|
||||
"apollo-cache": "1.1.17",
|
||||
"apollo-link": "1.2.3",
|
||||
"apollo-link-dedup": "1.0.10",
|
||||
"apollo-link": "^1.0.0",
|
||||
"apollo-link-dedup": "^1.0.0",
|
||||
"apollo-utilities": "1.0.21",
|
||||
"symbol-observable": "1.2.0",
|
||||
"zen-observable": "0.8.9"
|
||||
"symbol-observable": "^1.0.2",
|
||||
"zen-observable": "^0.8.0"
|
||||
}
|
||||
},
|
||||
"apollo-link": {
|
||||
@@ -156,8 +156,8 @@
|
||||
"resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.3.tgz",
|
||||
"integrity": "sha512-iL9yS2OfxYhigme5bpTbmRyC+Htt6tyo2fRMHT3K1XRL/C5IQDDz37OjpPy4ndx7WInSvfSZaaOTKFja9VWqSw==",
|
||||
"requires": {
|
||||
"apollo-utilities": "1.0.21",
|
||||
"zen-observable-ts": "0.8.10"
|
||||
"apollo-utilities": "^1.0.0",
|
||||
"zen-observable-ts": "^0.8.10"
|
||||
}
|
||||
},
|
||||
"apollo-link-dedup": {
|
||||
@@ -165,7 +165,7 @@
|
||||
"resolved": "https://registry.npmjs.org/apollo-link-dedup/-/apollo-link-dedup-1.0.10.tgz",
|
||||
"integrity": "sha512-tpUI9lMZsidxdNygSY1FxflXEkUZnvKRkMUsXXuQUNoSLeNtEvUX7QtKRAl4k9ubLl8JKKc9X3L3onAFeGTK8w==",
|
||||
"requires": {
|
||||
"apollo-link": "1.2.3"
|
||||
"apollo-link": "^1.2.3"
|
||||
}
|
||||
},
|
||||
"apollo-utilities": {
|
||||
@@ -173,8 +173,8 @@
|
||||
"resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.21.tgz",
|
||||
"integrity": "sha512-ZcxELlEl+sDCYBgEMdNXJAsZtRVm8wk4HIA58bMsqYfd1DSAJQEtZ93F0GZgYNAGy3QyaoBeZtbb0/01++G8JQ==",
|
||||
"requires": {
|
||||
"fast-json-stable-stringify": "2.0.0",
|
||||
"fclone": "1.0.11"
|
||||
"fast-json-stable-stringify": "^2.0.0",
|
||||
"fclone": "^1.0.11"
|
||||
}
|
||||
},
|
||||
"asap": {
|
||||
@@ -207,7 +207,7 @@
|
||||
"resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz",
|
||||
"integrity": "sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo=",
|
||||
"requires": {
|
||||
"is-in-browser": "1.1.3"
|
||||
"is-in-browser": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"csstype": {
|
||||
@@ -241,7 +241,7 @@
|
||||
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
|
||||
"integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
|
||||
"requires": {
|
||||
"iconv-lite": "0.4.24"
|
||||
"iconv-lite": "~0.4.13"
|
||||
}
|
||||
},
|
||||
"fast-json-stable-stringify": {
|
||||
@@ -260,13 +260,13 @@
|
||||
"resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
|
||||
"integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=",
|
||||
"requires": {
|
||||
"core-js": "1.2.7",
|
||||
"isomorphic-fetch": "2.2.1",
|
||||
"loose-envify": "1.4.0",
|
||||
"object-assign": "4.1.1",
|
||||
"promise": "7.3.1",
|
||||
"setimmediate": "1.0.5",
|
||||
"ua-parser-js": "0.7.18"
|
||||
"core-js": "^1.0.0",
|
||||
"isomorphic-fetch": "^2.1.1",
|
||||
"loose-envify": "^1.0.0",
|
||||
"object-assign": "^4.1.0",
|
||||
"promise": "^7.1.1",
|
||||
"setimmediate": "^1.0.5",
|
||||
"ua-parser-js": "^0.7.18"
|
||||
}
|
||||
},
|
||||
"fbjs-css-vars": {
|
||||
@@ -285,8 +285,8 @@
|
||||
"integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"min-document": "2.19.0",
|
||||
"process": "0.5.2"
|
||||
"min-document": "^2.19.0",
|
||||
"process": "~0.5.1"
|
||||
}
|
||||
},
|
||||
"graphql": {
|
||||
@@ -294,7 +294,7 @@
|
||||
"resolved": "https://registry.npmjs.org/graphql/-/graphql-14.0.2.tgz",
|
||||
"integrity": "sha512-gUC4YYsaiSJT1h40krG3J+USGlwhzNTXSb4IOZljn9ag5Tj+RkoXrWp+Kh7WyE3t1NCfab5kzCuxBIvOMERMXw==",
|
||||
"requires": {
|
||||
"iterall": "1.2.2"
|
||||
"iterall": "^1.2.2"
|
||||
}
|
||||
},
|
||||
"graphql-tag": {
|
||||
@@ -307,11 +307,11 @@
|
||||
"resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz",
|
||||
"integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==",
|
||||
"requires": {
|
||||
"invariant": "2.2.4",
|
||||
"loose-envify": "1.4.0",
|
||||
"resolve-pathname": "2.2.0",
|
||||
"value-equal": "0.4.0",
|
||||
"warning": "3.0.0"
|
||||
"invariant": "^2.2.1",
|
||||
"loose-envify": "^1.2.0",
|
||||
"resolve-pathname": "^2.2.0",
|
||||
"value-equal": "^0.4.0",
|
||||
"warning": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"warning": {
|
||||
@@ -319,7 +319,7 @@
|
||||
"resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
|
||||
"integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
|
||||
"requires": {
|
||||
"loose-envify": "1.4.0"
|
||||
"loose-envify": "^1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -339,7 +339,7 @@
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
|
||||
"requires": {
|
||||
"safer-buffer": "2.1.2"
|
||||
"safer-buffer": ">= 2.1.2 < 3"
|
||||
}
|
||||
},
|
||||
"indefinite-observable": {
|
||||
@@ -362,7 +362,7 @@
|
||||
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
|
||||
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
|
||||
"requires": {
|
||||
"loose-envify": "1.4.0"
|
||||
"loose-envify": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"is-in-browser": {
|
||||
@@ -375,7 +375,7 @@
|
||||
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
|
||||
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
|
||||
"requires": {
|
||||
"isobject": "3.0.1"
|
||||
"isobject": "^3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"isobject": {
|
||||
@@ -395,8 +395,8 @@
|
||||
"resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
|
||||
"integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
|
||||
"requires": {
|
||||
"node-fetch": "1.7.3",
|
||||
"whatwg-fetch": "2.0.4"
|
||||
"node-fetch": "^1.0.1",
|
||||
"whatwg-fetch": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"iterall": {
|
||||
@@ -414,9 +414,9 @@
|
||||
"resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz",
|
||||
"integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==",
|
||||
"requires": {
|
||||
"is-in-browser": "1.1.3",
|
||||
"symbol-observable": "1.2.0",
|
||||
"warning": "3.0.0"
|
||||
"is-in-browser": "^1.1.3",
|
||||
"symbol-observable": "^1.1.0",
|
||||
"warning": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"warning": {
|
||||
@@ -424,7 +424,7 @@
|
||||
"resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
|
||||
"integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
|
||||
"requires": {
|
||||
"loose-envify": "1.4.0"
|
||||
"loose-envify": "^1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -434,7 +434,7 @@
|
||||
"resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz",
|
||||
"integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==",
|
||||
"requires": {
|
||||
"hyphenate-style-name": "1.0.2"
|
||||
"hyphenate-style-name": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"jss-default-unit": {
|
||||
@@ -452,7 +452,7 @@
|
||||
"resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz",
|
||||
"integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==",
|
||||
"requires": {
|
||||
"warning": "3.0.0"
|
||||
"warning": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"warning": {
|
||||
@@ -460,7 +460,7 @@
|
||||
"resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
|
||||
"integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
|
||||
"requires": {
|
||||
"loose-envify": "1.4.0"
|
||||
"loose-envify": "^1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -475,7 +475,7 @@
|
||||
"resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz",
|
||||
"integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==",
|
||||
"requires": {
|
||||
"css-vendor": "0.3.8"
|
||||
"css-vendor": "^0.3.8"
|
||||
}
|
||||
},
|
||||
"keycode": {
|
||||
@@ -498,7 +498,7 @@
|
||||
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
|
||||
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
|
||||
"requires": {
|
||||
"js-tokens": "4.0.0"
|
||||
"js-tokens": "^3.0.0 || ^4.0.0"
|
||||
}
|
||||
},
|
||||
"luxon": {
|
||||
@@ -511,12 +511,12 @@
|
||||
"resolved": "https://registry.npmjs.org/material-ui-pickers/-/material-ui-pickers-1.0.1.tgz",
|
||||
"integrity": "sha512-FRJwgeFUQdQxzNAybZvf11204KFBxqKS6sg4JvAO0cWmHULXJhrc9kuEDT8F7Pomwnv6+AyfxygsoMgIRcBMNg==",
|
||||
"requires": {
|
||||
"classnames": "2.2.6",
|
||||
"keycode": "2.2.0",
|
||||
"react-event-listener": "0.6.4",
|
||||
"react-text-mask": "5.4.1",
|
||||
"react-transition-group": "2.5.0",
|
||||
"tslib": "1.9.3"
|
||||
"classnames": "^2.2.6",
|
||||
"keycode": "^2.2.0",
|
||||
"react-event-listener": "^0.6.4",
|
||||
"react-text-mask": "=5.4.1",
|
||||
"react-transition-group": "^2.5.0",
|
||||
"tslib": "^1.9.3"
|
||||
}
|
||||
},
|
||||
"min-document": {
|
||||
@@ -525,7 +525,7 @@
|
||||
"integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"dom-walk": "0.1.1"
|
||||
"dom-walk": "^0.1.0"
|
||||
}
|
||||
},
|
||||
"node-fetch": {
|
||||
@@ -533,8 +533,8 @@
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
|
||||
"integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
|
||||
"requires": {
|
||||
"encoding": "0.1.12",
|
||||
"is-stream": "1.1.0"
|
||||
"encoding": "^0.1.11",
|
||||
"is-stream": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"normalize-scroll-left": {
|
||||
@@ -578,7 +578,7 @@
|
||||
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
|
||||
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
|
||||
"requires": {
|
||||
"asap": "2.0.6"
|
||||
"asap": "~2.0.3"
|
||||
}
|
||||
},
|
||||
"prop-types": {
|
||||
@@ -586,8 +586,8 @@
|
||||
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz",
|
||||
"integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==",
|
||||
"requires": {
|
||||
"loose-envify": "1.4.0",
|
||||
"object-assign": "4.1.1"
|
||||
"loose-envify": "^1.3.1",
|
||||
"object-assign": "^4.1.1"
|
||||
}
|
||||
},
|
||||
"react": {
|
||||
@@ -595,10 +595,10 @@
|
||||
"resolved": "https://registry.npmjs.org/react/-/react-16.6.1.tgz",
|
||||
"integrity": "sha512-OtawJThYlvRgm9BXK+xTL7BIlDx8vv21j+fbQDjRRUyok6y7NyjlweGorielTahLZHYIdKUoK2Dp9ByVWuMqxw==",
|
||||
"requires": {
|
||||
"loose-envify": "1.4.0",
|
||||
"object-assign": "4.1.1",
|
||||
"prop-types": "15.6.2",
|
||||
"scheduler": "0.11.0"
|
||||
"loose-envify": "^1.1.0",
|
||||
"object-assign": "^4.1.1",
|
||||
"prop-types": "^15.6.2",
|
||||
"scheduler": "^0.11.0"
|
||||
}
|
||||
},
|
||||
"react-apollo": {
|
||||
@@ -606,12 +606,12 @@
|
||||
"resolved": "https://registry.npmjs.org/react-apollo/-/react-apollo-2.2.4.tgz",
|
||||
"integrity": "sha512-haS5R30Qvteb65ZLfWomUZQh47VU4ld4Kof3zlqdbLOrYPt3/DdVZC8ZFPZSxd5zPeIJtZqpUfAxD1WHVoMPIA==",
|
||||
"requires": {
|
||||
"fbjs": "1.0.0",
|
||||
"hoist-non-react-statics": "3.0.1",
|
||||
"invariant": "2.2.4",
|
||||
"lodash.flowright": "3.5.0",
|
||||
"lodash.isequal": "4.5.0",
|
||||
"prop-types": "15.6.2"
|
||||
"fbjs": "^1.0.0",
|
||||
"hoist-non-react-statics": "^3.0.0",
|
||||
"invariant": "^2.2.2",
|
||||
"lodash.flowright": "^3.5.0",
|
||||
"lodash.isequal": "^4.5.0",
|
||||
"prop-types": "^15.6.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"core-js": {
|
||||
@@ -624,14 +624,14 @@
|
||||
"resolved": "https://registry.npmjs.org/fbjs/-/fbjs-1.0.0.tgz",
|
||||
"integrity": "sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==",
|
||||
"requires": {
|
||||
"core-js": "2.5.7",
|
||||
"fbjs-css-vars": "1.0.1",
|
||||
"isomorphic-fetch": "2.2.1",
|
||||
"loose-envify": "1.4.0",
|
||||
"object-assign": "4.1.1",
|
||||
"promise": "7.3.1",
|
||||
"setimmediate": "1.0.5",
|
||||
"ua-parser-js": "0.7.18"
|
||||
"core-js": "^2.4.1",
|
||||
"fbjs-css-vars": "^1.0.0",
|
||||
"isomorphic-fetch": "^2.1.1",
|
||||
"loose-envify": "^1.0.0",
|
||||
"object-assign": "^4.1.0",
|
||||
"promise": "^7.1.1",
|
||||
"setimmediate": "^1.0.5",
|
||||
"ua-parser-js": "^0.7.18"
|
||||
}
|
||||
},
|
||||
"hoist-non-react-statics": {
|
||||
@@ -639,7 +639,7 @@
|
||||
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.0.1.tgz",
|
||||
"integrity": "sha512-1kXwPsOi0OGQIZNVMPvgWJ9tSnGMiMfJdihqEzrPEXlHOBh9AAHXX/QYmAJTXztnz/K+PQ8ryCb4eGaN6HlGbQ==",
|
||||
"requires": {
|
||||
"react-is": "16.5.2"
|
||||
"react-is": "^16.3.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -649,10 +649,10 @@
|
||||
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.6.1.tgz",
|
||||
"integrity": "sha512-zm+wBuEMGm009Wt1uE4Zw5KcXOW7qC4E/xW/fpJsCsbOco4U/R84u+DzzO/S4SYSdNBcqcaulcp4w3FXl8pImw==",
|
||||
"requires": {
|
||||
"loose-envify": "1.4.0",
|
||||
"object-assign": "4.1.1",
|
||||
"prop-types": "15.6.2",
|
||||
"scheduler": "0.11.0"
|
||||
"loose-envify": "^1.1.0",
|
||||
"object-assign": "^4.1.1",
|
||||
"prop-types": "^15.6.2",
|
||||
"scheduler": "^0.11.0"
|
||||
}
|
||||
},
|
||||
"react-event-listener": {
|
||||
@@ -661,8 +661,8 @@
|
||||
"integrity": "sha512-t7VSjIuUFmN+GeyKb+wm025YLeojVB85kJL6sSs0wEBJddfmKBEQz+CNBZ2zBLKVWkPy/fZXM6U5yvojjYBVYQ==",
|
||||
"requires": {
|
||||
"@babel/runtime": "7.0.0",
|
||||
"prop-types": "15.6.2",
|
||||
"warning": "4.0.2"
|
||||
"prop-types": "^15.6.0",
|
||||
"warning": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"react-hot-loader": {
|
||||
@@ -671,12 +671,12 @@
|
||||
"integrity": "sha512-T0G5jURyTsFLoiW6MTr5Q35UHC/B2pmYJ7+VBjk8yMDCEABRmCGy4g6QwxoB4pWg4/xYvVTa/Pbqnsgx/+NLuA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fast-levenshtein": "2.0.6",
|
||||
"global": "4.3.2",
|
||||
"hoist-non-react-statics": "2.5.5",
|
||||
"prop-types": "15.6.2",
|
||||
"react-lifecycles-compat": "3.0.4",
|
||||
"shallowequal": "1.1.0"
|
||||
"fast-levenshtein": "^2.0.6",
|
||||
"global": "^4.3.0",
|
||||
"hoist-non-react-statics": "^2.5.0",
|
||||
"prop-types": "^15.6.1",
|
||||
"react-lifecycles-compat": "^3.0.4",
|
||||
"shallowequal": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"react-is": {
|
||||
@@ -694,7 +694,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-4.0.6.tgz",
|
||||
"integrity": "sha512-WfBlqYRD0fGZpQxRy1apxsPeaqtxhzo7CnUVFKBoGDsQbc89+DQNhjG/D3IxgGYM47oKB+W/Su9ol/vVS6Wc2Q==",
|
||||
"requires": {
|
||||
"prop-types": "15.6.2"
|
||||
"prop-types": "^15.6.0"
|
||||
}
|
||||
},
|
||||
"react-router": {
|
||||
@@ -702,13 +702,13 @@
|
||||
"resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz",
|
||||
"integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==",
|
||||
"requires": {
|
||||
"history": "4.7.2",
|
||||
"hoist-non-react-statics": "2.5.5",
|
||||
"invariant": "2.2.4",
|
||||
"loose-envify": "1.4.0",
|
||||
"path-to-regexp": "1.7.0",
|
||||
"prop-types": "15.6.2",
|
||||
"warning": "4.0.2"
|
||||
"history": "^4.7.2",
|
||||
"hoist-non-react-statics": "^2.5.0",
|
||||
"invariant": "^2.2.4",
|
||||
"loose-envify": "^1.3.1",
|
||||
"path-to-regexp": "^1.7.0",
|
||||
"prop-types": "^15.6.1",
|
||||
"warning": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"react-router-dom": {
|
||||
@@ -716,12 +716,12 @@
|
||||
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz",
|
||||
"integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==",
|
||||
"requires": {
|
||||
"history": "4.7.2",
|
||||
"invariant": "2.2.4",
|
||||
"loose-envify": "1.4.0",
|
||||
"prop-types": "15.6.2",
|
||||
"react-router": "4.3.1",
|
||||
"warning": "4.0.2"
|
||||
"history": "^4.7.2",
|
||||
"invariant": "^2.2.4",
|
||||
"loose-envify": "^1.3.1",
|
||||
"prop-types": "^15.6.1",
|
||||
"react-router": "^4.3.1",
|
||||
"warning": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"react-text-mask": {
|
||||
@@ -729,7 +729,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react-text-mask/-/react-text-mask-5.4.1.tgz",
|
||||
"integrity": "sha512-mGx1n0x0skktwsKcpgAGnrgExFlXDflbWEHh8PC1UaQP8+EdHkW7JYczTghsBo2rnVwU9/4A9x/2bVt3HY46/w==",
|
||||
"requires": {
|
||||
"prop-types": "15.6.2"
|
||||
"prop-types": "^15.5.6"
|
||||
}
|
||||
},
|
||||
"react-transition-group": {
|
||||
@@ -737,10 +737,10 @@
|
||||
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.5.0.tgz",
|
||||
"integrity": "sha512-qYB3JBF+9Y4sE4/Mg/9O6WFpdoYjeeYqx0AFb64PTazVy8RPMiE3A47CG9QmM4WJ/mzDiZYslV+Uly6O1Erlgw==",
|
||||
"requires": {
|
||||
"dom-helpers": "3.3.1",
|
||||
"loose-envify": "1.4.0",
|
||||
"prop-types": "15.6.2",
|
||||
"react-lifecycles-compat": "3.0.4"
|
||||
"dom-helpers": "^3.3.1",
|
||||
"loose-envify": "^1.4.0",
|
||||
"prop-types": "^15.6.2",
|
||||
"react-lifecycles-compat": "^3.0.4"
|
||||
}
|
||||
},
|
||||
"recompose": {
|
||||
@@ -748,12 +748,12 @@
|
||||
"resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz",
|
||||
"integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==",
|
||||
"requires": {
|
||||
"@babel/runtime": "7.0.0",
|
||||
"change-emitter": "0.1.6",
|
||||
"fbjs": "0.8.17",
|
||||
"hoist-non-react-statics": "2.5.5",
|
||||
"react-lifecycles-compat": "3.0.4",
|
||||
"symbol-observable": "1.2.0"
|
||||
"@babel/runtime": "^7.0.0",
|
||||
"change-emitter": "^0.1.2",
|
||||
"fbjs": "^0.8.1",
|
||||
"hoist-non-react-statics": "^2.3.1",
|
||||
"react-lifecycles-compat": "^3.0.2",
|
||||
"symbol-observable": "^1.0.4"
|
||||
}
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
@@ -776,8 +776,8 @@
|
||||
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.11.0.tgz",
|
||||
"integrity": "sha512-MAYbBfmiEHxF0W+c4CxMpEqMYK+rYF584VP/qMKSiHM6lTkBKKYOJaDiSILpJHla6hBOsVd6GucPL46o2Uq3sg==",
|
||||
"requires": {
|
||||
"loose-envify": "1.4.0",
|
||||
"object-assign": "4.1.1"
|
||||
"loose-envify": "^1.1.0",
|
||||
"object-assign": "^4.1.1"
|
||||
}
|
||||
},
|
||||
"setimmediate": {
|
||||
@@ -816,7 +816,7 @@
|
||||
"resolved": "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz",
|
||||
"integrity": "sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug==",
|
||||
"requires": {
|
||||
"loose-envify": "1.4.0"
|
||||
"loose-envify": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"whatwg-fetch": {
|
||||
@@ -834,7 +834,7 @@
|
||||
"resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.10.tgz",
|
||||
"integrity": "sha512-5vqMtRggU/2GhePC9OU4sYEWOdvmayp2k3gjPf4F0mXwB3CSbbNznfDUvDJx9O2ZTa1EIXdJhPchQveFKwNXPQ==",
|
||||
"requires": {
|
||||
"zen-observable": "0.8.9"
|
||||
"zen-observable": "^0.8.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@superalgos/operations-client",
|
||||
"version": "0.0.15",
|
||||
"version": "0.0.21",
|
||||
"description": "Superalgos Operations client-side web app",
|
||||
"main": "src/index.js",
|
||||
"dependencies": {
|
||||
|
||||
@@ -31,5 +31,6 @@ export const clone = gql`
|
||||
teamAvatar
|
||||
processName
|
||||
keyId
|
||||
botSlug
|
||||
}
|
||||
`
|
||||
@@ -1,17 +1,45 @@
|
||||
const availableMonths = ['January', 'February', 'March', 'April', 'May', 'June',
|
||||
'July', 'August', 'September', 'October', 'November', 'December']
|
||||
const availableMonths = [
|
||||
'January',
|
||||
'February',
|
||||
'March',
|
||||
'April',
|
||||
'May',
|
||||
'June',
|
||||
'July',
|
||||
'August',
|
||||
'September',
|
||||
'October',
|
||||
'November',
|
||||
'December'
|
||||
]
|
||||
|
||||
const availableTimePeriods = ["24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs", "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min"]
|
||||
|
||||
const tradingStartModes = {
|
||||
live: 'Live',
|
||||
backtest: 'Backtest'
|
||||
}
|
||||
|
||||
const tradingStartModesList = {
|
||||
live: 'Live',
|
||||
backtest: 'Backtest',
|
||||
competition: 'Competition'
|
||||
}
|
||||
|
||||
const indicatorStartModes = {
|
||||
allMonths: 'All Months',
|
||||
oneMonth: 'One Month',
|
||||
noTime: 'No Time'
|
||||
}
|
||||
|
||||
const processNames = {
|
||||
Daily: 'Multi-Period-Daily',
|
||||
Market: 'Multi-Period-Market',
|
||||
Min: "One-Min-Daily-Candles-Volumes",
|
||||
Live: "Poloniex-Live-Trades",
|
||||
HoleFixing: "Poloniex-Hole-Fixing"
|
||||
}
|
||||
|
||||
const exchanges = [
|
||||
{
|
||||
id: '1',
|
||||
@@ -19,4 +47,4 @@ const exchanges = [
|
||||
}
|
||||
]
|
||||
|
||||
export { tradingStartModes, exchanges, indicatorStartModes, availableMonths }
|
||||
export { tradingStartModes, tradingStartModesList, exchanges, indicatorStartModes, availableMonths, processNames, availableTimePeriods }
|
||||
@@ -6,7 +6,7 @@ import TopBar from '../../BannerTopBar'
|
||||
import { withStyles } from '@material-ui/core/styles'
|
||||
import classNames from 'classnames'
|
||||
import styles from './styles'
|
||||
import { tradingStartModes, indicatorStartModes, availableMonths } from '../../../GraphQL/models'
|
||||
import { tradingStartModes, indicatorStartModes, availableMonths, processNames, availableTimePeriods } from '../../../GraphQL/models'
|
||||
import { isDefined, getIndicatorYears } from '../../../utils'
|
||||
import {
|
||||
MenuItem, Button, TextField, FormControl, InputLabel, Input, Typography,
|
||||
@@ -32,7 +32,7 @@ class AddClone extends Component {
|
||||
state: '',
|
||||
stateDatetime: 0,
|
||||
createDatetime: 0,
|
||||
runAsTeam: true,
|
||||
runAsTeam: false,
|
||||
teams: [],
|
||||
teamId: '',
|
||||
keyId: '',
|
||||
@@ -43,6 +43,9 @@ class AddClone extends Component {
|
||||
month: 1,
|
||||
processName: '',
|
||||
|
||||
//TradingBot
|
||||
timePeriod: '01-hs',
|
||||
|
||||
//Error handlers
|
||||
nameError: false,
|
||||
teamError: false,
|
||||
@@ -152,7 +155,7 @@ class AddClone extends Component {
|
||||
<FormHelperText>{this.state.selectedBot.kind}</FormHelperText>
|
||||
</FormControl>
|
||||
|
||||
{ this.state.selectedBot.kind === "TRADER" &&
|
||||
{ this.state.selectedBot.kind === "Trading" &&
|
||||
<React.Fragment>
|
||||
<Typography className={classes.typography} variant='subtitle1' align='justify'>
|
||||
Available Running Modes are Backtest and Live.
|
||||
@@ -215,19 +218,6 @@ class AddClone extends Component {
|
||||
className={classNames(classes.form, classes.textField)}
|
||||
fullWidth
|
||||
/>
|
||||
|
||||
<Typography className={classes.typography} variant='subtitle1' align='justify'>
|
||||
The Wait Time represent the number of miliseconds the bot will wait between executions.
|
||||
</Typography>
|
||||
|
||||
<TextField
|
||||
id="waitTime"
|
||||
label="Wait Time"
|
||||
className={classNames(classes.form, classes.textField)}
|
||||
value={this.state.waitTime}
|
||||
onChange={(e)=>this.setState({waitTime:e.target.value})}
|
||||
fullWidth
|
||||
/>
|
||||
</React.Fragment>
|
||||
}
|
||||
|
||||
@@ -290,31 +280,58 @@ class AddClone extends Component {
|
||||
</React.Fragment>
|
||||
}
|
||||
|
||||
<Typography className={classes.typography} variant='subtitle1' align='justify'>
|
||||
If Run as Team is selected, the clone will be taken from the
|
||||
team respository instead of your own team member folder.
|
||||
Competitions runs from the team respository.
|
||||
</Typography>
|
||||
<FormControlLabel
|
||||
control={
|
||||
<Checkbox
|
||||
checked={this.state.runAsTeam}
|
||||
onChange={(e)=>this.setState({runAsTeam:e.target.checked })}
|
||||
value="runAsTeam"
|
||||
color="primary"
|
||||
|
||||
|
||||
<Typography className={classes.typography} variant='subtitle1' align='justify'>
|
||||
The Time Period in which the bot will operate.
|
||||
</Typography>
|
||||
|
||||
<TextField
|
||||
select
|
||||
label="Time Period"
|
||||
className={classNames(classes.margin, classes.textField, classes.form)}
|
||||
value={this.state.timePeriod}
|
||||
onChange={(e)=> this.setState({timePeriod:e.target.value})}
|
||||
fullWidth
|
||||
>
|
||||
{availableTimePeriods.map((option, index) => (
|
||||
<MenuItem key={index} value={option}>
|
||||
{option}
|
||||
</MenuItem>
|
||||
))}
|
||||
</TextField>
|
||||
|
||||
{ false &&
|
||||
<React.Fragment>
|
||||
<Typography className={classes.typography} variant='subtitle1' align='justify'>
|
||||
If Run as Team is selected, the clone will be taken from the
|
||||
team respository instead of your own team member folder.
|
||||
Competitions runs from the team respository.
|
||||
</Typography>
|
||||
|
||||
<FormControlLabel
|
||||
control={
|
||||
<Checkbox
|
||||
checked={this.state.runAsTeam}
|
||||
onChange={(e)=>this.setState({runAsTeam:e.target.checked })}
|
||||
value="runAsTeam"
|
||||
color="primary"
|
||||
/>
|
||||
}
|
||||
label="Run as Team"
|
||||
className={classNames(classes.form, classes.textField)}
|
||||
/>
|
||||
}
|
||||
label="Run as Team"
|
||||
className={classNames(classes.form, classes.textField)}
|
||||
/>
|
||||
</React.Fragment>
|
||||
}
|
||||
|
||||
</React.Fragment>
|
||||
}
|
||||
|
||||
{ (this.state.selectedBot.kind === "INDICATOR"
|
||||
|| this.state.selectedBot.kind === "EXTRACTOR") &&
|
||||
{ (this.state.selectedBot.kind === "Indicator"
|
||||
|| this.state.selectedBot.kind === "Sensor") &&
|
||||
<React.Fragment>
|
||||
<TextField
|
||||
select
|
||||
label="Process Name"
|
||||
className={classNames(classes.textField, classes.form)}
|
||||
value={this.state.processName}
|
||||
@@ -322,7 +339,14 @@ class AddClone extends Component {
|
||||
onBlur={(e)=>this.setState({processNameError:false})}
|
||||
error={this.state.processNameError}
|
||||
fullWidth
|
||||
/>
|
||||
>
|
||||
{Object.keys(processNames).map(option => (
|
||||
<MenuItem key={option} value={processNames[option]}>
|
||||
{processNames[option]}
|
||||
</MenuItem>
|
||||
))}
|
||||
</TextField>
|
||||
|
||||
|
||||
<TextField
|
||||
select
|
||||
@@ -389,14 +413,14 @@ class AddClone extends Component {
|
||||
fullWidth
|
||||
>
|
||||
{getIndicatorYears().map((option, index) => (
|
||||
<MenuItem key={option} value={index}>
|
||||
<MenuItem key={index} value={option}>
|
||||
{option}
|
||||
</MenuItem>
|
||||
))}
|
||||
</TextField>
|
||||
|
||||
<TextField
|
||||
id="endYearInput"
|
||||
id="endMonthInput"
|
||||
select
|
||||
label="Month"
|
||||
className={classNames(classes.textField, classes.form)}
|
||||
@@ -404,8 +428,8 @@ class AddClone extends Component {
|
||||
onChange={(e)=> this.setState({month:e.target.value})}
|
||||
fullWidth
|
||||
>
|
||||
{availableMonths.map(option => (
|
||||
<MenuItem key={option} value={option}>
|
||||
{availableMonths.map((option, index) => (
|
||||
<MenuItem key={index} value={index+1}>
|
||||
{option}
|
||||
</MenuItem>
|
||||
))}
|
||||
@@ -498,9 +522,10 @@ class AddClone extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
if(this.state.selectedBot.kind === "TRADER"){
|
||||
if(this.state.selectedBot.kind === "Trading"){
|
||||
variables.clone.runAsTeam = this.state.runAsTeam
|
||||
variables.clone.processName = 'Trading-Process'
|
||||
variables.clone.timePeriod = this.state.timePeriod
|
||||
if(this.state.mode === "backtest"){
|
||||
variables.clone.beginDatetime = this.state.beginDatetime.valueOf() / 1000|0
|
||||
variables.clone.endDatetime = this.state.endDatetime.valueOf() / 1000|0
|
||||
@@ -522,11 +547,11 @@ class AddClone extends Component {
|
||||
}
|
||||
|
||||
getBotTypeFromKind(kind){
|
||||
if(kind === 'TRADER')
|
||||
if(kind === 'Trading')
|
||||
return 'Trading'
|
||||
else if(kind === 'INDICATOR')
|
||||
else if(kind === 'Indicator')
|
||||
return 'Indicator'
|
||||
else if(kind === 'EXTRACTOR')
|
||||
else if(kind === 'Sensor')
|
||||
return 'Extraction'
|
||||
}
|
||||
|
||||
@@ -550,7 +575,7 @@ class AddClone extends Component {
|
||||
state : '',
|
||||
stateDatetime: 0,
|
||||
createDatetime: 0,
|
||||
runAsTeam: true,
|
||||
runAsTeam: false,
|
||||
processName: '',
|
||||
teams: [],
|
||||
teamId: '',
|
||||
@@ -582,7 +607,7 @@ class AddClone extends Component {
|
||||
this.setState(state => ({ modeError: true }));
|
||||
}
|
||||
|
||||
if(this.state.selectedBot.kind !== "TRADER"
|
||||
if(this.state.selectedBot.kind !== "Trading"
|
||||
&& this.state.processName.length < 1 ) {
|
||||
isError = true
|
||||
this.setState(state => ({ processNameError: true }));
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import React, { Component } from 'react'
|
||||
import { graphql, compose } from 'react-apollo'
|
||||
import {withRouter} from "react-router-dom";
|
||||
import { clones } from '../../../GraphQL/Calls'
|
||||
import {
|
||||
Typography, Button, TextField, Dialog, DialogContent,
|
||||
@@ -10,7 +11,7 @@ import {
|
||||
} from '@material-ui/core'
|
||||
import Avatar from '@material-ui/core/Avatar';
|
||||
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
||||
import { tradingStartModes, indicatorStartModes } from '../../../GraphQL/models'
|
||||
import { tradingStartModesList, indicatorStartModes } from '../../../GraphQL/models'
|
||||
import { isDefined, toLocalTime } from '../../../utils'
|
||||
import classNames from 'classnames'
|
||||
import { withStyles } from '@material-ui/core/styles'
|
||||
@@ -43,7 +44,7 @@ class ListClones extends Component {
|
||||
</div>
|
||||
<div className={classes.heading}>
|
||||
<Typography className={classes.heading}>
|
||||
{ clone.processName } / { clone.botType === 'TRADER' ? tradingStartModes[clone.mode] : indicatorStartModes[clone.mode] }
|
||||
{ clone.processName } / { clone.botType === 'Trading' ? tradingStartModesList[clone.mode] : indicatorStartModes[clone.mode] }
|
||||
</Typography>
|
||||
</div>
|
||||
</ExpansionPanelSummary>
|
||||
@@ -89,7 +90,7 @@ class ListClones extends Component {
|
||||
<div className={classes.details}>
|
||||
<div className={classes.column4}>
|
||||
<Typography className={classes.cloneInfoBold}>Last Execution:</Typography>
|
||||
{ (clone.botType === 'TRADER' && isDefined(clone.assetA) ) &&
|
||||
{ (clone.botType === 'Trading' && isDefined(clone.assetA) ) &&
|
||||
<React.Fragment>
|
||||
<Typography className={classes.cloneInfoBold}>Buy Average:</Typography>
|
||||
<Typography className={classes.cloneInfoBold}>Sell Average:</Typography>
|
||||
@@ -101,7 +102,7 @@ class ListClones extends Component {
|
||||
</div>
|
||||
<div className={classes.column4}>
|
||||
<Typography className={classes.cloneInfoNormal}>{ toLocalTime(clone.summaryDate) }</Typography>
|
||||
{ (clone.botType === 'TRADER' && isDefined(clone.assetA) ) &&
|
||||
{ (clone.botType === 'Trading' && isDefined(clone.assetA) ) &&
|
||||
<React.Fragment>
|
||||
<Typography className={classes.cloneInfoNormal}>{clone.buyAverage}</Typography>
|
||||
<Typography className={classes.cloneInfoNormal}>{clone.sellAverage}</Typography>
|
||||
@@ -144,6 +145,12 @@ class ListClones extends Component {
|
||||
className={classes.buttonList}
|
||||
variant='contained' color='secondary' size='small'
|
||||
onClick={() => this.setState({ isLogsDialogOpen: true })}>
|
||||
View Process Output
|
||||
</Button>
|
||||
<Button
|
||||
className={classes.buttonList}
|
||||
variant='contained' color='secondary' size='small'
|
||||
onClick={() => this.showCloneLogs(clone)}>
|
||||
View Logs
|
||||
</Button>
|
||||
<Button
|
||||
@@ -226,6 +233,10 @@ class ListClones extends Component {
|
||||
)
|
||||
}
|
||||
|
||||
showCloneLogs(clone) {
|
||||
this.props.history.push("/logs/show/"+clone.botSlug+"-"+clone.id+".1.0");
|
||||
}
|
||||
|
||||
canStopClone(){
|
||||
const state = JSON.parse(this.props.currentClone.state)
|
||||
if(isDefined(state) && state.hasOwnProperty("running")){
|
||||
@@ -277,5 +288,6 @@ class ListClones extends Component {
|
||||
|
||||
export default compose(
|
||||
graphql(clones.OPERATIONS_REMOVE_CLONE),
|
||||
withStyles(styles)
|
||||
withStyles(styles),
|
||||
withRouter
|
||||
)(ListClones)
|
||||
Generated
+1494
-1368
File diff suppressed because it is too large.
Load diff
+13
-13
@@ -10,20 +10,20 @@
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"babel-cli": "^6.26.0",
|
||||
"babel-preset-env": "^1.7.0",
|
||||
"babel-preset-stage-2": "^6.24.1",
|
||||
"nodemon": "^1.18.10"
|
||||
"babel-cli": "6.26.0",
|
||||
"babel-preset-env": "1.7.0",
|
||||
"babel-preset-stage-2": "6.24.1",
|
||||
"nodemon": "1.18.10"
|
||||
},
|
||||
"dependencies": {
|
||||
"axios": "^0.18.0",
|
||||
"cors": "^2.8.4",
|
||||
"dotenv": "^6.0.0",
|
||||
"express": "^4.16.3",
|
||||
"express-graphql": "^0.6.12",
|
||||
"graphql": "^14.0.0",
|
||||
"kubernetes-client": "^6.5.1",
|
||||
"mongoose": "^5.2.12",
|
||||
"winston": "^3.1.0"
|
||||
"axios": "0.18.0",
|
||||
"cors": "2.8.4",
|
||||
"dotenv": "6.0.0",
|
||||
"express": "4.16.3",
|
||||
"express-graphql": "0.6.12",
|
||||
"graphql": "14.0.0",
|
||||
"kubernetes-client": "6.5.1",
|
||||
"mongoose": "5.2.12",
|
||||
"winston": "3.1.0"
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
export const TRADER = 'Trading'
|
||||
export const INDICATOR = 'Indicator'
|
||||
export const EXTRACTION = 'Extraction'
|
||||
export const Trading = 'Trading'
|
||||
export const Indicator = 'Indicator'
|
||||
export const Sensor = 'Extraction'
|
||||
|
||||
export const BotTypesEnum = [
|
||||
TRADER,
|
||||
INDICATOR,
|
||||
EXTRACTION
|
||||
Trading,
|
||||
Indicator,
|
||||
Sensor
|
||||
]
|
||||
|
||||
export default BotTypesEnum
|
||||
@@ -3,8 +3,8 @@ import { toPlatformDatetime, isDefined } from '../config/utils'
|
||||
import { KubernateError } from '../errors'
|
||||
import { Client, config } from 'kubernetes-client'
|
||||
import deploymentManifest from '../config/clone-deployment.json'
|
||||
import { BACKTEST, NO_TIME } from '../enums/CloneMode'
|
||||
import { TRADER, INDICATOR, EXTRACTION } from '../enums/BotTypes'
|
||||
import { BACKTEST, COMPETITION, LIVE, NO_TIME } from '../enums/CloneMode'
|
||||
import { Trading, Indicator, Sensor } from '../enums/BotTypes'
|
||||
|
||||
const createClone = async (clone) => {
|
||||
try {
|
||||
@@ -82,12 +82,22 @@ const createClone = async (clone) => {
|
||||
})
|
||||
|
||||
logger.debug('createClone Trading Configuration.')
|
||||
if (clone.botType === TRADER) {
|
||||
if (clone.botType === Trading) {
|
||||
env.push({
|
||||
'name': 'RESUME_EXECUTION',
|
||||
'value': clone.resumeExecution.toString()
|
||||
})
|
||||
|
||||
env.push({
|
||||
'name': 'TIME_PERIOD',
|
||||
'value': clone.timePeriod
|
||||
})
|
||||
|
||||
env.push({
|
||||
'name': 'DATA_SET',
|
||||
'value': datasetNames().get(clone.timePeriod)
|
||||
})
|
||||
|
||||
if (clone.mode === BACKTEST) {
|
||||
env.push({
|
||||
'name': 'BEGIN_DATE_TIME',
|
||||
@@ -101,13 +111,26 @@ const createClone = async (clone) => {
|
||||
'name': 'WAIT_TIME',
|
||||
'value': clone.waitTime.toString()
|
||||
})
|
||||
} else {
|
||||
} else if (clone.mode === COMPETITION) {
|
||||
env.push({
|
||||
'name': 'BEGIN_DATE_TIME',
|
||||
'value': toPlatformDatetime(clone.beginDatetime)
|
||||
})
|
||||
env.push({
|
||||
'name': 'END_DATE_TIME',
|
||||
'value': toPlatformDatetime(clone.endDatetime)
|
||||
})
|
||||
env.push({
|
||||
'name': 'KEY_ID',
|
||||
'value': clone.keyId
|
||||
})
|
||||
} else if (clone.mode === LIVE) {
|
||||
env.push({
|
||||
'name': 'KEY_ID',
|
||||
'value': clone.keyId
|
||||
})
|
||||
}
|
||||
} else if (clone.botType === INDICATOR || clone.botType === EXTRACTION) {
|
||||
} else if (clone.botType === Indicator || clone.botType === Sensor) {
|
||||
if (clone.mode !== NO_TIME) {
|
||||
env.push({
|
||||
'name': 'MIN_YEAR',
|
||||
@@ -129,6 +152,7 @@ const createClone = async (clone) => {
|
||||
}
|
||||
|
||||
deploymentManifest.spec.template.spec.containers[0].env = env
|
||||
logger.debug('createClone env: %s', JSON.stringify(env))
|
||||
|
||||
await client.apis.batch.v1.namespaces('default').jobs.post(
|
||||
{ body: deploymentManifest })
|
||||
@@ -138,4 +162,29 @@ const createClone = async (clone) => {
|
||||
throw new KubernateError(err)
|
||||
}
|
||||
}
|
||||
|
||||
function datasetNames(){
|
||||
let dataSetMap = new Map()
|
||||
dataSetMap.set("24-hs","Multi-Period-Market")
|
||||
dataSetMap.set("12-hs","Multi-Period-Market")
|
||||
dataSetMap.set("08-hs","Multi-Period-Market")
|
||||
dataSetMap.set("06-hs","Multi-Period-Market")
|
||||
dataSetMap.set("04-hs","Multi-Period-Market")
|
||||
dataSetMap.set("03-hs","Multi-Period-Market")
|
||||
dataSetMap.set("02-hs","Multi-Period-Market")
|
||||
dataSetMap.set("01-hs","Multi-Period-Market")
|
||||
dataSetMap.set("45-min","Multi-Period-Daily")
|
||||
dataSetMap.set("40-min","Multi-Period-Daily")
|
||||
dataSetMap.set("30-min","Multi-Period-Daily")
|
||||
dataSetMap.set("20-min","Multi-Period-Daily")
|
||||
dataSetMap.set("15-min","Multi-Period-Daily")
|
||||
dataSetMap.set("10-min","Multi-Period-Daily")
|
||||
dataSetMap.set("05-min","Multi-Period-Daily")
|
||||
dataSetMap.set("04-min","Multi-Period-Daily")
|
||||
dataSetMap.set("03-min","Multi-Period-Daily")
|
||||
dataSetMap.set("02-min","Multi-Period-Daily")
|
||||
dataSetMap.set("01-min","Multi-Period-Daily")
|
||||
return dataSetMap
|
||||
}
|
||||
|
||||
export default createClone
|
||||
@@ -20,15 +20,21 @@ const getClonePodLogs = async (cloneName) => {
|
||||
'tailLines': '20'
|
||||
}
|
||||
}
|
||||
const logs = await client.api.v1.namespaces('default')
|
||||
.pods(pod.body.items[0].metadata.name).log.get(queryLogs)
|
||||
let logsArray = logs.body.split('\n')
|
||||
if(pod.body.items[0] !== undefined){
|
||||
const logs = await client.api.v1.namespaces('default')
|
||||
.pods(pod.body.items[0].metadata.name).log.get(queryLogs)
|
||||
let logsArray = logs.body.split('\n')
|
||||
|
||||
logger.debug('getClonePodLogs on kubernates successful.')
|
||||
logger.debug('getClonePodLogs on kubernates successful.')
|
||||
|
||||
return JSON.stringify(logsArray, null, 2)
|
||||
return JSON.stringify(logsArray, null, 2)
|
||||
} else {
|
||||
logger.warn('getClonePodStatus pod not found %s: ', cloneName)
|
||||
return "Logs not available."
|
||||
}
|
||||
} catch (err) {
|
||||
throw new KubernateError(err)
|
||||
logger.error('There was an error getting the pod logs %s: ', err)
|
||||
return "Logs not available."
|
||||
}
|
||||
}
|
||||
export default getClonePodLogs
|
||||
@@ -5,7 +5,7 @@ import { Client, config } from 'kubernetes-client'
|
||||
const getClonePodStatus = async (cloneName) => {
|
||||
try {
|
||||
logger.debug('getClonePodStatus on kubernates started. ')
|
||||
const client = new Client({config: config.fromKubeconfig(), version: '1.9'})
|
||||
const client = new Client({ config: config.fromKubeconfig(), version: '1.9' })
|
||||
|
||||
let query = {
|
||||
'qs': {
|
||||
@@ -15,16 +15,23 @@ const getClonePodStatus = async (cloneName) => {
|
||||
|
||||
const pod = await client.api.v1.namespaces('default').pods.get(query)
|
||||
|
||||
let clonePodStatus = pod.body.items[0].status.containerStatuses[0].state
|
||||
if (pod.body.items[0] !== undefined) {
|
||||
let clonePodStatus = pod.body.items[0].status.containerStatuses[0].state
|
||||
|
||||
if (clonePodStatus.hasOwnProperty('terminated')
|
||||
&& clonePodStatus.terminated.hasOwnProperty('containerID')) {
|
||||
delete clonePodStatus.terminated.containerID
|
||||
if (clonePodStatus.hasOwnProperty('terminated')
|
||||
&& clonePodStatus.terminated.hasOwnProperty('containerID')) {
|
||||
delete clonePodStatus.terminated.containerID
|
||||
}
|
||||
logger.debug('getClonePodStatus %s on kubernates successful', cloneName)
|
||||
|
||||
return JSON.stringify(clonePodStatus, null, 2)
|
||||
} else {
|
||||
logger.warn('getClonePodStatus pod not found %s: ', cloneName)
|
||||
return " Clone not found on the server. "
|
||||
}
|
||||
logger.debug('getClonePodStatus %s on kubernates successful', cloneName)
|
||||
return JSON.stringify(clonePodStatus, null, 2)
|
||||
} catch (err) {
|
||||
throw new KubernateError(err)
|
||||
logger.error('There was an error getting the pod status %s: ', err)
|
||||
return "Status not available."
|
||||
}
|
||||
}
|
||||
export default getClonePodStatus
|
||||
@@ -20,7 +20,7 @@ const removeClone = async (clone) => {
|
||||
|
||||
logger.debug('removeClone %s on kubernates succesful', clone.id)
|
||||
} catch (err) {
|
||||
throw new KubernateError(err)
|
||||
logger.warn('removeClone %s on kubernates failed, the job was not found on the server.', clone.id)
|
||||
}
|
||||
}
|
||||
export default removeClone
|
||||
@@ -21,7 +21,7 @@ const args = {
|
||||
clone: { type: CloneInputType }
|
||||
}
|
||||
|
||||
const resolve = async(parent, { clone }, context) => {
|
||||
const resolve = async (parent, { clone }, context) => {
|
||||
logger.debug('addClone -> Entering Fuction.')
|
||||
|
||||
if (!context.userId) {
|
||||
@@ -36,7 +36,7 @@ const resolve = async(parent, { clone }, context) => {
|
||||
throw new WrongArgumentsError('The bot type selected is not valid.')
|
||||
}
|
||||
|
||||
if ( (clone.mode === LIVE || clone.mode === COMPETITION) && !isDefined(clone.keyId)) {
|
||||
if ((clone.mode === LIVE || clone.mode === COMPETITION) && !isDefined(clone.keyId)) {
|
||||
throw new WrongArgumentsError('The key was not provided to run the clone.')
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ const resolve = async(parent, { clone }, context) => {
|
||||
} else {
|
||||
throw new AutorizationError()
|
||||
}
|
||||
}else{
|
||||
} else {
|
||||
await createKubernetesClone(clone)
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ const resolve = async (parent, { id }, context) => {
|
||||
let team = await teamQuery(context.authorization, clone.teamId)
|
||||
clone = await cloneDetails(context.userId, team.data.data.teams_TeamById, clone)
|
||||
|
||||
if ( (clone.mode === LIVE || clone.mode === COMPETITION) && !isDefined(clone.keyId)) {
|
||||
if ((clone.mode === LIVE || clone.mode === COMPETITION) && isDefined(clone.keyId)) {
|
||||
logger.debug('removeClone -> Release the clone key.')
|
||||
await authorizeClone(context.authorization, clone.keyId, clone.id, true)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
import { GraphQLNonNull, GraphQLID } from 'graphql'
|
||||
import { OperationsError } from '../../errors'
|
||||
import { GetClonesType } from '../types'
|
||||
import { Clone } from '../../models'
|
||||
import logger from '../../config/logger'
|
||||
import mongoose from 'mongoose'
|
||||
import { isDefined } from '../../config/utils'
|
||||
|
||||
const args = {
|
||||
cloneId: { type: new GraphQLNonNull(GraphQLID) }
|
||||
}
|
||||
|
||||
const resolve = async(parent, { cloneId }, context) => {
|
||||
logger.debug('Get Clone -> Entering Fuction.')
|
||||
|
||||
try {
|
||||
if (mongoose.Types.ObjectId.isValid(cloneId)) {
|
||||
let existingClone = await Clone.findOne({
|
||||
_id: cloneId
|
||||
})
|
||||
|
||||
if (isDefined(existingClone)) {
|
||||
return {
|
||||
id: cloneId,
|
||||
teamId: existingClone.teamId,
|
||||
botId: existingClone.botId
|
||||
}
|
||||
} else {
|
||||
throw new Error('Clone not found.')
|
||||
}
|
||||
} else {
|
||||
throw new Error('Invalid Clone ID.')
|
||||
}
|
||||
return clones
|
||||
} catch (err) {
|
||||
logger.error('Get Clone error: %s', err.stack)
|
||||
throw new OperationsError('There has been an error getting the clone. ' + err.message)
|
||||
}
|
||||
}
|
||||
|
||||
const GetClones = {
|
||||
getClone: {
|
||||
type: GetClonesType,
|
||||
args,
|
||||
resolve
|
||||
}
|
||||
}
|
||||
|
||||
export default GetClones
|
||||
@@ -30,6 +30,7 @@ const resolve = async(parent, args, context) => {
|
||||
let lastLogs = await getCloneLogs(clones[i].id)
|
||||
clones[i].lastLogs = lastLogs.substring(1, lastLogs.length - 1)
|
||||
clones[i].botType = clones[i].kind // Only for listing we show the teams value
|
||||
clones[i].botSlug = clones[i].botSlug
|
||||
}
|
||||
return clones
|
||||
} catch (err) {
|
||||
|
||||
@@ -2,13 +2,15 @@ import { GraphQLObjectType } from 'graphql'
|
||||
import ListClones from './ListClones'
|
||||
import HistoryClones from './HistoryClones'
|
||||
import GetClones from './GetClones'
|
||||
import GetClone from './GetClone'
|
||||
|
||||
const RootQuery = new GraphQLObjectType({
|
||||
name: 'RootQueryType',
|
||||
fields: Object.assign(
|
||||
ListClones,
|
||||
HistoryClones,
|
||||
GetClones
|
||||
GetClones,
|
||||
GetClone
|
||||
)
|
||||
})
|
||||
|
||||
|
||||
@@ -38,7 +38,8 @@ const CloneType = new GraphQLObjectType({
|
||||
botName: {type: GraphQLString},
|
||||
botAvatar: {type: GraphQLString},
|
||||
teamAvatar: {type: GraphQLString},
|
||||
keyId: {type: GraphQLString}
|
||||
keyId: {type: GraphQLString},
|
||||
botSlug: {type: GraphQLString}
|
||||
})
|
||||
})
|
||||
export default CloneType
|
||||
@@ -24,7 +24,8 @@ const Type = new GraphQLInputObjectType({
|
||||
interval: { type: GraphQLInt },
|
||||
processName: { type: new GraphQLNonNull(GraphQLString) },
|
||||
botType: { type: new GraphQLNonNull(GraphQLString) },
|
||||
keyId: { type: GraphQLString }
|
||||
keyId: { type: GraphQLString },
|
||||
timePeriod: { type: GraphQLString }
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
Reference in new issue
Block a user