Remove unused organizations and configurations folder contents
parent
66cd6dd1ba
commit
40bc15d53f
|
@ -1016,7 +1016,7 @@
|
|||
}
|
||||
},
|
||||
"@influxdata/influx": {
|
||||
"version": "github:influxdata/influxdb2-js#47621167f05c2fbda3b38f0c6aaa85f29190d39b",
|
||||
"version": "github:influxdata/influxdb2-js#d7de8c08cac900c34a59ab4591312b5a2620a89e",
|
||||
"from": "github:influxdata/influxdb2-js#dev",
|
||||
"requires": {
|
||||
"axios": "^0.18.0"
|
||||
|
@ -1201,7 +1201,7 @@
|
|||
},
|
||||
"@types/codemirror": {
|
||||
"version": "0.0.56",
|
||||
"resolved": "http://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.56.tgz",
|
||||
"resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.56.tgz",
|
||||
"integrity": "sha512-OMtPqg2wFOEcNeVga+m+UXpYJw8ugISPCQOtShdFUho/k91Ms1oWOozoDT1I87Phv6IdwLfMLtIOahh1tO1cJQ==",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -1380,7 +1380,7 @@
|
|||
},
|
||||
"@types/react-dnd-html5-backend": {
|
||||
"version": "2.1.9",
|
||||
"resolved": "http://registry.npmjs.org/@types/react-dnd-html5-backend/-/react-dnd-html5-backend-2.1.9.tgz",
|
||||
"resolved": "https://registry.npmjs.org/@types/react-dnd-html5-backend/-/react-dnd-html5-backend-2.1.9.tgz",
|
||||
"integrity": "sha512-o42zIpcgXXj04xYDT9o9kXoldqDa81ie5XAKKCo7/fOWEhOCRt9UYu+LzOXC308eKKf8v0HzbJaDTr93j3JrTw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -2120,7 +2120,7 @@
|
|||
},
|
||||
"array-equal": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
|
||||
"integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -2205,7 +2205,7 @@
|
|||
},
|
||||
"util": {
|
||||
"version": "0.10.3",
|
||||
"resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz",
|
||||
"resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
|
||||
"integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -2373,7 +2373,7 @@
|
|||
},
|
||||
"axios": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
|
||||
"integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
|
||||
"requires": {
|
||||
"follow-redirects": "^1.3.0",
|
||||
|
@ -2618,7 +2618,7 @@
|
|||
},
|
||||
"bindings": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz",
|
||||
"integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -2757,7 +2757,7 @@
|
|||
},
|
||||
"browserify-aes": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
|
||||
"integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -2794,7 +2794,7 @@
|
|||
},
|
||||
"browserify-rsa": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
|
||||
"resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
|
||||
"integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -2873,7 +2873,7 @@
|
|||
},
|
||||
"buffer": {
|
||||
"version": "4.9.1",
|
||||
"resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
|
||||
"resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
|
||||
"integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -3036,7 +3036,7 @@
|
|||
},
|
||||
"callsites": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
|
||||
"integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -3743,7 +3743,7 @@
|
|||
},
|
||||
"create-hash": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
|
||||
"integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -3756,7 +3756,7 @@
|
|||
},
|
||||
"create-hmac": {
|
||||
"version": "1.1.7",
|
||||
"resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
|
||||
"resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
|
||||
"integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -3835,7 +3835,7 @@
|
|||
},
|
||||
"css-color-names": {
|
||||
"version": "0.0.4",
|
||||
"resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
|
||||
"resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
|
||||
"integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -4573,7 +4573,7 @@
|
|||
},
|
||||
"diffie-hellman": {
|
||||
"version": "5.0.3",
|
||||
"resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
|
||||
"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
|
||||
"integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -4595,7 +4595,7 @@
|
|||
},
|
||||
"dnd-core": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "http://registry.npmjs.org/dnd-core/-/dnd-core-2.6.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-2.6.0.tgz",
|
||||
"integrity": "sha1-ErrWbVh0LG5ffPKUP7aFlED4CcQ=",
|
||||
"requires": {
|
||||
"asap": "^2.0.6",
|
||||
|
@ -4717,7 +4717,7 @@
|
|||
},
|
||||
"dotenv": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz",
|
||||
"integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -5845,7 +5845,7 @@
|
|||
"dependencies": {
|
||||
"core-js": {
|
||||
"version": "1.2.7",
|
||||
"resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
|
||||
"integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
|
||||
}
|
||||
}
|
||||
|
@ -5914,7 +5914,7 @@
|
|||
},
|
||||
"finalhandler": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
|
||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
|
||||
"integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -6176,21 +6176,21 @@
|
|||
"dependencies": {
|
||||
"abbrev": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"ansi-regex": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"aproba": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
|
@ -6208,14 +6208,14 @@
|
|||
},
|
||||
"balanced-match": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6233,35 +6233,35 @@
|
|||
},
|
||||
"code-point-at": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"console-control-strings": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6278,21 +6278,21 @@
|
|||
},
|
||||
"delegates": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"detect-libc": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"fs-minipass": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6302,14 +6302,14 @@
|
|||
},
|
||||
"fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"gauge": {
|
||||
"version": "2.7.4",
|
||||
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6341,7 +6341,7 @@
|
|||
},
|
||||
"has-unicode": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
|
@ -6358,7 +6358,7 @@
|
|||
},
|
||||
"ignore-walk": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6368,7 +6368,7 @@
|
|||
},
|
||||
"inflight": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6379,21 +6379,21 @@
|
|||
},
|
||||
"inherits": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"ini": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"is-fullwidth-code-point": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6403,14 +6403,14 @@
|
|||
},
|
||||
"isarray": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"minimatch": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6420,7 +6420,7 @@
|
|||
},
|
||||
"minimist": {
|
||||
"version": "0.0.8",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
|
@ -6448,7 +6448,7 @@
|
|||
},
|
||||
"mkdirp": {
|
||||
"version": "0.5.1",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6458,7 +6458,7 @@
|
|||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
|
@ -6496,7 +6496,7 @@
|
|||
},
|
||||
"nopt": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6525,7 +6525,7 @@
|
|||
},
|
||||
"npmlog": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6538,21 +6538,21 @@
|
|||
},
|
||||
"number-is-nan": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"object-assign": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6562,21 +6562,21 @@
|
|||
},
|
||||
"os-homedir": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"os-tmpdir": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"osenv": {
|
||||
"version": "0.1.5",
|
||||
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6587,14 +6587,14 @@
|
|||
},
|
||||
"path-is-absolute": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"process-nextick-args": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
|
@ -6614,7 +6614,7 @@
|
|||
"dependencies": {
|
||||
"minimist": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
|
@ -6623,7 +6623,7 @@
|
|||
},
|
||||
"readable-stream": {
|
||||
"version": "2.3.6",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6656,14 +6656,14 @@
|
|||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"sax": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
|
@ -6677,21 +6677,21 @@
|
|||
},
|
||||
"set-blocking": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"signal-exit": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"string-width": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6703,7 +6703,7 @@
|
|||
},
|
||||
"string_decoder": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6713,7 +6713,7 @@
|
|||
},
|
||||
"strip-ansi": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
|
@ -6723,7 +6723,7 @@
|
|||
},
|
||||
"strip-json-comments": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
|
@ -6746,7 +6746,7 @@
|
|||
},
|
||||
"util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
|
@ -6763,7 +6763,7 @@
|
|||
},
|
||||
"wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"resolved": "",
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
|
@ -6820,7 +6820,7 @@
|
|||
},
|
||||
"get-stream": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
|
||||
"integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -7662,7 +7662,7 @@
|
|||
},
|
||||
"http-errors": {
|
||||
"version": "1.6.3",
|
||||
"resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
|
||||
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -7685,7 +7685,7 @@
|
|||
},
|
||||
"http-proxy-middleware": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
|
||||
"integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -8375,7 +8375,7 @@
|
|||
},
|
||||
"is-obj": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
|
||||
"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -10046,7 +10046,7 @@
|
|||
},
|
||||
"lodash.isempty": {
|
||||
"version": "4.4.0",
|
||||
"resolved": "http://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
|
||||
"integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4="
|
||||
},
|
||||
"lodash.isequal": {
|
||||
|
@ -10174,7 +10174,7 @@
|
|||
},
|
||||
"magic-string": {
|
||||
"version": "0.22.5",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
|
||||
"resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
|
||||
"integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -10291,7 +10291,7 @@
|
|||
},
|
||||
"media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -10487,7 +10487,7 @@
|
|||
},
|
||||
"minimist": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
|
||||
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -10532,7 +10532,7 @@
|
|||
},
|
||||
"mkdirp": {
|
||||
"version": "0.5.1",
|
||||
"resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
|
||||
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -10541,7 +10541,7 @@
|
|||
"dependencies": {
|
||||
"minimist": {
|
||||
"version": "0.0.8",
|
||||
"resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
||||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
|
||||
"dev": true
|
||||
}
|
||||
|
@ -11129,7 +11129,7 @@
|
|||
"dependencies": {
|
||||
"minimist": {
|
||||
"version": "0.0.10",
|
||||
"resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
|
||||
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -11177,7 +11177,7 @@
|
|||
},
|
||||
"os-homedir": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
|
||||
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
|
||||
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -11194,7 +11194,7 @@
|
|||
},
|
||||
"os-tmpdir": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
|
||||
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
|
||||
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -11556,7 +11556,7 @@
|
|||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -11695,7 +11695,7 @@
|
|||
},
|
||||
"path-is-absolute": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
||||
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -13046,7 +13046,7 @@
|
|||
},
|
||||
"react-dnd": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "http://registry.npmjs.org/react-dnd/-/react-dnd-2.6.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-2.6.0.tgz",
|
||||
"integrity": "sha1-f6JWds+CfViokSk+PBq1naACVFo=",
|
||||
"requires": {
|
||||
"disposables": "^1.0.1",
|
||||
|
@ -13059,7 +13059,7 @@
|
|||
},
|
||||
"react-dnd-html5-backend": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "http://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-2.6.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-2.6.0.tgz",
|
||||
"integrity": "sha1-WQzRzKeEQbsnTt1XH+9MCxbdz44=",
|
||||
"requires": {
|
||||
"lodash": "^4.2.0"
|
||||
|
@ -13174,7 +13174,7 @@
|
|||
},
|
||||
"react-resize-detector": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "http://registry.npmjs.org/react-resize-detector/-/react-resize-detector-2.3.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-2.3.0.tgz",
|
||||
"integrity": "sha512-oCAddEWWeFWYH5FAcHdBYcZjAw9fMzRUK9sWSx6WvSSOPVRxcHd5zTIGy/mOus+AhN/u6T4TMiWxvq79PywnJQ==",
|
||||
"requires": {
|
||||
"lodash.debounce": "^4.0.8",
|
||||
|
@ -13185,7 +13185,7 @@
|
|||
},
|
||||
"react-router": {
|
||||
"version": "3.2.1",
|
||||
"resolved": "http://registry.npmjs.org/react-router/-/react-router-3.2.1.tgz",
|
||||
"resolved": "https://registry.npmjs.org/react-router/-/react-router-3.2.1.tgz",
|
||||
"integrity": "sha512-SXkhC0nr3G0ltzVU07IN8jYl0bB6FsrDIqlLC9dK3SITXqyTJyM7yhXlUqs89w3Nqi5OkXsfRUeHX+P874HQrg==",
|
||||
"requires": {
|
||||
"create-react-class": "^15.5.1",
|
||||
|
@ -13339,7 +13339,7 @@
|
|||
},
|
||||
"readable-stream": {
|
||||
"version": "2.3.6",
|
||||
"resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
||||
"requires": {
|
||||
"core-util-is": "~1.0.0",
|
||||
|
@ -13610,7 +13610,7 @@
|
|||
"dependencies": {
|
||||
"hoist-non-react-statics": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "http://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz",
|
||||
"integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs="
|
||||
},
|
||||
"prop-types": {
|
||||
|
@ -13625,7 +13625,7 @@
|
|||
},
|
||||
"redux-thunk": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "http://registry.npmjs.org/redux-thunk/-/redux-thunk-1.0.3.tgz",
|
||||
"resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-1.0.3.tgz",
|
||||
"integrity": "sha1-d4qgCZ7qBZUDGrazkWX2Zw2NJr0="
|
||||
},
|
||||
"regenerate": {
|
||||
|
@ -13788,7 +13788,7 @@
|
|||
"dependencies": {
|
||||
"jsesc": {
|
||||
"version": "0.5.0",
|
||||
"resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
|
||||
"integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
|
||||
"dev": true
|
||||
}
|
||||
|
@ -14084,7 +14084,7 @@
|
|||
},
|
||||
"safe-regex": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
|
||||
"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -14324,7 +14324,7 @@
|
|||
},
|
||||
"sha.js": {
|
||||
"version": "2.4.11",
|
||||
"resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
|
||||
"resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
|
||||
"integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
@ -14803,7 +14803,7 @@
|
|||
},
|
||||
"string_decoder": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||
"requires": {
|
||||
"safe-buffer": "~5.1.0"
|
||||
|
@ -14834,7 +14834,7 @@
|
|||
},
|
||||
"strip-eof": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
|
||||
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
|
||||
"dev": true
|
||||
},
|
||||
|
@ -16272,7 +16272,7 @@
|
|||
},
|
||||
"wrap-ansi": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
|
||||
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
|
|
@ -4,14 +4,12 @@ import {connect} from 'react-redux'
|
|||
|
||||
// Components
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import OrganizationNavigation from 'src/organizations/components/OrganizationNavigation'
|
||||
import OrgHeader from 'src/organizations/containers/OrgHeader'
|
||||
import SettingsNavigation from 'src/settings/components/SettingsNavigation'
|
||||
import SettingsHeader from 'src/settings/components/SettingsHeader'
|
||||
import {Tabs} from 'src/clockface'
|
||||
import {Page} from 'src/pageLayout'
|
||||
import TabbedPageSection from 'src/shared/components/tabbed_page/TabbedPageSection'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
import TokensTab from 'src/authorizations/components/TokensTab'
|
||||
|
||||
// Types
|
||||
|
@ -29,11 +27,11 @@ class TokensIndex extends Component<StateProps> {
|
|||
|
||||
return (
|
||||
<Page titleTag={org.name}>
|
||||
<OrgHeader />
|
||||
<SettingsHeader />
|
||||
<Page.Contents fullWidth={false} scrollable={true}>
|
||||
<div className="col-xs-12">
|
||||
<Tabs>
|
||||
<OrganizationNavigation tab="tokens" orgID={org.id} />
|
||||
<SettingsNavigation tab="tokens" orgID={org.id} />
|
||||
<Tabs.TabContents>
|
||||
<TabbedPageSection
|
||||
id="org-view-tab--buckets"
|
||||
|
|
|
@ -4,10 +4,10 @@ import moment from 'moment'
|
|||
|
||||
// Components
|
||||
import {Form, Input, Button, Grid} from '@influxdata/clockface'
|
||||
import Retention from 'src/organizations/components/Retention'
|
||||
import Retention from 'src/buckets/components/Retention'
|
||||
|
||||
// Constants
|
||||
import {MIN_RETENTION_SECONDS} from 'src/organizations/constants'
|
||||
import {MIN_RETENTION_SECONDS} from 'src/buckets/constants'
|
||||
|
||||
// Types
|
||||
import {BucketRetentionRules} from '@influxdata/influx'
|
||||
|
|
|
@ -3,7 +3,7 @@ import React, {PureComponent, ChangeEvent} from 'react'
|
|||
|
||||
// Components
|
||||
import {Radio, ButtonShape} from '@influxdata/clockface'
|
||||
import RetentionDuration from 'src/organizations/components/RetentionDuration'
|
||||
import RetentionDuration from 'src/buckets/components/RetentionDuration'
|
||||
|
||||
// Utils
|
||||
import {
|
|
@ -6,7 +6,7 @@ import {Overlay, ComponentStatus} from 'src/clockface'
|
|||
import BucketOverlayForm from 'src/buckets/components/BucketOverlayForm'
|
||||
|
||||
// Constants
|
||||
import {DEFAULT_SECONDS} from 'src/organizations/components/Retention'
|
||||
import {DEFAULT_SECONDS} from 'src/buckets/components/Retention'
|
||||
|
||||
// Types
|
||||
import {Bucket, BucketRetentionRules} from '@influxdata/influx'
|
||||
|
|
|
@ -4,15 +4,13 @@ import {connect} from 'react-redux'
|
|||
|
||||
// Components
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import OrganizationNavigation from 'src/organizations/components/OrganizationNavigation'
|
||||
import OrgHeader from 'src/organizations/containers/OrgHeader'
|
||||
import SettingsNavigation from 'src/settings/components/SettingsNavigation'
|
||||
import SettingsHeader from 'src/settings/components/SettingsHeader'
|
||||
import {Tabs} from 'src/clockface'
|
||||
import {Page} from 'src/pageLayout'
|
||||
import TabbedPageSection from 'src/shared/components/tabbed_page/TabbedPageSection'
|
||||
import BucketsTab from 'src/buckets/components/BucketsTab'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
|
||||
// Types
|
||||
import {Organization} from '@influxdata/influx'
|
||||
|
@ -30,11 +28,11 @@ class BucketsIndex extends Component<StateProps> {
|
|||
return (
|
||||
<>
|
||||
<Page titleTag={org.name}>
|
||||
<OrgHeader />
|
||||
<SettingsHeader />
|
||||
<Page.Contents fullWidth={false} scrollable={true}>
|
||||
<div className="col-xs-12">
|
||||
<Tabs>
|
||||
<OrganizationNavigation tab="buckets" orgID={org.id} />
|
||||
<SettingsNavigation tab="buckets" orgID={org.id} />
|
||||
<Tabs.TabContents>
|
||||
<TabbedPageSection
|
||||
id="org-view-tab--buckets"
|
||||
|
|
|
@ -1,99 +0,0 @@
|
|||
// Libraries
|
||||
import React, {Component} from 'react'
|
||||
import {withRouter, WithRouterProps} from 'react-router'
|
||||
|
||||
// Components
|
||||
import {Page} from 'src/pageLayout'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import TabbedPageSection from 'src/shared/components/tabbed_page/TabbedPageSection'
|
||||
import TabbedPage from 'src/shared/components/tabbed_page/TabbedPage'
|
||||
import Settings from 'src/me/components/account/Settings'
|
||||
import Telegrafs from 'src/configuration/components/Telegrafs'
|
||||
import PageTitleWithOrg from 'src/shared/components/PageTitleWithOrg'
|
||||
|
||||
// Decorators
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import CloudExclude from 'src/shared/components/cloud/CloudExclude'
|
||||
import CloudOnly from 'src/shared/components/cloud/CloudOnly'
|
||||
|
||||
interface OwnProps {
|
||||
activeTabUrl: string
|
||||
}
|
||||
|
||||
type Props = OwnProps & WithRouterProps
|
||||
|
||||
@ErrorHandling
|
||||
class ConfigurationPage extends Component<Props> {
|
||||
public render() {
|
||||
const {
|
||||
params: {tab},
|
||||
} = this.props
|
||||
|
||||
return (
|
||||
<Page titleTag="Configuration">
|
||||
<Page.Header fullWidth={false}>
|
||||
<Page.Header.Left>
|
||||
<PageTitleWithOrg title="Configuration" />
|
||||
</Page.Header.Left>
|
||||
<Page.Header.Right />
|
||||
</Page.Header>
|
||||
<Page.Contents fullWidth={false} scrollable={true}>
|
||||
<div className="col-xs-12">
|
||||
<GetResources resource={ResourceTypes.Authorizations}>
|
||||
<CloudExclude>
|
||||
<TabbedPage
|
||||
name="Configuration"
|
||||
parentUrl="/configuration"
|
||||
activeTabUrl={tab}
|
||||
>
|
||||
<TabbedPageSection
|
||||
id="telegrafs_tab"
|
||||
url="telegrafs_tab"
|
||||
title="Telegraf"
|
||||
>
|
||||
<GetResources resource={ResourceTypes.Buckets}>
|
||||
<GetResources resource={ResourceTypes.Telegrafs}>
|
||||
<Telegrafs />
|
||||
</GetResources>
|
||||
</GetResources>
|
||||
</TabbedPageSection>
|
||||
<TabbedPageSection
|
||||
id="scrapers_tab"
|
||||
url="scrapers_tab"
|
||||
title="Scrapers"
|
||||
/>
|
||||
<TabbedPageSection
|
||||
id="settings_tab"
|
||||
url="settings_tab"
|
||||
title="Profile"
|
||||
>
|
||||
<Settings />
|
||||
</TabbedPageSection>
|
||||
</TabbedPage>
|
||||
</CloudExclude>
|
||||
<CloudOnly>
|
||||
<TabbedPage
|
||||
name="Configuration"
|
||||
parentUrl="/configuration"
|
||||
activeTabUrl={tab}
|
||||
>
|
||||
<TabbedPageSection
|
||||
id="settings_tab"
|
||||
url="settings_tab"
|
||||
title="Profile"
|
||||
>
|
||||
<Settings />
|
||||
</TabbedPageSection>
|
||||
</TabbedPage>
|
||||
</CloudOnly>
|
||||
</GetResources>
|
||||
</div>
|
||||
</Page.Contents>
|
||||
</Page>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default withRouter<OwnProps>(ConfigurationPage)
|
|
@ -1,21 +0,0 @@
|
|||
// Libraries
|
||||
import React, {Component} from 'react'
|
||||
|
||||
// Decorators
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
|
||||
interface Props {
|
||||
id: string
|
||||
title: string
|
||||
url: string
|
||||
children: JSX.Element
|
||||
}
|
||||
|
||||
@ErrorHandling
|
||||
class TabbedPageSection extends Component<Props> {
|
||||
public render() {
|
||||
return <div>{this.props.children}</div>
|
||||
}
|
||||
}
|
||||
|
||||
export default TabbedPageSection
|
|
@ -1,22 +0,0 @@
|
|||
// Libraries
|
||||
import React, {SFC} from 'react'
|
||||
import classnames from 'classnames'
|
||||
|
||||
interface Props {
|
||||
id: string
|
||||
title: string
|
||||
active: boolean
|
||||
url: string
|
||||
onClick: (url: string) => () => void
|
||||
}
|
||||
|
||||
const ConfigurationPageTab: SFC<Props> = ({title, active, url, onClick}) => (
|
||||
<div
|
||||
className={classnames('tabbed-page-nav--tab', {active})}
|
||||
onClick={onClick(url)}
|
||||
>
|
||||
{title}
|
||||
</div>
|
||||
)
|
||||
|
||||
export default ConfigurationPageTab
|
|
@ -1,49 +0,0 @@
|
|||
import React, {Component} from 'react'
|
||||
import _ from 'lodash'
|
||||
|
||||
// Utils
|
||||
import {randomPresetColor} from 'src/configuration/utils/labels'
|
||||
import {IconFont} from 'src/clockface'
|
||||
import {validateHexCode} from 'src/configuration/utils/labels'
|
||||
|
||||
// Constants
|
||||
import {INPUT_ERROR_COLOR} from 'src/configuration/constants/LabelColors'
|
||||
|
||||
interface Props {
|
||||
colorHex: string
|
||||
onClick: (newRandomHex: string) => void
|
||||
}
|
||||
|
||||
export default class RandomLabelColorButton extends Component<Props> {
|
||||
public render() {
|
||||
return (
|
||||
<button
|
||||
className="button button-sm button-default random-color--button "
|
||||
onClick={this.handleClick}
|
||||
title="Randomize label color"
|
||||
>
|
||||
<div
|
||||
className="label-colors--swatch"
|
||||
style={{
|
||||
backgroundColor: this.colorHex,
|
||||
}}
|
||||
/>
|
||||
<span className={`button-icon icon ${IconFont.Refresh}`} />
|
||||
</button>
|
||||
)
|
||||
}
|
||||
|
||||
private get colorHex(): string {
|
||||
const {colorHex} = this.props
|
||||
|
||||
if (validateHexCode(colorHex)) {
|
||||
return INPUT_ERROR_COLOR
|
||||
}
|
||||
|
||||
return colorHex
|
||||
}
|
||||
|
||||
private handleClick = () => {
|
||||
this.props.onClick(randomPresetColor())
|
||||
}
|
||||
}
|
|
@ -1,277 +0,0 @@
|
|||
// Libraries
|
||||
import _ from 'lodash'
|
||||
import React, {PureComponent, ChangeEvent} from 'react'
|
||||
import {connect} from 'react-redux'
|
||||
|
||||
// Components
|
||||
import {Input, Button, EmptyState, Grid} from '@influxdata/clockface'
|
||||
import {Tabs} from 'src/clockface'
|
||||
import CollectorList from 'src/telegrafs/components/CollectorList'
|
||||
import TelegrafExplainer from 'src/telegrafs/components/TelegrafExplainer'
|
||||
import FilterList from 'src/shared/components/Filter'
|
||||
import NoBucketsWarning from 'src/organizations/components/NoBucketsWarning'
|
||||
|
||||
// Actions
|
||||
import {deleteLabel} from 'src/labels/actions'
|
||||
import {setBucketInfo} from 'src/dataLoaders/actions/steps'
|
||||
import {
|
||||
setDataLoadersType,
|
||||
setTelegrafConfigID,
|
||||
setTelegrafConfigName,
|
||||
clearDataLoaders,
|
||||
} from 'src/dataLoaders/actions/dataLoaders'
|
||||
import {
|
||||
updateTelegraf,
|
||||
createTelegraf,
|
||||
deleteTelegraf,
|
||||
} from 'src/telegrafs/actions'
|
||||
import {deleteAuthorization} from 'src/authorizations/actions'
|
||||
|
||||
// Decorators
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
|
||||
// Types
|
||||
import {ITelegraf as Telegraf, Bucket, Organization} from '@influxdata/influx'
|
||||
import {
|
||||
Columns,
|
||||
IconFont,
|
||||
InputType,
|
||||
ComponentSize,
|
||||
ComponentColor,
|
||||
ComponentStatus,
|
||||
} from '@influxdata/clockface'
|
||||
import {OverlayState} from 'src/types'
|
||||
import {DataLoaderType} from 'src/types/dataLoaders'
|
||||
import {AppState} from 'src/types'
|
||||
import {TOKEN_LABEL} from 'src/labels/constants'
|
||||
|
||||
interface StateProps {
|
||||
org: Organization
|
||||
buckets: Bucket[]
|
||||
telegrafs: Telegraf[]
|
||||
}
|
||||
|
||||
interface DispatchProps {
|
||||
onSetBucketInfo: typeof setBucketInfo
|
||||
onSetDataLoadersType: typeof setDataLoadersType
|
||||
onSetTelegrafConfigID: typeof setTelegrafConfigID
|
||||
onSetTelegrafConfigName: typeof setTelegrafConfigName
|
||||
onClearDataLoaders: typeof clearDataLoaders
|
||||
updateTelegraf: typeof updateTelegraf
|
||||
deleteTelegraf: typeof deleteTelegraf
|
||||
createTelegraf: typeof createTelegraf
|
||||
deleteLabel: typeof deleteLabel
|
||||
deleteAuthorization: typeof deleteAuthorization
|
||||
}
|
||||
|
||||
type Props = StateProps & DispatchProps
|
||||
|
||||
interface State {
|
||||
dataLoaderOverlay: OverlayState
|
||||
searchTerm: string
|
||||
instructionsOverlay: OverlayState
|
||||
collectorID?: string
|
||||
telegrafConfig: OverlayState
|
||||
}
|
||||
|
||||
@ErrorHandling
|
||||
export class Telegrafs extends PureComponent<Props, State> {
|
||||
constructor(props: Props) {
|
||||
super(props)
|
||||
|
||||
this.state = {
|
||||
searchTerm: '',
|
||||
collectorID: null,
|
||||
dataLoaderOverlay: OverlayState.Closed,
|
||||
instructionsOverlay: OverlayState.Closed,
|
||||
telegrafConfig: OverlayState.Closed,
|
||||
}
|
||||
}
|
||||
|
||||
public render() {
|
||||
const {telegrafs} = this.props
|
||||
const {searchTerm} = this.state
|
||||
|
||||
return (
|
||||
<>
|
||||
<Tabs.TabContentsHeader>
|
||||
<Input
|
||||
icon={IconFont.Search}
|
||||
placeholder="Filter telegraf configs..."
|
||||
widthPixels={290}
|
||||
value={searchTerm}
|
||||
type={InputType.Text}
|
||||
onChange={this.handleFilterChange}
|
||||
onBlur={this.handleFilterBlur}
|
||||
/>
|
||||
{this.createButton}
|
||||
</Tabs.TabContentsHeader>
|
||||
<Grid>
|
||||
<Grid.Row>
|
||||
<Grid.Column widthSM={Columns.Twelve}>
|
||||
<NoBucketsWarning
|
||||
visible={this.hasNoBuckets}
|
||||
resourceName="Telegraf Configurations"
|
||||
/>
|
||||
<FilterList<Telegraf>
|
||||
searchTerm={searchTerm}
|
||||
searchKeys={['plugins.0.config.bucket', 'labels[].name']}
|
||||
list={telegrafs}
|
||||
>
|
||||
{cs => (
|
||||
<CollectorList
|
||||
collectors={cs}
|
||||
emptyState={this.emptyState}
|
||||
onDelete={this.handleDeleteTelegraf}
|
||||
onUpdate={this.handleUpdateTelegraf}
|
||||
onOpenInstructions={this.handleOpenInstructions}
|
||||
onFilterChange={this.handleFilterUpdate}
|
||||
/>
|
||||
)}
|
||||
</FilterList>
|
||||
</Grid.Column>
|
||||
<Grid.Column
|
||||
widthSM={Columns.Six}
|
||||
widthMD={Columns.Four}
|
||||
offsetSM={Columns.Three}
|
||||
offsetMD={Columns.Four}
|
||||
>
|
||||
<TelegrafExplainer />
|
||||
</Grid.Column>
|
||||
</Grid.Row>
|
||||
</Grid>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
private get hasNoBuckets(): boolean {
|
||||
const {buckets} = this.props
|
||||
|
||||
if (!buckets || !buckets.length) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
private handleOpenInstructions = (collectorID: string): void => {
|
||||
this.setState({
|
||||
instructionsOverlay: OverlayState.Open,
|
||||
collectorID,
|
||||
})
|
||||
}
|
||||
|
||||
private get createButton(): JSX.Element {
|
||||
let status = ComponentStatus.Default
|
||||
let titleText = 'Create a new Telegraf Configuration'
|
||||
|
||||
if (this.hasNoBuckets) {
|
||||
status = ComponentStatus.Disabled
|
||||
titleText =
|
||||
'You need at least 1 bucket in order to create a Telegraf Configuration'
|
||||
}
|
||||
|
||||
return (
|
||||
<Button
|
||||
text="Create Configuration"
|
||||
icon={IconFont.Plus}
|
||||
color={ComponentColor.Primary}
|
||||
onClick={this.handleAddCollector}
|
||||
status={status}
|
||||
titleText={titleText}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
private handleAddCollector = () => {
|
||||
const {buckets, onSetBucketInfo, onSetDataLoadersType} = this.props
|
||||
|
||||
if (buckets && buckets.length) {
|
||||
const {organization, organizationID, name, id} = buckets[0]
|
||||
onSetBucketInfo(organization, organizationID, name, id)
|
||||
}
|
||||
|
||||
onSetDataLoadersType(DataLoaderType.Streaming)
|
||||
|
||||
this.setState({dataLoaderOverlay: OverlayState.Open})
|
||||
}
|
||||
|
||||
private get emptyState(): JSX.Element {
|
||||
const {org} = this.props
|
||||
const {searchTerm} = this.state
|
||||
|
||||
if (_.isEmpty(searchTerm)) {
|
||||
return (
|
||||
<EmptyState size={ComponentSize.Medium}>
|
||||
<EmptyState.Text
|
||||
text={`${
|
||||
org.name
|
||||
} does not own any Telegraf Configurations, why not create one?`}
|
||||
highlightWords={['Telegraf', 'Configurations']}
|
||||
/>
|
||||
{this.createButton}
|
||||
</EmptyState>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<EmptyState size={ComponentSize.Medium}>
|
||||
<EmptyState.Text text="No Telegraf Configuration buckets match your query" />
|
||||
</EmptyState>
|
||||
)
|
||||
}
|
||||
|
||||
private handleDeleteTelegraf = async (telegraf: Telegraf) => {
|
||||
this.props.deleteTelegraf(telegraf.id, telegraf.name)
|
||||
|
||||
// stale tokens from system when telegraf is deleted
|
||||
const label = telegraf.labels.find(l => l.name === TOKEN_LABEL)
|
||||
|
||||
if (label) {
|
||||
this.props.deleteAuthorization(label.properties.tokenID)
|
||||
}
|
||||
}
|
||||
|
||||
private handleUpdateTelegraf = async (telegraf: Telegraf) => {
|
||||
this.props.updateTelegraf(telegraf)
|
||||
}
|
||||
|
||||
private handleFilterChange = (e: ChangeEvent<HTMLInputElement>): void => {
|
||||
this.handleFilterUpdate(e.target.value)
|
||||
}
|
||||
|
||||
private handleFilterBlur = (e: ChangeEvent<HTMLInputElement>): void => {
|
||||
this.setState({searchTerm: e.target.value})
|
||||
}
|
||||
|
||||
private handleFilterUpdate = (searchTerm: string) => {
|
||||
this.setState({searchTerm})
|
||||
}
|
||||
}
|
||||
|
||||
const mdtp: DispatchProps = {
|
||||
onSetBucketInfo: setBucketInfo,
|
||||
onSetDataLoadersType: setDataLoadersType,
|
||||
onSetTelegrafConfigID: setTelegrafConfigID,
|
||||
onSetTelegrafConfigName: setTelegrafConfigName,
|
||||
onClearDataLoaders: clearDataLoaders,
|
||||
updateTelegraf,
|
||||
createTelegraf,
|
||||
deleteTelegraf,
|
||||
deleteLabel,
|
||||
deleteAuthorization,
|
||||
}
|
||||
|
||||
const mstp = ({orgs, buckets, telegrafs}: AppState): StateProps => {
|
||||
const org = orgs[0]
|
||||
return {
|
||||
org,
|
||||
buckets: buckets.list,
|
||||
telegrafs: telegrafs.list,
|
||||
}
|
||||
}
|
||||
|
||||
export default connect<StateProps, DispatchProps, {}>(
|
||||
mstp,
|
||||
mdtp
|
||||
)(Telegrafs)
|
|
@ -1,208 +0,0 @@
|
|||
// Labels can use a different set of brand colors than single stats or gauges
|
||||
import {ILabel} from '@influxdata/influx'
|
||||
import {LabelColor, LabelColorType} from 'src/types/colors'
|
||||
|
||||
export const HEX_CODE_CHAR_LENGTH = 7
|
||||
|
||||
export const DEFAULT_LABEL_COLOR_HEX = '#326BBA'
|
||||
|
||||
export const EMPTY_LABEL: ILabel = {
|
||||
name: '',
|
||||
properties: {
|
||||
description: '',
|
||||
color: DEFAULT_LABEL_COLOR_HEX,
|
||||
},
|
||||
}
|
||||
|
||||
export const CUSTOM_LABEL: LabelColor = {
|
||||
id: 'custom',
|
||||
colorHex: '#RRRRRR',
|
||||
name: 'Custom Hexcode',
|
||||
type: LabelColorType.Custom,
|
||||
}
|
||||
|
||||
export const PRESET_LABEL_COLORS: LabelColor[] = [
|
||||
CUSTOM_LABEL,
|
||||
{
|
||||
id: 'label-preset-sapphire',
|
||||
colorHex: '#326BBA',
|
||||
name: 'Sapphire',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-ocean',
|
||||
colorHex: '#4591ED',
|
||||
name: 'Ocean',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-pool',
|
||||
colorHex: '#22ADF6',
|
||||
name: 'Pool',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-laser',
|
||||
colorHex: '#00C9FF',
|
||||
name: 'Laser',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-hydrogen',
|
||||
colorHex: '#6BDFFF',
|
||||
name: 'Hydrogen',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-neutrino',
|
||||
colorHex: '#BEF0FF',
|
||||
name: 'Neutrino',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-void',
|
||||
colorHex: '#311F94',
|
||||
name: 'Void',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-amethyst',
|
||||
colorHex: '#513CC6',
|
||||
name: 'Amethyst',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-star',
|
||||
colorHex: '#7A65F2',
|
||||
name: 'Star',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-comet',
|
||||
colorHex: '#9394FF',
|
||||
name: 'Comet',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-potassium',
|
||||
colorHex: '#B1B6FF',
|
||||
name: 'Potassium',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-moonstone',
|
||||
colorHex: '#C9D0FF',
|
||||
name: 'Moonstone',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-emerald',
|
||||
colorHex: '#108174',
|
||||
name: 'Emerald',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-viridian',
|
||||
colorHex: '#32B08C',
|
||||
name: 'Viridian',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-rainforest',
|
||||
colorHex: '#4ED8A0',
|
||||
name: 'Rainforest',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-honeydew',
|
||||
colorHex: '#7CE490',
|
||||
name: 'Honeydew',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-krypton',
|
||||
colorHex: '#A5F3B4',
|
||||
name: 'Krypton',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-wasabi',
|
||||
colorHex: '#C6FFD0',
|
||||
name: 'Wasabi',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-ruby',
|
||||
colorHex: '#BF3D5E',
|
||||
name: 'Ruby',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-fire',
|
||||
colorHex: '#DC4E58',
|
||||
name: 'Fire',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-curacao',
|
||||
colorHex: '#F95F53',
|
||||
name: 'Curacao',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-dreamsicle',
|
||||
colorHex: '#FF8564',
|
||||
name: 'Dreamsicle',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-tungsten',
|
||||
colorHex: '#FFB6A0',
|
||||
name: 'Tungsten',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-marmelade',
|
||||
colorHex: '#FFDCCF',
|
||||
name: 'Marmelade',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-topaz',
|
||||
colorHex: '#E85B1C',
|
||||
name: 'Topaz',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-tiger',
|
||||
colorHex: '#F48D38',
|
||||
name: 'Tiger',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-pineapple',
|
||||
colorHex: '#FFB94A',
|
||||
name: 'Pineapple',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-thunder',
|
||||
colorHex: '#FFD255',
|
||||
name: 'Thunder',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-sulfur',
|
||||
colorHex: '#FFE480',
|
||||
name: 'Sulfur',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-daisy',
|
||||
colorHex: '#FFF6B8',
|
||||
name: 'Daisy',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
]
|
||||
|
||||
export const INPUT_ERROR_COLOR = '#0F0E15'
|
|
@ -38,17 +38,6 @@ export const getDashboard = async (id: string): Promise<Dashboard> => {
|
|||
}
|
||||
}
|
||||
|
||||
export const getDashboardsByOrgID = async (
|
||||
orgID: string
|
||||
): Promise<Dashboard[]> => {
|
||||
const dashboards = await client.dashboards.getAll(orgID)
|
||||
|
||||
return dashboards.map(d => ({
|
||||
...d,
|
||||
cells: addDashboardIDToCells(d.cells, d.id),
|
||||
}))
|
||||
}
|
||||
|
||||
export const createDashboard = async (
|
||||
props: CreateDashboardRequest
|
||||
): Promise<Dashboard> => {
|
||||
|
|
|
@ -27,9 +27,8 @@ import {getTemplateByID} from 'src/templates/actions'
|
|||
|
||||
// Types
|
||||
import {AppState, RemoteDataState, DashboardTemplate} from 'src/types'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
|
||||
|
||||
interface StateProps {
|
||||
templates: TemplateSummary[]
|
||||
|
|
|
@ -21,9 +21,7 @@ import {
|
|||
} from 'src/dashboards/actions'
|
||||
import {retainRangesDashTimeV1 as retainRangesDashTimeV1Action} from 'src/dashboards/actions/ranges'
|
||||
import {notify as notifyAction} from 'src/shared/actions/notifications'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
|
||||
// Constants
|
||||
import {DEFAULT_DASHBOARD_NAME} from 'src/dashboards/constants/index'
|
||||
|
|
|
@ -5,7 +5,7 @@ import _ from 'lodash'
|
|||
// Components
|
||||
import Table from 'src/dashboards/components/dashboard_index/Table'
|
||||
import FilterList from 'src/shared/components/Filter'
|
||||
import GetLabels from 'src/configuration/components/GetLabels'
|
||||
import GetLabels from 'src/labels/components/GetLabels'
|
||||
|
||||
// Decorators
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
|
|
|
@ -4,9 +4,7 @@ import {connect} from 'react-redux'
|
|||
|
||||
// Components
|
||||
import TimeMachine from 'src/timeMachine/components/TimeMachine'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
|
||||
// Actions
|
||||
import {setActiveTimeMachine} from 'src/timeMachine/actions'
|
||||
|
|
|
@ -36,7 +36,6 @@ import NotFound from 'src/shared/components/NotFound'
|
|||
import GetLinks from 'src/shared/containers/GetLinks'
|
||||
import GetMe from 'src/shared/containers/GetMe'
|
||||
import Notifications from 'src/shared/containers/Notifications'
|
||||
import ConfigurationPage from 'src/configuration/components/ConfigurationPage'
|
||||
import TaskExportOverlay from 'src/tasks/components/TaskExportOverlay'
|
||||
import TaskImportOverlay from 'src/tasks/components/TaskImportOverlay'
|
||||
import VEO from 'src/dashboards/components/VEO'
|
||||
|
@ -183,10 +182,6 @@ class Root extends PureComponent {
|
|||
</Route>
|
||||
<Route path="me" component={MePage} />
|
||||
<Route path="account/:tab" component={Account} />
|
||||
<Route
|
||||
path="configuration/:tab"
|
||||
component={ConfigurationPage}
|
||||
/>
|
||||
<Route path="settings">
|
||||
<IndexRoute component={MembersIndex} />
|
||||
</Route>
|
||||
|
|
|
@ -10,7 +10,7 @@ import {Overlay, ComponentStatus} from 'src/clockface'
|
|||
import {ILabel} from '@influxdata/influx'
|
||||
|
||||
// Constants
|
||||
import {EMPTY_LABEL} from 'src/configuration/constants/LabelColors'
|
||||
import {EMPTY_LABEL} from 'src/labels/constants'
|
||||
|
||||
// Decorators
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
|
@ -3,11 +3,11 @@ import React, {PureComponent} from 'react'
|
|||
|
||||
// Components
|
||||
import {IndexList, Overlay} from 'src/clockface'
|
||||
import UpdateLabelOverlay from 'src/configuration/components/UpdateLabelOverlay'
|
||||
import UpdateLabelOverlay from 'src/labels/components/UpdateLabelOverlay'
|
||||
import LabelRow from 'src/labels/components/LabelRow'
|
||||
|
||||
// Utils
|
||||
import {validateLabelUniqueness} from 'src/configuration/utils/labels'
|
||||
import {validateLabelUniqueness} from 'src/labels/utils/'
|
||||
|
||||
// Types
|
||||
import {ILabel} from '@influxdata/influx'
|
||||
|
|
|
@ -16,11 +16,11 @@ import {
|
|||
} from '@influxdata/clockface'
|
||||
|
||||
// Constants
|
||||
import {INPUT_ERROR_COLOR} from 'src/configuration/constants/LabelColors'
|
||||
import {INPUT_ERROR_COLOR} from 'src/labels/constants'
|
||||
const MAX_LABEL_CHARS = 50
|
||||
|
||||
// Utils
|
||||
import {validateHexCode} from 'src/configuration/utils/labels'
|
||||
import {validateHexCode} from 'src/labels/utils/'
|
||||
|
||||
// Decorators
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
|
|
|
@ -4,7 +4,7 @@ import {connect} from 'react-redux'
|
|||
|
||||
// Components
|
||||
import {Input, Button, EmptyState} from '@influxdata/clockface'
|
||||
import CreateLabelOverlay from 'src/configuration/components/CreateLabelOverlay'
|
||||
import CreateLabelOverlay from 'src/labels/components/CreateLabelOverlay'
|
||||
import TabbedPageHeader from 'src/shared/components/tabbed_page/TabbedPageHeader'
|
||||
import LabelList from 'src/labels/components/LabelList'
|
||||
import FilterList from 'src/shared/components/Filter'
|
||||
|
@ -16,7 +16,7 @@ import {createLabel, updateLabel, deleteLabel} from 'src/labels/actions'
|
|||
import {viewableLabels} from 'src/labels/selectors'
|
||||
|
||||
// Utils
|
||||
import {validateLabelUniqueness} from 'src/configuration/utils/labels'
|
||||
import {validateLabelUniqueness} from 'src/labels/utils/'
|
||||
|
||||
// Types
|
||||
import {AppState} from 'src/types'
|
||||
|
|
|
@ -1,2 +1,211 @@
|
|||
// Labels can use a different set of brand colors than single stats or gauges
|
||||
import {ILabel} from '@influxdata/influx'
|
||||
import {LabelColor, LabelColorType} from 'src/types/colors'
|
||||
|
||||
export const INFLUX_LABEL_PREFIX = '@influxdata'
|
||||
export const TOKEN_LABEL = `${INFLUX_LABEL_PREFIX}.token`
|
||||
|
||||
export const HEX_CODE_CHAR_LENGTH = 7
|
||||
|
||||
export const DEFAULT_LABEL_COLOR_HEX = '#326BBA'
|
||||
|
||||
export const EMPTY_LABEL: ILabel = {
|
||||
name: '',
|
||||
properties: {
|
||||
description: '',
|
||||
color: DEFAULT_LABEL_COLOR_HEX,
|
||||
},
|
||||
}
|
||||
|
||||
export const CUSTOM_LABEL: LabelColor = {
|
||||
id: 'custom',
|
||||
colorHex: '#RRRRRR',
|
||||
name: 'Custom Hexcode',
|
||||
type: LabelColorType.Custom,
|
||||
}
|
||||
|
||||
export const PRESET_LABEL_COLORS: LabelColor[] = [
|
||||
CUSTOM_LABEL,
|
||||
{
|
||||
id: 'label-preset-sapphire',
|
||||
colorHex: '#326BBA',
|
||||
name: 'Sapphire',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-ocean',
|
||||
colorHex: '#4591ED',
|
||||
name: 'Ocean',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-pool',
|
||||
colorHex: '#22ADF6',
|
||||
name: 'Pool',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-laser',
|
||||
colorHex: '#00C9FF',
|
||||
name: 'Laser',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-hydrogen',
|
||||
colorHex: '#6BDFFF',
|
||||
name: 'Hydrogen',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-neutrino',
|
||||
colorHex: '#BEF0FF',
|
||||
name: 'Neutrino',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-void',
|
||||
colorHex: '#311F94',
|
||||
name: 'Void',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-amethyst',
|
||||
colorHex: '#513CC6',
|
||||
name: 'Amethyst',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-star',
|
||||
colorHex: '#7A65F2',
|
||||
name: 'Star',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-comet',
|
||||
colorHex: '#9394FF',
|
||||
name: 'Comet',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-potassium',
|
||||
colorHex: '#B1B6FF',
|
||||
name: 'Potassium',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-moonstone',
|
||||
colorHex: '#C9D0FF',
|
||||
name: 'Moonstone',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-emerald',
|
||||
colorHex: '#108174',
|
||||
name: 'Emerald',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-viridian',
|
||||
colorHex: '#32B08C',
|
||||
name: 'Viridian',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-rainforest',
|
||||
colorHex: '#4ED8A0',
|
||||
name: 'Rainforest',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-honeydew',
|
||||
colorHex: '#7CE490',
|
||||
name: 'Honeydew',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-krypton',
|
||||
colorHex: '#A5F3B4',
|
||||
name: 'Krypton',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-wasabi',
|
||||
colorHex: '#C6FFD0',
|
||||
name: 'Wasabi',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-ruby',
|
||||
colorHex: '#BF3D5E',
|
||||
name: 'Ruby',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-fire',
|
||||
colorHex: '#DC4E58',
|
||||
name: 'Fire',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-curacao',
|
||||
colorHex: '#F95F53',
|
||||
name: 'Curacao',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-dreamsicle',
|
||||
colorHex: '#FF8564',
|
||||
name: 'Dreamsicle',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-tungsten',
|
||||
colorHex: '#FFB6A0',
|
||||
name: 'Tungsten',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-marmelade',
|
||||
colorHex: '#FFDCCF',
|
||||
name: 'Marmelade',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-topaz',
|
||||
colorHex: '#E85B1C',
|
||||
name: 'Topaz',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-tiger',
|
||||
colorHex: '#F48D38',
|
||||
name: 'Tiger',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-pineapple',
|
||||
colorHex: '#FFB94A',
|
||||
name: 'Pineapple',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-thunder',
|
||||
colorHex: '#FFD255',
|
||||
name: 'Thunder',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-sulfur',
|
||||
colorHex: '#FFE480',
|
||||
name: 'Sulfur',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
{
|
||||
id: 'label-preset-daisy',
|
||||
colorHex: '#FFF6B8',
|
||||
name: 'Daisy',
|
||||
type: LabelColorType.Preset,
|
||||
},
|
||||
]
|
||||
|
||||
export const INPUT_ERROR_COLOR = '#0F0E15'
|
||||
|
|
|
@ -4,15 +4,13 @@ import {connect} from 'react-redux'
|
|||
|
||||
// Components
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import OrganizationNavigation from 'src/organizations/components/OrganizationNavigation'
|
||||
import OrgHeader from 'src/organizations/containers/OrgHeader'
|
||||
import SettingsNavigation from 'src/settings/components/SettingsNavigation'
|
||||
import SettingsHeader from 'src/settings/components/SettingsHeader'
|
||||
import {Tabs} from 'src/clockface'
|
||||
import {Page} from 'src/pageLayout'
|
||||
import TabbedPageSection from 'src/shared/components/tabbed_page/TabbedPageSection'
|
||||
import LabelsTab from 'src/labels/components/LabelsTab'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
|
||||
// Types
|
||||
import {Organization} from '@influxdata/influx'
|
||||
|
@ -29,11 +27,11 @@ class LabelsIndex extends PureComponent<StateProps> {
|
|||
|
||||
return (
|
||||
<Page titleTag={org.name}>
|
||||
<OrgHeader />
|
||||
<SettingsHeader />
|
||||
<Page.Contents fullWidth={false} scrollable={true}>
|
||||
<div className="col-xs-12">
|
||||
<Tabs>
|
||||
<OrganizationNavigation tab="labels" orgID={org.id} />
|
||||
<SettingsNavigation tab="labels" orgID={org.id} />
|
||||
<Tabs.TabContents>
|
||||
<TabbedPageSection
|
||||
id="org-view-tab--labels"
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
import _ from 'lodash'
|
||||
|
||||
import {
|
||||
HEX_CODE_CHAR_LENGTH,
|
||||
PRESET_LABEL_COLORS,
|
||||
} from 'src/configuration/constants/LabelColors'
|
||||
import {HEX_CODE_CHAR_LENGTH, PRESET_LABEL_COLORS} from 'src/labels/constants/'
|
||||
|
||||
export const randomPresetColor = () =>
|
||||
_.sample(PRESET_LABEL_COLORS.slice(1)).colorHex
|
|
@ -1,41 +0,0 @@
|
|||
// Libraries
|
||||
import React, {PureComponent} from 'react'
|
||||
import {Link} from 'react-router'
|
||||
|
||||
// Components
|
||||
import {EmptyState} from '@influxdata/clockface'
|
||||
|
||||
// Types
|
||||
import {Organization} from 'src/types'
|
||||
import {ComponentSize} from '@influxdata/clockface'
|
||||
|
||||
interface Props {
|
||||
orgs: Organization[]
|
||||
}
|
||||
|
||||
export default class UserDashboardList extends PureComponent<Props> {
|
||||
public render() {
|
||||
const {orgs} = this.props
|
||||
|
||||
if (this.isEmpty) {
|
||||
return (
|
||||
<EmptyState size={ComponentSize.ExtraSmall}>
|
||||
<EmptyState.Text text="You don't belong to any Organizations" />
|
||||
</EmptyState>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<ul className="link-list">
|
||||
{orgs.map(({id, name}) => (
|
||||
<li key={id}>
|
||||
<Link to={`/orgs/${id}`}>{name}</Link>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
)
|
||||
}
|
||||
private get isEmpty(): boolean {
|
||||
return !this.props.orgs.length
|
||||
}
|
||||
}
|
|
@ -17,9 +17,7 @@ import VersionInfo from 'src/shared/components/VersionInfo'
|
|||
|
||||
// Types
|
||||
import {AppState} from 'src/types'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
|
||||
interface Props {
|
||||
me: AppState['me']
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
// Libraries
|
||||
import React, {Component} from 'react'
|
||||
|
||||
interface Props {
|
||||
token: string
|
||||
}
|
||||
|
||||
class TokenManager extends Component<Props> {
|
||||
public render() {
|
||||
return <div>{this.props.token}</div>
|
||||
}
|
||||
}
|
||||
|
||||
export default TokenManager
|
|
@ -1,14 +0,0 @@
|
|||
// Libraries
|
||||
import React, {Component} from 'react'
|
||||
|
||||
interface Props {
|
||||
blargh: string
|
||||
}
|
||||
|
||||
class UserSettings extends Component<Props> {
|
||||
public render() {
|
||||
return <div>{this.props.blargh}</div>
|
||||
}
|
||||
}
|
||||
|
||||
export default UserSettings
|
|
@ -4,12 +4,12 @@ import {connect} from 'react-redux'
|
|||
|
||||
// Components
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import OrganizationNavigation from 'src/organizations/components/OrganizationNavigation'
|
||||
import OrgHeader from 'src/organizations/containers/OrgHeader'
|
||||
import SettingsNavigation from 'src/settings/components/SettingsNavigation'
|
||||
import SettingsHeader from 'src/settings/components/SettingsHeader'
|
||||
import {Tabs} from 'src/clockface'
|
||||
import {Page} from 'src/pageLayout'
|
||||
import TabbedPageSection from 'src/shared/components/tabbed_page/TabbedPageSection'
|
||||
import GetResources from 'src/configuration/components/GetResources'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
import Members from 'src/members/components/Members'
|
||||
|
||||
//Actions
|
||||
|
@ -19,7 +19,6 @@ import * as notifyActions from 'src/shared/actions/notifications'
|
|||
// Types
|
||||
import {Organization} from '@influxdata/influx'
|
||||
import {AppState} from 'src/types'
|
||||
import {ResourceTypes} from 'src/configuration/components/GetResources'
|
||||
|
||||
interface DispatchProps {
|
||||
notify: NotificationsActions.PublishNotificationActionCreator
|
||||
|
@ -42,11 +41,11 @@ class MembersIndex extends Component<Props> {
|
|||
|
||||
return (
|
||||
<Page titleTag={org.name}>
|
||||
<OrgHeader />
|
||||
<SettingsHeader />
|
||||
<Page.Contents fullWidth={false} scrollable={true}>
|
||||
<div className="col-xs-12">
|
||||
<Tabs>
|
||||
<OrganizationNavigation tab="members" orgID={org.id} />
|
||||
<SettingsNavigation tab="members" orgID={org.id} />
|
||||
<Tabs.TabContents>
|
||||
<TabbedPageSection
|
||||
id="org-view-tab--members"
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
import {ScraperTargetRequest} from '@influxdata/influx'
|
||||
|
||||
// API
|
||||
import {client} from 'src/utils/api'
|
||||
|
||||
export const createScraper = (scraper: ScraperTargetRequest) => async () => {
|
||||
await client.scrapers.create(scraper)
|
||||
}
|
|
@ -1,180 +0,0 @@
|
|||
// Libraries
|
||||
import React, {PureComponent, ChangeEvent} from 'react'
|
||||
import {withRouter, WithRouterProps} from 'react-router'
|
||||
import {connect} from 'react-redux'
|
||||
import _ from 'lodash'
|
||||
|
||||
// Components
|
||||
import {Input} from '@influxdata/clockface'
|
||||
import {Tabs} from 'src/clockface'
|
||||
import DashboardsIndexContents from 'src/dashboards/components/dashboard_index/DashboardsIndexContents'
|
||||
import AddResourceDropdown from 'src/shared/components/AddResourceDropdown'
|
||||
|
||||
// APIs
|
||||
import {createDashboard, cloneDashboard} from 'src/dashboards/apis/'
|
||||
|
||||
// Actions
|
||||
import {
|
||||
deleteDashboardAsync,
|
||||
updateDashboardAsync,
|
||||
} from 'src/dashboards/actions/'
|
||||
import {notify as notifyAction} from 'src/shared/actions/notifications'
|
||||
|
||||
// Constants
|
||||
import {dashboardCreateFailed} from 'src/shared/copy/notifications'
|
||||
import {DEFAULT_DASHBOARD_NAME} from 'src/dashboards/constants/index'
|
||||
|
||||
// Types
|
||||
import {IconFont} from '@influxdata/clockface'
|
||||
import {Dashboard, AppState, Notification} from 'src/types'
|
||||
|
||||
// Decorators
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
|
||||
interface DispatchProps {
|
||||
handleDeleteDashboard: typeof deleteDashboardAsync
|
||||
handleUpdateDashboard: typeof updateDashboardAsync
|
||||
notify: (message: Notification) => void
|
||||
}
|
||||
|
||||
interface OwnProps {
|
||||
orgID: string
|
||||
}
|
||||
|
||||
interface StateProps {
|
||||
dashboards: Dashboard[]
|
||||
}
|
||||
|
||||
type Props = DispatchProps & StateProps & OwnProps & WithRouterProps
|
||||
|
||||
interface State {
|
||||
searchTerm: string
|
||||
}
|
||||
|
||||
@ErrorHandling
|
||||
class Dashboards extends PureComponent<Props, State> {
|
||||
constructor(props: Props) {
|
||||
super(props)
|
||||
|
||||
this.state = {
|
||||
searchTerm: '',
|
||||
}
|
||||
}
|
||||
|
||||
public render() {
|
||||
const {dashboards, notify, handleUpdateDashboard} = this.props
|
||||
const {searchTerm} = this.state
|
||||
|
||||
return (
|
||||
<>
|
||||
<Tabs.TabContentsHeader>
|
||||
<Input
|
||||
icon={IconFont.Search}
|
||||
placeholder="Filter dashboards..."
|
||||
widthPixels={290}
|
||||
value={searchTerm}
|
||||
onChange={this.handleFilterChange}
|
||||
onBlur={this.handleFilterBlur}
|
||||
testID={`dashboards--filter-field ${searchTerm}`}
|
||||
customClass="filter-dashboards"
|
||||
/>
|
||||
<AddResourceDropdown
|
||||
onSelectNew={this.handleCreateDashboard}
|
||||
onSelectImport={this.summonImportOverlay}
|
||||
onSelectTemplate={this.summonImportFromTemplateOverlay}
|
||||
resourceName="Dashboard"
|
||||
canImportFromTemplate={true}
|
||||
/>
|
||||
</Tabs.TabContentsHeader>
|
||||
<DashboardsIndexContents
|
||||
dashboards={dashboards}
|
||||
onDeleteDashboard={this.handleDeleteDashboard}
|
||||
onCreateDashboard={this.handleCreateDashboard}
|
||||
onCloneDashboard={this.handleCloneDashboard}
|
||||
onUpdateDashboard={handleUpdateDashboard}
|
||||
notify={notify}
|
||||
searchTerm={searchTerm}
|
||||
onFilterChange={this.handleFilterUpdate}
|
||||
onImportDashboard={this.summonImportOverlay}
|
||||
/>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
private handleFilterBlur = (e: ChangeEvent<HTMLInputElement>): void => {
|
||||
this.setState({searchTerm: e.target.value})
|
||||
}
|
||||
|
||||
private handleFilterChange = (e: ChangeEvent<HTMLInputElement>): void => {
|
||||
this.setState({searchTerm: e.target.value})
|
||||
}
|
||||
|
||||
private handleFilterUpdate = (searchTerm: string): void => {
|
||||
this.setState({searchTerm})
|
||||
}
|
||||
|
||||
private summonImportOverlay = (): void => {
|
||||
const {
|
||||
router,
|
||||
params: {orgID},
|
||||
} = this.props
|
||||
router.push(`/orgs/${orgID}/dashboards/import`)
|
||||
}
|
||||
|
||||
private summonImportFromTemplateOverlay = (): void => {
|
||||
const {
|
||||
router,
|
||||
params: {orgID},
|
||||
} = this.props
|
||||
router.push(`/orgs/${orgID}/dashboards/import/template`)
|
||||
}
|
||||
|
||||
private handleCreateDashboard = async (): Promise<void> => {
|
||||
const {router, notify, orgID} = this.props
|
||||
try {
|
||||
const newDashboard = {
|
||||
name: DEFAULT_DASHBOARD_NAME,
|
||||
cells: [],
|
||||
orgID: orgID,
|
||||
}
|
||||
const data = await createDashboard(newDashboard)
|
||||
router.push(`/dashboards/${data.id}`)
|
||||
} catch (error) {
|
||||
notify(dashboardCreateFailed())
|
||||
}
|
||||
}
|
||||
|
||||
private handleCloneDashboard = async (
|
||||
dashboard: Dashboard
|
||||
): Promise<void> => {
|
||||
const {router, notify, dashboards, orgID} = this.props
|
||||
try {
|
||||
const data = await cloneDashboard(dashboard, dashboards, orgID)
|
||||
router.push(`/dashboards/${data.id}`)
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
notify(dashboardCreateFailed())
|
||||
}
|
||||
}
|
||||
|
||||
private handleDeleteDashboard = (dashboard: Dashboard) => {
|
||||
this.props.handleDeleteDashboard(dashboard)
|
||||
}
|
||||
}
|
||||
|
||||
const mstp = (state: AppState, props: OwnProps): StateProps => {
|
||||
const dashboards = state.dashboards.list.filter(d => d.orgID === props.orgID)
|
||||
|
||||
return {dashboards}
|
||||
}
|
||||
|
||||
const mdtp: DispatchProps = {
|
||||
notify: notifyAction,
|
||||
handleDeleteDashboard: deleteDashboardAsync,
|
||||
handleUpdateDashboard: updateDashboardAsync,
|
||||
}
|
||||
|
||||
export default connect<StateProps, DispatchProps, OwnProps>(
|
||||
mstp,
|
||||
mdtp
|
||||
)(withRouter(Dashboards))
|
|
@ -1,106 +0,0 @@
|
|||
// Libraries
|
||||
import {PureComponent} from 'react'
|
||||
import _ from 'lodash'
|
||||
|
||||
// Types
|
||||
import {RemoteDataState} from 'src/types'
|
||||
|
||||
// Decorators
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import {Organization} from '@influxdata/influx'
|
||||
|
||||
interface PassedProps<T> {
|
||||
organization: Organization
|
||||
fetcher: (org: Organization) => Promise<T[]>
|
||||
children: (
|
||||
resources: T[],
|
||||
loading: RemoteDataState,
|
||||
fetch?: () => void
|
||||
) => JSX.Element
|
||||
}
|
||||
|
||||
interface State<T> {
|
||||
resources: T[]
|
||||
loading: RemoteDataState
|
||||
}
|
||||
|
||||
interface DefaultProps<T> {
|
||||
orderBy?: {
|
||||
keys: Array<keyof T>
|
||||
orders?: string[]
|
||||
}
|
||||
}
|
||||
|
||||
type Props<T> = DefaultProps<T> & PassedProps<T>
|
||||
|
||||
const DEFAULT_SORT_KEY = 'name'
|
||||
|
||||
@ErrorHandling
|
||||
export default class GetOrgResources<T> extends PureComponent<
|
||||
Props<T>,
|
||||
State<T>
|
||||
> {
|
||||
constructor(props: Props<T>) {
|
||||
super(props)
|
||||
|
||||
this.state = {
|
||||
resources: null,
|
||||
loading: RemoteDataState.NotStarted,
|
||||
}
|
||||
}
|
||||
|
||||
public async componentDidMount() {
|
||||
this.fetchResourcesForOrg()
|
||||
}
|
||||
|
||||
public async componentDidUpdate(prevProps: Props<T>) {
|
||||
if (this.props.organization !== prevProps.organization) {
|
||||
this.fetchResourcesForOrg()
|
||||
}
|
||||
}
|
||||
|
||||
public render() {
|
||||
const {resources, loading} = this.state
|
||||
return this.props.children(resources, loading, this.fetchResourcesForOrg)
|
||||
}
|
||||
|
||||
public fetchResourcesForOrg = async () => {
|
||||
const {fetcher, organization} = this.props
|
||||
if (organization) {
|
||||
const resources = await fetcher(organization)
|
||||
this.setState({
|
||||
resources: this.order(resources),
|
||||
loading: RemoteDataState.Done,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private order(resources: T[]): T[] {
|
||||
const {orderBy} = this.props
|
||||
|
||||
const defaultKeys = this.extractDefaultKeys(resources)
|
||||
|
||||
if (orderBy) {
|
||||
return _.orderBy(resources, orderBy.keys, orderBy.orders)
|
||||
} else if (defaultKeys.length !== 0) {
|
||||
return _.orderBy(resources, defaultKeys)
|
||||
} else {
|
||||
return resources
|
||||
}
|
||||
}
|
||||
|
||||
private extractDefaultKeys(resources: T[]): Array<keyof T> {
|
||||
return this.hasKeyOf(resources, DEFAULT_SORT_KEY) ? [DEFAULT_SORT_KEY] : []
|
||||
}
|
||||
|
||||
private hasKeyOf(
|
||||
resources: T[],
|
||||
key: string | number | symbol
|
||||
): key is keyof T {
|
||||
const resource = _.get(resources, '0', null)
|
||||
// gaurd against null and primitive types
|
||||
const isObject = !!resource && typeof resource === 'object'
|
||||
|
||||
return isObject && _.hasIn(resource, key)
|
||||
}
|
||||
}
|
|
@ -1,53 +0,0 @@
|
|||
// Libraries
|
||||
import React, {Component, ReactElement, ReactNode} from 'react'
|
||||
import {withRouter, WithRouterProps} from 'react-router'
|
||||
|
||||
// Components
|
||||
import OrganizationNavigation from 'src/organizations/components/OrganizationNavigation'
|
||||
import {Tabs} from 'src/clockface'
|
||||
|
||||
// Decorators
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
|
||||
interface OwnProps {
|
||||
name: string
|
||||
avatar?: string
|
||||
description?: string
|
||||
children: ReactNode[] | ReactNode
|
||||
activeTabUrl: string
|
||||
orgID: string
|
||||
}
|
||||
|
||||
type Props = OwnProps & WithRouterProps
|
||||
|
||||
@ErrorHandling
|
||||
class OrganizationTabs extends Component<Props> {
|
||||
constructor(props) {
|
||||
super(props)
|
||||
}
|
||||
|
||||
public render() {
|
||||
return (
|
||||
<Tabs>
|
||||
<OrganizationNavigation
|
||||
tab={this.props.activeTabUrl}
|
||||
orgID={this.props.orgID}
|
||||
/>
|
||||
<Tabs.TabContents>{this.activeSectionComponent}</Tabs.TabContents>
|
||||
</Tabs>
|
||||
)
|
||||
}
|
||||
|
||||
private get activeSectionComponent(): JSX.Element[] {
|
||||
const {children, activeTabUrl} = this.props
|
||||
|
||||
// Using ReactElement as type to ensure children have props
|
||||
return React.Children.map(children, (child: ReactElement<any>) => {
|
||||
if (child.props.url === activeTabUrl) {
|
||||
return child.props.children
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export default withRouter<OwnProps>(OrganizationTabs)
|
|
@ -1,85 +0,0 @@
|
|||
// Libraries
|
||||
import React, {Component} from 'react'
|
||||
import {Link} from 'react-router'
|
||||
import _ from 'lodash'
|
||||
|
||||
// Components
|
||||
import {EmptyState} from '@influxdata/clockface'
|
||||
import {IndexList, ConfirmationButton} from 'src/clockface'
|
||||
|
||||
// Decorators
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
|
||||
// Types
|
||||
import {Organization} from 'src/types'
|
||||
import {ComponentSize} from '@influxdata/clockface'
|
||||
import {Alignment} from 'src/clockface'
|
||||
import {deleteOrg} from 'src/organizations/actions/orgs'
|
||||
import CloudExclude from 'src/shared/components/cloud/CloudExclude'
|
||||
|
||||
interface Props {
|
||||
orgs: Organization[]
|
||||
onDeleteOrg: typeof deleteOrg
|
||||
searchTerm: string
|
||||
}
|
||||
|
||||
@ErrorHandling
|
||||
class OrganizationsPageContents extends Component<Props> {
|
||||
public render() {
|
||||
return (
|
||||
<div className="col-xs-12">
|
||||
<IndexList>
|
||||
<IndexList.Header>
|
||||
<IndexList.HeaderCell columnName="Name" />
|
||||
<IndexList.HeaderCell />
|
||||
</IndexList.Header>
|
||||
<IndexList.Body columnCount={2} emptyState={this.emptyState}>
|
||||
{this.rows}
|
||||
</IndexList.Body>
|
||||
</IndexList>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
private get rows(): JSX.Element[] {
|
||||
const {orgs, onDeleteOrg} = this.props
|
||||
return orgs.map(o => (
|
||||
<IndexList.Row key={o.id}>
|
||||
<IndexList.Cell>
|
||||
<Link to={`/orgs/${o.id}/members`}>{o.name}</Link>
|
||||
</IndexList.Cell>
|
||||
<IndexList.Cell revealOnHover={true} alignment={Alignment.Right}>
|
||||
<CloudExclude>
|
||||
<ConfirmationButton
|
||||
confirmText="Confirm"
|
||||
text="Delete"
|
||||
size={ComponentSize.ExtraSmall}
|
||||
returnValue={o}
|
||||
onConfirm={onDeleteOrg}
|
||||
/>
|
||||
</CloudExclude>
|
||||
</IndexList.Cell>
|
||||
</IndexList.Row>
|
||||
))
|
||||
}
|
||||
|
||||
private get emptyState(): JSX.Element {
|
||||
const {searchTerm} = this.props
|
||||
|
||||
if (searchTerm) {
|
||||
return (
|
||||
<EmptyState size={ComponentSize.Large}>
|
||||
<EmptyState.Text text="No Organizations match your query" />
|
||||
</EmptyState>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<EmptyState size={ComponentSize.Large}>
|
||||
<EmptyState.Text text="You are not a member of any Organizations" />
|
||||
</EmptyState>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default OrganizationsPageContents
|
|
@ -1,100 +0,0 @@
|
|||
// Libraries
|
||||
import React, {Component} from 'react'
|
||||
import {withRouter, WithRouterProps} from 'react-router'
|
||||
import {connect} from 'react-redux'
|
||||
|
||||
// Components
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import OrganizationNavigation from 'src/organizations/components/OrganizationNavigation'
|
||||
import OrgHeader from 'src/organizations/containers/OrgHeader'
|
||||
import {Tabs} from 'src/clockface'
|
||||
import {Page} from 'src/pageLayout'
|
||||
import TabbedPageSection from 'src/shared/components/tabbed_page/TabbedPageSection'
|
||||
import Dashboards from 'src/organizations/components/Dashboards'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
|
||||
//Actions
|
||||
import * as NotificationsActions from 'src/types/actions/notifications'
|
||||
import * as notifyActions from 'src/shared/actions/notifications'
|
||||
|
||||
// Types
|
||||
import {Organization} from '@influxdata/influx'
|
||||
import {AppState} from 'src/types'
|
||||
import {RemoteDataState} from 'src/types'
|
||||
|
||||
interface RouterProps {
|
||||
params: {
|
||||
orgID: string
|
||||
}
|
||||
}
|
||||
|
||||
interface DispatchProps {
|
||||
notify: NotificationsActions.PublishNotificationActionCreator
|
||||
}
|
||||
|
||||
interface StateProps {
|
||||
org: Organization
|
||||
}
|
||||
|
||||
type Props = WithRouterProps & RouterProps & DispatchProps & StateProps
|
||||
|
||||
interface State {
|
||||
loadingState: RemoteDataState
|
||||
}
|
||||
|
||||
@ErrorHandling
|
||||
class OrgDashboardsIndex extends Component<Props, State> {
|
||||
public render() {
|
||||
const {org} = this.props
|
||||
|
||||
return (
|
||||
<>
|
||||
<Page titleTag={org.name}>
|
||||
<OrgHeader />
|
||||
<Page.Contents fullWidth={false} scrollable={true}>
|
||||
<div className="col-xs-12">
|
||||
<Tabs>
|
||||
<OrganizationNavigation tab="dashboards" orgID={org.id} />
|
||||
<Tabs.TabContents>
|
||||
<TabbedPageSection
|
||||
id="org-view-tab--dashboards"
|
||||
url="dashboards"
|
||||
title="Dashboards"
|
||||
>
|
||||
<GetResources resource={ResourceTypes.Dashboards}>
|
||||
<Dashboards orgID={org.id} />
|
||||
</GetResources>
|
||||
</TabbedPageSection>
|
||||
</Tabs.TabContents>
|
||||
</Tabs>
|
||||
</div>
|
||||
</Page.Contents>
|
||||
</Page>
|
||||
{this.props.children}
|
||||
</>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
const mstp = (state: AppState, props: Props): StateProps => {
|
||||
const {
|
||||
orgs: {items},
|
||||
} = state
|
||||
|
||||
const org = items.find(o => o.id === props.params.orgID)
|
||||
|
||||
return {
|
||||
org,
|
||||
}
|
||||
}
|
||||
|
||||
const mdtp: DispatchProps = {
|
||||
notify: notifyActions.notify,
|
||||
}
|
||||
|
||||
export default connect<StateProps, DispatchProps, {}>(
|
||||
mstp,
|
||||
mdtp
|
||||
)(withRouter<{}>(OrgDashboardsIndex))
|
|
@ -1,118 +0,0 @@
|
|||
// Libraries
|
||||
import React, {PureComponent} from 'react'
|
||||
import {WithRouterProps, withRouter} from 'react-router'
|
||||
import {connect} from 'react-redux'
|
||||
import _ from 'lodash'
|
||||
|
||||
// Components
|
||||
import {Page} from 'src/pageLayout'
|
||||
import OrganizationsIndexContents from 'src/organizations/components/OrganizationsIndexContents'
|
||||
import SearchWidget from 'src/shared/components/search_widget/SearchWidget'
|
||||
import {Button, IconFont, ComponentColor} from '@influxdata/clockface'
|
||||
|
||||
// Actions
|
||||
import {deleteOrg} from 'src/organizations/actions/orgs'
|
||||
|
||||
// Types
|
||||
import {Organization, Links, AppState} from 'src/types'
|
||||
|
||||
// Decorators
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import FilterList from 'src/shared/components/Filter'
|
||||
|
||||
interface StateProps {
|
||||
links: Links
|
||||
orgs: Organization[]
|
||||
}
|
||||
|
||||
interface DispatchProps {
|
||||
onDeleteOrg: typeof deleteOrg
|
||||
}
|
||||
|
||||
interface State {
|
||||
searchTerm: string
|
||||
}
|
||||
|
||||
type Props = StateProps & DispatchProps & WithRouterProps
|
||||
|
||||
@ErrorHandling
|
||||
class OrganizationsIndex extends PureComponent<Props, State> {
|
||||
public state: State = {
|
||||
searchTerm: '',
|
||||
}
|
||||
|
||||
public render() {
|
||||
const {onDeleteOrg, orgs, children} = this.props
|
||||
const {searchTerm} = this.state
|
||||
|
||||
return (
|
||||
<>
|
||||
<Page titleTag="Organizations">
|
||||
<Page.Header fullWidth={false}>
|
||||
<Page.Header.Left>
|
||||
<Page.Title title="Organizations" />
|
||||
</Page.Header.Left>
|
||||
<Page.Header.Right>
|
||||
<SearchWidget
|
||||
placeholderText="Filter organizations by name..."
|
||||
onSearch={this.handleChangeSearchTerm}
|
||||
/>
|
||||
<Button
|
||||
color={ComponentColor.Primary}
|
||||
onClick={this.handleOpenModal}
|
||||
icon={IconFont.Plus}
|
||||
text="Create Organization"
|
||||
titleText="Create a new Organization"
|
||||
testID="create-org-button"
|
||||
/>
|
||||
</Page.Header.Right>
|
||||
</Page.Header>
|
||||
<Page.Contents fullWidth={false} scrollable={true}>
|
||||
<FilterList<Organization>
|
||||
searchKeys={['name']}
|
||||
searchTerm={searchTerm}
|
||||
list={orgs}
|
||||
>
|
||||
{filteredOrgs => (
|
||||
<OrganizationsIndexContents
|
||||
orgs={filteredOrgs}
|
||||
onDeleteOrg={onDeleteOrg}
|
||||
searchTerm={searchTerm}
|
||||
/>
|
||||
)}
|
||||
</FilterList>
|
||||
</Page.Contents>
|
||||
</Page>
|
||||
{children}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
private handleChangeSearchTerm = (searchTerm: string): void => {
|
||||
this.setState({searchTerm})
|
||||
}
|
||||
|
||||
private handleOpenModal = () => {
|
||||
this.props.router.push(`${this.props.location.pathname}/new`)
|
||||
}
|
||||
}
|
||||
|
||||
const mstp = (state: AppState): StateProps => {
|
||||
const {orgs, links} = state
|
||||
|
||||
return {
|
||||
orgs: orgs.items,
|
||||
links,
|
||||
}
|
||||
}
|
||||
|
||||
const mdtp: DispatchProps = {
|
||||
onDeleteOrg: deleteOrg,
|
||||
}
|
||||
|
||||
export default withRouter(
|
||||
connect<StateProps, DispatchProps>(
|
||||
mstp,
|
||||
mdtp
|
||||
)(OrganizationsIndex)
|
||||
)
|
|
@ -1,31 +0,0 @@
|
|||
import {ResourceOwner, User} from '@influxdata/influx'
|
||||
|
||||
export const resouceOwner: ResourceOwner[] = [
|
||||
{
|
||||
id: '1',
|
||||
name: 'John',
|
||||
status: User.StatusEnum.Active,
|
||||
links: {
|
||||
self: '/api/v2/users/1',
|
||||
},
|
||||
role: ResourceOwner.RoleEnum.Owner,
|
||||
},
|
||||
{
|
||||
id: '2',
|
||||
name: 'Jane',
|
||||
status: User.StatusEnum.Active,
|
||||
links: {
|
||||
self: '/api/v2/users/2',
|
||||
},
|
||||
role: ResourceOwner.RoleEnum.Owner,
|
||||
},
|
||||
{
|
||||
id: '3',
|
||||
name: 'Smith',
|
||||
status: User.StatusEnum.Active,
|
||||
links: {
|
||||
self: '/api/v2/users/3',
|
||||
},
|
||||
role: ResourceOwner.RoleEnum.Owner,
|
||||
},
|
||||
]
|
|
@ -8,7 +8,7 @@ import _ from 'lodash'
|
|||
import {Input, Button, EmptyState} from '@influxdata/clockface'
|
||||
import {Tabs} from 'src/clockface'
|
||||
import ScraperList from 'src/scrapers/components/ScraperList'
|
||||
import NoBucketsWarning from 'src/organizations/components/NoBucketsWarning'
|
||||
import NoBucketsWarning from 'src/buckets/components/NoBucketsWarning'
|
||||
|
||||
// Actions
|
||||
import {updateScraper, deleteScraper} from 'src/scrapers/actions'
|
||||
|
|
|
@ -6,11 +6,9 @@ import {connect} from 'react-redux'
|
|||
import {Page} from 'src/pageLayout'
|
||||
import {Tabs} from 'src/clockface'
|
||||
import TabbedPageSection from 'src/shared/components/tabbed_page/TabbedPageSection'
|
||||
import OrgHeader from 'src/organizations/containers/OrgHeader'
|
||||
import OrganizationNavigation from 'src/organizations/components/OrganizationNavigation'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import SettingsHeader from 'src/settings/components/SettingsHeader'
|
||||
import SettingsNavigation from 'src/settings/components/SettingsNavigation'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
import Scrapers from 'src/scrapers/components/Scrapers'
|
||||
|
||||
// Decorators
|
||||
|
@ -32,11 +30,11 @@ class ScrapersIndex extends Component<StateProps> {
|
|||
return (
|
||||
<>
|
||||
<Page titleTag={org.name}>
|
||||
<OrgHeader />
|
||||
<SettingsHeader />
|
||||
<Page.Contents fullWidth={false} scrollable={true}>
|
||||
<div className="col-xs-12">
|
||||
<Tabs>
|
||||
<OrganizationNavigation tab="scrapers" orgID={org.id} />
|
||||
<SettingsNavigation tab="scrapers" orgID={org.id} />
|
||||
<Tabs.TabContents>
|
||||
<TabbedPageSection
|
||||
id="org-view-tab--scrapers"
|
||||
|
@ -60,14 +58,7 @@ class ScrapersIndex extends Component<StateProps> {
|
|||
}
|
||||
}
|
||||
|
||||
const mstp = (state: AppState) => {
|
||||
const {
|
||||
orgs: {org},
|
||||
} = state
|
||||
return {
|
||||
org,
|
||||
}
|
||||
}
|
||||
const mstp = ({orgs: {org}}: AppState) => ({org})
|
||||
|
||||
export default connect<StateProps, {}, {}>(
|
||||
mstp,
|
||||
|
|
|
@ -4,7 +4,7 @@ import React, {Component} from 'react'
|
|||
import {Page} from 'src/pageLayout'
|
||||
import PageTitleWithOrg from 'src/shared/components/PageTitleWithOrg'
|
||||
|
||||
class OrgHeader extends Component {
|
||||
class SettingsHeader extends Component {
|
||||
public render() {
|
||||
return (
|
||||
<Page.Header fullWidth={false}>
|
||||
|
@ -17,4 +17,4 @@ class OrgHeader extends Component {
|
|||
}
|
||||
}
|
||||
|
||||
export default OrgHeader
|
||||
export default SettingsHeader
|
|
@ -15,7 +15,7 @@ interface Props {
|
|||
}
|
||||
|
||||
@ErrorHandling
|
||||
class OrganizationNavigation extends PureComponent<Props> {
|
||||
class SettingsNavigation extends PureComponent<Props> {
|
||||
public render() {
|
||||
const {tab, orgID} = this.props
|
||||
|
||||
|
@ -78,4 +78,4 @@ class OrganizationNavigation extends PureComponent<Props> {
|
|||
}
|
||||
}
|
||||
|
||||
export default OrganizationNavigation
|
||||
export default SettingsNavigation
|
|
@ -10,10 +10,10 @@ import {
|
|||
ComponentColor,
|
||||
} from '@influxdata/clockface'
|
||||
import InlineLabelPopover from 'src/shared/components/inlineLabels/InlineLabelPopover'
|
||||
import CreateLabelOverlay from 'src/configuration/components/CreateLabelOverlay'
|
||||
import CreateLabelOverlay from 'src/labels/components/CreateLabelOverlay'
|
||||
|
||||
// Utils
|
||||
import {validateLabelUniqueness} from 'src/configuration/utils/labels'
|
||||
import {validateLabelUniqueness} from 'src/labels/utils/'
|
||||
|
||||
// Types
|
||||
import {ILabel} from '@influxdata/influx'
|
||||
|
|
|
@ -56,7 +56,7 @@
|
|||
@import 'src/shared/components/SearchableDropdown.scss';
|
||||
@import 'src/shared/components/BoxTooltip.scss';
|
||||
@import 'src/shared/components/dropdown_auto_refresh/AutoRefreshDropdown.scss';
|
||||
@import 'src/organizations/components/Retention.scss';
|
||||
@import 'src/buckets/components/Retention.scss';
|
||||
@import 'src/telegrafs/components/TelegrafConfigOverlay.scss';
|
||||
@import 'src/telegrafs/components/TelegrafExplainer.scss';
|
||||
@import 'src/variables/components/CreateVariableOverlay.scss';
|
||||
|
@ -66,7 +66,7 @@
|
|||
@import 'src/tasks/components/TaskForm.scss';
|
||||
@import 'src/tasks/components/TasksPage.scss';
|
||||
@import 'src/labels/components/LabelOverlayForm.scss';
|
||||
@import 'src/configuration/components/RandomLabelColor.scss';
|
||||
@import 'src/labels/components/RandomLabelColor.scss';
|
||||
@import 'src/dataExplorer/components/SaveAsButton.scss';
|
||||
@import 'src/dataExplorer/components/DataExplorer.scss';
|
||||
@import 'src/dataExplorer/components/SaveAsButton.scss';
|
||||
|
|
|
@ -13,9 +13,7 @@ import {
|
|||
} from '@influxdata/clockface'
|
||||
import TaskScheduleFormField from 'src/tasks/components/TaskScheduleFormField'
|
||||
import TaskOptionsBucketDropdown from 'src/tasks/components/TasksOptionsBucketDropdown'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
|
||||
// Types
|
||||
import {
|
||||
|
|
|
@ -1,54 +0,0 @@
|
|||
// Libraries
|
||||
import React, {PureComponent} from 'react'
|
||||
import _ from 'lodash'
|
||||
|
||||
// Components
|
||||
import {Dropdown} from 'src/clockface'
|
||||
|
||||
// Types
|
||||
import {Organization} from '@influxdata/influx'
|
||||
|
||||
interface Props {
|
||||
orgs: Organization[]
|
||||
onChangeOrgName: (selectedOrg: string) => void
|
||||
selectedOrgName: string
|
||||
}
|
||||
|
||||
export default class TaskOptionsOrgDropdown extends PureComponent<Props> {
|
||||
public componentDidMount() {
|
||||
this.setSelectedToFirst()
|
||||
}
|
||||
|
||||
public componentDidUpdate(prevProps: Props) {
|
||||
if (this.props.orgs !== prevProps.orgs) {
|
||||
this.setSelectedToFirst()
|
||||
}
|
||||
}
|
||||
public render() {
|
||||
const {selectedOrgName, onChangeOrgName} = this.props
|
||||
return (
|
||||
<Dropdown selectedID={selectedOrgName} onChange={onChangeOrgName}>
|
||||
{this.orgDropdownItems}
|
||||
</Dropdown>
|
||||
)
|
||||
}
|
||||
|
||||
private get orgDropdownItems(): JSX.Element[] {
|
||||
const {orgs} = this.props
|
||||
|
||||
return orgs.map(org => {
|
||||
return (
|
||||
<Dropdown.Item id={org.name} key={org.name} value={org.name}>
|
||||
{org.name}
|
||||
</Dropdown.Item>
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
private setSelectedToFirst() {
|
||||
const {orgs, onChangeOrgName} = this.props
|
||||
const firstOrgNameInList = _.get(orgs, '0.name', '')
|
||||
|
||||
onChangeOrgName(firstOrgNameInList)
|
||||
}
|
||||
}
|
|
@ -1,54 +0,0 @@
|
|||
// Libraries
|
||||
import React, {PureComponent} from 'react'
|
||||
import _ from 'lodash'
|
||||
|
||||
// Components
|
||||
import {Dropdown} from 'src/clockface'
|
||||
|
||||
// Types
|
||||
import {Organization} from '@influxdata/influx'
|
||||
|
||||
interface Props {
|
||||
orgs: Organization[]
|
||||
onChangeOrgID: (selectedOrgID: string) => void
|
||||
selectedOrgID: string
|
||||
}
|
||||
|
||||
export default class TaskOptionsOrgIDDropdown extends PureComponent<Props> {
|
||||
public componentDidMount() {
|
||||
this.setSelectedToFirst()
|
||||
}
|
||||
|
||||
public componentDidUpdate(prevProps: Props) {
|
||||
if (this.props.orgs !== prevProps.orgs) {
|
||||
this.setSelectedToFirst()
|
||||
}
|
||||
}
|
||||
public render() {
|
||||
const {selectedOrgID, onChangeOrgID} = this.props
|
||||
return (
|
||||
<Dropdown selectedID={selectedOrgID} onChange={onChangeOrgID}>
|
||||
{this.orgDropdownItems}
|
||||
</Dropdown>
|
||||
)
|
||||
}
|
||||
|
||||
private get orgDropdownItems(): JSX.Element[] {
|
||||
const {orgs} = this.props
|
||||
|
||||
return orgs.map(org => {
|
||||
return (
|
||||
<Dropdown.Item id={org.id} key={org.id} value={org.id}>
|
||||
{org.name}
|
||||
</Dropdown.Item>
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
private setSelectedToFirst() {
|
||||
const {orgs, onChangeOrgID} = this.props
|
||||
const firstOrgIDInList = _.get(orgs, '0.id', '')
|
||||
|
||||
onChangeOrgID(firstOrgIDInList)
|
||||
}
|
||||
}
|
|
@ -10,10 +10,8 @@ import {Page} from 'src/pageLayout'
|
|||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import FilterList from 'src/shared/components/Filter'
|
||||
import SearchWidget from 'src/shared/components/search_widget/SearchWidget'
|
||||
import GetLabels from 'src/configuration/components/GetLabels'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import GetLabels from 'src/labels/components/GetLabels'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
|
||||
// Actions
|
||||
import {
|
||||
|
|
|
@ -1,47 +0,0 @@
|
|||
import {Run, Logs} from '@influxdata/influx'
|
||||
|
||||
export const taskRuns: Run[] = [
|
||||
{
|
||||
id: '40002242',
|
||||
taskID: 'string',
|
||||
status: Run.StatusEnum.Scheduled,
|
||||
scheduledFor: new Date('2019-02-11T22:37:25.985Z'),
|
||||
startedAt: new Date('2019-02-11T22:37:25.985Z'),
|
||||
finishedAt: new Date('2019-02-11T22:37:25.985Z'),
|
||||
requestedAt: new Date('2019-02-11T22:37:25.985Z'),
|
||||
links: {
|
||||
self: '/api/v2/tasks/1/runs/1',
|
||||
task: '/arequei/v2/tasks/1',
|
||||
retry: '/api/v2/tasks/1/runs/1/retry',
|
||||
logs: '/api/v2/tasks/1/runs/1/logs',
|
||||
},
|
||||
},
|
||||
{
|
||||
id: '40002342',
|
||||
taskID: 'string',
|
||||
status: Run.StatusEnum.Scheduled,
|
||||
scheduledFor: new Date('2019-02-11T22:37:25.985Z'),
|
||||
startedAt: new Date('2019-02-11T22:37:25.985Z'),
|
||||
finishedAt: new Date('2019-02-11T22:37:25.985Z'),
|
||||
requestedAt: new Date('2019-02-11T22:37:25.985Z'),
|
||||
links: {
|
||||
self: '/api/v2/tasks/1/runs/1',
|
||||
task: '/arequei/v2/tasks/1',
|
||||
retry: '/api/v2/tasks/1/runs/1/retry',
|
||||
logs: '/api/v2/tasks/1/runs/1/logs',
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
export const runLogs: Logs = {
|
||||
events: [
|
||||
{
|
||||
time: new Date('2019-02-12T22:00:09.572Z'),
|
||||
message: 'Halt and catch fire',
|
||||
},
|
||||
{
|
||||
time: new Date('2019-02-12T22:00:09.572Z'),
|
||||
message: 'Catch fire and Halt',
|
||||
},
|
||||
],
|
||||
}
|
|
@ -10,8 +10,8 @@ import {Tabs} from 'src/clockface'
|
|||
import CollectorList from 'src/telegrafs/components/CollectorList'
|
||||
import TelegrafExplainer from 'src/telegrafs/components/TelegrafExplainer'
|
||||
import FilterList from 'src/shared/components/Filter'
|
||||
import NoBucketsWarning from 'src/organizations/components/NoBucketsWarning'
|
||||
import GetLabels from 'src/configuration/components/GetLabels'
|
||||
import NoBucketsWarning from 'src/buckets/components/NoBucketsWarning'
|
||||
import GetLabels from 'src/labels/components/GetLabels'
|
||||
|
||||
// Actions
|
||||
import {setBucketInfo} from 'src/dataLoaders/actions/steps'
|
||||
|
|
|
@ -8,9 +8,7 @@ import {withRouter, WithRouterProps} from 'react-router'
|
|||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import WizardOverlay from 'src/clockface/components/wizard/WizardOverlay'
|
||||
import TelegrafInstructions from 'src/dataLoaders/components/verifyStep/TelegrafInstructions'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
|
||||
// Constants
|
||||
import {TOKEN_LABEL} from 'src/labels/constants'
|
||||
|
|
|
@ -5,15 +5,13 @@ import {AppState} from 'src/types'
|
|||
|
||||
// Components
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import OrganizationNavigation from 'src/organizations/components/OrganizationNavigation'
|
||||
import OrgHeader from 'src/organizations/containers/OrgHeader'
|
||||
import SettingsNavigation from 'src/settings/components/SettingsNavigation'
|
||||
import SettingsHeader from 'src/settings/components/SettingsHeader'
|
||||
import {Tabs} from 'src/clockface'
|
||||
import {Page} from 'src/pageLayout'
|
||||
import Collectors from 'src/telegrafs/components/Collectors'
|
||||
import TabbedPageSection from 'src/shared/components/tabbed_page/TabbedPageSection'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
|
||||
// Types
|
||||
import {Organization} from '@influxdata/influx'
|
||||
|
@ -30,11 +28,11 @@ class TelegrafsPage extends PureComponent<StateProps> {
|
|||
return (
|
||||
<>
|
||||
<Page titleTag={org.name}>
|
||||
<OrgHeader />
|
||||
<SettingsHeader />
|
||||
<Page.Contents fullWidth={false} scrollable={true}>
|
||||
<div className="col-xs-12">
|
||||
<Tabs>
|
||||
<OrganizationNavigation tab="telegrafs" orgID={org.id} />
|
||||
<SettingsNavigation tab="telegrafs" orgID={org.id} />
|
||||
<Tabs.TabContents>
|
||||
<TabbedPageSection
|
||||
id="org-view-tab--telegrafs"
|
||||
|
|
|
@ -9,7 +9,7 @@ import TemplatesHeader from 'src/templates/components/TemplatesHeader'
|
|||
import TemplatesList from 'src/templates/components/TemplatesList'
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import SearchWidget from 'src/shared/components/search_widget/SearchWidget'
|
||||
import GetLabels from 'src/configuration/components/GetLabels'
|
||||
import GetLabels from 'src/labels/components/GetLabels'
|
||||
|
||||
// Types
|
||||
import {TemplateSummary, AppState} from 'src/types'
|
||||
|
|
|
@ -6,17 +6,15 @@ import {connect} from 'react-redux'
|
|||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import {Tabs} from 'src/clockface'
|
||||
import {Page} from 'src/pageLayout'
|
||||
import OrganizationNavigation from 'src/organizations/components/OrganizationNavigation'
|
||||
import OrgHeader from 'src/organizations/containers/OrgHeader'
|
||||
import SettingsNavigation from 'src/settings/components/SettingsNavigation'
|
||||
import SettingsHeader from 'src/settings/components/SettingsHeader'
|
||||
import TabbedPageSection from 'src/shared/components/tabbed_page/TabbedPageSection'
|
||||
import TemplatesPage from 'src/templates/components/TemplatesPage'
|
||||
|
||||
// Types
|
||||
import {Organization} from '@influxdata/influx'
|
||||
import {AppState} from 'src/types'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
|
||||
interface StateProps {
|
||||
org: Organization
|
||||
|
@ -31,11 +29,11 @@ class TemplatesIndex extends Component<Props> {
|
|||
return (
|
||||
<>
|
||||
<Page titleTag={org.name}>
|
||||
<OrgHeader />
|
||||
<SettingsHeader />
|
||||
<Page.Contents fullWidth={false} scrollable={true}>
|
||||
<div className="col-xs-12">
|
||||
<Tabs>
|
||||
<OrganizationNavigation tab="templates" orgID={org.id} />
|
||||
<SettingsNavigation tab="templates" orgID={org.id} />
|
||||
<Tabs.TabContents>
|
||||
<TabbedPageSection
|
||||
id="org-view-tab--templates"
|
||||
|
|
|
@ -14,7 +14,7 @@ import TabbedPageHeader from 'src/shared/components/tabbed_page/TabbedPageHeader
|
|||
import VariableList from 'src/variables/components/VariableList'
|
||||
import FilterList from 'src/shared/components/Filter'
|
||||
import AddResourceDropdown from 'src/shared/components/AddResourceDropdown'
|
||||
import GetLabels from 'src/configuration/components/GetLabels'
|
||||
import GetLabels from 'src/labels/components/GetLabels'
|
||||
|
||||
// Types
|
||||
import {OverlayState} from 'src/types'
|
||||
|
|
|
@ -4,15 +4,13 @@ import {connect} from 'react-redux'
|
|||
|
||||
// Components
|
||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
||||
import OrganizationNavigation from 'src/organizations/components/OrganizationNavigation'
|
||||
import OrgHeader from 'src/organizations/containers/OrgHeader'
|
||||
import SettingsNavigation from 'src/settings/components/SettingsNavigation'
|
||||
import SettingsHeader from 'src/settings/components/SettingsHeader'
|
||||
import {Tabs} from 'src/clockface'
|
||||
import {Page} from 'src/pageLayout'
|
||||
import TabbedPageSection from 'src/shared/components/tabbed_page/TabbedPageSection'
|
||||
import VariablesTab from 'src/variables/components/VariablesTab'
|
||||
import GetResources, {
|
||||
ResourceTypes,
|
||||
} from 'src/configuration/components/GetResources'
|
||||
import GetResources, {ResourceTypes} from 'src/shared/components/GetResources'
|
||||
|
||||
// Types
|
||||
import {Organization} from '@influxdata/influx'
|
||||
|
@ -30,11 +28,11 @@ class VariablesIndex extends Component<StateProps> {
|
|||
return (
|
||||
<>
|
||||
<Page titleTag={org.name}>
|
||||
<OrgHeader />
|
||||
<SettingsHeader />
|
||||
<Page.Contents fullWidth={false} scrollable={true}>
|
||||
<div className="col-xs-12">
|
||||
<Tabs>
|
||||
<OrganizationNavigation tab="variables" orgID={org.id} />
|
||||
<SettingsNavigation tab="variables" orgID={org.id} />
|
||||
<Tabs.TabContents>
|
||||
<TabbedPageSection
|
||||
id="org-view-tab--variables"
|
||||
|
|
Loading…
Reference in New Issue