From f53b422782fe2e470a67a0ae148d746022b49b81 Mon Sep 17 00:00:00 2001 From: Fine0830 Date: Sat, 19 Feb 2022 23:05:57 +0800 Subject: [PATCH] feat: implement Topology on the dashboard (#14) --- dist/LICENSE | 7 +- dist/licenses/LICENSE-ctrl-tinycolor | 21 + package-lock.json | 1460 ++++++++++++++++- package.json | 6 +- src/assets/icons/all_inbox.svg | 1 - src/assets/icons/chevron-left.svg | 2 +- src/assets/icons/device_hub.svg | 17 + src/assets/icons/folder_open.svg | 1 - src/assets/icons/insert_image.svg | 1 - src/assets/icons/keyboard_backspace.svg | 17 + src/assets/icons/playlist_add.svg | 1 - src/assets/icons/save.svg | 1 - src/assets/icons/save_alt.svg | 1 - src/assets/icons/settings.svg | 1 - src/assets/icons/topology-dark.svg | 15 + src/assets/icons/topology-light.svg | 15 + src/assets/img/icons.ts | 49 + src/assets/img/{tool => tools}/ALARM.png | Bin src/assets/img/{tool => tools}/API.png | Bin src/assets/img/{tool => tools}/ENDPOINT.png | Bin src/assets/img/{tool => tools}/INSTANCE.png | Bin src/assets/img/{tool => tools}/TRACE.png | Bin src/components/DateCalendar.vue | 15 +- src/components/Graph.vue | 20 +- src/components/Selector.vue | 7 +- src/components/TimePicker.vue | 9 +- src/{assets/img/icons.js => graphql/fetch.ts} | 33 +- src/{graph => graphql}/fragments/app.ts | 0 src/{graph => graphql}/fragments/dashboard.ts | 0 src/{graph => graphql}/fragments/selector.ts | 0 src/graphql/fragments/topology.ts | 77 + src/{graph => graphql}/index.ts | 12 +- src/{graph => graphql}/query/app.ts | 0 src/{graph => graphql}/query/dashboard.ts | 0 src/{graph => graphql}/query/selector.ts | 0 src/graphql/query/topology.ts | 25 + src/hooks/useEcharts.ts | 2 + src/hooks/useProcessor.ts | 29 + src/locales/lang/en.ts | 18 +- src/locales/lang/zh.ts | 19 +- src/router/alarm.ts | 43 + src/router/dashboard.ts | 22 +- src/router/index.ts | 5 +- src/store/data.ts | 75 +- src/store/modules/dashboard.ts | 53 +- src/store/modules/selectors.ts | 71 +- src/store/modules/topology.ts | 460 ++++++ src/styles/lib.scss | 16 +- src/types/dashboard.ts | 13 +- src/types/global.d.ts | 2 + src/types/topology.d.ts | 34 + src/utils/echarts.ts | 9 +- src/utils/localtime.ts | 6 +- src/views/Settings.vue | 2 +- src/views/dashboard/Edit.vue | 16 +- src/views/dashboard/List.vue | 6 +- src/views/dashboard/New.vue | 6 +- .../dashboard/configuration/MetricOptions.vue | 5 +- .../configuration/StandardOptions.vue | 20 +- .../dashboard/configuration/Topology.vue | 52 + .../{ConfigEdit.vue => Widget.vue} | 4 +- .../dashboard/configuration/WidgetOptions.vue | 4 +- .../configuration/graph-styles/Table.vue | 4 +- .../configuration/graph-styles/TopList.vue | 2 +- .../graph-styles/TopologyItem.vue | 145 ++ src/views/dashboard/controls/Topology.vue | 143 ++ src/views/dashboard/controls/Widget.vue | 34 +- src/views/dashboard/data.ts | 43 +- src/views/dashboard/panel/Layout.vue | 3 +- src/views/dashboard/panel/Tool.vue | 221 ++- .../dashboard/related/topology/Index.vue | 30 + .../related/topology/components/Graph.vue | 586 +++++++ .../topology/components/PodTopology.vue | 274 ++++ .../related/topology/components/Sankey.vue | 131 ++ .../related/topology/components/Settings.vue | 402 +++++ .../related/topology/utils/legend.ts | 53 + .../related/topology/utils/linkElement.ts | 60 + .../related/topology/utils/nodeElement.ts | 96 ++ .../related/topology/utils/simulation.ts | 56 + .../dashboard/related/topology/utils/zoom.ts | 28 + tsconfig.json | 1 + 81 files changed, 4886 insertions(+), 232 deletions(-) create mode 100644 dist/licenses/LICENSE-ctrl-tinycolor create mode 100644 src/assets/icons/device_hub.svg create mode 100644 src/assets/icons/keyboard_backspace.svg create mode 100644 src/assets/icons/topology-dark.svg create mode 100644 src/assets/icons/topology-light.svg create mode 100755 src/assets/img/icons.ts rename src/assets/img/{tool => tools}/ALARM.png (100%) rename src/assets/img/{tool => tools}/API.png (100%) rename src/assets/img/{tool => tools}/ENDPOINT.png (100%) rename src/assets/img/{tool => tools}/INSTANCE.png (100%) rename src/assets/img/{tool => tools}/TRACE.png (100%) rename src/{assets/img/icons.js => graphql/fetch.ts} (60%) mode change 100755 => 100644 rename src/{graph => graphql}/fragments/app.ts (100%) rename src/{graph => graphql}/fragments/dashboard.ts (100%) rename src/{graph => graphql}/fragments/selector.ts (100%) create mode 100644 src/graphql/fragments/topology.ts rename src/{graph => graphql}/index.ts (89%) rename src/{graph => graphql}/query/app.ts (100%) rename src/{graph => graphql}/query/dashboard.ts (100%) rename src/{graph => graphql}/query/selector.ts (100%) create mode 100644 src/graphql/query/topology.ts create mode 100644 src/router/alarm.ts create mode 100644 src/store/modules/topology.ts create mode 100644 src/types/topology.d.ts create mode 100644 src/views/dashboard/configuration/Topology.vue rename src/views/dashboard/configuration/{ConfigEdit.vue => Widget.vue} (98%) create mode 100644 src/views/dashboard/configuration/graph-styles/TopologyItem.vue create mode 100644 src/views/dashboard/controls/Topology.vue create mode 100644 src/views/dashboard/related/topology/Index.vue create mode 100644 src/views/dashboard/related/topology/components/Graph.vue create mode 100644 src/views/dashboard/related/topology/components/PodTopology.vue create mode 100644 src/views/dashboard/related/topology/components/Sankey.vue create mode 100644 src/views/dashboard/related/topology/components/Settings.vue create mode 100644 src/views/dashboard/related/topology/utils/legend.ts create mode 100644 src/views/dashboard/related/topology/utils/linkElement.ts create mode 100644 src/views/dashboard/related/topology/utils/nodeElement.ts create mode 100644 src/views/dashboard/related/topology/utils/simulation.ts create mode 100644 src/views/dashboard/related/topology/utils/zoom.ts diff --git a/dist/LICENSE b/dist/LICENSE index b4781d67..0f966877 100644 --- a/dist/LICENSE +++ b/dist/LICENSE @@ -18,7 +18,7 @@ three-orbit-controls 82.1.0: https://github.com/mattdesl/three-orbit-controls MI vue-demi 0.12.1: https://github.com/antfu/vue-demi MIT vueuse/core 6.8.0: https://github.com/vueuse/vueuse MIT vue/devtools-api 6.0.0-beta.20.1: https://github.com/vuejs/vue-devtools MIT -element-plus 1.2.0-beta.3: https://github.com/element-plus/element-plus MIT +element-plus 2.0.1: https://github.com/element-plus/element-plus MIT vue-types 4.1.1: https://github.com/dwightjack/vue-types MIT is-plain-object 5.0.0: https://github.com/jonschlinkert/is-plain-object MIT vue-grid-layout 3.0.0-beta1: https://github.com/jbaysolutions/vue-grid-layout MIT @@ -28,4 +28,7 @@ element-resize-detector 1.2.4: https://github.com/wnr/element-resize-detector MI batch-processor 1.0.0: https://github.com/wnr/batch-processor MIT echarts 5.2.2: https://github.com/apache/echarts Apache-2.0 License zrender 5.2.1: https://github.com/ecomfe/zrender BSD-3-Clause License -tslib 2.3.0: https://github.com/Microsoft/tslib 0BSD License \ No newline at end of file +tslib 2.3.0: https://github.com/Microsoft/tslib 0BSD License +d3-tip 0.9.1: https: //github.com/Caged/d3-tip MIT Licensee +d3 7.3.0: https://github.com/d3/d3 ISC License +ctrl/tinycolor 3.4.0: https: //github.com/scttcper/tinycolor MIT Licensee diff --git a/dist/licenses/LICENSE-ctrl-tinycolor b/dist/licenses/LICENSE-ctrl-tinycolor new file mode 100644 index 00000000..4ef6d01e --- /dev/null +++ b/dist/licenses/LICENSE-ctrl-tinycolor @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-present Evan You + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/package-lock.json b/package-lock.json index 5ab3f399..eebfd21f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,10 @@ "version": "0.1.0", "dependencies": { "axios": "^0.24.0", + "d3": "^7.3.0", + "d3-tip": "^0.9.1", "echarts": "^5.2.2", - "element-plus": "^1.2.0-beta.3", + "element-plus": "^2.0.2", "pinia": "^2.0.5", "three": "^0.131.3", "three-orbit-controls": "^82.1.0", @@ -22,6 +24,8 @@ "vuex": "^4.0.0-0" }, "devDependencies": { + "@types/d3": "^7.1.0", + "@types/d3-tip": "^3.5.5", "@types/echarts": "^4.9.12", "@types/jest": "^24.0.19", "@types/three": "^0.131.0", @@ -1698,6 +1702,14 @@ "node": ">=0.1.95" } }, + "node_modules/@ctrl/tinycolor": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz", + "integrity": "sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/@cypress/listr-verbose-renderer": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", @@ -1788,9 +1800,9 @@ } }, "node_modules/@element-plus/icons-vue": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-0.2.4.tgz", - "integrity": "sha512-RsJNyL58rwxtsjeMy34o8txkL6UlME1stWsUlRpTac6UE9Bx9gdJvnDXbIKhOJqBLX17fBjmposdrn6VTqim2w==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-0.2.7.tgz", + "integrity": "sha512-S8kDbfVaWkQvbUYQE1ui448tzaHfUvyESCep9J6uPRlViyQPXjdIfwLBhV6AmQSOfFS8rL+xehJGhvzPXLrSBg==", "peerDependencies": { "vue": "^3.2.0" } @@ -2947,6 +2959,274 @@ "@types/node": "*" } }, + "node_modules/@types/d3": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.1.0.tgz", + "integrity": "sha512-gYWvgeGjEl+zmF8c+U1RNIKqe7sfQwIXeLXO5Os72TjDjCEtgpvGBvZ8dXlAuSS1m6B90Y1Uo6Bm36OGR/OtCA==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.2.tgz", + "integrity": "sha512-5mjGjz6XOXKOCdTajXTZ/pMsg236RdiwKPrRPWAEf/2S/+PzwY+LLYShUpeysWaMvsdS7LArh6GdUefoxpchsQ==", + "dev": true + }, + "node_modules/@types/d3-axis": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.1.tgz", + "integrity": "sha512-zji/iIbdd49g9WN0aIsGcwcTBUkgLsCSwB+uH+LPVDAiKWENMtI3cJEWt+7/YYwelMoZmbBfzA3qCdrZ2XFNnw==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.1.tgz", + "integrity": "sha512-B532DozsiTuQMHu2YChdZU0qsFJSio3Q6jmBYGYNp3gMDzBmuFFgPt9qKA4VYuLZMp4qc6eX7IUFUEsvHiXZAw==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-eQfcxIHrg7V++W8Qxn6QkqBNBokyhdWSAS73AbkbMzvLQmVVBviknoz2SRS/ZJdIOmhcmmdCRE/NFOm28Z1AMw==", + "dev": true + }, + "node_modules/@types/d3-color": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.0.2.tgz", + "integrity": "sha512-WVx6zBiz4sWlboCy7TCgjeyHpNjMsoF36yaagny1uXfbadc9f+5BeBf7U+lRmQqY3EHbGQpP8UdW8AC+cywSwQ==", + "dev": true + }, + "node_modules/@types/d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-C3zfBrhHZvrpAAK3YXqLWVAGo87A4SvJ83Q/zVJ8rFWJdKejUnDYaWZPkA8K84kb2vDA/g90LTQAz7etXcgoQQ==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.0.tgz", + "integrity": "sha512-iGm7ZaGLq11RK3e69VeMM6Oqj2SjKUB9Qhcyd1zIcqn2uE8w9GFB445yCY46NOQO3ByaNyktX1DK+Etz7ZaX+w==", + "dev": true + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-NhxMn3bAkqhjoxabVJWKryhnZXXYYVQxaBnbANu0O94+O/nX9qSjrA1P1jbAQJxJf+VC72TxDX/YJcKue5bRqw==", + "dev": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.1.tgz", + "integrity": "sha512-o1Va7bLwwk6h03+nSM8dpaGEYnoIG19P0lKqlic8Un36ymh9NSkNFX1yiXMKNMx8rJ0Kfnn2eovuFaL6Jvj0zA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.0.tgz", + "integrity": "sha512-o0/7RlMl9p5n6FQDptuJVMxDf/7EDEv2SYEO/CwdG2tr1hTfUVi0Iavkk2ax+VpaQ/1jVhpnj5rq1nj8vwhn2A==", + "dev": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "dev": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-toZJNOwrOIqz7Oh6Q7l2zkaNfXkfR7mFSJvGvlD/Ciq/+SQ39d5gynHJZ/0fjt83ec3WL7+u3ssqIijQtBISsw==", + "dev": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.3.tgz", + "integrity": "sha512-z8GteGVfkWJMKsx6hwC3SiTSLspL98VNpmvLpEFJQpZPq6xpA1I8HNBDNSpukfK0Vb0l64zGFhzunLgEAcBWSA==", + "dev": true + }, + "node_modules/@types/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", + "dev": true + }, + "node_modules/@types/d3-geo": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.2.tgz", + "integrity": "sha512-DbqK7MLYA8LpyHQfv6Klz0426bQEf7bRTvhMy44sNGVyZoWn//B0c+Qbeg8Osi2Obdc9BLLXYAKpyWege2/7LQ==", + "dev": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.0.2.tgz", + "integrity": "sha512-+krnrWOZ+aQB6v+E+jEkmkAx9HvsNAD+1LCD0vlBY3t+HwjKnsBFbpVLx6WWzDzCIuiTWdAxXMEnGnVXpB09qQ==", + "dev": true + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dev": true, + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "dev": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", + "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", + "dev": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "dev": true + }, + "node_modules/@types/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==", + "dev": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "dev": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.2.tgz", + "integrity": "sha512-d29EDd0iUBrRoKhPndhDY6U/PYxOWqgIZwKTooy2UkBfU7TNZNpRho0yLWPxlatQrFWk2mnTu71IZQ4+LRgKlQ==", + "dev": true + }, + "node_modules/@types/d3-shape": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.0.2.tgz", + "integrity": "sha512-5+ButCmIfNX8id5seZ7jKj3igdcxx+S9IDBiT35fQGTLZUfkFgTv+oBH34xgeoWDKpWcMITSzBILWQtBoN5Piw==", + "dev": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "dev": true + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "dev": true + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true + }, + "node_modules/@types/d3-tip": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/@types/d3-tip/-/d3-tip-3.5.5.tgz", + "integrity": "sha512-MWt1tlChRfHZtwBh8kIOrJo//TC5cdH5UN+KwcAs4wbFi6wnQJtk/MY4LBr/ZG7b2BQmRNJXu+EMI6NnH6VmxQ==", + "dev": true, + "dependencies": { + "@types/d3": "^3" + } + }, + "node_modules/@types/d3-tip/node_modules/@types/d3": { + "version": "3.5.46", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.46.tgz", + "integrity": "sha512-jNHfiGd41+JUV43LTMzQNidyp4Hn0XfhoSmy8baE0d/N5pGYpD+yX03JacY/MH+smFxYOQGXlz4HxkRZOuRNOQ==", + "dev": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-Sv4qEI9uq3bnZwlOANvYK853zvpdKEm1yz9rcc8ZTsxvRklcs9Fx4YFuGA3gXoQN/c/1T6QkVNjhaRO/cWj94g==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.1.tgz", + "integrity": "sha512-7s5L9TjfqIYQmQQEUcpMAcBOahem7TRoSO/+Gkz02GbMVuULiZzjF2BOdw291dbO2aNon4m2OdFsRGaCq2caLQ==", + "dev": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/echarts": { "version": "4.9.12", "resolved": "https://registry.npmjs.org/@types/echarts/-/echarts-4.9.12.tgz", @@ -2979,6 +3259,12 @@ "@types/range-parser": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.8", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz", + "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==", + "dev": true + }, "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -3038,6 +3324,21 @@ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", + "peer": true + }, + "node_modules/@types/lodash-es": { + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz", + "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", + "peer": true, + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -5000,11 +5301,11 @@ "dev": true }, "node_modules/@vueuse/core": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-7.5.3.tgz", - "integrity": "sha512-D9j5ymHFMFRXQqCp0yZJkf/bvBGiz0MrKUa364p+L8dMyd5zyq2K1JmHyvoBd4xbTFRfmQ1h878u6YE5LCkDVQ==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-7.6.1.tgz", + "integrity": "sha512-492y7R9HRu6TXzcGBMVG5qg5o9CHjrWLfOHh+TEknJeLe3LIYHsIBi1IlUN5s/yP3OHlBynjrzMMUm4gEyBmQg==", "dependencies": { - "@vueuse/shared": "7.5.3", + "@vueuse/shared": "7.6.1", "vue-demi": "*" }, "funding": { @@ -5024,9 +5325,9 @@ } }, "node_modules/@vueuse/core/node_modules/@vueuse/shared": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-7.5.3.tgz", - "integrity": "sha512-BJ71cxHN5VByW1S58Gl85NFJaQu93F7Vs7K/MuAKsIIuHm9PBbkR5Vxkg9ko9cBdiKVt+FNoo13BhdbA+Vwycg==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-7.6.1.tgz", + "integrity": "sha512-VhURBjuyELYLW94TLqwyM+tUZ0uyWAOjp8zDnJts5wwyHZlGt/yabLbuEl70cKmt0zR9psVyAyHC+LTgRrA1Zw==", "dependencies": { "vue-demi": "*" }, @@ -8789,6 +9090,417 @@ "node": ">=0.8" } }, + "node_modules/d3": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.3.0.tgz", + "integrity": "sha512-MDRLJCMK232OJQRqGljQ/gCxtB8k3/sLKFjftMjzPB3nKVUODpdW9Rb3vcq7U8Ka5YKoZkAmp++Ur6I+6iNWIw==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.1.tgz", + "integrity": "sha512-33qQ+ZoZlli19IFiQx4QEpf2CBEayMRzhlisJHSCsSUbDXv6ZishqS1x7uFVClKG4Wr7rZVHvaAttoLow6GqdQ==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "node_modules/d3-color": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz", + "integrity": "sha512-LtAIu54UctRmhGKllleflmHalttH3zkfSi4NlKrTAoFKjC+AFBJohsCAdgCBYQwH0F8hIOGY89X1pPqAchlMkA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", + "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-tip": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/d3-tip/-/d3-tip-0.9.1.tgz", + "integrity": "sha512-EVBfG9d+HnjIoyVXfhpytWxlF59JaobwizqMX9EBXtsFmJytjwHeYiUs74ldHQjE7S9vzfKTx2LCtvUrIbuFYg==", + "dependencies": { + "d3-collection": "^1.0.4", + "d3-selection": "^1.3.0" + }, + "engines": { + "node": ">=4.2.6" + } + }, + "node_modules/d3-tip/node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -9224,6 +9936,14 @@ "node": ">=6" } }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -9618,16 +10338,19 @@ } }, "node_modules/element-plus": { - "version": "1.2.0-beta.6", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-1.2.0-beta.6.tgz", - "integrity": "sha512-8EdSIR/5/FHcSB8w1diAh+gJMHgxIvxuZoayY99k6taAR1QyEFHuPTgFccZLopJ1+iP4UEsZFz49l57qS08Utw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.0.2.tgz", + "integrity": "sha512-URjC0HwwiqtlLxqTmHXQ31WXrdAq4ChWyyn52OcQs3PRsnMPfahGVq2AWnfzzlzlhVeI5lY3HQiuB1zDathS+g==", "dependencies": { - "@element-plus/icons-vue": "^0.2.2", - "@popperjs/core": "^2.10.2", - "@vueuse/core": "^7.0.0", + "@ctrl/tinycolor": "^3.4.0", + "@element-plus/icons-vue": "^0.2.6", + "@popperjs/core": "^2.11.2", + "@vueuse/core": "^7.6.0", "async-validator": "^4.0.7", "dayjs": "^1.10.7", "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.1", "memoize-one": "^6.0.0", "normalize-wheel-es": "^1.1.1" }, @@ -13136,6 +13859,14 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -16759,6 +17490,21 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash-unified": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.1.tgz", + "integrity": "sha512-Py+twfpWn+2dFQWCuGcp21WiQRwZwnm1cyE3piSt/VtBVKVyxlR58WgOVRzXtmdmDRGJKH8F8GPaA29WK/yK8g==", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -21811,6 +22557,11 @@ "inherits": "^2.0.1" } }, + "node_modules/robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, "node_modules/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -21861,6 +22612,11 @@ "aproba": "^1.1.1" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, "node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -21897,8 +22653,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sane": { "version": "4.1.0", @@ -29168,6 +29923,11 @@ "minimist": "^1.2.0" } }, + "@ctrl/tinycolor": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz", + "integrity": "sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ==" + }, "@cypress/listr-verbose-renderer": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", @@ -29244,9 +30004,9 @@ } }, "@element-plus/icons-vue": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-0.2.4.tgz", - "integrity": "sha512-RsJNyL58rwxtsjeMy34o8txkL6UlME1stWsUlRpTac6UE9Bx9gdJvnDXbIKhOJqBLX17fBjmposdrn6VTqim2w==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-0.2.7.tgz", + "integrity": "sha512-S8kDbfVaWkQvbUYQE1ui448tzaHfUvyESCep9J6uPRlViyQPXjdIfwLBhV6AmQSOfFS8rL+xehJGhvzPXLrSBg==", "requires": {} }, "@hapi/address": { @@ -30178,6 +30938,276 @@ "@types/node": "*" } }, + "@types/d3": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.1.0.tgz", + "integrity": "sha512-gYWvgeGjEl+zmF8c+U1RNIKqe7sfQwIXeLXO5Os72TjDjCEtgpvGBvZ8dXlAuSS1m6B90Y1Uo6Bm36OGR/OtCA==", + "dev": true, + "requires": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "@types/d3-array": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.2.tgz", + "integrity": "sha512-5mjGjz6XOXKOCdTajXTZ/pMsg236RdiwKPrRPWAEf/2S/+PzwY+LLYShUpeysWaMvsdS7LArh6GdUefoxpchsQ==", + "dev": true + }, + "@types/d3-axis": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.1.tgz", + "integrity": "sha512-zji/iIbdd49g9WN0aIsGcwcTBUkgLsCSwB+uH+LPVDAiKWENMtI3cJEWt+7/YYwelMoZmbBfzA3qCdrZ2XFNnw==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-brush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.1.tgz", + "integrity": "sha512-B532DozsiTuQMHu2YChdZU0qsFJSio3Q6jmBYGYNp3gMDzBmuFFgPt9qKA4VYuLZMp4qc6eX7IUFUEsvHiXZAw==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-eQfcxIHrg7V++W8Qxn6QkqBNBokyhdWSAS73AbkbMzvLQmVVBviknoz2SRS/ZJdIOmhcmmdCRE/NFOm28Z1AMw==", + "dev": true + }, + "@types/d3-color": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.0.2.tgz", + "integrity": "sha512-WVx6zBiz4sWlboCy7TCgjeyHpNjMsoF36yaagny1uXfbadc9f+5BeBf7U+lRmQqY3EHbGQpP8UdW8AC+cywSwQ==", + "dev": true + }, + "@types/d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-C3zfBrhHZvrpAAK3YXqLWVAGo87A4SvJ83Q/zVJ8rFWJdKejUnDYaWZPkA8K84kb2vDA/g90LTQAz7etXcgoQQ==", + "dev": true, + "requires": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "@types/d3-delaunay": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.0.tgz", + "integrity": "sha512-iGm7ZaGLq11RK3e69VeMM6Oqj2SjKUB9Qhcyd1zIcqn2uE8w9GFB445yCY46NOQO3ByaNyktX1DK+Etz7ZaX+w==", + "dev": true + }, + "@types/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-NhxMn3bAkqhjoxabVJWKryhnZXXYYVQxaBnbANu0O94+O/nX9qSjrA1P1jbAQJxJf+VC72TxDX/YJcKue5bRqw==", + "dev": true + }, + "@types/d3-drag": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.1.tgz", + "integrity": "sha512-o1Va7bLwwk6h03+nSM8dpaGEYnoIG19P0lKqlic8Un36ymh9NSkNFX1yiXMKNMx8rJ0Kfnn2eovuFaL6Jvj0zA==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-dsv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.0.tgz", + "integrity": "sha512-o0/7RlMl9p5n6FQDptuJVMxDf/7EDEv2SYEO/CwdG2tr1hTfUVi0Iavkk2ax+VpaQ/1jVhpnj5rq1nj8vwhn2A==", + "dev": true + }, + "@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "dev": true + }, + "@types/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-toZJNOwrOIqz7Oh6Q7l2zkaNfXkfR7mFSJvGvlD/Ciq/+SQ39d5gynHJZ/0fjt83ec3WL7+u3ssqIijQtBISsw==", + "dev": true, + "requires": { + "@types/d3-dsv": "*" + } + }, + "@types/d3-force": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.3.tgz", + "integrity": "sha512-z8GteGVfkWJMKsx6hwC3SiTSLspL98VNpmvLpEFJQpZPq6xpA1I8HNBDNSpukfK0Vb0l64zGFhzunLgEAcBWSA==", + "dev": true + }, + "@types/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", + "dev": true + }, + "@types/d3-geo": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.2.tgz", + "integrity": "sha512-DbqK7MLYA8LpyHQfv6Klz0426bQEf7bRTvhMy44sNGVyZoWn//B0c+Qbeg8Osi2Obdc9BLLXYAKpyWege2/7LQ==", + "dev": true, + "requires": { + "@types/geojson": "*" + } + }, + "@types/d3-hierarchy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.0.2.tgz", + "integrity": "sha512-+krnrWOZ+aQB6v+E+jEkmkAx9HvsNAD+1LCD0vlBY3t+HwjKnsBFbpVLx6WWzDzCIuiTWdAxXMEnGnVXpB09qQ==", + "dev": true + }, + "@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dev": true, + "requires": { + "@types/d3-color": "*" + } + }, + "@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true + }, + "@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "dev": true + }, + "@types/d3-quadtree": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", + "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", + "dev": true + }, + "@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "dev": true + }, + "@types/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==", + "dev": true, + "requires": { + "@types/d3-time": "*" + } + }, + "@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "dev": true + }, + "@types/d3-selection": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.2.tgz", + "integrity": "sha512-d29EDd0iUBrRoKhPndhDY6U/PYxOWqgIZwKTooy2UkBfU7TNZNpRho0yLWPxlatQrFWk2mnTu71IZQ4+LRgKlQ==", + "dev": true + }, + "@types/d3-shape": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.0.2.tgz", + "integrity": "sha512-5+ButCmIfNX8id5seZ7jKj3igdcxx+S9IDBiT35fQGTLZUfkFgTv+oBH34xgeoWDKpWcMITSzBILWQtBoN5Piw==", + "dev": true, + "requires": { + "@types/d3-path": "*" + } + }, + "@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "dev": true + }, + "@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "dev": true + }, + "@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true + }, + "@types/d3-tip": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/@types/d3-tip/-/d3-tip-3.5.5.tgz", + "integrity": "sha512-MWt1tlChRfHZtwBh8kIOrJo//TC5cdH5UN+KwcAs4wbFi6wnQJtk/MY4LBr/ZG7b2BQmRNJXu+EMI6NnH6VmxQ==", + "dev": true, + "requires": { + "@types/d3": "^3" + }, + "dependencies": { + "@types/d3": { + "version": "3.5.46", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.46.tgz", + "integrity": "sha512-jNHfiGd41+JUV43LTMzQNidyp4Hn0XfhoSmy8baE0d/N5pGYpD+yX03JacY/MH+smFxYOQGXlz4HxkRZOuRNOQ==", + "dev": true + } + } + }, + "@types/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-Sv4qEI9uq3bnZwlOANvYK853zvpdKEm1yz9rcc8ZTsxvRklcs9Fx4YFuGA3gXoQN/c/1T6QkVNjhaRO/cWj94g==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-zoom": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.1.tgz", + "integrity": "sha512-7s5L9TjfqIYQmQQEUcpMAcBOahem7TRoSO/+Gkz02GbMVuULiZzjF2BOdw291dbO2aNon4m2OdFsRGaCq2caLQ==", + "dev": true, + "requires": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "@types/echarts": { "version": "4.9.12", "resolved": "https://registry.npmjs.org/@types/echarts/-/echarts-4.9.12.tgz", @@ -30210,6 +31240,12 @@ "@types/range-parser": "*" } }, + "@types/geojson": { + "version": "7946.0.8", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz", + "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==", + "dev": true + }, "@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -30269,6 +31305,21 @@ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "@types/lodash": { + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", + "peer": true + }, + "@types/lodash-es": { + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz", + "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", + "peer": true, + "requires": { + "@types/lodash": "*" + } + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -31836,18 +32887,18 @@ "dev": true }, "@vueuse/core": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-7.5.3.tgz", - "integrity": "sha512-D9j5ymHFMFRXQqCp0yZJkf/bvBGiz0MrKUa364p+L8dMyd5zyq2K1JmHyvoBd4xbTFRfmQ1h878u6YE5LCkDVQ==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-7.6.1.tgz", + "integrity": "sha512-492y7R9HRu6TXzcGBMVG5qg5o9CHjrWLfOHh+TEknJeLe3LIYHsIBi1IlUN5s/yP3OHlBynjrzMMUm4gEyBmQg==", "requires": { - "@vueuse/shared": "7.5.3", + "@vueuse/shared": "7.6.1", "vue-demi": "*" }, "dependencies": { "@vueuse/shared": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-7.5.3.tgz", - "integrity": "sha512-BJ71cxHN5VByW1S58Gl85NFJaQu93F7Vs7K/MuAKsIIuHm9PBbkR5Vxkg9ko9cBdiKVt+FNoo13BhdbA+Vwycg==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-7.6.1.tgz", + "integrity": "sha512-VhURBjuyELYLW94TLqwyM+tUZ0uyWAOjp8zDnJts5wwyHZlGt/yabLbuEl70cKmt0zR9psVyAyHC+LTgRrA1Zw==", "requires": { "vue-demi": "*" } @@ -34896,6 +35947,305 @@ } } }, + "d3": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.3.0.tgz", + "integrity": "sha512-MDRLJCMK232OJQRqGljQ/gCxtB8k3/sLKFjftMjzPB3nKVUODpdW9Rb3vcq7U8Ka5YKoZkAmp++Ur6I+6iNWIw==", + "requires": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + } + }, + "d3-array": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.1.tgz", + "integrity": "sha512-33qQ+ZoZlli19IFiQx4QEpf2CBEayMRzhlisJHSCsSUbDXv6ZishqS1x7uFVClKG4Wr7rZVHvaAttoLow6GqdQ==", + "requires": { + "internmap": "1 - 2" + } + }, + "d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" + }, + "d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + } + }, + "d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "requires": { + "d3-path": "1 - 3" + } + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==" + }, + "d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", + "requires": { + "d3-array": "2 - 3" + } + }, + "d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "requires": { + "delaunator": "5" + } + }, + "d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" + }, + "d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + } + }, + "d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "requires": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" + }, + "d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "requires": { + "d3-dsv": "1 - 3" + } + }, + "d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" + }, + "d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", + "requires": { + "d3-array": "2.5.0 - 3" + } + }, + "d3-hierarchy": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz", + "integrity": "sha512-LtAIu54UctRmhGKllleflmHalttH3zkfSi4NlKrTAoFKjC+AFBJohsCAdgCBYQwH0F8hIOGY89X1pPqAchlMkA==" + }, + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "1 - 3" + } + }, + "d3-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==" + }, + "d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" + }, + "d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" + }, + "d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" + }, + "d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "requires": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + } + }, + "d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "requires": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + } + }, + "d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + }, + "d3-shape": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", + "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", + "requires": { + "d3-path": "1 - 3" + } + }, + "d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "requires": { + "d3-array": "2 - 3" + } + }, + "d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "requires": { + "d3-time": "1 - 3" + } + }, + "d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" + }, + "d3-tip": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/d3-tip/-/d3-tip-0.9.1.tgz", + "integrity": "sha512-EVBfG9d+HnjIoyVXfhpytWxlF59JaobwizqMX9EBXtsFmJytjwHeYiUs74ldHQjE7S9vzfKTx2LCtvUrIbuFYg==", + "requires": { + "d3-collection": "^1.0.4", + "d3-selection": "^1.3.0" + }, + "dependencies": { + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + } + } + }, + "d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "requires": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -35234,6 +36584,14 @@ } } }, + "delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "requires": { + "robust-predicates": "^3.0.0" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -35566,16 +36924,19 @@ "dev": true }, "element-plus": { - "version": "1.2.0-beta.6", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-1.2.0-beta.6.tgz", - "integrity": "sha512-8EdSIR/5/FHcSB8w1diAh+gJMHgxIvxuZoayY99k6taAR1QyEFHuPTgFccZLopJ1+iP4UEsZFz49l57qS08Utw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.0.2.tgz", + "integrity": "sha512-URjC0HwwiqtlLxqTmHXQ31WXrdAq4ChWyyn52OcQs3PRsnMPfahGVq2AWnfzzlzlhVeI5lY3HQiuB1zDathS+g==", "requires": { - "@element-plus/icons-vue": "^0.2.2", - "@popperjs/core": "^2.10.2", - "@vueuse/core": "^7.0.0", + "@ctrl/tinycolor": "^3.4.0", + "@element-plus/icons-vue": "^0.2.6", + "@popperjs/core": "^2.11.2", + "@vueuse/core": "^7.6.0", "async-validator": "^4.0.7", "dayjs": "^1.10.7", "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.1", "memoize-one": "^6.0.0", "normalize-wheel-es": "^1.1.1" } @@ -38305,6 +39666,11 @@ "side-channel": "^1.0.4" } }, + "internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -41126,6 +42492,17 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "lodash-unified": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.1.tgz", + "integrity": "sha512-Py+twfpWn+2dFQWCuGcp21WiQRwZwnm1cyE3piSt/VtBVKVyxlR58WgOVRzXtmdmDRGJKH8F8GPaA29WK/yK8g==", + "requires": {} + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -45065,6 +46442,11 @@ "inherits": "^2.0.1" } }, + "robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -45095,6 +46477,11 @@ "aproba": "^1.1.1" } }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, "rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -45130,8 +46517,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { "version": "4.1.0", diff --git a/package.json b/package.json index f3cd9097..eb7a151a 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,10 @@ }, "dependencies": { "axios": "^0.24.0", + "d3": "^7.3.0", + "d3-tip": "^0.9.1", "echarts": "^5.2.2", - "element-plus": "^1.2.0-beta.3", + "element-plus": "^2.0.2", "pinia": "^2.0.5", "three": "^0.131.3", "three-orbit-controls": "^82.1.0", @@ -24,6 +26,8 @@ "vuex": "^4.0.0-0" }, "devDependencies": { + "@types/d3": "^7.1.0", + "@types/d3-tip": "^3.5.5", "@types/echarts": "^4.9.12", "@types/jest": "^24.0.19", "@types/three": "^0.131.0", diff --git a/src/assets/icons/all_inbox.svg b/src/assets/icons/all_inbox.svg index bcf2fa84..cf38fc98 100644 --- a/src/assets/icons/all_inbox.svg +++ b/src/assets/icons/all_inbox.svg @@ -13,6 +13,5 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -all_inbox diff --git a/src/assets/icons/chevron-left.svg b/src/assets/icons/chevron-left.svg index 67158a0d..a2463274 100755 --- a/src/assets/icons/chevron-left.svg +++ b/src/assets/icons/chevron-left.svg @@ -13,4 +13,4 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -icn/chevron-left \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/icons/device_hub.svg b/src/assets/icons/device_hub.svg new file mode 100644 index 00000000..26054c38 --- /dev/null +++ b/src/assets/icons/device_hub.svg @@ -0,0 +1,17 @@ + + + + diff --git a/src/assets/icons/folder_open.svg b/src/assets/icons/folder_open.svg index 86892377..1c19c9b9 100644 --- a/src/assets/icons/folder_open.svg +++ b/src/assets/icons/folder_open.svg @@ -13,6 +13,5 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -folder_open diff --git a/src/assets/icons/insert_image.svg b/src/assets/icons/insert_image.svg index b3643964..5aea97ca 100644 --- a/src/assets/icons/insert_image.svg +++ b/src/assets/icons/insert_image.svg @@ -13,6 +13,5 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -insert_image diff --git a/src/assets/icons/keyboard_backspace.svg b/src/assets/icons/keyboard_backspace.svg new file mode 100644 index 00000000..989ad140 --- /dev/null +++ b/src/assets/icons/keyboard_backspace.svg @@ -0,0 +1,17 @@ + + + + diff --git a/src/assets/icons/playlist_add.svg b/src/assets/icons/playlist_add.svg index 58440236..82b905f5 100644 --- a/src/assets/icons/playlist_add.svg +++ b/src/assets/icons/playlist_add.svg @@ -13,6 +13,5 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -playlist_add diff --git a/src/assets/icons/save.svg b/src/assets/icons/save.svg index b6457af0..5a8f3b04 100644 --- a/src/assets/icons/save.svg +++ b/src/assets/icons/save.svg @@ -13,6 +13,5 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -save diff --git a/src/assets/icons/save_alt.svg b/src/assets/icons/save_alt.svg index e99ade2c..59d6e879 100644 --- a/src/assets/icons/save_alt.svg +++ b/src/assets/icons/save_alt.svg @@ -13,6 +13,5 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -save_alt diff --git a/src/assets/icons/settings.svg b/src/assets/icons/settings.svg index 6dac1694..f394ff29 100644 --- a/src/assets/icons/settings.svg +++ b/src/assets/icons/settings.svg @@ -13,6 +13,5 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -settings diff --git a/src/assets/icons/topology-dark.svg b/src/assets/icons/topology-dark.svg new file mode 100644 index 00000000..db404e3e --- /dev/null +++ b/src/assets/icons/topology-dark.svg @@ -0,0 +1,15 @@ + + \ No newline at end of file diff --git a/src/assets/icons/topology-light.svg b/src/assets/icons/topology-light.svg new file mode 100644 index 00000000..2210c7f2 --- /dev/null +++ b/src/assets/icons/topology-light.svg @@ -0,0 +1,15 @@ + + \ No newline at end of file diff --git a/src/assets/img/icons.ts b/src/assets/img/icons.ts new file mode 100755 index 00000000..396bbdd5 --- /dev/null +++ b/src/assets/img/icons.ts @@ -0,0 +1,49 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const requireComponent = require.context("./technologies", false, /\.png$/); +const requireTool = require.context("./tools", false, /\.png$/); +const result: { [key: string]: string } = {}; +const t: { [key: string]: string } = {}; + +function capitalizeFirstLetter(str: string) { + return str.toUpperCase(); +} +function validateFileName(str: string): string | undefined { + if (/^\S+\.png$/.test(str)) { + return str.replace(/^\S+\/(\w+)\.png$/, (rs, $1) => + capitalizeFirstLetter($1) + ); + } +} +[...requireComponent.keys()].forEach((filePath: string) => { + const componentConfig = requireComponent(filePath); + + const fileName = validateFileName(filePath); + if (fileName) { + result[fileName] = componentConfig; + } +}); +[...requireTool.keys()].forEach((filePath: string) => { + const componentConfig = requireTool(filePath); + + const fileName = validateFileName(filePath); + if (fileName) { + t[fileName] = componentConfig; + } +}); + +export default { ...result, ...t }; diff --git a/src/assets/img/tool/ALARM.png b/src/assets/img/tools/ALARM.png similarity index 100% rename from src/assets/img/tool/ALARM.png rename to src/assets/img/tools/ALARM.png diff --git a/src/assets/img/tool/API.png b/src/assets/img/tools/API.png similarity index 100% rename from src/assets/img/tool/API.png rename to src/assets/img/tools/API.png diff --git a/src/assets/img/tool/ENDPOINT.png b/src/assets/img/tools/ENDPOINT.png similarity index 100% rename from src/assets/img/tool/ENDPOINT.png rename to src/assets/img/tools/ENDPOINT.png diff --git a/src/assets/img/tool/INSTANCE.png b/src/assets/img/tools/INSTANCE.png similarity index 100% rename from src/assets/img/tool/INSTANCE.png rename to src/assets/img/tools/INSTANCE.png diff --git a/src/assets/img/tool/TRACE.png b/src/assets/img/tools/TRACE.png similarity index 100% rename from src/assets/img/tool/TRACE.png rename to src/assets/img/tools/TRACE.png diff --git a/src/components/DateCalendar.vue b/src/components/DateCalendar.vue index 0b6b105b..c4c948f7 100755 --- a/src/components/DateCalendar.vue +++ b/src/components/DateCalendar.vue @@ -118,9 +118,9 @@ limitations under the License. --> v-for="(i, j) in local.months" @click=" is($event) && - ((state.showMonths = m === 'M'), + ((state.showMonths = state.m === 'M'), (state.month = j), - m === 'M' && ok('m')) + state.m === 'M' && ok('m')) " :class="[ status( @@ -142,7 +142,7 @@ limitations under the License. --> v-for="(i, j) in years" @click=" is($event) && - ((state.showYears = m === 'Y'), + ((state.showYears = state.m === 'Y'), (state.year = i), state.m === 'Y' && ok('y')) " @@ -278,6 +278,7 @@ limitations under the License. --> - diff --git a/src/views/dashboard/configuration/ConfigEdit.vue b/src/views/dashboard/configuration/Widget.vue similarity index 98% rename from src/views/dashboard/configuration/ConfigEdit.vue rename to src/views/dashboard/configuration/Widget.vue index 5c5e5f63..c2bbd49f 100644 --- a/src/views/dashboard/configuration/ConfigEdit.vue +++ b/src/views/dashboard/configuration/Widget.vue @@ -60,10 +60,10 @@ limitations under the License. --> diff --git a/src/views/dashboard/configuration/WidgetOptions.vue b/src/views/dashboard/configuration/WidgetOptions.vue index a9b42172..0d38ffe2 100644 --- a/src/views/dashboard/configuration/WidgetOptions.vue +++ b/src/views/dashboard/configuration/WidgetOptions.vue @@ -18,7 +18,7 @@ limitations under the License. --> @@ -28,7 +28,7 @@ limitations under the License. --> diff --git a/src/views/dashboard/configuration/graph-styles/Table.vue b/src/views/dashboard/configuration/graph-styles/Table.vue index e12498b5..d4135876 100644 --- a/src/views/dashboard/configuration/graph-styles/Table.vue +++ b/src/views/dashboard/configuration/graph-styles/Table.vue @@ -27,7 +27,7 @@ limitations under the License. --> @@ -37,7 +37,7 @@ limitations under the License. --> diff --git a/src/views/dashboard/configuration/graph-styles/TopList.vue b/src/views/dashboard/configuration/graph-styles/TopList.vue index ef71509a..6c315ba2 100644 --- a/src/views/dashboard/configuration/graph-styles/TopList.vue +++ b/src/views/dashboard/configuration/graph-styles/TopList.vue @@ -18,7 +18,7 @@ limitations under the License. --> + + + diff --git a/src/views/dashboard/controls/Topology.vue b/src/views/dashboard/controls/Topology.vue new file mode 100644 index 00000000..67ef3993 --- /dev/null +++ b/src/views/dashboard/controls/Topology.vue @@ -0,0 +1,143 @@ + + + + diff --git a/src/views/dashboard/controls/Widget.vue b/src/views/dashboard/controls/Widget.vue index 254e71fc..74ca377c 100644 --- a/src/views/dashboard/controls/Widget.vue +++ b/src/views/dashboard/controls/Widget.vue @@ -18,20 +18,20 @@ limitations under the License. -->
{{ data.widget?.title || "" }}
- + + + - +
{{ t("edit") }} @@ -99,6 +99,7 @@ export default defineComponent({ async function queryMetrics() { const params = await useQueryProcessor(props.data); + if (!params) { state.source = {}; return; @@ -137,15 +138,18 @@ export default defineComponent({ } ); watch( - () => selectorStore.currentService, + () => [selectorStore.currentService, selectorStore.currentDestService], () => { - if (dashboardStore.entity === EntityType[0].value) { + if ( + dashboardStore.entity === EntityType[0].value || + dashboardStore.entity === EntityType[4].value + ) { queryMetrics(); } } ); watch( - () => selectorStore.currentPod, + () => [selectorStore.currentPod, selectorStore.currentDestPod], () => { if (dashboardStore.entity === EntityType[0].value) { return; diff --git a/src/views/dashboard/data.ts b/src/views/dashboard/data.ts index 50d0e3e7..cb1f51af 100644 --- a/src/views/dashboard/data.ts +++ b/src/views/dashboard/data.ts @@ -142,7 +142,7 @@ export enum MetricCatalog { export const EntityType = [ { value: "Service", label: "Service", key: 1 }, { value: "All", label: "All", key: 10 }, - { value: "Endpoint", label: "Service Endpoint", key: 3 }, + { value: "Endpoint", label: "Endpoint", key: 3 }, { value: "ServiceInstance", label: "Service Instance", key: 3 }, { value: "ServiceRelation", label: "Service Relation", key: 2 }, { @@ -152,6 +152,7 @@ export const EntityType = [ }, { value: "EndpointRelation", label: "Endpoint Relation", key: 4 }, ]; +export const hasTopology = ["All", "Service", "ServiceRelation", "Endpoint"]; export const TableEntity: any = { InstanceList: EntityType[3].value, EndpointList: EntityType[2].value, @@ -165,8 +166,40 @@ export const ToolIcons = [ { name: "playlist_add", content: "Add Widget", id: "addWidget" }, { name: "all_inbox", content: "Add Tab", id: "addTab" }, // { name: "insert_image", content: "Add Image", id: "addImage" }, - { name: "save_alt", content: "Export", id: "export" }, - { name: "folder_open", content: "Import", id: "import" }, - { name: "settings", content: "Settings", id: "settings" }, - { name: "save", content: "Apply", id: "applay" }, + // { name: "save_alt", content: "Export", id: "export" }, + // { name: "folder_open", content: "Import", id: "import" }, + // { name: "settings", content: "Settings", id: "settings" }, + { name: "device_hub", content: "Add Topology", id: "topology" }, + // { name: "save", content: "Apply", id: "apply" }, ]; +export const ScopeType = [ + { value: "Service", label: "Service", key: 1 }, + { value: "Endpoint", label: "Endpoint", key: 3 }, + { value: "ServiceInstance", label: "Service Instance", key: 3 }, +]; +export const LegendConditions = [ + { label: "&&", value: "and" }, + { label: "||", value: "or" }, +]; +export const MetricConditions = [ + { label: ">", value: ">" }, + { label: "<", value: "<" }, +]; +export enum LegendOpt { + NAME = "name", + VALUE = "value", + CONDITION = "condition", +} +export const DepthList = ["1", "2", "3", "4", "5"].map((item: string) => ({ + value: item, + label: item, +})); +export const Colors: any = { + green: "#67C23A", + blue: "#409EFF", + red: "#F56C6C", + grey: "#909399", + white: "#fff", + black: "#000", + orange: "#E6A23C", +}; diff --git a/src/views/dashboard/panel/Layout.vue b/src/views/dashboard/panel/Layout.vue index 0f1577f3..9c3b6e78 100644 --- a/src/views/dashboard/panel/Layout.vue +++ b/src/views/dashboard/panel/Layout.vue @@ -42,10 +42,11 @@ import { useDashboardStore } from "@/store/modules/dashboard"; import { LayoutConfig } from "@/types/dashboard"; import Widget from "../controls/Widget.vue"; import Tab from "../controls/Tab.vue"; +import Topology from "../controls/Topology.vue"; export default defineComponent({ name: "Layout", - components: { Widget, Tab }, + components: { Widget, Tab, Topology }, setup() { const dashboardStore = useDashboardStore(); function layoutUpdatedEvent(newLayout: LayoutConfig[]) { diff --git a/src/views/dashboard/panel/Tool.vue b/src/views/dashboard/panel/Tool.vue index 1f8584e8..eb5827ac 100644 --- a/src/views/dashboard/panel/Tool.vue +++ b/src/views/dashboard/panel/Tool.vue @@ -20,7 +20,7 @@ limitations under the License. -->
{{ - dashboardStore.entity === "Endpoint" + ["EndpointRelation", "Endpoint"].includes(dashboardStore.entity) ? "$Endpoint" : "$ServiceInstance" }} @@ -37,48 +37,58 @@ limitations under the License. -->
-
+
$DestinationService
- $DestinationServiceInstance + + {{ + dashboardStore.entity === "EndpointRelation" + ? "$DestinationEndpoint" + : "$DestinationServiceInstance" + }}
- - - - - + +
@@ -88,7 +98,7 @@ import { reactive, watch } from "vue"; import { useRoute } from "vue-router"; import { useDashboardStore } from "@/store/modules/dashboard"; import { useAppStoreWithOut } from "@/store/modules/app"; -import { EntityType, ToolIcons } from "../data"; +import { EntityType, ToolIcons, hasTopology } from "../data"; import { useSelectorStore } from "@/store/modules/selectors"; import { ElMessage } from "element-plus"; import { Option } from "@/types/app"; @@ -105,12 +115,16 @@ const states = reactive<{ key: number; currentService: string; currentPod: string; + currentDestService: string; + currentDestPod: string; }>({ destService: "", destPod: "", key: (type && type.key) || 0, currentService: "", currentPod: "", + currentDestService: "", + currentDestPod: "", }); dashboardStore.setLayer(String(params.layerId)); @@ -127,56 +141,136 @@ function initSelector() { } async function setSelector() { - if (params.podId) { - await selectorStore.getService(String(params.serviceId)); - states.currentService = selectorStore.currentService.value; - await fetchPods(String(params.entity), false); - const currentPod = selectorStore.pods.filter( - (d: { id: string }) => d.id === String(params.podId) - )[0]; - selectorStore.setCurrentPod(currentPod); - states.currentPod = currentPod.label; + if ( + [ + EntityType[2].value, + EntityType[3].value, + EntityType[5].value, + EntityType[6].value, + ].includes(String(params.entity)) + ) { + setSourceSelector(); + if ( + [EntityType[2].value, EntityType[3].value].includes(String(params.entity)) + ) { + return; + } + setDestSelector(); return; } - // entity=Service with serviceId + // entity=Service/ServiceRelation const json = await selectorStore.fetchServices(dashboardStore.layerId); if (json.errors) { ElMessage.error(json.errors); return; } - const currentService = selectorStore.services.filter( - (d: { id: string }) => d.id === String(params.serviceId) - )[0]; + let currentService, currentDestService; + for (const d of selectorStore.services) { + if (d.id === String(params.serviceId)) { + currentService = d; + } + if (d.id === String(params.destServiceId)) { + currentDestService = d; + } + } selectorStore.setCurrentService(currentService); + selectorStore.setCurrentDestService(currentDestService); states.currentService = selectorStore.currentService.value; + states.currentDestService = selectorStore.currentDestService.value; +} + +async function setSourceSelector() { + await selectorStore.getService(String(params.serviceId)); + states.currentService = selectorStore.currentService.value; + const e = String(params.entity).split("Relation")[0]; + await fetchPods(e, selectorStore.currentService.id, false); + if (!(selectorStore.pods.length && selectorStore.pods[0])) { + selectorStore.setCurrentPod(null); + states.currentPod = ""; + return; + } + const pod = params.podId || selectorStore.pods[0].id; + const currentPod = selectorStore.pods.filter( + (d: { id: string }) => d.id === pod + )[0]; + if (currentPod) { + selectorStore.setCurrentPod(currentPod); + states.currentPod = currentPod.label; + } +} + +async function setDestSelector() { + await selectorStore.getService(String(params.destServiceId), true); + states.currentDestService = selectorStore.currentDestService.value; + await fetchPods( + String(params.entity), + selectorStore.currentDestService.id, + false + ); + if (!(selectorStore.destPods.length && selectorStore.destPods[0])) { + selectorStore.setCurrentDestPod(null); + states.currentDestPod = ""; + return; + } + const destPod = params.destPodId || selectorStore.destPods[0].id; + const currentDestPod = selectorStore.destPods.filter( + (d: { id: string }) => d.id === destPod + )[0]; + if (currentDestPod) { + selectorStore.setCurrentDestPod(currentDestPod); + states.currentDestPod = currentDestPod.label; + } } async function getServices() { if (!dashboardStore.layerId) { return; } - if (dashboardStore.entity === EntityType[1].value) { - return; - } const json = await selectorStore.fetchServices(dashboardStore.layerId); if (json.errors) { ElMessage.error(json.errors); return; } + if (dashboardStore.entity === EntityType[1].value) { + return; + } selectorStore.setCurrentService( selectorStore.services.length ? selectorStore.services[0] : null ); + selectorStore.setCurrentDestService( + selectorStore.services.length ? selectorStore.services[1] : null + ); states.currentService = selectorStore.currentService.value; - fetchPods(dashboardStore.entity, true); + states.currentDestService = selectorStore.currentDestService.value; + const e = dashboardStore.entity.split("Relation")[0]; + if ( + [EntityType[2].value, EntityType[3].value].includes(dashboardStore.entity) + ) { + fetchPods(e, selectorStore.currentService.id, true); + } + if ( + [EntityType[5].value, EntityType[6].value].includes(dashboardStore.entity) + ) { + fetchPods(dashboardStore.entity, selectorStore.currentDestService.id, true); + } } async function changeService(service: Service[]) { if (service[0]) { states.currentService = service[0].value; selectorStore.setCurrentService(service[0]); - fetchPods(dashboardStore.entity, true); + fetchPods(dashboardStore.entity, selectorStore.currentService.id, true); } else { - selectorStore.setCurrentService(""); + selectorStore.setCurrentService(null); + } +} + +function changeDestService(service: Service[]) { + if (service[0]) { + states.currentDestService = service[0].value; + selectorStore.setCurrentDestService(service[0]); + } else { + selectorStore.setCurrentDestService(null); } } @@ -199,6 +293,9 @@ function clickIcons(t: { id: string; content: string; name: string }) { case "addImage": dashboardStore.addControl("Image"); break; + case "topology": + dashboardStore.addControl("Topology"); + break; case "settings": dashboardStore.setConfigPanel(true); break; @@ -207,11 +304,11 @@ function clickIcons(t: { id: string; content: string; name: string }) { } } -async function fetchPods(type: string, setPod: boolean) { +async function fetchPods(type: string, serviceId: string, setPod: boolean) { let resp; switch (type) { - case "Endpoint": - resp = await selectorStore.getEndpoints(); + case EntityType[2].value: + resp = await selectorStore.getEndpoints({ serviceId }); if (setPod) { selectorStore.setCurrentPod( selectorStore.pods.length ? selectorStore.pods[0] : null @@ -219,8 +316,8 @@ async function fetchPods(type: string, setPod: boolean) { states.currentPod = selectorStore.currentPod.label; } break; - case "ServiceInstance": - resp = await selectorStore.getServiceInstances(); + case EntityType[3].value: + resp = await selectorStore.getServiceInstances({ serviceId }); if (setPod) { selectorStore.setCurrentPod( selectorStore.pods.length ? selectorStore.pods[0] : null @@ -228,6 +325,27 @@ async function fetchPods(type: string, setPod: boolean) { states.currentPod = selectorStore.currentPod.label; } break; + case EntityType[6].value: + resp = await selectorStore.getEndpoints({ serviceId, isRelation: true }); + if (setPod) { + selectorStore.setCurrentDestPod( + selectorStore.destPods.length ? selectorStore.destPods[0] : null + ); + states.currentDestPod = selectorStore.currentDestPod.label; + } + break; + case EntityType[5].value: + resp = await selectorStore.getServiceInstances({ + serviceId, + isRelation: true, + }); + if (setPod) { + selectorStore.setCurrentDestPod( + selectorStore.destPods.length ? selectorStore.destPods[0] : null + ); + states.currentDestPod = selectorStore.currentDestPod.label; + } + break; default: resp = {}; } @@ -258,9 +376,13 @@ watch( padding: 4px 2px; } +.tool-icons { + margin-top: 2px; +} + .icon-btn { display: inline-block; - padding: 0 5px; + padding: 3px; text-align: center; border: 1px solid #ccc; border-radius: 3px; @@ -268,9 +390,6 @@ watch( cursor: pointer; background-color: #eee; color: #666; -} - -.item { font-size: 12px; } diff --git a/src/views/dashboard/related/topology/Index.vue b/src/views/dashboard/related/topology/Index.vue new file mode 100644 index 00000000..83ef1905 --- /dev/null +++ b/src/views/dashboard/related/topology/Index.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/views/dashboard/related/topology/components/Graph.vue b/src/views/dashboard/related/topology/components/Graph.vue new file mode 100644 index 00000000..22c42a5b --- /dev/null +++ b/src/views/dashboard/related/topology/components/Graph.vue @@ -0,0 +1,586 @@ + + + + diff --git a/src/views/dashboard/related/topology/components/PodTopology.vue b/src/views/dashboard/related/topology/components/PodTopology.vue new file mode 100644 index 00000000..66073168 --- /dev/null +++ b/src/views/dashboard/related/topology/components/PodTopology.vue @@ -0,0 +1,274 @@ + + + + diff --git a/src/views/dashboard/related/topology/components/Sankey.vue b/src/views/dashboard/related/topology/components/Sankey.vue new file mode 100644 index 00000000..4aa6a656 --- /dev/null +++ b/src/views/dashboard/related/topology/components/Sankey.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/src/views/dashboard/related/topology/components/Settings.vue b/src/views/dashboard/related/topology/components/Settings.vue new file mode 100644 index 00000000..c99eeb58 --- /dev/null +++ b/src/views/dashboard/related/topology/components/Settings.vue @@ -0,0 +1,402 @@ + + + + diff --git a/src/views/dashboard/related/topology/utils/legend.ts b/src/views/dashboard/related/topology/utils/legend.ts new file mode 100644 index 00000000..a5b0c957 --- /dev/null +++ b/src/views/dashboard/related/topology/utils/legend.ts @@ -0,0 +1,53 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import icons from "@/assets/img/icons"; + +export default function topoLegend( + graph: any, + clientHeight: number, + clientWidth: number, + config: any +) { + for (const item of ["CUBE", "CUBEERROR"]) { + graph + .append("image") + .attr("width", 30) + .attr("height", 30) + .attr("x", clientWidth - (item === "CUBEERROR" ? 340 : 440)) + .attr("y", clientHeight - 50) + .attr("xlink:href", () => + item === "CUBEERROR" ? icons.CUBEERROR : icons.CUBE + ); + graph + .append("text") + .attr("x", clientWidth - (item === "CUBEERROR" ? 310 : 410)) + .attr("y", clientHeight - 30) + .text(() => { + const l = config || []; + const str = l + .map((d: any) => `${d.name} ${d.condition} ${d.value}`) + .join(" and "); + return item === "CUBEERROR" + ? config + ? `Unhealthy (${str})` + : "Unhealthy" + : "Healthy"; + }) + .style("fill", "#efeff1") + .style("font-size", "11px"); + } +} diff --git a/src/views/dashboard/related/topology/utils/linkElement.ts b/src/views/dashboard/related/topology/utils/linkElement.ts new file mode 100644 index 00000000..efc3c388 --- /dev/null +++ b/src/views/dashboard/related/topology/utils/linkElement.ts @@ -0,0 +1,60 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const linkElement = (graph: any) => { + const linkEnter = graph + .append("path") + .attr("class", "topo-line") + .attr("marker-end", "url(#arrow)") + .attr("stroke", "#217EF25f"); + return linkEnter; +}; +export const anchorElement = (graph: any, funcs: any, tip: any) => { + const linkEnter = graph + .append("circle") + .attr("class", "topo-line-anchor") + .attr("r", 5) + .attr("fill", "#217EF25f") + .on("mouseover", function (event: unknown, d: unknown) { + tip.html(funcs.tipHtml).show(d, this); + }) + .on("mouseout", function () { + tip.hide(this); + }) + .on("click", (event: unknown, d: unknown) => { + funcs.handleLinkClick(event, d); + }); + return linkEnter; +}; +export const arrowMarker = (graph: any) => { + const defs = graph.append("defs"); + const arrow = defs + .append("marker") + .attr("id", "arrow") + .attr("class", "topo-line-arrow") + .attr("markerUnits", "strokeWidth") + .attr("markerWidth", "6") + .attr("markerHeight", "6") + .attr("viewBox", "0 0 12 12") + .attr("refX", "5") + .attr("refY", "6") + .attr("orient", "auto"); + const arrowPath = "M2,2 L10,6 L2,10 L6,6 L2,2"; + + arrow.append("path").attr("d", arrowPath).attr("fill", "#217EF25f"); + return arrow; +}; diff --git a/src/views/dashboard/related/topology/utils/nodeElement.ts b/src/views/dashboard/related/topology/utils/nodeElement.ts new file mode 100644 index 00000000..6a9fbe1d --- /dev/null +++ b/src/views/dashboard/related/topology/utils/nodeElement.ts @@ -0,0 +1,96 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import icons from "@/assets/img/icons"; +import { Node } from "@/types/topology"; + +icons["KAFKA-CONSUMER"] = icons.KAFKA; +export default (d3: any, graph: any, funcs: any, tip: any, legend: any) => { + const nodeEnter = graph + .append("g") + .call( + d3 + .drag() + .on("start", funcs.dragstart) + .on("drag", funcs.dragged) + .on("end", funcs.dragended) + ) + .on("mouseover", function (event: any, d: Node) { + tip.html(funcs.tipHtml).show(d, this); + }) + .on("mouseout", function () { + tip.hide(this); + }) + .on("click", (event: any, d: Node | any) => { + event.stopPropagation(); + event.preventDefault(); + funcs.handleNodeClick(d); + }); + nodeEnter + .append("image") + .attr("width", 49) + .attr("height", 49) + .attr("x", 2) + .attr("y", 10) + .attr("style", "cursor: move;") + .attr("xlink:href", (d: { [key: string]: number }) => { + if (!legend) { + return icons.CUBE; + } + if (!legend.length) { + return icons.CUBE; + } + let c = true; + for (const l of legend) { + const val = l.name.includes("_sla") ? d[l.name] / 100 : d[l.name]; + if (l.condition === "<") { + c = c && val < Number(l.value); + } else { + c = c && val > Number(l.value); + } + } + return c && d.isReal ? icons.CUBEERROR : icons.CUBE; + }); + nodeEnter + .append("image") + .attr("width", 32) + .attr("height", 32) + .attr("x", 6) + .attr("y", -10) + .attr("style", "opacity: 0.5;") + .attr("xlink:href", icons.LOCAL); + nodeEnter + .append("image") + .attr("width", 18) + .attr("height", 18) + .attr("x", 13) + .attr("y", -7) + .attr("xlink:href", (d: { type: string }) => + !d.type || d.type === "N/A" + ? icons.UNDEFINED + : icons[d.type.toUpperCase().replace("-", "")] + ); + nodeEnter + .append("text") + .attr("class", "topo-text") + .attr("text-anchor", "middle") + .attr("x", 22) + .attr("y", 70) + .text((d: { name: string }) => + d.name.length > 20 ? `${d.name.substring(0, 20)}...` : d.name + ); + return nodeEnter; +}; diff --git a/src/views/dashboard/related/topology/utils/simulation.ts b/src/views/dashboard/related/topology/utils/simulation.ts new file mode 100644 index 00000000..80707660 --- /dev/null +++ b/src/views/dashboard/related/topology/utils/simulation.ts @@ -0,0 +1,56 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export const simulationInit = ( + d3: any, + dataNodes: any, + dataLinks: any, + ticked: any +) => { + const simulation = d3 + .forceSimulation(dataNodes) + .force( + "collide", + d3.forceCollide().radius(() => 60) + ) + .force("yPos", d3.forceY().strength(1)) + .force("xPos", d3.forceX().strength(1)) + .force("charge", d3.forceManyBody().strength(-520)) + .force( + "link", + d3.forceLink(dataLinks).id((d: { id: string }) => d.id) + ) + .force( + "center", + d3.forceCenter(window.innerWidth / 2, window.innerHeight / 2 - 20) + ) + .on("tick", ticked) + .stop(); + simulationSkip(d3, simulation, ticked); + return simulation; +}; + +export const simulationSkip = (d3: any, simulation: any, ticked: any) => { + d3.timeout(() => { + const n = Math.ceil( + Math.log(simulation.alphaMin()) / Math.log(1 - simulation.alphaDecay()) + ); + for (let i = 0; i < n; i += 1) { + simulation.tick(); + ticked(); + } + }); +}; diff --git a/src/views/dashboard/related/topology/utils/zoom.ts b/src/views/dashboard/related/topology/utils/zoom.ts new file mode 100644 index 00000000..70576dda --- /dev/null +++ b/src/views/dashboard/related/topology/utils/zoom.ts @@ -0,0 +1,28 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export default (d3: any, graph: any) => + d3 + .zoom() + .scaleExtent([0.3, 10]) + .on("zoom", (d: any) => { + graph + .attr("transform", d3.zoomTransform(graph.node())) + .attr( + `translate(${d.transform.x},${d.transform.y})scale(${d.transform.k})` + ); + }); diff --git a/tsconfig.json b/tsconfig.json index 045b4baf..e2594fd6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -30,6 +30,7 @@ "baseUrl": ".", "allowJs": true, "resolveJsonModule": true, + "noImplicitThis": false, "types": [ "webpack-env", "jest"