diff --git a/README.md b/README.md index f5af4d91..2aa7213d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Git tips: to push your local branch to a remote branch that it's not tracking (say currentState for instance), use +Git tips: to push your local branch to a remote branch that it's not tracking (say this currentState for instance), use git push origin your_updated_branch_name:currentState /--------------------------------- THE TREE -----------------------------------/ diff --git a/package-lock.json b/package-lock.json index 3abc46c4..e22d2986 100644 --- a/package-lock.json +++ b/package-lock.json @@ -853,8 +853,7 @@ "@types/node": { "version": "8.10.36", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.36.tgz", - "integrity": "sha512-SL6KhfM7PTqiFmbCW3eVNwVBZ+88Mrzbuvn9olPsfv43mbiWaFY+nRcz/TGGku0/lc2FepdMbImdMY1JrQ+zbw==", - "dev": true + "integrity": "sha512-SL6KhfM7PTqiFmbCW3eVNwVBZ+88Mrzbuvn9olPsfv43mbiWaFY+nRcz/TGGku0/lc2FepdMbImdMY1JrQ+zbw==" }, "@types/tapable": { "version": "1.0.2", @@ -1479,8 +1478,7 @@ "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "array-flatten": { "version": "2.1.1", @@ -2478,7 +2476,6 @@ "version": "2.1.0", "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, "requires": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" @@ -2487,8 +2484,7 @@ "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" } } }, @@ -2557,6 +2553,39 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, + "chart.js": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.7.3.tgz", + "integrity": "sha512-3+7k/DbR92m6BsMUYP6M0dMsMVZpMnwkUyNSAbqolHKsbIzH2Q4LWVEHHYq7v0fmEV8whXE0DrjANulw9j2K5g==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.2.0.tgz", + "integrity": "sha1-hKL7dVeH7YXDndbdjHsdiEKbrq4=", + "requires": { + "chartjs-color-string": "^0.5.0", + "color-convert": "^0.5.3" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" + } + } + }, + "chartjs-color-string": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.5.0.tgz", + "integrity": "sha512-amWNvCOXlOUYxZVDSa0YOab5K/lmEhbFNKI55PWc4mlv28BDzA7zaoQTGxSBgJMHIW+hGX8YUrvw/FH4LyhwSQ==", + "requires": { + "color-name": "^1.0.0" + } + }, "check-types": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", @@ -3554,7 +3583,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, "requires": { "array-find-index": "^1.0.1" } @@ -3564,6 +3592,89 @@ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.3.tgz", + "integrity": "sha512-x37qq3ChOTLd26hnps36lexMRhNXEtVxZ4B25rL0DVdDsGQIJGB18S7y9XDwlDD6MD/ZBzITCf4JjGMM10TZkw==" + }, + "d3-ease": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz", + "integrity": "sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ==" + }, + "d3-format": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", + "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" + }, + "d3-interpolate": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", + "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", + "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" + }, + "d3-scale": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-shape": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.2.tgz", + "integrity": "sha512-hUGEozlKecFZ2bOSNt7ENex+4Tk9uc/m0TtTEHBvitCBxUNjhzm5hS2GrrVRD/ae4IylSmxGeqX5tWC2rASMlQ==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.10.tgz", + "integrity": "sha512-hF+NTLCaJHF/JqHN5hE8HVGAXPStEq6/omumPE/SxyHVrR7/qQxusFDo0t0c/44+sCGHthC7yNGFZIEgju0P8g==" + }, + "d3-time-format": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", + "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", + "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==" + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, "damerau-levenshtein": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", @@ -3623,8 +3734,7 @@ "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "deep-is": { "version": "0.1.3", @@ -3998,6 +4108,98 @@ "extract-zip": "^1.0.3" } }, + "electron-chartjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/electron-chartjs/-/electron-chartjs-1.0.0.tgz", + "integrity": "sha512-Sk05ZhsbipKVirq4iN0RWKjsq2ZetxL5uhZCM9lieBhu4aZiHhVLb+llwG0fphWoZLAGV3xpe0DUtcW14cW/VA==", + "requires": { + "chart.js": "^2.7.1", + "electron": "^1.7.9" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "electron": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/electron/-/electron-1.8.8.tgz", + "integrity": "sha512-1f9zJehcTTGjrkb06o6ds+gsRq6SYhZJyxOk6zIWjRH8hVy03y/RzUDELzNas71f5vcvXmfGVvyjeEsadDI8tg==", + "requires": { + "@types/node": "^8.0.24", + "electron-download": "^3.0.1", + "extract-zip": "^1.0.3" + } + }, + "electron-download": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz", + "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=", + "requires": { + "debug": "^2.2.0", + "fs-extra": "^0.30.0", + "home-path": "^1.0.1", + "minimist": "^1.2.0", + "nugget": "^2.0.0", + "path-exists": "^2.1.0", + "rc": "^1.1.2", + "semver": "^5.3.0", + "sumchecker": "^1.2.0" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "sumchecker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz", + "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", + "requires": { + "debug": "^2.2.0", + "es6-promise": "^4.0.5" + } + } + } + }, "electron-download": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", @@ -4208,8 +4410,7 @@ "es6-promise": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", - "dev": true + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==" }, "escape-html": { "version": "1.0.3", @@ -4827,7 +5028,6 @@ "version": "1.6.7", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", - "dev": true, "requires": { "concat-stream": "1.6.2", "debug": "2.6.9", @@ -4839,7 +5039,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -4847,8 +5046,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -4926,7 +5124,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, "requires": { "pend": "~1.2.0" } @@ -5740,8 +5937,7 @@ "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" }, "get-stream": { "version": "3.0.0", @@ -6116,8 +6312,7 @@ "home-path": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz", - "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==", - "dev": true + "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==" }, "homedir-polyfill": { "version": "1.0.1", @@ -6680,7 +6875,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, "requires": { "repeating": "^2.0.0" } @@ -7956,7 +8150,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, "requires": { "graceful-fs": "^4.1.9" } @@ -8215,7 +8408,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, "requires": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.0" @@ -8285,8 +8477,7 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, "map-visit": { "version": "1.0.0", @@ -8411,7 +8602,6 @@ "version": "3.7.0", "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, "requires": { "camelcase-keys": "^2.0.0", "decamelize": "^1.1.2", @@ -8428,8 +8618,7 @@ "minimist": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -8940,7 +9129,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", - "dev": true, "requires": { "debug": "^2.1.3", "minimist": "^1.1.0", @@ -8955,7 +9143,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -8963,20 +9150,17 @@ "minimist": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "pretty-bytes": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", - "dev": true, "requires": { "get-stdin": "^4.0.1", "meow": "^3.1.0" @@ -9459,8 +9643,7 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, "performance-now": { "version": "2.1.0", @@ -9501,6 +9684,14 @@ "find-up": "^2.1.0" } }, + "plotly": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/plotly/-/plotly-1.0.6.tgz", + "integrity": "sha1-smcsPfiDM2Jb32hJgtDj9lIdeqo=", + "requires": { + "mkdirp": "~0.5.0" + } + }, "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", @@ -11313,7 +11504,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", - "dev": true, "requires": { "speedometer": "~0.1.2", "through2": "~0.2.3" @@ -11322,20 +11512,17 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "object-keys": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" }, "readable-stream": { "version": "1.1.14", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -11347,7 +11534,6 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", - "dev": true, "requires": { "readable-stream": "~1.1.9", "xtend": "~2.1.1" @@ -11357,7 +11543,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, "requires": { "object-keys": "~0.4.0" } @@ -11604,7 +11789,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -11615,8 +11799,7 @@ "minimist": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -11732,6 +11915,15 @@ "react-lifecycles-compat": "^3.0.4" } }, + "react-chartjs-2": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-2.7.4.tgz", + "integrity": "sha512-lXTpBaDlk9rIMjRONjZd76dIUhEm3vOp2jOrJrsFG/UpFI5VqX8Xw83apVHTnUGJ968f8i/i/syLddls4NHy2g==", + "requires": { + "lodash": "^4.17.4", + "prop-types": "^15.5.8" + } + }, "react-dev-utils": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-6.0.5.tgz", @@ -12010,6 +12202,11 @@ } } }, + "react-fast-compare": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.2.tgz", + "integrity": "sha512-EdPU5vXIzvNvQFNuej3oQ1PZ6YmDunTPZJ3V5EmwRqOhEmW0PNxzUdbYhXnZKZFtrrjGiu9718f6iQRdj0l2JA==" + }, "react-is": { "version": "16.6.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.6.0.tgz", @@ -12515,7 +12712,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, "requires": { "indent-string": "^2.1.0", "strip-indent": "^1.0.1" @@ -13533,7 +13729,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", - "dev": true, "requires": { "string-width": "^1.0.1" }, @@ -13542,7 +13737,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -13551,7 +13745,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -13875,8 +14068,7 @@ "speedometer": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", - "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", - "dev": true + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=" }, "split-string": { "version": "3.1.0", @@ -14145,7 +14337,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, "requires": { "get-stdin": "^4.0.1" } @@ -14482,8 +14673,7 @@ "throttleit": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", - "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", - "dev": true + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=" }, "through": { "version": "2.3.8", @@ -14643,8 +14833,7 @@ "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" }, "trim-right": { "version": "1.0.1", @@ -15176,6 +15365,309 @@ "extsprintf": "^1.2.0" } }, + "victory": { + "version": "30.6.0", + "resolved": "https://registry.npmjs.org/victory/-/victory-30.6.0.tgz", + "integrity": "sha512-YQonLDOw+qY/jnW1eKjil60CQ5u5l3HAKHuoQgy/r4i/ddUvCsTLChhIJbgQuWhWuq6WZ9le05GYop8OiRFiCg==", + "requires": { + "victory-area": "^30.3.1", + "victory-axis": "^30.3.1", + "victory-bar": "^30.6.0", + "victory-box-plot": "^30.3.1", + "victory-brush-container": "^30.5.0", + "victory-brush-line": "^30.3.1", + "victory-candlestick": "^30.3.1", + "victory-chart": "^30.3.1", + "victory-core": "^30.3.1", + "victory-create-container": "^30.5.1", + "victory-cursor-container": "^30.5.1", + "victory-errorbar": "^30.3.1", + "victory-group": "^30.3.1", + "victory-legend": "^30.3.1", + "victory-line": "^30.5.0", + "victory-pie": "^30.5.1", + "victory-polar-axis": "^30.3.1", + "victory-scatter": "^30.3.1", + "victory-selection-container": "^30.3.1", + "victory-shared-events": "^30.3.1", + "victory-stack": "^30.3.1", + "victory-tooltip": "^30.3.1", + "victory-voronoi": "^30.3.1", + "victory-voronoi-container": "^30.3.1", + "victory-zoom-container": "^30.3.1" + } + }, + "victory-area": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-30.3.1.tgz", + "integrity": "sha512-qZiCQQ6eGsvnkI9/2ZlYlbhSFlkM7/kc/WKOChOUDqr9EpJpi89Y1LSUkzC7g/Ejgb4xxWczkCBO0EVFGyn+PA==", + "requires": { + "d3-shape": "^1.2.0", + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-axis": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-30.3.1.tgz", + "integrity": "sha512-vAZIkIyHKBRseLm3PgW8wgMDgNwzNLD30tF6uXfQkmLpGABNzxETmU9CnQE0HfLJvRTydDpkNi4C5mee/h1qmg==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-bar": { + "version": "30.6.0", + "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-30.6.0.tgz", + "integrity": "sha512-5ovYT8Bv5ixAJ6C1cGcR+D7652rbt98KoyXCU2GJiD6R110YJBNCxHnUfcr9k+LijDYlyRY2EyE6U3KxD27MPA==", + "requires": { + "d3-shape": "^1.2.0", + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-box-plot": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-30.3.1.tgz", + "integrity": "sha512-DzUyu+Un5rqAhdBrROPMSGJgF5bdsLWZkzg9Ppxcjkl9IxgFe8+Xfp6C3pU/J4s0Rt2FnnSsARjfTgXNzXkWSA==", + "requires": { + "d3-array": "^1.2.0", + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-brush-container": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-30.5.0.tgz", + "integrity": "sha512-xYFmQq/l6sYIwT/TnhqOftUmCuWZ2n6aVabBkF8EBuVYCEP+pulepOReZxsoKrqWCQPz3xxOIgvFSri/p3hLCQ==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-brush-line": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-brush-line/-/victory-brush-line-30.3.1.tgz", + "integrity": "sha512-L67X+DyF832Gp83sjclRNFwyIkP7hkpHqGoWAQnIMjNlcd+Qq47c4Z89YxL0AiHfNN2eSKETB0SXJXlPB/s6NQ==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-candlestick": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-candlestick/-/victory-candlestick-30.3.1.tgz", + "integrity": "sha512-bqsQNit8H7xTdWSZHnhogJN7LlE/e5mOmWxxI5wbt8K31qIkrEqIEElQoaGcw95kleQkHA6XDxHbDE6kW7Nf5A==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-chart": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-30.3.1.tgz", + "integrity": "sha512-yT06xMnYx2r+tmW11rGoK2vLT6huP9ff6tDwgtIlifqzA71KlU8rERwWJCTktLkPU10iiqypYD9fwaP6jx6KGQ==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "react-fast-compare": "^2.0.0", + "victory-axis": "^30.3.1", + "victory-core": "^30.3.1", + "victory-polar-axis": "^30.3.1", + "victory-shared-events": "^30.3.1" + } + }, + "victory-core": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-30.3.1.tgz", + "integrity": "sha512-c2BTwWI+txAOjt2786Ftcov0Eqaqt9EhRf8BkeK1APszVb7I5UV48I2JyZOl9l0v2/JWVKHY11JegFZ95Y64fQ==", + "requires": { + "d3-ease": "^1.0.0", + "d3-interpolate": "^1.1.1", + "d3-scale": "^1.0.0", + "d3-shape": "^1.2.0", + "d3-timer": "^1.0.0", + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "react-fast-compare": "^2.0.0" + } + }, + "victory-create-container": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-30.5.1.tgz", + "integrity": "sha512-NqziZkyx0i+L5jMKsydZJrCu6L/rVRCucbLVlQkbv5Yan2u0NXBB4aZAbn3XhW3aXjLuJGXrBrumMM7ygtnq/w==", + "requires": { + "lodash": "^4.17.5", + "victory-brush-container": "^30.5.0", + "victory-core": "^30.3.1", + "victory-cursor-container": "^30.5.1", + "victory-selection-container": "^30.3.1", + "victory-voronoi-container": "^30.3.1", + "victory-zoom-container": "^30.3.1" + } + }, + "victory-cursor-container": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-30.5.1.tgz", + "integrity": "sha512-gwhJvEbPyxFkqTwGRotxyun55kxE0e00BwzQ3djRz1jzZj2Ae372XyikI+har30vMkmzI1Mqy7W1kzmvyVcrSw==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-errorbar": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-errorbar/-/victory-errorbar-30.3.1.tgz", + "integrity": "sha512-vvWg46piCu9uMJX2OXPF04Ma0zwoj+17CG2mRADy9eAaa6GIZLFaoi1IAKXFNX0g4kjPyUo+rgh/zslhkzZxNQ==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-group": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-30.3.1.tgz", + "integrity": "sha512-wP5xqhiXPfVmqfzcy5wyIR6hYrqGNMFXq33c88LdLN5bQ0YvZg3IM9MgBohN7SLxcoBbGVE3XzTP9Yc72pS7xQ==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-legend": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-30.3.1.tgz", + "integrity": "sha512-9y0ZwRBkdDUD4x3J3TM38U7lEfyUpfdDYGsED5sYrkGgBj0xXrrvjiWyNSyRn70ac33K15M5VCmmI7Dnvn2rtg==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-line": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-30.5.0.tgz", + "integrity": "sha512-5tWhemybJ9vd1LyJmwpUW11YZLa5ngmNTUt6w/dMwIuXOMHk1Kjr8lR5yvjSIvPy8pTLEZ0+Bah9XA65rAtjXQ==", + "requires": { + "d3-shape": "^1.2.0", + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-pie": { + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-30.5.1.tgz", + "integrity": "sha512-Cx4qDt3FyI4VoP0fe3Ubbpz7Sj6d6A5PUWKEuFuMjccb2h1jZgX6uJyBx+uPDBtbxCylrU2GORdLPQDnAXKssQ==", + "requires": { + "d3-shape": "^1.0.0", + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-polar-axis": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-30.3.1.tgz", + "integrity": "sha512-UyupwAGp9IEnEG0zMyffuUFLD3DRBnteNLCq7siszweBdlT/AAlH7SDlNJU5ahAcv4h+TgjD/bGObiMli3AcXw==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-scatter": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-30.3.1.tgz", + "integrity": "sha512-JLseknw+SMMIfhYxSu8GQ1qAJVy8fDQ8vze4gFOwvMHhdK8BbQiCLxPCmdlAhxoQixMbcwhAsHp/1RlpgK6IyA==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-selection-container": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-30.3.1.tgz", + "integrity": "sha512-UheHWWEx1PUmNobhmLbovErhOV1vLDUdJ+8/qoS9TJJZ9QRoG0S1Gw97q9knyyGuheKljckQnfPWZlVdFjswkQ==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-shared-events": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-30.3.1.tgz", + "integrity": "sha512-MFEx9YPXh+lrVJVvNQonup7Fxwgdt0IALLi4qfr5LzCO0vEmkIPvCdU1HeYk+8BDmpWeKz0MnJZx5SKEXrnK+g==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-stack": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-30.3.1.tgz", + "integrity": "sha512-mbo0tcZz/WuYl3HWVkxqm7P0FbzR9Wgpo8YwUqeHdlGdc9pyd/laGuFwiJ8W6wc6yoV4rWNdLWuQGwAqaVmfpw==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-tooltip": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-30.3.1.tgz", + "integrity": "sha512-F0IPgucHRzVpiw45QHfqne1qXKFx6ibJBtw5iCvnnD991ctu28Wlo84SMhWvJPzDYk6zv7b4pcfkVqHrS1nmGg==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-voronoi": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-voronoi/-/victory-voronoi-30.3.1.tgz", + "integrity": "sha512-8OJVyJEEJt5fHFR52iyyfwJ2HBh5KKlAM0XZV6dS46w5rkS7HMRJkQLbYMIGYcv4K2b8+Cx3PvXyf+nOOCeeiA==", + "requires": { + "d3-voronoi": "^1.1.2", + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, + "victory-voronoi-container": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-30.3.1.tgz", + "integrity": "sha512-Yj2g/v9oD065tSkcQbXyCqoYqDkuxvSxBe83jnaQrqd7rXiCCRsEEUjVqnZtEASvm3kkQxt/H5CRELo42o4s1A==", + "requires": { + "d3-voronoi": "^1.1.2", + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1", + "victory-tooltip": "^30.3.1" + } + }, + "victory-zoom-container": { + "version": "30.3.1", + "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-30.3.1.tgz", + "integrity": "sha512-Jf37RNnf0SQwkn5IoZuQD1QFhZLRNXS4fPUe9QZJivNCulo3Y/ziOjfjjnJjZ210LQqFIQocTdnweDHvygUWmw==", + "requires": { + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "victory-core": "^30.3.1" + } + }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -16205,7 +16697,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, "requires": { "fd-slicer": "~1.0.1" } diff --git a/package.json b/package.json index dcc2a6cc..52a49f49 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,18 @@ "version": "0.1.0", "private": true, "dependencies": { + "chart.js": "^2.7.3", + "electron-chartjs": "^1.0.0", "moment": "^2.22.2", + "plotly": "^1.0.6", "react": "^16.6.0", "react-big-calendar": "^0.20.1", "react-big-calendar-like-google": "0.0.3", "react-calendar": "^2.17.5", + "react-chartjs-2": "^2.7.4", "react-dom": "^16.6.0", - "react-scripts": "2.0.5" + "react-scripts": "2.0.5", + "victory": "^30.6.0" }, "homepage": "./", "main": "src/scripts/electron-start.js", diff --git a/src/App/App.css b/src/App/App.css index 7b17a273..3059d893 100644 --- a/src/App/App.css +++ b/src/App/App.css @@ -1,4 +1,4 @@ .App { - height: 80%; - width: 80%; + height: 100%; + width: 100%; } diff --git a/src/App/App.js b/src/App/App.js index dacf7f20..d2b0928a 100644 --- a/src/App/App.js +++ b/src/App/App.js @@ -1,8 +1,8 @@ import React, { Component } from 'react'; import Frame from '../components/structure/Frame'; import Model from '../model/Model'; -import './App.css'; import { getTestTaskListSmall } from '../test_resources/testutils' +import './App.css'; class App extends Component { constructor(props) { diff --git a/src/App/App.test.js b/src/App/App.test.js index a754b201..84abf4da 100644 --- a/src/App/App.test.js +++ b/src/App/App.test.js @@ -3,7 +3,7 @@ import ReactDOM from 'react-dom'; import App from './App'; it('renders without crashing', () => { - const div = document.createElement('div'); - ReactDOM.render(, div); - ReactDOM.unmountComponentAtNode(div); -}); + const div = document.createElement('div'); + ReactDOM.render(, div); + ReactDOM.unmountComponentAtNode(div); +}); \ No newline at end of file diff --git a/src/Model/Model.js b/src/Model/Model.js index 449e475e..486fef28 100644 --- a/src/Model/Model.js +++ b/src/Model/Model.js @@ -114,16 +114,16 @@ class Model { /* * Create a new task * 'title' is the title of the new task. + * returns - 'true' if it added, 'false' if it was a duplicate. */ createTask(title) { // look for duplicate titles - const duplicateTitles = this.resources.titleKeyList.getData().filter(titleKeyPair => titleKeyPair.key === title); + const duplicateTitles = this.resources.titleKeyList.getData().filter(titleKeyPair => titleKeyPair.title === title); if (duplicateTitles.length > 0) { - // make an alert and exit this function - throw new Error("woops, a task with that title already exists"); - + // there was a duplicate, handle it! (meaning make the alert in the outer component) + return false; } else { // find the key for the new task const maxKey = this.findMaxKey(this.resources.titleKeyList.getData()); @@ -136,11 +136,20 @@ class Model { // update the taskkey list this.resources.refreshTitleKeyList(); + + return true } } - findMaxKey(titleKeyList) { + /* + * Deletes the selected task, a deleted task cannot be recovered(!) + */ + deleteTask(key) { + this.resources.removeTask(key); + this.resources.refreshTitleKeyList(); + } + findMaxKey(titleKeyList) { const reducer = (sofar, newTK) => { const newKey = newTK.key; if (newKey > sofar) { @@ -149,7 +158,6 @@ class Model { return sofar; } }; - return titleKeyList.reduce(reducer, 0); } } diff --git a/src/Model/Model.test.js b/src/Model/Model.test.js index 7eb38c71..57bda266 100644 --- a/src/Model/Model.test.js +++ b/src/Model/Model.test.js @@ -2,8 +2,10 @@ import Model from './Model'; import { getTestTaskListSmall, getTestTitleKeyListSmall, getNewTestTask } from '../test_resources/testutils.js'; import { InitialTask } from '../utilities/general_content.js'; import ObservableData from './ObservableData'; +import { NO_DUPLICATE_TASK_TITLES } from '../utilities/constants'; describe('Model', () => { + it('constructs a new Model', () => { const testing = true; const model = new Model(testing, getTestTaskListSmall()); @@ -107,7 +109,28 @@ describe('Model', () => { const testing = true; const model = new Model(testing, getTestTaskListSmall()); - + const duplicateTitle = getTestTaskListSmall()[2].title; + + expect(model.createTask(duplicateTitle)).toEqual(false); + }); + + it("remove deleted tasks from titlekeylist", () => { + // and deletion should also change current task back to the welcome task + const testing = true; + const model = new Model(testing, getTestTaskListSmall()); + + const keyToRemove = 2; + + model.deleteTask(keyToRemove); + + const resultingTitleKeyList = model.resources.titleKeyList.getData(); + + expect(resultingTitleKeyList.length).toEqual(getTestTaskListSmall().length - 1); + expect(resultingTitleKeyList.filter(tk => tk.key === keyToRemove)).toEqual([]); + }); + + it("should reset current task to the InitialTask on deletion", () => { + const testing = true; }); }); diff --git a/src/Model/ObservableData.test.js b/src/Model/ObservableData.test.js index f0efe9fe..752135c0 100644 --- a/src/Model/ObservableData.test.js +++ b/src/Model/ObservableData.test.js @@ -89,7 +89,7 @@ describe('ObservableData', () => { expect(od.data).toEqual(originalTitle); }); - it('call \'obs.onChange(newData)\' with a shallow copy of data when data is an object', () => { + it('calls \'obs.onChange(newData)\' with a shallow copy of data when data is an object', () => { const od = new ObservableData(); var originalData = { title: "tomatoes", diff --git a/src/Model/Resources.js b/src/Model/Resources.js index a56b7fb8..e6e65d71 100644 --- a/src/Model/Resources.js +++ b/src/Model/Resources.js @@ -44,7 +44,7 @@ import { InitialTask } from '../utilities/general_content'; */ refreshTitleKeyList() { const currentStateOfList = this.parseTasksToTitles(); - if (currentStateOfList != this.titleKeyList.getData()) { + if (currentStateOfList !== this.titleKeyList.getData()) { this.titleKeyList.updateData(currentStateOfList); } // it they are the same, then nothing needs to happen :) @@ -58,4 +58,11 @@ import { InitialTask } from '../utilities/general_content'; obsWrapper.updateData(newTask); this.taskList.push(obsWrapper); } + + /* + * Remove a task (with the matching key) + */ + removeTask(keyOfTaskToRemove) { + this.taskList = this.taskList.filter(taskObs => taskObs.getData().key !== keyOfTaskToRemove); + } } \ No newline at end of file diff --git a/src/Model/Resources.test.js b/src/Model/Resources.test.js index 31f8556e..20588fe1 100644 --- a/src/Model/Resources.test.js +++ b/src/Model/Resources.test.js @@ -40,4 +40,15 @@ describe('Resources', () => { expect(res.taskList.map(task => task.getData())).toEqual(correctList); }); + + it("removes a task", () => { + const res = new Resources(getTestTaskListSmall()); + + const taskToRemove = getTestTaskListSmall()[2]; + + res.removeTask(taskToRemove.key); + + expect(res.taskList.length).toEqual(getTestTaskListSmall().length - 1); + expect(res.taskList.filter(task => task.key == taskToRemove.key)).toEqual([]); + }); }); \ No newline at end of file diff --git a/src/components/Analytics/Analytics.css b/src/components/Analytics/Analytics.css new file mode 100644 index 00000000..1fef6cca --- /dev/null +++ b/src/components/Analytics/Analytics.css @@ -0,0 +1,3 @@ +#displayContainer { + +} \ No newline at end of file diff --git a/src/components/Analytics/View.js b/src/components/Analytics/View.js new file mode 100644 index 00000000..574024e6 --- /dev/null +++ b/src/components/Analytics/View.js @@ -0,0 +1,26 @@ +import React from 'react'; +import {Line} from 'react-chartjs-2'; + +/**/ +/*{this.addData()}*/ +/**/ +const View = ({dataValue, labelValue, chartData, handleChange, handleSubmit}) => ( +
+
+ + + +
+ + +
+
+
+ +); + +export default View; diff --git a/src/components/Analytics/index.js b/src/components/Analytics/index.js new file mode 100644 index 00000000..c7debf39 --- /dev/null +++ b/src/components/Analytics/index.js @@ -0,0 +1,52 @@ +import React, { Component } from 'react'; +import View from './View'; +// import {Line} from 'react-chartjs-2'; + +class Analytics extends Component { + constructor(props) { + super(props); + this.state = { + dataValue: 0, + labelValue: 'enter label', + chartData : { + labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'], + datasets: [ + { + label: 'My data!', + data: [65, 59, 80, 81, 56, 55, 40], + fill: false, + lineTension: 0.1 + } + ] + } + }; + + this.handleChange = this.handleChange.bind(this); + this.handleSubmit = this.handleSubmit.bind(this); + }; + + handleChange(event) { + this.setState({dataValue: event.target.dataValue}); + this.setState({labelValue: event.target.labelValue}); + } + + handleSubmit(event) { + const dataToAdd = this.state.labelValue; + const labelToAdd = this.state.labelValue; + const data = this.state.chartData.datasets.data; + const labels = this.state.chartData.labels; + this.setState({ + dataValue: 'data entered.', + labelValue: 'label entered.', + data: data.concat(dataToAdd), + labels: labels.concat(labelToAdd) + }) + } + + render() { + return ; + + } +} + +export default Analytics; diff --git a/src/components/Journal/Journal.css b/src/components/Journal/Journal.css new file mode 100644 index 00000000..1fef6cca --- /dev/null +++ b/src/components/Journal/Journal.css @@ -0,0 +1,3 @@ +#displayContainer { + +} \ No newline at end of file diff --git a/src/components/Journal/View.js b/src/components/Journal/View.js new file mode 100644 index 00000000..9a1abd69 --- /dev/null +++ b/src/components/Journal/View.js @@ -0,0 +1,20 @@ +import React from 'react'; + + + +const View = ({value, entries, handleSubmit, handleChange}) => ( +
+
+