Commit eb697a873d88bc18e41c764df8ec6530f4d08d3e

Authored by ww
1 parent 4247063b

chore: 更新go-view基线版本至v1.2.6

Showing 115 changed files with 5124 additions and 597 deletions
1 { 1 {
2 "name": "go-view", 2 "name": "go-view",
3 - "version": "1.2.0", 3 + "version": "1.2.6",
4 "engines": { 4 "engines": {
5 - "node": ">=16.14 <18.0.0" 5 + "node": ">=12.0"
6 }, 6 },
7 "scripts": { 7 "scripts": {
8 "dev": "vite --host", 8 "dev": "vite --host",
@@ -37,6 +37,7 @@ @@ -37,6 +37,7 @@
37 "html2canvas": "^1.4.1", 37 "html2canvas": "^1.4.1",
38 "jwt-decode": "^3.1.2", 38 "jwt-decode": "^3.1.2",
39 "keymaster": "^1.6.2", 39 "keymaster": "^1.6.2",
  40 + "mitt": "^3.0.0",
40 "monaco-editor": "^0.33.0", 41 "monaco-editor": "^0.33.0",
41 "naive-ui": "2.34.3", 42 "naive-ui": "2.34.3",
42 "pinia": "^2.0.13", 43 "pinia": "^2.0.13",
@@ -56,6 +57,8 @@ @@ -56,6 +57,8 @@
56 "devDependencies": { 57 "devDependencies": {
57 "@commitlint/cli": "^17.0.2", 58 "@commitlint/cli": "^17.0.2",
58 "@commitlint/config-conventional": "^17.0.2", 59 "@commitlint/config-conventional": "^17.0.2",
  60 + "@iconify/types": "^2.0.0",
  61 + "@iconify/vue": "^4.1.1",
59 "@types/node": "^16.11.26", 62 "@types/node": "^16.11.26",
60 "@types/qs": "^6.9.7", 63 "@types/qs": "^6.9.7",
61 "@types/three": "^0.144.0", 64 "@types/three": "^0.144.0",
@@ -64,8 +67,8 @@ @@ -64,8 +67,8 @@
64 "@typescript-eslint/parser": "^5.18.0", 67 "@typescript-eslint/parser": "^5.18.0",
65 "@vicons/carbon": "^0.12.0", 68 "@vicons/carbon": "^0.12.0",
66 "@vicons/ionicons5": "~0.11.0", 69 "@vicons/ionicons5": "~0.11.0",
67 - "@vitejs/plugin-vue": "^1.10.2",  
68 - "@vitejs/plugin-vue-jsx": "^1.3.9", 70 + "@vitejs/plugin-vue": "^4.2.3",
  71 + "@vitejs/plugin-vue-jsx": "^3.0.1",
69 "@vue/compiler-sfc": "^3.2.31", 72 "@vue/compiler-sfc": "^3.2.31",
70 "@vueuse/core": "^7.7.1", 73 "@vueuse/core": "^7.7.1",
71 "commitlint": "^17.0.2", 74 "commitlint": "^17.0.2",
@@ -84,7 +87,7 @@ @@ -84,7 +87,7 @@
84 "sass": "^1.49.11", 87 "sass": "^1.49.11",
85 "sass-loader": "^12.6.0", 88 "sass-loader": "^12.6.0",
86 "typescript": "4.6.3", 89 "typescript": "4.6.3",
87 - "vite": "2.9.9", 90 + "vite": "4.3.6",
88 "vite-plugin-compression": "^0.5.1", 91 "vite-plugin-compression": "^0.5.1",
89 "vite-plugin-html": "^3.2.0", 92 "vite-plugin-html": "^3.2.0",
90 "vite-plugin-importer": "^0.2.5", 93 "vite-plugin-importer": "^0.2.5",
1 -lockfileVersion: '6.0' 1 +lockfileVersion: '6.1'
  2 +
  3 +settings:
  4 + autoInstallPeers: true
  5 + excludeLinksFromLockfile: false
2 6
3 dependencies: 7 dependencies:
4 '@amap/amap-jsapi-loader': 8 '@amap/amap-jsapi-loader':
@@ -61,6 +65,9 @@ dependencies: @@ -61,6 +65,9 @@ dependencies:
61 keymaster: 65 keymaster:
62 specifier: ^1.6.2 66 specifier: ^1.6.2
63 version: 1.6.2 67 version: 1.6.2
  68 + mitt:
  69 + specifier: ^3.0.0
  70 + version: 3.0.0
64 monaco-editor: 71 monaco-editor:
65 specifier: ^0.33.0 72 specifier: ^0.33.0
66 version: 0.33.0 73 version: 0.33.0
@@ -85,6 +92,9 @@ dependencies: @@ -85,6 +92,9 @@ dependencies:
85 vue: 92 vue:
86 specifier: ^3.2.31 93 specifier: ^3.2.31
87 version: 3.2.37 94 version: 3.2.37
  95 + vue-3d-loader:
  96 + specifier: ^2.1.7
  97 + version: 2.1.7
88 vue-demi: 98 vue-demi:
89 specifier: ^0.13.1 99 specifier: ^0.13.1
90 version: 0.13.1(vue@3.2.37) 100 version: 0.13.1(vue@3.2.37)
@@ -111,6 +121,12 @@ devDependencies: @@ -111,6 +121,12 @@ devDependencies:
111 '@commitlint/config-conventional': 121 '@commitlint/config-conventional':
112 specifier: ^17.0.2 122 specifier: ^17.0.2
113 version: 17.0.2 123 version: 17.0.2
  124 + '@iconify/types':
  125 + specifier: ^2.0.0
  126 + version: 2.0.0
  127 + '@iconify/vue':
  128 + specifier: ^4.1.1
  129 + version: 4.1.1(vue@3.2.37)
114 '@types/node': 130 '@types/node':
115 specifier: ^16.11.26 131 specifier: ^16.11.26
116 version: 16.11.40 132 version: 16.11.40
@@ -136,11 +152,11 @@ devDependencies: @@ -136,11 +152,11 @@ devDependencies:
136 specifier: ~0.11.0 152 specifier: ~0.11.0
137 version: 0.11.0 153 version: 0.11.0
138 '@vitejs/plugin-vue': 154 '@vitejs/plugin-vue':
139 - specifier: ^1.10.2  
140 - version: 1.10.2(vite@2.9.9) 155 + specifier: ^4.2.3
  156 + version: 4.2.3(vite@4.3.6)(vue@3.2.37)
141 '@vitejs/plugin-vue-jsx': 157 '@vitejs/plugin-vue-jsx':
142 - specifier: ^1.3.9  
143 - version: 1.3.10 158 + specifier: ^3.0.1
  159 + version: 3.0.1(vite@4.3.6)(vue@3.2.37)
144 '@vue/compiler-sfc': 160 '@vue/compiler-sfc':
145 specifier: ^3.2.31 161 specifier: ^3.2.31
146 version: 3.2.37 162 version: 3.2.37
@@ -196,20 +212,20 @@ devDependencies: @@ -196,20 +212,20 @@ devDependencies:
196 specifier: 4.6.3 212 specifier: 4.6.3
197 version: 4.6.3 213 version: 4.6.3
198 vite: 214 vite:
199 - specifier: 2.9.9  
200 - version: 2.9.9(sass@1.52.3) 215 + specifier: 4.3.6
  216 + version: 4.3.6(@types/node@16.11.40)(sass@1.52.3)
201 vite-plugin-compression: 217 vite-plugin-compression:
202 specifier: ^0.5.1 218 specifier: ^0.5.1
203 - version: 0.5.1(vite@2.9.9) 219 + version: 0.5.1(vite@4.3.6)
204 vite-plugin-html: 220 vite-plugin-html:
205 specifier: ^3.2.0 221 specifier: ^3.2.0
206 - version: 3.2.0(vite@2.9.9) 222 + version: 3.2.0(vite@4.3.6)
207 vite-plugin-importer: 223 vite-plugin-importer:
208 specifier: ^0.2.5 224 specifier: ^0.2.5
209 version: 0.2.5 225 version: 0.2.5
210 vite-plugin-mock: 226 vite-plugin-mock:
211 specifier: ^2.9.6 227 specifier: ^2.9.6
212 - version: 2.9.6(mockjs@1.1.0)(rollup@2.75.6)(vite@2.9.9) 228 + version: 2.9.6(mockjs@1.1.0)(rollup@2.75.6)(vite@4.3.6)
213 vite-plugin-monaco-editor: 229 vite-plugin-monaco-editor:
214 specifier: ^1.1.0 230 specifier: ^1.1.0
215 version: 1.1.0(monaco-editor@0.33.0) 231 version: 1.1.0(monaco-editor@0.33.0)
@@ -245,11 +261,23 @@ packages: @@ -245,11 +261,23 @@ packages:
245 '@babel/highlight': 7.17.12 261 '@babel/highlight': 7.17.12
246 dev: true 262 dev: true
247 263
  264 + /@babel/code-frame@7.22.5:
  265 + resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==}
  266 + engines: {node: '>=6.9.0'}
  267 + dependencies:
  268 + '@babel/highlight': 7.22.5
  269 + dev: true
  270 +
248 /@babel/compat-data@7.18.5: 271 /@babel/compat-data@7.18.5:
249 resolution: {integrity: sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==} 272 resolution: {integrity: sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==}
250 engines: {node: '>=6.9.0'} 273 engines: {node: '>=6.9.0'}
251 dev: true 274 dev: true
252 275
  276 + /@babel/compat-data@7.22.5:
  277 + resolution: {integrity: sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==}
  278 + engines: {node: '>=6.9.0'}
  279 + dev: true
  280 +
253 /@babel/core@7.18.5: 281 /@babel/core@7.18.5:
254 resolution: {integrity: sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==} 282 resolution: {integrity: sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==}
255 engines: {node: '>=6.9.0'} 283 engines: {node: '>=6.9.0'}
@@ -273,6 +301,29 @@ packages: @@ -273,6 +301,29 @@ packages:
273 - supports-color 301 - supports-color
274 dev: true 302 dev: true
275 303
  304 + /@babel/core@7.22.5:
  305 + resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==}
  306 + engines: {node: '>=6.9.0'}
  307 + dependencies:
  308 + '@ampproject/remapping': 2.2.0
  309 + '@babel/code-frame': 7.22.5
  310 + '@babel/generator': 7.22.5
  311 + '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5)
  312 + '@babel/helper-module-transforms': 7.22.5
  313 + '@babel/helpers': 7.22.5
  314 + '@babel/parser': 7.22.5
  315 + '@babel/template': 7.22.5
  316 + '@babel/traverse': 7.22.5
  317 + '@babel/types': 7.22.5
  318 + convert-source-map: 1.8.0
  319 + debug: 4.3.4
  320 + gensync: 1.0.0-beta.2
  321 + json5: 2.2.3
  322 + semver: 6.3.0
  323 + transitivePeerDependencies:
  324 + - supports-color
  325 + dev: true
  326 +
276 /@babel/generator@7.18.2: 327 /@babel/generator@7.18.2:
277 resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} 328 resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==}
278 engines: {node: '>=6.9.0'} 329 engines: {node: '>=6.9.0'}
@@ -282,11 +333,21 @@ packages: @@ -282,11 +333,21 @@ packages:
282 jsesc: 2.5.2 333 jsesc: 2.5.2
283 dev: true 334 dev: true
284 335
285 - /@babel/helper-annotate-as-pure@7.16.7:  
286 - resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==} 336 + /@babel/generator@7.22.5:
  337 + resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==}
287 engines: {node: '>=6.9.0'} 338 engines: {node: '>=6.9.0'}
288 dependencies: 339 dependencies:
289 - '@babel/types': 7.18.4 340 + '@babel/types': 7.22.5
  341 + '@jridgewell/gen-mapping': 0.3.3
  342 + '@jridgewell/trace-mapping': 0.3.17
  343 + jsesc: 2.5.2
  344 + dev: true
  345 +
  346 + /@babel/helper-annotate-as-pure@7.22.5:
  347 + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
  348 + engines: {node: '>=6.9.0'}
  349 + dependencies:
  350 + '@babel/types': 7.22.5
290 dev: true 351 dev: true
291 352
292 /@babel/helper-compilation-targets@7.18.2(@babel/core@7.18.5): 353 /@babel/helper-compilation-targets@7.18.2(@babel/core@7.18.5):
@@ -302,20 +363,36 @@ packages: @@ -302,20 +363,36 @@ packages:
302 semver: 6.3.0 363 semver: 6.3.0
303 dev: true 364 dev: true
304 365
305 - /@babel/helper-create-class-features-plugin@7.18.0(@babel/core@7.18.5):  
306 - resolution: {integrity: sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==} 366 + /@babel/helper-compilation-targets@7.22.5(@babel/core@7.22.5):
  367 + resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==}
307 engines: {node: '>=6.9.0'} 368 engines: {node: '>=6.9.0'}
308 peerDependencies: 369 peerDependencies:
309 '@babel/core': ^7.0.0 370 '@babel/core': ^7.0.0
310 dependencies: 371 dependencies:
311 - '@babel/core': 7.18.5  
312 - '@babel/helper-annotate-as-pure': 7.16.7  
313 - '@babel/helper-environment-visitor': 7.18.2  
314 - '@babel/helper-function-name': 7.17.9  
315 - '@babel/helper-member-expression-to-functions': 7.17.7  
316 - '@babel/helper-optimise-call-expression': 7.16.7  
317 - '@babel/helper-replace-supers': 7.18.2  
318 - '@babel/helper-split-export-declaration': 7.16.7 372 + '@babel/compat-data': 7.22.5
  373 + '@babel/core': 7.22.5
  374 + '@babel/helper-validator-option': 7.22.5
  375 + browserslist: 4.21.7
  376 + lru-cache: 5.1.1
  377 + semver: 6.3.0
  378 + dev: true
  379 +
  380 + /@babel/helper-create-class-features-plugin@7.22.5(@babel/core@7.22.5):
  381 + resolution: {integrity: sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==}
  382 + engines: {node: '>=6.9.0'}
  383 + peerDependencies:
  384 + '@babel/core': ^7.0.0
  385 + dependencies:
  386 + '@babel/core': 7.22.5
  387 + '@babel/helper-annotate-as-pure': 7.22.5
  388 + '@babel/helper-environment-visitor': 7.22.5
  389 + '@babel/helper-function-name': 7.22.5
  390 + '@babel/helper-member-expression-to-functions': 7.22.5
  391 + '@babel/helper-optimise-call-expression': 7.22.5
  392 + '@babel/helper-replace-supers': 7.22.5
  393 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
  394 + '@babel/helper-split-export-declaration': 7.22.5
  395 + semver: 6.3.0
319 transitivePeerDependencies: 396 transitivePeerDependencies:
320 - supports-color 397 - supports-color
321 dev: true 398 dev: true
@@ -325,6 +402,11 @@ packages: @@ -325,6 +402,11 @@ packages:
325 engines: {node: '>=6.9.0'} 402 engines: {node: '>=6.9.0'}
326 dev: true 403 dev: true
327 404
  405 + /@babel/helper-environment-visitor@7.22.5:
  406 + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==}
  407 + engines: {node: '>=6.9.0'}
  408 + dev: true
  409 +
328 /@babel/helper-function-name@7.17.9: 410 /@babel/helper-function-name@7.17.9:
329 resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==} 411 resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==}
330 engines: {node: '>=6.9.0'} 412 engines: {node: '>=6.9.0'}
@@ -333,6 +415,14 @@ packages: @@ -333,6 +415,14 @@ packages:
333 '@babel/types': 7.18.4 415 '@babel/types': 7.18.4
334 dev: true 416 dev: true
335 417
  418 + /@babel/helper-function-name@7.22.5:
  419 + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==}
  420 + engines: {node: '>=6.9.0'}
  421 + dependencies:
  422 + '@babel/template': 7.22.5
  423 + '@babel/types': 7.22.5
  424 + dev: true
  425 +
336 /@babel/helper-hoist-variables@7.16.7: 426 /@babel/helper-hoist-variables@7.16.7:
337 resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} 427 resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==}
338 engines: {node: '>=6.9.0'} 428 engines: {node: '>=6.9.0'}
@@ -340,11 +430,18 @@ packages: @@ -340,11 +430,18 @@ packages:
340 '@babel/types': 7.18.4 430 '@babel/types': 7.18.4
341 dev: true 431 dev: true
342 432
343 - /@babel/helper-member-expression-to-functions@7.17.7:  
344 - resolution: {integrity: sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==} 433 + /@babel/helper-hoist-variables@7.22.5:
  434 + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
345 engines: {node: '>=6.9.0'} 435 engines: {node: '>=6.9.0'}
346 dependencies: 436 dependencies:
347 - '@babel/types': 7.18.4 437 + '@babel/types': 7.22.5
  438 + dev: true
  439 +
  440 + /@babel/helper-member-expression-to-functions@7.22.5:
  441 + resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==}
  442 + engines: {node: '>=6.9.0'}
  443 + dependencies:
  444 + '@babel/types': 7.22.5
348 dev: true 445 dev: true
349 446
350 /@babel/helper-module-imports@7.16.7: 447 /@babel/helper-module-imports@7.16.7:
@@ -354,6 +451,13 @@ packages: @@ -354,6 +451,13 @@ packages:
354 '@babel/types': 7.18.4 451 '@babel/types': 7.18.4
355 dev: true 452 dev: true
356 453
  454 + /@babel/helper-module-imports@7.22.5:
  455 + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==}
  456 + engines: {node: '>=6.9.0'}
  457 + dependencies:
  458 + '@babel/types': 7.22.5
  459 + dev: true
  460 +
357 /@babel/helper-module-transforms@7.18.0: 461 /@babel/helper-module-transforms@7.18.0:
358 resolution: {integrity: sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==} 462 resolution: {integrity: sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==}
359 engines: {node: '>=6.9.0'} 463 engines: {node: '>=6.9.0'}
@@ -370,11 +474,27 @@ packages: @@ -370,11 +474,27 @@ packages:
370 - supports-color 474 - supports-color
371 dev: true 475 dev: true
372 476
373 - /@babel/helper-optimise-call-expression@7.16.7:  
374 - resolution: {integrity: sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==} 477 + /@babel/helper-module-transforms@7.22.5:
  478 + resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==}
375 engines: {node: '>=6.9.0'} 479 engines: {node: '>=6.9.0'}
376 dependencies: 480 dependencies:
377 - '@babel/types': 7.18.4 481 + '@babel/helper-environment-visitor': 7.22.5
  482 + '@babel/helper-module-imports': 7.22.5
  483 + '@babel/helper-simple-access': 7.22.5
  484 + '@babel/helper-split-export-declaration': 7.22.5
  485 + '@babel/helper-validator-identifier': 7.22.5
  486 + '@babel/template': 7.22.5
  487 + '@babel/traverse': 7.22.5
  488 + '@babel/types': 7.22.5
  489 + transitivePeerDependencies:
  490 + - supports-color
  491 + dev: true
  492 +
  493 + /@babel/helper-optimise-call-expression@7.22.5:
  494 + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==}
  495 + engines: {node: '>=6.9.0'}
  496 + dependencies:
  497 + '@babel/types': 7.22.5
378 dev: true 498 dev: true
379 499
380 /@babel/helper-plugin-utils@7.17.12: 500 /@babel/helper-plugin-utils@7.17.12:
@@ -382,15 +502,21 @@ packages: @@ -382,15 +502,21 @@ packages:
382 engines: {node: '>=6.9.0'} 502 engines: {node: '>=6.9.0'}
383 dev: true 503 dev: true
384 504
385 - /@babel/helper-replace-supers@7.18.2:  
386 - resolution: {integrity: sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==} 505 + /@babel/helper-plugin-utils@7.22.5:
  506 + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==}
  507 + engines: {node: '>=6.9.0'}
  508 + dev: true
  509 +
  510 + /@babel/helper-replace-supers@7.22.5:
  511 + resolution: {integrity: sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==}
387 engines: {node: '>=6.9.0'} 512 engines: {node: '>=6.9.0'}
388 dependencies: 513 dependencies:
389 - '@babel/helper-environment-visitor': 7.18.2  
390 - '@babel/helper-member-expression-to-functions': 7.17.7  
391 - '@babel/helper-optimise-call-expression': 7.16.7  
392 - '@babel/traverse': 7.18.5  
393 - '@babel/types': 7.18.4 514 + '@babel/helper-environment-visitor': 7.22.5
  515 + '@babel/helper-member-expression-to-functions': 7.22.5
  516 + '@babel/helper-optimise-call-expression': 7.22.5
  517 + '@babel/template': 7.22.5
  518 + '@babel/traverse': 7.22.5
  519 + '@babel/types': 7.22.5
394 transitivePeerDependencies: 520 transitivePeerDependencies:
395 - supports-color 521 - supports-color
396 dev: true 522 dev: true
@@ -402,6 +528,20 @@ packages: @@ -402,6 +528,20 @@ packages:
402 '@babel/types': 7.18.4 528 '@babel/types': 7.18.4
403 dev: true 529 dev: true
404 530
  531 + /@babel/helper-simple-access@7.22.5:
  532 + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
  533 + engines: {node: '>=6.9.0'}
  534 + dependencies:
  535 + '@babel/types': 7.22.5
  536 + dev: true
  537 +
  538 + /@babel/helper-skip-transparent-expression-wrappers@7.22.5:
  539 + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==}
  540 + engines: {node: '>=6.9.0'}
  541 + dependencies:
  542 + '@babel/types': 7.22.5
  543 + dev: true
  544 +
405 /@babel/helper-split-export-declaration@7.16.7: 545 /@babel/helper-split-export-declaration@7.16.7:
406 resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} 546 resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==}
407 engines: {node: '>=6.9.0'} 547 engines: {node: '>=6.9.0'}
@@ -409,15 +549,37 @@ packages: @@ -409,15 +549,37 @@ packages:
409 '@babel/types': 7.18.4 549 '@babel/types': 7.18.4
410 dev: true 550 dev: true
411 551
  552 + /@babel/helper-split-export-declaration@7.22.5:
  553 + resolution: {integrity: sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==}
  554 + engines: {node: '>=6.9.0'}
  555 + dependencies:
  556 + '@babel/types': 7.22.5
  557 + dev: true
  558 +
  559 + /@babel/helper-string-parser@7.22.5:
  560 + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
  561 + engines: {node: '>=6.9.0'}
  562 + dev: true
  563 +
412 /@babel/helper-validator-identifier@7.16.7: 564 /@babel/helper-validator-identifier@7.16.7:
413 resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} 565 resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==}
414 engines: {node: '>=6.9.0'} 566 engines: {node: '>=6.9.0'}
415 567
  568 + /@babel/helper-validator-identifier@7.22.5:
  569 + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==}
  570 + engines: {node: '>=6.9.0'}
  571 + dev: true
  572 +
416 /@babel/helper-validator-option@7.16.7: 573 /@babel/helper-validator-option@7.16.7:
417 resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} 574 resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==}
418 engines: {node: '>=6.9.0'} 575 engines: {node: '>=6.9.0'}
419 dev: true 576 dev: true
420 577
  578 + /@babel/helper-validator-option@7.22.5:
  579 + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==}
  580 + engines: {node: '>=6.9.0'}
  581 + dev: true
  582 +
421 /@babel/helpers@7.18.2: 583 /@babel/helpers@7.18.2:
422 resolution: {integrity: sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==} 584 resolution: {integrity: sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==}
423 engines: {node: '>=6.9.0'} 585 engines: {node: '>=6.9.0'}
@@ -429,6 +591,17 @@ packages: @@ -429,6 +591,17 @@ packages:
429 - supports-color 591 - supports-color
430 dev: true 592 dev: true
431 593
  594 + /@babel/helpers@7.22.5:
  595 + resolution: {integrity: sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==}
  596 + engines: {node: '>=6.9.0'}
  597 + dependencies:
  598 + '@babel/template': 7.22.5
  599 + '@babel/traverse': 7.22.5
  600 + '@babel/types': 7.22.5
  601 + transitivePeerDependencies:
  602 + - supports-color
  603 + dev: true
  604 +
432 /@babel/highlight@7.17.12: 605 /@babel/highlight@7.17.12:
433 resolution: {integrity: sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==} 606 resolution: {integrity: sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==}
434 engines: {node: '>=6.9.0'} 607 engines: {node: '>=6.9.0'}
@@ -438,6 +611,15 @@ packages: @@ -438,6 +611,15 @@ packages:
438 js-tokens: 4.0.0 611 js-tokens: 4.0.0
439 dev: true 612 dev: true
440 613
  614 + /@babel/highlight@7.22.5:
  615 + resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==}
  616 + engines: {node: '>=6.9.0'}
  617 + dependencies:
  618 + '@babel/helper-validator-identifier': 7.22.5
  619 + chalk: 2.4.2
  620 + js-tokens: 4.0.0
  621 + dev: true
  622 +
441 /@babel/parser@7.18.5: 623 /@babel/parser@7.18.5:
442 resolution: {integrity: sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==} 624 resolution: {integrity: sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==}
443 engines: {node: '>=6.0.0'} 625 engines: {node: '>=6.0.0'}
@@ -445,6 +627,14 @@ packages: @@ -445,6 +627,14 @@ packages:
445 dependencies: 627 dependencies:
446 '@babel/types': 7.18.4 628 '@babel/types': 7.18.4
447 629
  630 + /@babel/parser@7.22.5:
  631 + resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==}
  632 + engines: {node: '>=6.0.0'}
  633 + hasBin: true
  634 + dependencies:
  635 + '@babel/types': 7.22.5
  636 + dev: true
  637 +
448 /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.5): 638 /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.5):
449 resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 639 resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
450 peerDependencies: 640 peerDependencies:
@@ -454,36 +644,37 @@ packages: @@ -454,36 +644,37 @@ packages:
454 '@babel/helper-plugin-utils': 7.17.12 644 '@babel/helper-plugin-utils': 7.17.12
455 dev: true 645 dev: true
456 646
457 - /@babel/plugin-syntax-jsx@7.17.12(@babel/core@7.18.5): 647 + /@babel/plugin-syntax-jsx@7.17.12(@babel/core@7.22.5):
458 resolution: {integrity: sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==} 648 resolution: {integrity: sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==}
459 engines: {node: '>=6.9.0'} 649 engines: {node: '>=6.9.0'}
460 peerDependencies: 650 peerDependencies:
461 '@babel/core': ^7.0.0-0 651 '@babel/core': ^7.0.0-0
462 dependencies: 652 dependencies:
463 - '@babel/core': 7.18.5  
464 - '@babel/helper-plugin-utils': 7.17.12 653 + '@babel/core': 7.22.5
  654 + '@babel/helper-plugin-utils': 7.22.5
465 dev: true 655 dev: true
466 656
467 - /@babel/plugin-syntax-typescript@7.17.12(@babel/core@7.18.5):  
468 - resolution: {integrity: sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==} 657 + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.5):
  658 + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==}
469 engines: {node: '>=6.9.0'} 659 engines: {node: '>=6.9.0'}
470 peerDependencies: 660 peerDependencies:
471 '@babel/core': ^7.0.0-0 661 '@babel/core': ^7.0.0-0
472 dependencies: 662 dependencies:
473 - '@babel/core': 7.18.5  
474 - '@babel/helper-plugin-utils': 7.17.12 663 + '@babel/core': 7.22.5
  664 + '@babel/helper-plugin-utils': 7.22.5
475 dev: true 665 dev: true
476 666
477 - /@babel/plugin-transform-typescript@7.18.4(@babel/core@7.18.5):  
478 - resolution: {integrity: sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==} 667 + /@babel/plugin-transform-typescript@7.22.5(@babel/core@7.22.5):
  668 + resolution: {integrity: sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==}
479 engines: {node: '>=6.9.0'} 669 engines: {node: '>=6.9.0'}
480 peerDependencies: 670 peerDependencies:
481 '@babel/core': ^7.0.0-0 671 '@babel/core': ^7.0.0-0
482 dependencies: 672 dependencies:
483 - '@babel/core': 7.18.5  
484 - '@babel/helper-create-class-features-plugin': 7.18.0(@babel/core@7.18.5)  
485 - '@babel/helper-plugin-utils': 7.17.12  
486 - '@babel/plugin-syntax-typescript': 7.17.12(@babel/core@7.18.5) 673 + '@babel/core': 7.22.5
  674 + '@babel/helper-annotate-as-pure': 7.22.5
  675 + '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.5)
  676 + '@babel/helper-plugin-utils': 7.22.5
  677 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.5)
487 transitivePeerDependencies: 678 transitivePeerDependencies:
488 - supports-color 679 - supports-color
489 dev: true 680 dev: true
@@ -504,6 +695,15 @@ packages: @@ -504,6 +695,15 @@ packages:
504 '@babel/types': 7.18.4 695 '@babel/types': 7.18.4
505 dev: true 696 dev: true
506 697
  698 + /@babel/template@7.22.5:
  699 + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==}
  700 + engines: {node: '>=6.9.0'}
  701 + dependencies:
  702 + '@babel/code-frame': 7.22.5
  703 + '@babel/parser': 7.22.5
  704 + '@babel/types': 7.22.5
  705 + dev: true
  706 +
507 /@babel/traverse@7.18.5: 707 /@babel/traverse@7.18.5:
508 resolution: {integrity: sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==} 708 resolution: {integrity: sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==}
509 engines: {node: '>=6.9.0'} 709 engines: {node: '>=6.9.0'}
@@ -522,6 +722,24 @@ packages: @@ -522,6 +722,24 @@ packages:
522 - supports-color 722 - supports-color
523 dev: true 723 dev: true
524 724
  725 + /@babel/traverse@7.22.5:
  726 + resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==}
  727 + engines: {node: '>=6.9.0'}
  728 + dependencies:
  729 + '@babel/code-frame': 7.22.5
  730 + '@babel/generator': 7.22.5
  731 + '@babel/helper-environment-visitor': 7.22.5
  732 + '@babel/helper-function-name': 7.22.5
  733 + '@babel/helper-hoist-variables': 7.22.5
  734 + '@babel/helper-split-export-declaration': 7.22.5
  735 + '@babel/parser': 7.22.5
  736 + '@babel/types': 7.22.5
  737 + debug: 4.3.4
  738 + globals: 11.12.0
  739 + transitivePeerDependencies:
  740 + - supports-color
  741 + dev: true
  742 +
525 /@babel/types@7.18.4: 743 /@babel/types@7.18.4:
526 resolution: {integrity: sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==} 744 resolution: {integrity: sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==}
527 engines: {node: '>=6.9.0'} 745 engines: {node: '>=6.9.0'}
@@ -529,6 +747,15 @@ packages: @@ -529,6 +747,15 @@ packages:
529 '@babel/helper-validator-identifier': 7.16.7 747 '@babel/helper-validator-identifier': 7.16.7
530 to-fast-properties: 2.0.0 748 to-fast-properties: 2.0.0
531 749
  750 + /@babel/types@7.22.5:
  751 + resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==}
  752 + engines: {node: '>=6.9.0'}
  753 + dependencies:
  754 + '@babel/helper-string-parser': 7.22.5
  755 + '@babel/helper-validator-identifier': 7.22.5
  756 + to-fast-properties: 2.0.0
  757 + dev: true
  758 +
532 /@commitlint/cli@17.0.2: 759 /@commitlint/cli@17.0.2:
533 resolution: {integrity: sha512-Axe89Js0YzGGd4gxo3JLlF7yIdjOVpG1LbOorGc6PfYF+drBh14PvarSDLzyd2TNqdylUCq9wb9/A88ZjIdyhA==} 760 resolution: {integrity: sha512-Axe89Js0YzGGd4gxo3JLlF7yIdjOVpG1LbOorGc6PfYF+drBh14PvarSDLzyd2TNqdylUCq9wb9/A88ZjIdyhA==}
534 engines: {node: '>=v14'} 761 engines: {node: '>=v14'}
@@ -689,32 +916,230 @@ packages: @@ -689,32 +916,230 @@ packages:
689 chalk: 4.1.2 916 chalk: 4.1.2
690 dev: true 917 dev: true
691 918
692 - /@cspotcode/source-map-support@0.8.1:  
693 - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 919 + /@cspotcode/source-map-support@0.8.1:
  920 + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
  921 + engines: {node: '>=12'}
  922 + dependencies:
  923 + '@jridgewell/trace-mapping': 0.3.9
  924 + dev: true
  925 +
  926 + /@css-render/plugin-bem@0.15.10(css-render@0.15.10):
  927 + resolution: {integrity: sha512-V7b08sM2PWJlXI7BJiVIa0Sg30H3u/jHay4AclNXfF2yRFwwb4ZJjggsMfzwj3WSihAdNf2WTqvOU5qsOD80Dg==}
  928 + peerDependencies:
  929 + css-render: ~0.15.10
  930 + dependencies:
  931 + css-render: 0.15.10
  932 + dev: false
  933 +
  934 + /@css-render/vue3-ssr@0.15.10(vue@3.2.37):
  935 + resolution: {integrity: sha512-keGKnkB2nyVGoA8GezMKNsmvTGXEzgLOGGlgshwOTSEzd1dsROyZ2m/khJ9jV5zbzDM4rWeAWbWF0zwHemsJcw==}
  936 + peerDependencies:
  937 + vue: ^3.0.11
  938 + dependencies:
  939 + vue: 3.2.37
  940 + dev: false
  941 +
  942 + /@emotion/hash@0.8.0:
  943 + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
  944 + dev: false
  945 +
  946 + /@esbuild/android-arm64@0.17.19:
  947 + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==}
  948 + engines: {node: '>=12'}
  949 + cpu: [arm64]
  950 + os: [android]
  951 + requiresBuild: true
  952 + dev: true
  953 + optional: true
  954 +
  955 + /@esbuild/android-arm@0.17.19:
  956 + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==}
  957 + engines: {node: '>=12'}
  958 + cpu: [arm]
  959 + os: [android]
  960 + requiresBuild: true
  961 + dev: true
  962 + optional: true
  963 +
  964 + /@esbuild/android-x64@0.17.19:
  965 + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==}
  966 + engines: {node: '>=12'}
  967 + cpu: [x64]
  968 + os: [android]
  969 + requiresBuild: true
  970 + dev: true
  971 + optional: true
  972 +
  973 + /@esbuild/darwin-arm64@0.17.19:
  974 + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==}
  975 + engines: {node: '>=12'}
  976 + cpu: [arm64]
  977 + os: [darwin]
  978 + requiresBuild: true
  979 + dev: true
  980 + optional: true
  981 +
  982 + /@esbuild/darwin-x64@0.17.19:
  983 + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==}
  984 + engines: {node: '>=12'}
  985 + cpu: [x64]
  986 + os: [darwin]
  987 + requiresBuild: true
  988 + dev: true
  989 + optional: true
  990 +
  991 + /@esbuild/freebsd-arm64@0.17.19:
  992 + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==}
  993 + engines: {node: '>=12'}
  994 + cpu: [arm64]
  995 + os: [freebsd]
  996 + requiresBuild: true
  997 + dev: true
  998 + optional: true
  999 +
  1000 + /@esbuild/freebsd-x64@0.17.19:
  1001 + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==}
  1002 + engines: {node: '>=12'}
  1003 + cpu: [x64]
  1004 + os: [freebsd]
  1005 + requiresBuild: true
  1006 + dev: true
  1007 + optional: true
  1008 +
  1009 + /@esbuild/linux-arm64@0.17.19:
  1010 + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==}
  1011 + engines: {node: '>=12'}
  1012 + cpu: [arm64]
  1013 + os: [linux]
  1014 + requiresBuild: true
  1015 + dev: true
  1016 + optional: true
  1017 +
  1018 + /@esbuild/linux-arm@0.17.19:
  1019 + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==}
  1020 + engines: {node: '>=12'}
  1021 + cpu: [arm]
  1022 + os: [linux]
  1023 + requiresBuild: true
  1024 + dev: true
  1025 + optional: true
  1026 +
  1027 + /@esbuild/linux-ia32@0.17.19:
  1028 + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==}
  1029 + engines: {node: '>=12'}
  1030 + cpu: [ia32]
  1031 + os: [linux]
  1032 + requiresBuild: true
  1033 + dev: true
  1034 + optional: true
  1035 +
  1036 + /@esbuild/linux-loong64@0.17.19:
  1037 + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==}
  1038 + engines: {node: '>=12'}
  1039 + cpu: [loong64]
  1040 + os: [linux]
  1041 + requiresBuild: true
  1042 + dev: true
  1043 + optional: true
  1044 +
  1045 + /@esbuild/linux-mips64el@0.17.19:
  1046 + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==}
  1047 + engines: {node: '>=12'}
  1048 + cpu: [mips64el]
  1049 + os: [linux]
  1050 + requiresBuild: true
  1051 + dev: true
  1052 + optional: true
  1053 +
  1054 + /@esbuild/linux-ppc64@0.17.19:
  1055 + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==}
  1056 + engines: {node: '>=12'}
  1057 + cpu: [ppc64]
  1058 + os: [linux]
  1059 + requiresBuild: true
  1060 + dev: true
  1061 + optional: true
  1062 +
  1063 + /@esbuild/linux-riscv64@0.17.19:
  1064 + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==}
  1065 + engines: {node: '>=12'}
  1066 + cpu: [riscv64]
  1067 + os: [linux]
  1068 + requiresBuild: true
  1069 + dev: true
  1070 + optional: true
  1071 +
  1072 + /@esbuild/linux-s390x@0.17.19:
  1073 + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==}
  1074 + engines: {node: '>=12'}
  1075 + cpu: [s390x]
  1076 + os: [linux]
  1077 + requiresBuild: true
  1078 + dev: true
  1079 + optional: true
  1080 +
  1081 + /@esbuild/linux-x64@0.17.19:
  1082 + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==}
  1083 + engines: {node: '>=12'}
  1084 + cpu: [x64]
  1085 + os: [linux]
  1086 + requiresBuild: true
  1087 + dev: true
  1088 + optional: true
  1089 +
  1090 + /@esbuild/netbsd-x64@0.17.19:
  1091 + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==}
  1092 + engines: {node: '>=12'}
  1093 + cpu: [x64]
  1094 + os: [netbsd]
  1095 + requiresBuild: true
  1096 + dev: true
  1097 + optional: true
  1098 +
  1099 + /@esbuild/openbsd-x64@0.17.19:
  1100 + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==}
  1101 + engines: {node: '>=12'}
  1102 + cpu: [x64]
  1103 + os: [openbsd]
  1104 + requiresBuild: true
  1105 + dev: true
  1106 + optional: true
  1107 +
  1108 + /@esbuild/sunos-x64@0.17.19:
  1109 + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==}
  1110 + engines: {node: '>=12'}
  1111 + cpu: [x64]
  1112 + os: [sunos]
  1113 + requiresBuild: true
  1114 + dev: true
  1115 + optional: true
  1116 +
  1117 + /@esbuild/win32-arm64@0.17.19:
  1118 + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==}
  1119 + engines: {node: '>=12'}
  1120 + cpu: [arm64]
  1121 + os: [win32]
  1122 + requiresBuild: true
  1123 + dev: true
  1124 + optional: true
  1125 +
  1126 + /@esbuild/win32-ia32@0.17.19:
  1127 + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==}
  1128 + engines: {node: '>=12'}
  1129 + cpu: [ia32]
  1130 + os: [win32]
  1131 + requiresBuild: true
  1132 + dev: true
  1133 + optional: true
  1134 +
  1135 + /@esbuild/win32-x64@0.17.19:
  1136 + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==}
694 engines: {node: '>=12'} 1137 engines: {node: '>=12'}
695 - dependencies:  
696 - '@jridgewell/trace-mapping': 0.3.9 1138 + cpu: [x64]
  1139 + os: [win32]
  1140 + requiresBuild: true
697 dev: true 1141 dev: true
698 -  
699 - /@css-render/plugin-bem@0.15.10(css-render@0.15.10):  
700 - resolution: {integrity: sha512-V7b08sM2PWJlXI7BJiVIa0Sg30H3u/jHay4AclNXfF2yRFwwb4ZJjggsMfzwj3WSihAdNf2WTqvOU5qsOD80Dg==}  
701 - peerDependencies:  
702 - css-render: ~0.15.10  
703 - dependencies:  
704 - css-render: 0.15.10  
705 - dev: false  
706 -  
707 - /@css-render/vue3-ssr@0.15.10(vue@3.2.37):  
708 - resolution: {integrity: sha512-keGKnkB2nyVGoA8GezMKNsmvTGXEzgLOGGlgshwOTSEzd1dsROyZ2m/khJ9jV5zbzDM4rWeAWbWF0zwHemsJcw==}  
709 - peerDependencies:  
710 - vue: ^3.0.11  
711 - dependencies:  
712 - vue: 3.2.37  
713 - dev: false  
714 -  
715 - /@emotion/hash@0.8.0:  
716 - resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}  
717 - dev: false 1142 + optional: true
718 1143
719 /@eslint/eslintrc@1.3.0: 1144 /@eslint/eslintrc@1.3.0:
720 resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} 1145 resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==}
@@ -748,6 +1173,19 @@ packages: @@ -748,6 +1173,19 @@ packages:
748 resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 1173 resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
749 dev: true 1174 dev: true
750 1175
  1176 + /@iconify/types@2.0.0:
  1177 + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
  1178 + dev: true
  1179 +
  1180 + /@iconify/vue@4.1.1(vue@3.2.37):
  1181 + resolution: {integrity: sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==}
  1182 + peerDependencies:
  1183 + vue: '>=3'
  1184 + dependencies:
  1185 + '@iconify/types': 2.0.0
  1186 + vue: 3.2.37
  1187 + dev: true
  1188 +
751 /@intlify/core-base@9.2.2: 1189 /@intlify/core-base@9.2.2:
752 resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==} 1190 resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==}
753 engines: {node: '>= 14'} 1191 engines: {node: '>= 14'}
@@ -803,6 +1241,15 @@ packages: @@ -803,6 +1241,15 @@ packages:
803 '@jridgewell/trace-mapping': 0.3.13 1241 '@jridgewell/trace-mapping': 0.3.13
804 dev: true 1242 dev: true
805 1243
  1244 + /@jridgewell/gen-mapping@0.3.3:
  1245 + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
  1246 + engines: {node: '>=6.0.0'}
  1247 + dependencies:
  1248 + '@jridgewell/set-array': 1.1.1
  1249 + '@jridgewell/sourcemap-codec': 1.4.14
  1250 + '@jridgewell/trace-mapping': 0.3.17
  1251 + dev: true
  1252 +
806 /@jridgewell/resolve-uri@3.0.7: 1253 /@jridgewell/resolve-uri@3.0.7:
807 resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==} 1254 resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==}
808 engines: {node: '>=6.0.0'} 1255 engines: {node: '>=6.0.0'}
@@ -1049,6 +1496,12 @@ packages: @@ -1049,6 +1496,12 @@ packages:
1049 '@types/node': 17.0.43 1496 '@types/node': 17.0.43
1050 dev: true 1497 dev: true
1051 1498
  1499 + /@types/three@0.143.2:
  1500 + resolution: {integrity: sha512-HjsRWvd6rsXViFeOdU97/pHNDQknzJbFI0/5MrQ0joOlK0uixQH40sDJs/LwkNHhFYUvVENXAUQdKDeiQChHDw==}
  1501 + dependencies:
  1502 + '@types/webxr': 0.5.0
  1503 + dev: false
  1504 +
1052 /@types/three@0.144.0: 1505 /@types/three@0.144.0:
1053 resolution: {integrity: sha512-psvEs6q5rLN50jUYZ3D4pZMfxTbdt3A243blt0my7/NcL6chaCZpHe2csbCtx0SOD9fI/XnF3wnVUAYZGqCSYg==} 1506 resolution: {integrity: sha512-psvEs6q5rLN50jUYZ3D4pZMfxTbdt3A243blt0my7/NcL6chaCZpHe2csbCtx0SOD9fI/XnF3wnVUAYZGqCSYg==}
1054 dependencies: 1507 dependencies:
@@ -1067,7 +1520,6 @@ packages: @@ -1067,7 +1520,6 @@ packages:
1067 1520
1068 /@types/webxr@0.5.0: 1521 /@types/webxr@0.5.0:
1069 resolution: {integrity: sha512-IUMDPSXnYIbEO2IereEFcgcqfDREOgmbGqtrMpVPpACTU6pltYLwHgVkrnYv0XhWEcjio9sYEfIEzgn3c7nDqA==} 1522 resolution: {integrity: sha512-IUMDPSXnYIbEO2IereEFcgcqfDREOgmbGqtrMpVPpACTU6pltYLwHgVkrnYv0XhWEcjio9sYEfIEzgn3c7nDqA==}
1070 - dev: true  
1071 1523
1072 /@typescript-eslint/eslint-plugin@5.28.0(@typescript-eslint/parser@5.28.0)(eslint@8.17.0)(typescript@4.6.3): 1524 /@typescript-eslint/eslint-plugin@5.28.0(@typescript-eslint/parser@5.28.0)(eslint@8.17.0)(typescript@4.6.3):
1073 resolution: {integrity: sha512-DXVU6Cg29H2M6EybqSg2A+x8DgO9TCUBRp4QEXQHJceLS7ogVDP0g3Lkg/SZCqcvkAP/RruuQqK0gdlkgmhSUA==} 1525 resolution: {integrity: sha512-DXVU6Cg29H2M6EybqSg2A+x8DgO9TCUBRp4QEXQHJceLS7ogVDP0g3Lkg/SZCqcvkAP/RruuQqK0gdlkgmhSUA==}
@@ -1236,27 +1688,31 @@ packages: @@ -1236,27 +1688,31 @@ packages:
1236 is-function: 1.0.2 1688 is-function: 1.0.2
1237 dev: false 1689 dev: false
1238 1690
1239 - /@vitejs/plugin-vue-jsx@1.3.10:  
1240 - resolution: {integrity: sha512-Cf5zznh4yNMiEMBfTOztaDVDmK1XXfgxClzOSUVUc8WAmHzogrCUeM8B05ABzuGtg0D1amfng+mUmSIOFGP3Pw==}  
1241 - engines: {node: '>=12.0.0'} 1691 + /@vitejs/plugin-vue-jsx@3.0.1(vite@4.3.6)(vue@3.2.37):
  1692 + resolution: {integrity: sha512-+Jb7ggL48FSPS1uhPnJbJwWa9Sr90vQ+d0InW+AhBM22n+cfuYqJZDckBc+W3QSHe1WDvewMZfa4wZOtk5pRgw==}
  1693 + engines: {node: ^14.18.0 || >=16.0.0}
  1694 + peerDependencies:
  1695 + vite: ^4.0.0
  1696 + vue: ^3.0.0
1242 dependencies: 1697 dependencies:
1243 - '@babel/core': 7.18.5  
1244 - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.5)  
1245 - '@babel/plugin-transform-typescript': 7.18.4(@babel/core@7.18.5)  
1246 - '@rollup/pluginutils': 4.2.1  
1247 - '@vue/babel-plugin-jsx': 1.1.1(@babel/core@7.18.5)  
1248 - hash-sum: 2.0.0 1698 + '@babel/core': 7.22.5
  1699 + '@babel/plugin-transform-typescript': 7.22.5(@babel/core@7.22.5)
  1700 + '@vue/babel-plugin-jsx': 1.1.1(@babel/core@7.22.5)
  1701 + vite: 4.3.6(@types/node@16.11.40)(sass@1.52.3)
  1702 + vue: 3.2.37
1249 transitivePeerDependencies: 1703 transitivePeerDependencies:
1250 - supports-color 1704 - supports-color
1251 dev: true 1705 dev: true
1252 1706
1253 - /@vitejs/plugin-vue@1.10.2(vite@2.9.9):  
1254 - resolution: {integrity: sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw==}  
1255 - engines: {node: '>=12.0.0'} 1707 + /@vitejs/plugin-vue@4.2.3(vite@4.3.6)(vue@3.2.37):
  1708 + resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==}
  1709 + engines: {node: ^14.18.0 || >=16.0.0}
1256 peerDependencies: 1710 peerDependencies:
1257 - vite: ^2.5.10 1711 + vite: ^4.0.0
  1712 + vue: ^3.2.25
1258 dependencies: 1713 dependencies:
1259 - vite: 2.9.9(sass@1.52.3) 1714 + vite: 4.3.6(@types/node@16.11.40)(sass@1.52.3)
  1715 + vue: 3.2.37
1260 dev: true 1716 dev: true
1261 1717
1262 /@volar/code-gen@0.38.9: 1718 /@volar/code-gen@0.38.9:
@@ -1293,11 +1749,11 @@ packages: @@ -1293,11 +1749,11 @@ packages:
1293 resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==} 1749 resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==}
1294 dev: true 1750 dev: true
1295 1751
1296 - /@vue/babel-plugin-jsx@1.1.1(@babel/core@7.18.5): 1752 + /@vue/babel-plugin-jsx@1.1.1(@babel/core@7.22.5):
1297 resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==} 1753 resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==}
1298 dependencies: 1754 dependencies:
1299 '@babel/helper-module-imports': 7.16.7 1755 '@babel/helper-module-imports': 7.16.7
1300 - '@babel/plugin-syntax-jsx': 7.17.12(@babel/core@7.18.5) 1756 + '@babel/plugin-syntax-jsx': 7.17.12(@babel/core@7.22.5)
1301 '@babel/template': 7.16.7 1757 '@babel/template': 7.16.7
1302 '@babel/traverse': 7.18.5 1758 '@babel/traverse': 7.18.5
1303 '@babel/types': 7.18.4 1759 '@babel/types': 7.18.4
@@ -1803,6 +2259,17 @@ packages: @@ -1803,6 +2259,17 @@ packages:
1803 picocolors: 1.0.0 2259 picocolors: 1.0.0
1804 dev: true 2260 dev: true
1805 2261
  2262 + /browserslist@4.21.7:
  2263 + resolution: {integrity: sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==}
  2264 + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
  2265 + hasBin: true
  2266 + dependencies:
  2267 + caniuse-lite: 1.0.30001497
  2268 + electron-to-chromium: 1.4.425
  2269 + node-releases: 2.0.12
  2270 + update-browserslist-db: 1.0.11(browserslist@4.21.7)
  2271 + dev: true
  2272 +
1806 /buffer-from@1.1.2: 2273 /buffer-from@1.1.2:
1807 resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 2274 resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
1808 dev: true 2275 dev: true
@@ -1867,6 +2334,10 @@ packages: @@ -1867,6 +2334,10 @@ packages:
1867 resolution: {integrity: sha512-mImKeCkyGDAHNywYFA4bqnLAzTUvVkqPvhY4DV47X+Gl2c5Z8c3KNETnXp14GQt11LvxE8AwjzGxJ+rsikiOzg==} 2334 resolution: {integrity: sha512-mImKeCkyGDAHNywYFA4bqnLAzTUvVkqPvhY4DV47X+Gl2c5Z8c3KNETnXp14GQt11LvxE8AwjzGxJ+rsikiOzg==}
1868 dev: true 2335 dev: true
1869 2336
  2337 + /caniuse-lite@1.0.30001497:
  2338 + resolution: {integrity: sha512-I4/duVK4wL6rAK/aKZl3HXB4g+lIZvaT4VLAn2rCgJ38jVLb0lv2Xug6QuqmxXFVRJMF74SPPWPJ/1Sdm3vCzw==}
  2339 + dev: true
  2340 +
1870 /capital-case@1.0.4: 2341 /capital-case@1.0.4:
1871 resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} 2342 resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==}
1872 dependencies: 2343 dependencies:
@@ -2471,6 +2942,10 @@ packages: @@ -2471,6 +2942,10 @@ packages:
2471 resolution: {integrity: sha512-niPzKBSYPG06gxLKO0c2kEmgdRMTtIbNrBlvD31Ld8Q57b/K0218U4j8u/OOt25XE1eFOn47FcmQVdx9R1qqxA==} 2942 resolution: {integrity: sha512-niPzKBSYPG06gxLKO0c2kEmgdRMTtIbNrBlvD31Ld8Q57b/K0218U4j8u/OOt25XE1eFOn47FcmQVdx9R1qqxA==}
2472 dev: true 2943 dev: true
2473 2944
  2945 + /electron-to-chromium@1.4.425:
  2946 + resolution: {integrity: sha512-wv1NufHxu11zfDbY4fglYQApMswleE9FL/DSeyOyauVXDZ+Kco96JK/tPfBUaDqfRarYp2WH2hJ/5UnVywp9Jg==}
  2947 + dev: true
  2948 +
2474 /emoji-regex@8.0.0: 2949 /emoji-regex@8.0.0:
2475 resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 2950 resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
2476 dev: true 2951 dev: true
@@ -2546,218 +3021,40 @@ packages: @@ -2546,218 +3021,40 @@ packages:
2546 is-symbol: 1.0.4 3021 is-symbol: 1.0.4
2547 dev: true 3022 dev: true
2548 3023
2549 - /esbuild-android-64@0.14.43:  
2550 - resolution: {integrity: sha512-kqFXAS72K6cNrB6RiM7YJ5lNvmWRDSlpi7ZuRZ1hu1S3w0zlwcoCxWAyM23LQUyZSs1PbjHgdbbfYAN8IGh6xg==}  
2551 - engines: {node: '>=12'}  
2552 - cpu: [x64]  
2553 - os: [android]  
2554 - requiresBuild: true  
2555 - dev: true  
2556 - optional: true  
2557 -  
2558 - /esbuild-android-arm64@0.14.43:  
2559 - resolution: {integrity: sha512-bKS2BBFh+7XZY9rpjiHGRNA7LvWYbZWP87pLehggTG7tTaCDvj8qQGOU/OZSjCSKDYbgY7Q+oDw8RlYQ2Jt2BA==}  
2560 - engines: {node: '>=12'}  
2561 - cpu: [arm64]  
2562 - os: [android]  
2563 - requiresBuild: true  
2564 - dev: true  
2565 - optional: true  
2566 -  
2567 - /esbuild-darwin-64@0.14.43:  
2568 - resolution: {integrity: sha512-/3PSilx011ttoieRGkSZ0XV8zjBf2C9enV4ScMMbCT4dpx0mFhMOpFnCHkOK0pWGB8LklykFyHrWk2z6DENVUg==}  
2569 - engines: {node: '>=12'}  
2570 - cpu: [x64]  
2571 - os: [darwin]  
2572 - requiresBuild: true  
2573 - dev: true  
2574 - optional: true  
2575 -  
2576 - /esbuild-darwin-arm64@0.14.43:  
2577 - resolution: {integrity: sha512-1HyFUKs8DMCBOvw1Qxpr5Vv/ThNcVIFb5xgXWK3pyT40WPvgYIiRTwJCvNs4l8i5qWF8/CK5bQxJVDjQvtv0Yw==}  
2578 - engines: {node: '>=12'}  
2579 - cpu: [arm64]  
2580 - os: [darwin]  
2581 - requiresBuild: true  
2582 - dev: true  
2583 - optional: true  
2584 -  
2585 - /esbuild-freebsd-64@0.14.43:  
2586 - resolution: {integrity: sha512-FNWc05TPHYgaXjbPZO5/rJKSBslfG6BeMSs8GhwnqAKP56eEhvmzwnIz1QcC9cRVyO+IKqWNfmHFkCa1WJTULA==}  
2587 - engines: {node: '>=12'}  
2588 - cpu: [x64]  
2589 - os: [freebsd]  
2590 - requiresBuild: true  
2591 - dev: true  
2592 - optional: true  
2593 -  
2594 - /esbuild-freebsd-arm64@0.14.43:  
2595 - resolution: {integrity: sha512-amrYopclz3VohqisOPR6hA3GOWA3LZC1WDLnp21RhNmoERmJ/vLnOpnrG2P/Zao+/erKTCUqmrCIPVtj58DRoA==}  
2596 - engines: {node: '>=12'}  
2597 - cpu: [arm64]  
2598 - os: [freebsd]  
2599 - requiresBuild: true  
2600 - dev: true  
2601 - optional: true  
2602 -  
2603 - /esbuild-linux-32@0.14.43:  
2604 - resolution: {integrity: sha512-KoxoEra+9O3AKVvgDFvDkiuddCds6q71owSQEYwjtqRV7RwbPzKxJa6+uyzUulHcyGVq0g15K0oKG5CFBcvYDw==}  
2605 - engines: {node: '>=12'}  
2606 - cpu: [ia32]  
2607 - os: [linux]  
2608 - requiresBuild: true  
2609 - dev: true  
2610 - optional: true  
2611 -  
2612 - /esbuild-linux-64@0.14.43:  
2613 - resolution: {integrity: sha512-EwINwGMyiJMgBby5/SbMqKcUhS5AYAZ2CpEBzSowsJPNBJEdhkCTtEjk757TN/wxgbu3QklqDM6KghY660QCUw==}  
2614 - engines: {node: '>=12'}  
2615 - cpu: [x64]  
2616 - os: [linux]  
2617 - requiresBuild: true  
2618 - dev: true  
2619 - optional: true  
2620 -  
2621 - /esbuild-linux-arm64@0.14.43:  
2622 - resolution: {integrity: sha512-UlSpjMWllAc70zYbHxWuDS3FJytyuR/gHJYBr8BICcTNb/TSOYVBg6U7b3jZ3mILTrgzwJUHwhEwK18FZDouUQ==}  
2623 - engines: {node: '>=12'}  
2624 - cpu: [arm64]  
2625 - os: [linux]  
2626 - requiresBuild: true  
2627 - dev: true  
2628 - optional: true  
2629 -  
2630 - /esbuild-linux-arm@0.14.43:  
2631 - resolution: {integrity: sha512-e6YzQUoDxxtyamuF12eVzzRC7bbEFSZohJ6igQB9tBqnNmIQY3fI6Cns3z2wxtbZ3f2o6idkD2fQnlvs2902Dg==}  
2632 - engines: {node: '>=12'}  
2633 - cpu: [arm]  
2634 - os: [linux]  
2635 - requiresBuild: true  
2636 - dev: true  
2637 - optional: true  
2638 -  
2639 - /esbuild-linux-mips64le@0.14.43:  
2640 - resolution: {integrity: sha512-f+v8cInPEL1/SDP//CfSYzcDNgE4CY3xgDV81DWm3KAPWzhvxARrKxB1Pstf5mB56yAslJDxu7ryBUPX207EZA==}  
2641 - engines: {node: '>=12'}  
2642 - cpu: [mips64el]  
2643 - os: [linux]  
2644 - requiresBuild: true  
2645 - dev: true  
2646 - optional: true  
2647 -  
2648 - /esbuild-linux-ppc64le@0.14.43:  
2649 - resolution: {integrity: sha512-5wZYMDGAL/K2pqkdIsW+I4IR41kyfHr/QshJcNpUfK3RjB3VQcPWOaZmc+74rm4ZjVirYrtz+jWw0SgxtxRanA==}  
2650 - engines: {node: '>=12'}  
2651 - cpu: [ppc64]  
2652 - os: [linux]  
2653 - requiresBuild: true  
2654 - dev: true  
2655 - optional: true  
2656 -  
2657 - /esbuild-linux-riscv64@0.14.43:  
2658 - resolution: {integrity: sha512-lYcAOUxp85hC7lSjycJUVSmj4/9oEfSyXjb/ua9bNl8afonaduuqtw7hvKMoKuYnVwOCDw4RSfKpcnIRDWq+Bw==}  
2659 - engines: {node: '>=12'}  
2660 - cpu: [riscv64]  
2661 - os: [linux]  
2662 - requiresBuild: true  
2663 - dev: true  
2664 - optional: true  
2665 -  
2666 - /esbuild-linux-s390x@0.14.43:  
2667 - resolution: {integrity: sha512-27e43ZhHvhFE4nM7HqtUbMRu37I/4eNSUbb8FGZWszV+uLzMIsHDwLoBiJmw7G9N+hrehNPeQ4F5Ujad0DrUKQ==}  
2668 - engines: {node: '>=12'}  
2669 - cpu: [s390x]  
2670 - os: [linux]  
2671 - requiresBuild: true  
2672 - dev: true  
2673 - optional: true  
2674 -  
2675 - /esbuild-netbsd-64@0.14.43:  
2676 - resolution: {integrity: sha512-2mH4QF6hHBn5zzAfxEI/2eBC0mspVsZ6UVo821LpAJKMvLJPBk3XJO5xwg7paDqSqpl7p6IRrAenW999AEfJhQ==}  
2677 - engines: {node: '>=12'}  
2678 - cpu: [x64]  
2679 - os: [netbsd]  
2680 - requiresBuild: true  
2681 - dev: true  
2682 - optional: true  
2683 -  
2684 - /esbuild-openbsd-64@0.14.43:  
2685 - resolution: {integrity: sha512-ZhQpiZjvqCqO8jKdGp9+8k9E/EHSA+zIWOg+grwZasI9RoblqJ1QiZqqi7jfd6ZrrG1UFBNGe4m0NFxCFbMVbg==}  
2686 - engines: {node: '>=12'}  
2687 - cpu: [x64]  
2688 - os: [openbsd]  
2689 - requiresBuild: true  
2690 - dev: true  
2691 - optional: true  
2692 -  
2693 - /esbuild-sunos-64@0.14.43:  
2694 - resolution: {integrity: sha512-DgxSi9DaHReL9gYuul2rrQCAapgnCJkh3LSHPKsY26zytYppG0HgkgVF80zjIlvEsUbGBP/GHQzBtrezj/Zq1Q==}  
2695 - engines: {node: '>=12'}  
2696 - cpu: [x64]  
2697 - os: [sunos]  
2698 - requiresBuild: true  
2699 - dev: true  
2700 - optional: true  
2701 -  
2702 - /esbuild-windows-32@0.14.43:  
2703 - resolution: {integrity: sha512-Ih3+2O5oExiqm0mY6YYE5dR0o8+AspccQ3vIAtRodwFvhuyGLjb0Hbmzun/F3Lw19nuhPMu3sW2fqIJ5xBxByw==}  
2704 - engines: {node: '>=12'}  
2705 - cpu: [ia32]  
2706 - os: [win32]  
2707 - requiresBuild: true  
2708 - dev: true  
2709 - optional: true  
2710 -  
2711 - /esbuild-windows-64@0.14.43:  
2712 - resolution: {integrity: sha512-8NsuNfI8xwFuJbrCuI+aBqNTYkrWErejFO5aYM+yHqyHuL8mmepLS9EPzAzk8rvfaJrhN0+RvKWAcymViHOKEw==}  
2713 - engines: {node: '>=12'}  
2714 - cpu: [x64]  
2715 - os: [win32]  
2716 - requiresBuild: true  
2717 - dev: true  
2718 - optional: true  
2719 -  
2720 - /esbuild-windows-arm64@0.14.43:  
2721 - resolution: {integrity: sha512-7ZlD7bo++kVRblJEoG+cepljkfP8bfuTPz5fIXzptwnPaFwGS6ahvfoYzY7WCf5v/1nX2X02HDraVItTgbHnKw==}  
2722 - engines: {node: '>=12'}  
2723 - cpu: [arm64]  
2724 - os: [win32]  
2725 - requiresBuild: true  
2726 - dev: true  
2727 - optional: true  
2728 -  
2729 /esbuild@0.11.3: 3024 /esbuild@0.11.3:
2730 resolution: {integrity: sha512-BzVRHcCtFepjS9WcqRjqoIxLqgpK21a8J4Zi4msSGxDxiXVO1IbcqT1KjhdDDnJxKfe7bvzZrvMEX+bVO0Elcw==} 3025 resolution: {integrity: sha512-BzVRHcCtFepjS9WcqRjqoIxLqgpK21a8J4Zi4msSGxDxiXVO1IbcqT1KjhdDDnJxKfe7bvzZrvMEX+bVO0Elcw==}
2731 hasBin: true 3026 hasBin: true
2732 requiresBuild: true 3027 requiresBuild: true
2733 dev: true 3028 dev: true
2734 3029
2735 - /esbuild@0.14.43:  
2736 - resolution: {integrity: sha512-Uf94+kQmy/5jsFwKWiQB4hfo/RkM9Dh7b79p8yqd1tshULdr25G2szLz631NoH3s2ujnKEKVD16RmOxvCNKRFA==} 3030 + /esbuild@0.17.19:
  3031 + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
2737 engines: {node: '>=12'} 3032 engines: {node: '>=12'}
2738 hasBin: true 3033 hasBin: true
2739 requiresBuild: true 3034 requiresBuild: true
2740 optionalDependencies: 3035 optionalDependencies:
2741 - esbuild-android-64: 0.14.43  
2742 - esbuild-android-arm64: 0.14.43  
2743 - esbuild-darwin-64: 0.14.43  
2744 - esbuild-darwin-arm64: 0.14.43  
2745 - esbuild-freebsd-64: 0.14.43  
2746 - esbuild-freebsd-arm64: 0.14.43  
2747 - esbuild-linux-32: 0.14.43  
2748 - esbuild-linux-64: 0.14.43  
2749 - esbuild-linux-arm: 0.14.43  
2750 - esbuild-linux-arm64: 0.14.43  
2751 - esbuild-linux-mips64le: 0.14.43  
2752 - esbuild-linux-ppc64le: 0.14.43  
2753 - esbuild-linux-riscv64: 0.14.43  
2754 - esbuild-linux-s390x: 0.14.43  
2755 - esbuild-netbsd-64: 0.14.43  
2756 - esbuild-openbsd-64: 0.14.43  
2757 - esbuild-sunos-64: 0.14.43  
2758 - esbuild-windows-32: 0.14.43  
2759 - esbuild-windows-64: 0.14.43  
2760 - esbuild-windows-arm64: 0.14.43 3036 + '@esbuild/android-arm': 0.17.19
  3037 + '@esbuild/android-arm64': 0.17.19
  3038 + '@esbuild/android-x64': 0.17.19
  3039 + '@esbuild/darwin-arm64': 0.17.19
  3040 + '@esbuild/darwin-x64': 0.17.19
  3041 + '@esbuild/freebsd-arm64': 0.17.19
  3042 + '@esbuild/freebsd-x64': 0.17.19
  3043 + '@esbuild/linux-arm': 0.17.19
  3044 + '@esbuild/linux-arm64': 0.17.19
  3045 + '@esbuild/linux-ia32': 0.17.19
  3046 + '@esbuild/linux-loong64': 0.17.19
  3047 + '@esbuild/linux-mips64el': 0.17.19
  3048 + '@esbuild/linux-ppc64': 0.17.19
  3049 + '@esbuild/linux-riscv64': 0.17.19
  3050 + '@esbuild/linux-s390x': 0.17.19
  3051 + '@esbuild/linux-x64': 0.17.19
  3052 + '@esbuild/netbsd-x64': 0.17.19
  3053 + '@esbuild/openbsd-x64': 0.17.19
  3054 + '@esbuild/sunos-x64': 0.17.19
  3055 + '@esbuild/win32-arm64': 0.17.19
  3056 + '@esbuild/win32-ia32': 0.17.19
  3057 + '@esbuild/win32-x64': 0.17.19
2761 dev: true 3058 dev: true
2762 3059
2763 /escalade@3.1.1: 3060 /escalade@3.1.1:
@@ -3469,10 +3766,6 @@ packages: @@ -3469,10 +3766,6 @@ packages:
3469 dependencies: 3766 dependencies:
3470 function-bind: 1.1.1 3767 function-bind: 1.1.1
3471 3768
3472 - /hash-sum@2.0.0:  
3473 - resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==}  
3474 - dev: true  
3475 -  
3476 /he@1.2.0: 3769 /he@1.2.0:
3477 resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 3770 resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
3478 hasBin: true 3771 hasBin: true
@@ -3928,6 +4221,12 @@ packages: @@ -3928,6 +4221,12 @@ packages:
3928 hasBin: true 4221 hasBin: true
3929 dev: true 4222 dev: true
3930 4223
  4224 + /json5@2.2.3:
  4225 + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
  4226 + engines: {node: '>=6'}
  4227 + hasBin: true
  4228 + dev: true
  4229 +
3931 /jsonfile@6.1.0: 4230 /jsonfile@6.1.0:
3932 resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 4231 resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
3933 dependencies: 4232 dependencies:
@@ -4053,6 +4352,12 @@ packages: @@ -4053,6 +4352,12 @@ packages:
4053 tslib: 2.4.0 4352 tslib: 2.4.0
4054 dev: true 4353 dev: true
4055 4354
  4355 + /lru-cache@5.1.1:
  4356 + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
  4357 + dependencies:
  4358 + yallist: 3.1.1
  4359 + dev: true
  4360 +
4056 /lru-cache@6.0.0: 4361 /lru-cache@6.0.0:
4057 resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 4362 resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
4058 engines: {node: '>=10'} 4363 engines: {node: '>=10'}
@@ -4185,6 +4490,10 @@ packages: @@ -4185,6 +4490,10 @@ packages:
4185 resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} 4490 resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
4186 dev: true 4491 dev: true
4187 4492
  4493 + /mitt@3.0.0:
  4494 + resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==}
  4495 + dev: false
  4496 +
4188 /mkdirp@1.0.4: 4497 /mkdirp@1.0.4:
4189 resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 4498 resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
4190 engines: {node: '>=10'} 4499 engines: {node: '>=10'}
@@ -4267,6 +4576,12 @@ packages: @@ -4267,6 +4576,12 @@ packages:
4267 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 4576 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
4268 hasBin: true 4577 hasBin: true
4269 4578
  4579 + /nanoid@3.3.6:
  4580 + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
  4581 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
  4582 + hasBin: true
  4583 + dev: true
  4584 +
4270 /natural-compare@1.4.0: 4585 /natural-compare@1.4.0:
4271 resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 4586 resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
4272 dev: true 4587 dev: true
@@ -4308,6 +4623,10 @@ packages: @@ -4308,6 +4623,10 @@ packages:
4308 upper-case: 2.0.2 4623 upper-case: 2.0.2
4309 dev: true 4624 dev: true
4310 4625
  4626 + /node-releases@2.0.12:
  4627 + resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==}
  4628 + dev: true
  4629 +
4311 /node-releases@2.0.5: 4630 /node-releases@2.0.5:
4312 resolution: {integrity: sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==} 4631 resolution: {integrity: sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==}
4313 dev: true 4632 dev: true
@@ -4697,6 +5016,15 @@ packages: @@ -4697,6 +5016,15 @@ packages:
4697 picocolors: 1.0.0 5016 picocolors: 1.0.0
4698 source-map-js: 1.0.2 5017 source-map-js: 1.0.2
4699 5018
  5019 + /postcss@8.4.24:
  5020 + resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==}
  5021 + engines: {node: ^10 || ^12 || >=14}
  5022 + dependencies:
  5023 + nanoid: 3.3.6
  5024 + picocolors: 1.0.0
  5025 + source-map-js: 1.0.2
  5026 + dev: true
  5027 +
4700 /prelude-ls@1.2.1: 5028 /prelude-ls@1.2.1:
4701 resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 5029 resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
4702 engines: {node: '>= 0.8.0'} 5030 engines: {node: '>= 0.8.0'}
@@ -4904,6 +5232,14 @@ packages: @@ -4904,6 +5232,14 @@ packages:
4904 fsevents: 2.3.2 5232 fsevents: 2.3.2
4905 dev: true 5233 dev: true
4906 5234
  5235 + /rollup@3.24.0:
  5236 + resolution: {integrity: sha512-OgraHOIg2YpHQTjl0/ymWfFNBEyPucB7lmhXrQUh38qNOegxLapSPFs9sNr0qKR75awW41D93XafoR2QfhBdUQ==}
  5237 + engines: {node: '>=14.18.0', npm: '>=8.0.0'}
  5238 + hasBin: true
  5239 + optionalDependencies:
  5240 + fsevents: 2.3.2
  5241 + dev: true
  5242 +
4907 /run-async@2.4.1: 5243 /run-async@2.4.1:
4908 resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} 5244 resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
4909 engines: {node: '>=0.12.0'} 5245 engines: {node: '>=0.12.0'}
@@ -5294,6 +5630,10 @@ packages: @@ -5294,6 +5630,10 @@ packages:
5294 resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 5630 resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
5295 dev: true 5631 dev: true
5296 5632
  5633 + /three@0.143.0:
  5634 + resolution: {integrity: sha512-oKcAGYHhJ46TGEuHjodo2n6TY2R6lbvrkp+feKZxqsUL/WkH7GKKaeu6RHeyb2Xjfk2dPLRKLsOP0KM2VgT8Zg==}
  5635 + dev: false
  5636 +
5297 /three@0.145.0: 5637 /three@0.145.0:
5298 resolution: {integrity: sha512-EKoHQEtEJ4CB6b2BGMBgLZrfwLjXcSUfoI/MiIXUuRpeYsfK5aPWbYhdtIVWOH+x6X0TouldHKHBuc/LAiFzAw==} 5638 resolution: {integrity: sha512-EKoHQEtEJ4CB6b2BGMBgLZrfwLjXcSUfoI/MiIXUuRpeYsfK5aPWbYhdtIVWOH+x6X0TouldHKHBuc/LAiFzAw==}
5299 dev: false 5639 dev: false
@@ -5477,6 +5817,17 @@ packages: @@ -5477,6 +5817,17 @@ packages:
5477 engines: {node: '>= 0.8'} 5817 engines: {node: '>= 0.8'}
5478 dev: true 5818 dev: true
5479 5819
  5820 + /update-browserslist-db@1.0.11(browserslist@4.21.7):
  5821 + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
  5822 + hasBin: true
  5823 + peerDependencies:
  5824 + browserslist: '>= 4.21.0'
  5825 + dependencies:
  5826 + browserslist: 4.21.7
  5827 + escalade: 3.1.1
  5828 + picocolors: 1.0.0
  5829 + dev: true
  5830 +
5480 /upper-case-first@2.0.2: 5831 /upper-case-first@2.0.2:
5481 resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} 5832 resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==}
5482 dependencies: 5833 dependencies:
@@ -5571,7 +5922,7 @@ packages: @@ -5571,7 +5922,7 @@ packages:
5571 global: 4.4.0 5922 global: 4.4.0
5572 dev: false 5923 dev: false
5573 5924
5574 - /vite-plugin-compression@0.5.1(vite@2.9.9): 5925 + /vite-plugin-compression@0.5.1(vite@4.3.6):
5575 resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} 5926 resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
5576 peerDependencies: 5927 peerDependencies:
5577 vite: '>=2.0.0' 5928 vite: '>=2.0.0'
@@ -5579,12 +5930,12 @@ packages: @@ -5579,12 +5930,12 @@ packages:
5579 chalk: 4.1.2 5930 chalk: 4.1.2
5580 debug: 4.3.4 5931 debug: 4.3.4
5581 fs-extra: 10.1.0 5932 fs-extra: 10.1.0
5582 - vite: 2.9.9(sass@1.52.3) 5933 + vite: 4.3.6(@types/node@16.11.40)(sass@1.52.3)
5583 transitivePeerDependencies: 5934 transitivePeerDependencies:
5584 - supports-color 5935 - supports-color
5585 dev: true 5936 dev: true
5586 5937
5587 - /vite-plugin-html@3.2.0(vite@2.9.9): 5938 + /vite-plugin-html@3.2.0(vite@4.3.6):
5588 resolution: {integrity: sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==} 5939 resolution: {integrity: sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==}
5589 peerDependencies: 5940 peerDependencies:
5590 vite: '>=2.0.0' 5941 vite: '>=2.0.0'
@@ -5601,7 +5952,7 @@ packages: @@ -5601,7 +5952,7 @@ packages:
5601 html-minifier-terser: 6.1.0 5952 html-minifier-terser: 6.1.0
5602 node-html-parser: 5.4.2 5953 node-html-parser: 5.4.2
5603 pathe: 0.2.0 5954 pathe: 0.2.0
5604 - vite: 2.9.9(sass@1.52.3) 5955 + vite: 4.3.6(@types/node@16.11.40)(sass@1.52.3)
5605 dev: true 5956 dev: true
5606 5957
5607 /vite-plugin-importer@0.2.5: 5958 /vite-plugin-importer@0.2.5:
@@ -5614,7 +5965,7 @@ packages: @@ -5614,7 +5965,7 @@ packages:
5614 - supports-color 5965 - supports-color
5615 dev: true 5966 dev: true
5616 5967
5617 - /vite-plugin-mock@2.9.6(mockjs@1.1.0)(rollup@2.75.6)(vite@2.9.9): 5968 + /vite-plugin-mock@2.9.6(mockjs@1.1.0)(rollup@2.75.6)(vite@4.3.6):
5618 resolution: {integrity: sha512-/Rm59oPppe/ncbkSrUuAxIQihlI2YcBmnbR4ST1RA2VzM1C0tEQc1KlbQvnUGhXECAGTaQN2JyasiwXP6EtKgg==} 5969 resolution: {integrity: sha512-/Rm59oPppe/ncbkSrUuAxIQihlI2YcBmnbR4ST1RA2VzM1C0tEQc1KlbQvnUGhXECAGTaQN2JyasiwXP6EtKgg==}
5619 engines: {node: '>=12.0.0'} 5970 engines: {node: '>=12.0.0'}
5620 peerDependencies: 5971 peerDependencies:
@@ -5631,7 +5982,7 @@ packages: @@ -5631,7 +5982,7 @@ packages:
5631 fast-glob: 3.2.11 5982 fast-glob: 3.2.11
5632 mockjs: 1.1.0 5983 mockjs: 1.1.0
5633 path-to-regexp: 6.2.1 5984 path-to-regexp: 6.2.1
5634 - vite: 2.9.9(sass@1.52.3) 5985 + vite: 4.3.6(@types/node@16.11.40)(sass@1.52.3)
5635 transitivePeerDependencies: 5986 transitivePeerDependencies:
5636 - rollup 5987 - rollup
5637 - supports-color 5988 - supports-color
@@ -5645,26 +5996,35 @@ packages: @@ -5645,26 +5996,35 @@ packages:
5645 monaco-editor: 0.33.0 5996 monaco-editor: 0.33.0
5646 dev: true 5997 dev: true
5647 5998
5648 - /vite@2.9.9(sass@1.52.3):  
5649 - resolution: {integrity: sha512-ffaam+NgHfbEmfw/Vuh6BHKKlI/XIAhxE5QSS7gFLIngxg171mg1P3a4LSRME0z2ZU1ScxoKzphkipcYwSD5Ew==}  
5650 - engines: {node: '>=12.2.0'} 5999 + /vite@4.3.6(@types/node@16.11.40)(sass@1.52.3):
  6000 + resolution: {integrity: sha512-cqIyLSbA6gornMS659AXTVKF7cvSHMdKmJJwQ9DXq3lwsT1uZSdktuBRlpHQ8VnOWx0QHtjDwxPpGtyo9Fh/Qg==}
  6001 + engines: {node: ^14.18.0 || >=16.0.0}
5651 hasBin: true 6002 hasBin: true
5652 peerDependencies: 6003 peerDependencies:
  6004 + '@types/node': '>= 14'
5653 less: '*' 6005 less: '*'
5654 sass: '*' 6006 sass: '*'
5655 stylus: '*' 6007 stylus: '*'
  6008 + sugarss: '*'
  6009 + terser: ^5.4.0
5656 peerDependenciesMeta: 6010 peerDependenciesMeta:
  6011 + '@types/node':
  6012 + optional: true
5657 less: 6013 less:
5658 optional: true 6014 optional: true
5659 sass: 6015 sass:
5660 optional: true 6016 optional: true
5661 stylus: 6017 stylus:
5662 optional: true 6018 optional: true
  6019 + sugarss:
  6020 + optional: true
  6021 + terser:
  6022 + optional: true
5663 dependencies: 6023 dependencies:
5664 - esbuild: 0.14.43  
5665 - postcss: 8.4.14  
5666 - resolve: 1.22.0  
5667 - rollup: 2.75.6 6024 + '@types/node': 16.11.40
  6025 + esbuild: 0.17.19
  6026 + postcss: 8.4.24
  6027 + rollup: 3.24.0
5668 sass: 1.52.3 6028 sass: 1.52.3
5669 optionalDependencies: 6029 optionalDependencies:
5670 fsevents: 2.3.2 6030 fsevents: 2.3.2
@@ -5679,6 +6039,14 @@ packages: @@ -5679,6 +6039,14 @@ packages:
5679 vue: 3.2.37 6039 vue: 3.2.37
5680 dev: false 6040 dev: false
5681 6041
  6042 + /vue-3d-loader@2.1.7:
  6043 + resolution: {integrity: sha512-nOwCfxs7r5u4rvb5ir1TecUG9kHnwVYRhjwvuXnSbmIh+8v5+UG90YzXWMjRX5qu9EYqJrIUAJyzE+6SRfamcw==}
  6044 + dependencies:
  6045 + '@types/three': 0.143.2
  6046 + three: 0.143.0
  6047 + vue: 3.2.37
  6048 + dev: false
  6049 +
5682 /vue-demi@0.12.5(vue@3.2.37): 6050 /vue-demi@0.12.5(vue@3.2.37):
5683 resolution: {integrity: sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==} 6051 resolution: {integrity: sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==}
5684 engines: {node: '>=12'} 6052 engines: {node: '>=12'}
@@ -5870,7 +6238,7 @@ packages: @@ -5870,7 +6238,7 @@ packages:
5870 '@webassemblyjs/wasm-parser': 1.11.1 6238 '@webassemblyjs/wasm-parser': 1.11.1
5871 acorn: 8.7.1 6239 acorn: 8.7.1
5872 acorn-import-assertions: 1.8.0(acorn@8.7.1) 6240 acorn-import-assertions: 1.8.0(acorn@8.7.1)
5873 - browserslist: 4.20.4 6241 + browserslist: 4.21.7
5874 chrome-trace-event: 1.0.3 6242 chrome-trace-event: 1.0.3
5875 enhanced-resolve: 5.12.0 6243 enhanced-resolve: 5.12.0
5876 es-module-lexer: 0.9.3 6244 es-module-lexer: 0.9.3
@@ -5945,6 +6313,10 @@ packages: @@ -5945,6 +6313,10 @@ packages:
5945 engines: {node: '>=10'} 6313 engines: {node: '>=10'}
5946 dev: true 6314 dev: true
5947 6315
  6316 + /yallist@3.1.1:
  6317 + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
  6318 + dev: true
  6319 +
5948 /yallist@4.0.0: 6320 /yallist@4.0.0:
5949 resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 6321 resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
5950 dev: true 6322 dev: true
  1 +{
  2 + "nodes": [
  3 + {
  4 + "id": "0",
  5 + "name": "Myriel",
  6 + "symbolSize": "@integer(0, 50)",
  7 + "x": -266.82776,
  8 + "y": 299.6904,
  9 + "value": "@integer(0, 50)",
  10 + "category": 3
  11 + },
  12 + {
  13 + "id": "1",
  14 + "name": "Napoleon",
  15 + "symbolSize": "@integer(0, 50)",
  16 + "x": -418.08344,
  17 + "y": 446.8853,
  18 + "value": "@integer(0, 50)",
  19 + "category": 5
  20 + },
  21 + {
  22 + "id": "2",
  23 + "name": "MlleBaptistine",
  24 + "symbolSize": "@integer(0, 50)",
  25 + "x": -212.76357,
  26 + "y": 245.29176,
  27 + "value": "@integer(0, 50)",
  28 + "category": 1
  29 + },
  30 + {
  31 + "id": "3",
  32 + "name": "MmeMagloire",
  33 + "symbolSize": "@integer(0, 50)",
  34 + "x": -242.82404,
  35 + "y": 235.26283,
  36 + "value": "@integer(0, 50)",
  37 + "category": 1
  38 + },
  39 + {
  40 + "id": "4",
  41 + "name": "CountessDeLo",
  42 + "symbolSize": "@integer(0, 50)",
  43 + "x": -379.30386,
  44 + "y": 429.06424,
  45 + "value": "@integer(0, 50)",
  46 + "category": 0
  47 + }
  48 + ],
  49 + "links": [
  50 + {
  51 + "source": "1",
  52 + "target": "@integer(2, 4)"
  53 + },
  54 + {
  55 + "source": "2",
  56 + "target": "@integer(3, 4)"
  57 + },
  58 + {
  59 + "source": "3",
  60 + "target": "@integer(0, 2)"
  61 + },
  62 + {
  63 + "source": "3",
  64 + "target": "@integer(0, 1)"
  65 + },
  66 + {
  67 + "source": "4",
  68 + "target": "@integer(0, 3)"
  69 + }
  70 + ],
  71 + "categories": [
  72 + {
  73 + "name": "A"
  74 + },
  75 + {
  76 + "name": "B"
  77 + },
  78 + {
  79 + "name": "C"
  80 + },
  81 + {
  82 + "name": "D"
  83 + },
  84 + {
  85 + "name": "E"
  86 + },
  87 + {
  88 + "name": "F"
  89 + },
  90 + {
  91 + "name": "G"
  92 + },
  93 + {
  94 + "name": "H"
  95 + },
  96 + {
  97 + "name": "I"
  98 + }
  99 + ]
  100 + }
@@ -19,6 +19,8 @@ export const capsuleUrl = '/mock/capsule' @@ -19,6 +19,8 @@ export const capsuleUrl = '/mock/capsule'
19 export const wordCloudUrl = '/mock/wordCloud' 19 export const wordCloudUrl = '/mock/wordCloud'
20 export const treemapUrl = '/mock/treemap' 20 export const treemapUrl = '/mock/treemap'
21 export const threeEarth01Url = '/mock/threeEarth01Data' 21 export const threeEarth01Url = '/mock/threeEarth01Data'
  22 +export const sankeyUrl = '/mock/sankey'
  23 +export const graphUrl = '/mock/graphData'
22 24
23 const mockObject: MockMethod[] = [ 25 const mockObject: MockMethod[] = [
24 { 26 {
@@ -103,6 +105,16 @@ const mockObject: MockMethod[] = [ @@ -103,6 +105,16 @@ const mockObject: MockMethod[] = [
103 method: RequestHttpEnum.GET, 105 method: RequestHttpEnum.GET,
104 response: () => test.threeEarth01Data 106 response: () => test.threeEarth01Data
105 }, 107 },
  108 + {
  109 + url: sankeyUrl,
  110 + method: RequestHttpEnum.GET,
  111 + response: () => test.fetchSankey
  112 + },
  113 + {
  114 + url: graphUrl,
  115 + method: RequestHttpEnum.GET,
  116 + response: () => test.graphData
  117 + },
106 ] 118 ]
107 119
108 export default mockObject 120 export default mockObject
  1 +{
  2 + "label": [
  3 + {
  4 + "name": "a"
  5 + },
  6 + {
  7 + "name": "b"
  8 + },
  9 + {
  10 + "name": "a1"
  11 + },
  12 + {
  13 + "name": "a2"
  14 + },
  15 + {
  16 + "name": "b1"
  17 + },
  18 + {
  19 + "name": "b2"
  20 + }
  21 + ],
  22 + "links": [
  23 + {
  24 + "source": "a",
  25 + "target": "a1",
  26 + "value": "@integer(0, 10)"
  27 + },
  28 + {
  29 + "source": "a",
  30 + "target": "a2",
  31 + "value": "@integer(0, 10)"
  32 + },
  33 + {
  34 + "source": "b",
  35 + "target": "b1",
  36 + "value": "@integer(0, 10)"
  37 + },
  38 + {
  39 + "source": "a",
  40 + "target": "b1",
  41 + "value": "@integer(0, 10)"
  42 + },
  43 + {
  44 + "source": "b1",
  45 + "target": "a1",
  46 + "value": "@integer(0, 10)"
  47 + },
  48 + {
  49 + "source": "b1",
  50 + "target": "b2",
  51 + "value": "@integer(0, 10)"
  52 + }
  53 + ],
  54 + "levels": [
  55 + {
  56 + "depth": 0,
  57 + "itemStyle": {
  58 + "color": "#decbe4"
  59 + },
  60 + "lineStyle": {
  61 + "color": "source",
  62 + "opacity": 0.9
  63 + }
  64 + },
  65 + {
  66 + "depth": 1,
  67 + "itemStyle": {
  68 + "color": "#b3cde3"
  69 + },
  70 + "lineStyle": {
  71 + "color": "source",
  72 + "opacity": 0.6
  73 + }
  74 + },
  75 + {
  76 + "depth": 2,
  77 + "itemStyle": {
  78 + "color": "#ccebc5"
  79 + },
  80 + "lineStyle": {
  81 + "color": "source",
  82 + "opacity": 0.6
  83 + }
  84 + }
  85 + ]
  86 +}
@@ -2,6 +2,8 @@ import heatmapJson from './heatMapData.json' @@ -2,6 +2,8 @@ import heatmapJson from './heatMapData.json'
2 import scatterJson from './scatter.json' 2 import scatterJson from './scatter.json'
3 import mapJson from './map.json' 3 import mapJson from './map.json'
4 import tTreemapJson from './treemap.json' 4 import tTreemapJson from './treemap.json'
  5 +import sankeyJson from './sankey.json'
  6 +import graphDataJson from './graph.json'
5 7
6 export default { 8 export default {
7 // 单图表 9 // 单图表
@@ -219,5 +221,19 @@ export default { @@ -219,5 +221,19 @@ export default {
219 'endArray|10': [{ name: '@name', N: '@integer(10, 100)', E: '@integer(10, 100)' }] 221 'endArray|10': [{ name: '@name', N: '@integer(10, 100)', E: '@integer(10, 100)' }]
220 } 222 }
221 ] 223 ]
222 - } 224 + },
  225 + // 桑基图
  226 + fetchSankey: {
  227 + code: 0,
  228 + status: 200,
  229 + msg: '请求成功',
  230 + data: sankeyJson
  231 + },
  232 + // 关系图
  233 + graphData: {
  234 + code: 0,
  235 + status: 200,
  236 + msg: '请求成功',
  237 + data: graphDataJson
  238 + },
223 } 239 }
@@ -35,7 +35,11 @@ import Person from './person.png' @@ -35,7 +35,11 @@ import Person from './person.png'
35 35
36 import { icon } from '@/plugins' 36 import { icon } from '@/plugins'
37 import { useUserStore } from '@/store/external/modules/user' 37 import { useUserStore } from '@/store/external/modules/user'
38 -const { ChatboxEllipsesIcon, PersonIcon, LogOutOutlineIcon, SettingsSharpIcon } = icon.ionicons5 38 +const {
  39 + PersonIcon,
  40 + LogOutOutlineIcon,
  41 + SettingsSharpIcon
  42 +} = icon.ionicons5
39 43
40 const t = window['$t'] 44 const t = window['$t']
41 45
@@ -257,9 +257,36 @@ @@ -257,9 +257,36 @@
257 <n-switch v-model:value="legend.show" size="small"></n-switch> 257 <n-switch v-model:value="legend.show" size="small"></n-switch>
258 </template> 258 </template>
259 <setting-item-box name="图例文字"> 259 <setting-item-box name="图例文字">
260 - <setting-item> 260 + <setting-item name="颜色">
261 <n-color-picker size="small" v-model:value="legend.textStyle.color"></n-color-picker> 261 <n-color-picker size="small" v-model:value="legend.textStyle.color"></n-color-picker>
262 </setting-item> 262 </setting-item>
  263 + <setting-item name="大小">
  264 + <n-input-number v-model:value="legend.textStyle.fontSize" :min="1" size="small"></n-input-number>
  265 + </setting-item>
  266 + </setting-item-box>
  267 + <setting-item-box name="图例位置">
  268 + <setting-item name="x轴">
  269 + <n-select v-model:value="legend.x" size="small" :options="legendConfig.lengendX" />
  270 + </setting-item>
  271 + <setting-item name="y轴">
  272 + <n-select v-model:value="legend.y" size="small" :options="legendConfig.lengendY" />
  273 + </setting-item>
  274 + </setting-item-box>
  275 + <setting-item-box name="图例信息">
  276 + <setting-item name="方向">
  277 + <n-select v-model:value="legend.orient" size="small" :options="legendConfig.orient" />
  278 + </setting-item>
  279 + <setting-item name="形状">
  280 + <n-select v-model:value="legend.icon" size="small" :options="legendConfig.shape" />
  281 + </setting-item>
  282 + </setting-item-box>
  283 + <setting-item-box name="图例大小">
  284 + <setting-item name="宽">
  285 + <n-input-number v-model:value="legend.itemWidth" :min="1" size="small"></n-input-number>
  286 + </setting-item>
  287 + <setting-item name="高">
  288 + <n-input-number v-model:value="legend.itemHeight" :min="1" size="small"></n-input-number>
  289 + </setting-item>
263 </setting-item-box> 290 </setting-item-box>
264 </collapse-item> 291 </collapse-item>
265 292
@@ -309,9 +336,9 @@ @@ -309,9 +336,9 @@
309 </template> 336 </template>
310 337
311 <script setup lang="ts"> 338 <script setup lang="ts">
312 -import { PropType, computed } from 'vue' 339 +import { PropType, computed, watch } from 'vue'
313 import { GlobalThemeJsonType } from '@/settings/chartThemes/index' 340 import { GlobalThemeJsonType } from '@/settings/chartThemes/index'
314 -import { axisConfig } from '@/packages/chartConfiguration/echarts/index' 341 +import { axisConfig, legendConfig } from '@/packages/chartConfiguration/echarts/index'
315 import { CollapseItem, SettingItemBox, SettingItem, GlobalSettingPosition } from '@/components/Pages/ChartItemSetting' 342 import { CollapseItem, SettingItemBox, SettingItem, GlobalSettingPosition } from '@/components/Pages/ChartItemSetting'
316 import { icon } from '@/plugins' 343 import { icon } from '@/plugins'
317 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' 344 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
@@ -360,4 +387,14 @@ const grid = computed(() => { @@ -360,4 +387,14 @@ const grid = computed(() => {
360 const visualMap = computed(() => { 387 const visualMap = computed(() => {
361 return props.optionData.visualMap 388 return props.optionData.visualMap
362 }) 389 })
  390 +
  391 +// 监听legend color颜色改变type = scroll的颜色
  392 +watch(() => legend.value && legend.value.textStyle.color, (newVal) => {
  393 + if (legend.value && newVal) {
  394 + legend.value.pageTextStyle.color = newVal
  395 + }
  396 +}, {
  397 + immediate: true,
  398 + deep: true,
  399 +})
363 </script> 400 </script>
1 <template> 1 <template>
2 - <div class="go-Flipper" :class="[flipType, { go: isFlipping }]"> 2 + <div class="go-flipper" :class="[flipType, { go: isFlipping }]">
3 <div class="digital front" :data-front="frontTextFromData"></div> 3 <div class="digital front" :data-front="frontTextFromData"></div>
4 <div class="digital back" :data-back="backTextFromData"></div> 4 <div class="digital back" :data-back="backTextFromData"></div>
5 </div> 5 </div>
6 </template> 6 </template>
7 7
8 <script lang="ts" setup> 8 <script lang="ts" setup>
9 -import { ref, PropType, watch } from 'vue'  
10 -import { FlipType } from './index' 9 +import { ref, PropType, watch, nextTick } from 'vue'
  10 +import { FlipType } from './index'
11 11
12 const props = defineProps({ 12 const props = defineProps({
13 flipType: { 13 flipType: {
@@ -43,6 +43,10 @@ const props = defineProps({ @@ -43,6 +43,10 @@ const props = defineProps({
43 backColor: { 43 backColor: {
44 type: String, 44 type: String,
45 default: '#000000' 45 default: '#000000'
  46 + },
  47 + borderWidth: {
  48 + type: Number,
  49 + default: 2
46 } 50 }
47 }) 51 })
48 52
@@ -50,19 +54,27 @@ const isFlipping = ref(false) @@ -50,19 +54,27 @@ const isFlipping = ref(false)
50 const frontTextFromData = ref(props.count || 0) 54 const frontTextFromData = ref(props.count || 0)
51 const backTextFromData = ref(props.count || 0) 55 const backTextFromData = ref(props.count || 0)
52 56
  57 +let timeoutID: any = 0
  58 +
53 // 翻牌 59 // 翻牌
54 -const flip = (front: string | number, back: string | number) => { 60 +const flip = async (front: string | number, back: string | number) => {
55 // 如果处于翻转中,则不执行 61 // 如果处于翻转中,则不执行
56 - if (isFlipping.value) return 62 + if (isFlipping.value) {
  63 + isFlipping.value = false // 立即结束此次动画
  64 + clearTimeout(timeoutID) // 清除上一个计时器任务
  65 + await nextTick()
  66 + await flip(front, back) // 开始最后一次翻牌任务
  67 + return
  68 + }
  69 +
57 // 设置翻盘前后数据 70 // 设置翻盘前后数据
58 backTextFromData.value = back 71 backTextFromData.value = back
59 frontTextFromData.value = front 72 frontTextFromData.value = front
60 -  
61 // 设置翻转状态为true 73 // 设置翻转状态为true
62 isFlipping.value = true 74 isFlipping.value = true
63 75
64 // 翻牌结束的行为 76 // 翻牌结束的行为
65 - setTimeout(() => { 77 + timeoutID = setTimeout(() => {
66 isFlipping.value = false // 设置翻转状态为false 78 isFlipping.value = false // 设置翻转状态为false
67 frontTextFromData.value = back 79 frontTextFromData.value = back
68 }, props.duration) 80 }, props.duration)
@@ -86,6 +98,7 @@ $radius: v-bind('`${props.radius}px`'); @@ -86,6 +98,7 @@ $radius: v-bind('`${props.radius}px`');
86 $width: v-bind('`${props.width}px`'); 98 $width: v-bind('`${props.width}px`');
87 $height: v-bind('`${props.height}px`'); 99 $height: v-bind('`${props.height}px`');
88 $perspective: v-bind('`${props.height * 2}px`'); 100 $perspective: v-bind('`${props.height * 2}px`');
  101 +$borderWidth: v-bind('`${props.borderWidth * 2}px`');
89 $speed: v-bind('`${props.duration / 1000}s`'); 102 $speed: v-bind('`${props.duration / 1000}s`');
90 $shadowColor: #000000; 103 $shadowColor: #000000;
91 $lineColor: #4a9ef8; 104 $lineColor: #4a9ef8;
@@ -125,13 +138,12 @@ $lineColor: #4a9ef8; @@ -125,13 +138,12 @@ $lineColor: #4a9ef8;
125 } 138 }
126 // #endregion 139 // #endregion
127 140
128 -.go-Flipper { 141 +.go-flipper {
129 display: inline-block; 142 display: inline-block;
130 position: relative; 143 position: relative;
131 width: $width; 144 width: $width;
132 height: $height; 145 height: $height;
133 line-height: $height; 146 line-height: $height;
134 - border: solid 1px $backColor;  
135 border-radius: $radius; 147 border-radius: $radius;
136 background: $frontColor; 148 background: $frontColor;
137 font-size: $width; 149 font-size: $width;
@@ -139,6 +151,17 @@ $lineColor: #4a9ef8; @@ -139,6 +151,17 @@ $lineColor: #4a9ef8;
139 box-shadow: 0 0 6px rgba($color: $shadowColor, $alpha: 0.5); // 阴影部分 151 box-shadow: 0 0 6px rgba($color: $shadowColor, $alpha: 0.5); // 阴影部分
140 text-align: center; 152 text-align: center;
141 // font-family: 'Helvetica Neue'; 153 // font-family: 'Helvetica Neue';
  154 + &::after {
  155 + content: '';
  156 + position: absolute;
  157 + z-index: 10;
  158 + left: 0;
  159 + top: 0;
  160 + right: 0;
  161 + bottom: 0;
  162 + box-shadow: inset 0 0 $borderWidth 0 $frontColor; // 内测阴影部分
  163 + border-radius: $radius;
  164 + }
142 165
143 .digital:before, 166 .digital:before,
144 .digital:after { 167 .digital:after {
@@ -191,6 +214,8 @@ $lineColor: #4a9ef8; @@ -191,6 +214,8 @@ $lineColor: #4a9ef8;
191 } 214 }
192 &.down.go .back:after { 215 &.down.go .back:after {
193 animation: backFlipDown $speed ease-in-out both; 216 animation: backFlipDown $speed ease-in-out both;
  217 + box-shadow: 0 2px $borderWidth 0 $frontColor;
  218 + backface-visibility: hidden;
194 } 219 }
195 /*向上翻*/ 220 /*向上翻*/
196 &.up .front:after { 221 &.up .front:after {
@@ -213,6 +238,8 @@ $lineColor: #4a9ef8; @@ -213,6 +238,8 @@ $lineColor: #4a9ef8;
213 } 238 }
214 &.up.go .back:before { 239 &.up.go .back:before {
215 animation: backFlipUp $speed ease-in-out both; 240 animation: backFlipUp $speed ease-in-out both;
  241 + box-shadow: 0 -2px $borderWidth 0 $frontColor;
  242 + backface-visibility: hidden;
216 } 243 }
217 } 244 }
218 </style> 245 </style>
@@ -12,6 +12,7 @@ export enum DragKeyEnum { @@ -12,6 +12,7 @@ export enum DragKeyEnum {
12 // 不同页面保存操作 12 // 不同页面保存操作
13 export enum SavePageEnum { 13 export enum SavePageEnum {
14 CHART = 'SaveChart', 14 CHART = 'SaveChart',
  15 + CHART_TO_PREVIEW = 'ChartToPreview',
15 JSON = 'SaveJSON', 16 JSON = 'SaveJSON',
16 CLOSE = 'close' 17 CLOSE = 'close'
17 } 18 }
@@ -12,5 +12,7 @@ export enum StorageEnum { @@ -12,5 +12,7 @@ export enum StorageEnum {
12 // 工作台布局配置 12 // 工作台布局配置
13 GO_CHART_LAYOUT_STORE = 'GO_CHART_LAYOUT', 13 GO_CHART_LAYOUT_STORE = 'GO_CHART_LAYOUT',
14 // 工作台需要保存的数据 14 // 工作台需要保存的数据
15 - GO_CHART_STORAGE_LIST = 'GO_CHART_STORAGE_LIST' 15 + GO_CHART_STORAGE_LIST = 'GO_CHART_STORAGE_LIST',
  16 + // 用户存储的图片媒体
  17 + GO_USER_MEDIA_PHOTOS = 'GO_USER_MEDIA_PHOTOS'
16 } 18 }
@@ -80,10 +80,11 @@ export const originUseChartDataFetch = ( @@ -80,10 +80,11 @@ export const originUseChartDataFetch = (
80 if (res) { 80 if (res) {
81 try { 81 try {
82 const filter = targetComponent.filter 82 const filter = targetComponent.filter
83 - echartsUpdateHandle(newFunctionHandle(res?.data, res, filter)) 83 + const { data } = res
  84 + echartsUpdateHandle(newFunctionHandle(data, res, filter))
84 // 更新回调函数 85 // 更新回调函数
85 if (updateCallback) { 86 if (updateCallback) {
86 - updateCallback(newFunctionHandle(res?.data, res, filter)) 87 + updateCallback(newFunctionHandle(data, res, filter))
87 } 88 }
88 } catch (error) { 89 } catch (error) {
89 console.error(error) 90 console.error(error)
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 <router-view #default="{ Component, route }"> 2 <router-view #default="{ Component, route }">
3 <transition name="fade" mode="out-in" appear> 3 <transition name="fade" mode="out-in" appear>
4 <component 4 <component
5 - v-if="route.noKeepAlive" 5 + v-if="route.meta.noKeepAlive"
6 :is="Component" 6 :is="Component"
7 :key="route.fullPath" 7 :key="route.fullPath"
8 ></component> 8 ></component>
1 export * from './axis' 1 export * from './axis'
2 export * from './line' 2 export * from './line'
3 -export * from './label'  
  3 +export * from './label'
  4 +export * from './legend'
  1 +export const legendConfig = {
  2 + // X轴位置
  3 + lengendX: [
  4 + {
  5 + label: '靠左',
  6 + value: 'left'
  7 + },
  8 + {
  9 + label: '居中',
  10 + value: 'center'
  11 + },
  12 + {
  13 + label: '靠右',
  14 + value: 'right'
  15 + }
  16 + ],
  17 + // y轴位置
  18 + lengendY: [
  19 + {
  20 + label: '靠上',
  21 + value: 'top'
  22 + },
  23 + {
  24 + label: '居中',
  25 + value: 'center'
  26 + },
  27 + {
  28 + label: '靠下',
  29 + value: 'bottom'
  30 + }
  31 + ],
  32 + // 排列方向
  33 + orient: [
  34 + {
  35 + label: '水平',
  36 + value: 'horizontal'
  37 + },
  38 + {
  39 + label: '垂直',
  40 + value: 'vertical'
  41 + }
  42 + ],
  43 + // 形状
  44 + shape: [
  45 + {
  46 + label: '圆形',
  47 + value: 'circle'
  48 + },
  49 + {
  50 + label: '方形',
  51 + value: 'rect'
  52 + },
  53 + {
  54 + label: '圆角方形',
  55 + value: 'roundRect'
  56 + },
  57 + {
  58 + label: '三角形',
  59 + value: 'triangle'
  60 + },
  61 + {
  62 + label: '钢笔形',
  63 + value: 'pin'
  64 + },
  65 + {
  66 + label: '箭头形',
  67 + value: 'arrow'
  68 + }
  69 + ]
  70 +}
1 <template> 1 <template>
2 - <v-chart  
3 - ref="vChartRef"  
4 - :init-options="initOptions"  
5 - :theme="themeColor"  
6 - :option="option"  
7 - :manual-update="isPreview()" 2 + <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option" :manual-update="isPreview()"
8 :update-options="{ 3 :update-options="{
9 replaceMerge: replaceMergeArr 4 replaceMerge: replaceMergeArr
10 - }"  
11 - autoresize  
12 - ></v-chart> 5 + }" autoresize></v-chart>
13 </template> 6 </template>
14 7
15 <script setup lang="ts"> 8 <script setup lang="ts">
@@ -27,6 +20,7 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore @@ -27,6 +20,7 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore
27 import { isPreview } from '@/utils' 20 import { isPreview } from '@/utils'
28 import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components' 21 import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components'
29 import isObject from 'lodash/isObject' 22 import isObject from 'lodash/isObject'
  23 +import cloneDeep from 'lodash/cloneDeep'
30 24
31 const props = defineProps({ 25 const props = defineProps({
32 themeSetting: { 26 themeSetting: {
@@ -61,11 +55,23 @@ watch( @@ -61,11 +55,23 @@ watch(
61 if (!isObject(newData) || !('dimensions' in newData)) return 55 if (!isObject(newData) || !('dimensions' in newData)) return
62 if (Array.isArray(newData?.dimensions)) { 56 if (Array.isArray(newData?.dimensions)) {
63 const seriesArr = [] 57 const seriesArr = []
64 - for (let i = 0; i < newData.dimensions.length - 1; i++) {  
65 - seriesArr.push(seriesItem) 58 + // 对oldData进行判断,防止传入错误数据之后对旧维度判断产生干扰
  59 + // 此处计算的是dimensions的Y轴维度,若是dimensions.length为0或1,则默认为1,排除X轴维度干扰
  60 + const oldDimensions = Array.isArray(oldData?.dimensions)&&oldData.dimensions.length >= 1 ? oldData.dimensions.length : 1;
  61 + const newDimensions = newData.dimensions.length >= 1 ? newData.dimensions.length : 1;
  62 + const dimensionsGap = newDimensions - oldDimensions;
  63 + if (dimensionsGap < 0) {
  64 + props.chartConfig.option.series.splice(newDimensions - 1)
  65 + } else if (dimensionsGap > 0) {
  66 + if(!oldData || !oldData?.dimensions || !Array.isArray(oldData?.dimensions) || !oldData?.dimensions.length ) {
  67 + props.chartConfig.option.series=[]
  68 + }
  69 + for (let i = 0; i < dimensionsGap; i++) {
  70 + seriesArr.push(cloneDeep(seriesItem))
  71 + }
  72 + props.chartConfig.option.series.push(...seriesArr)
66 } 73 }
67 replaceMergeArr.value = ['series'] 74 replaceMergeArr.value = ['series']
68 - props.chartConfig.option.series = seriesArr  
69 nextTick(() => { 75 nextTick(() => {
70 replaceMergeArr.value = [] 76 replaceMergeArr.value = []
71 }) 77 })
@@ -26,6 +26,7 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore @@ -26,6 +26,7 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore
26 import { isPreview } from '@/utils' 26 import { isPreview } from '@/utils'
27 import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components' 27 import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components'
28 import isObject from 'lodash/isObject' 28 import isObject from 'lodash/isObject'
  29 +import cloneDeep from 'lodash/cloneDeep'
29 30
30 const props = defineProps({ 31 const props = defineProps({
31 themeSetting: { 32 themeSetting: {
@@ -61,7 +62,7 @@ watch( @@ -61,7 +62,7 @@ watch(
61 if (Array.isArray(newData?.dimensions)) { 62 if (Array.isArray(newData?.dimensions)) {
62 const seriesArr = [] 63 const seriesArr = []
63 for (let i = 0; i < newData.dimensions.length - 1; i++) { 64 for (let i = 0; i < newData.dimensions.length - 1; i++) {
64 - seriesArr.push(seriesItem) 65 + seriesArr.push(cloneDeep(seriesItem))
65 } 66 }
66 replaceMergeArr.value = ['series'] 67 replaceMergeArr.value = ['series']
67 props.chartConfig.option.series = seriesArr 68 props.chartConfig.option.series = seriesArr
@@ -16,7 +16,8 @@ export enum ThemeEnum { @@ -16,7 +16,8 @@ export enum ThemeEnum {
16 MACARON = 'macaron', 16 MACARON = 'macaron',
17 BLUE = 'blue', 17 BLUE = 'blue',
18 DARKBLUE = 'darkblue', 18 DARKBLUE = 'darkblue',
19 - WINE = 'wine' 19 + WINE = 'wine',
  20 + WEIXIN = 'tileLayer'
20 } 21 }
21 22
22 export enum LangEnum { 23 export enum LangEnum {
@@ -8,7 +8,7 @@ import AMapLoader from '@amap/amap-jsapi-loader' @@ -8,7 +8,7 @@ import AMapLoader from '@amap/amap-jsapi-loader'
8 import { CreateComponentType } from '@/packages/index.d' 8 import { CreateComponentType } from '@/packages/index.d'
9 import { useChartDataFetch } from '@/hooks' 9 import { useChartDataFetch } from '@/hooks'
10 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' 10 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
11 -import { MarkerEnum } from './config' 11 +import { MarkerEnum, ThemeEnum } from './config'
12 import { isArray } from '@/utils' 12 import { isArray } from '@/utils'
13 13
14 const props = defineProps({ 14 const props = defineProps({
@@ -51,7 +51,6 @@ const initMap = (newData: any) => { @@ -51,7 +51,6 @@ const initMap = (newData: any) => {
51 resizeEnable: true, 51 resizeEnable: true,
52 zoom: amapZindex.value, // 地图显示的缩放级别 52 zoom: amapZindex.value, // 地图显示的缩放级别
53 center: [amapLon.value, amapLat.value], 53 center: [amapLon.value, amapLat.value],
54 - mapStyle: `amap://styles/${amapStyleKeyCustom.value !== '' ? amapStyleKeyCustom.value : amapStyleKey.value}`, //自定义地图的显示样式  
55 lang: lang.value, 54 lang: lang.value,
56 features: features.value, 55 features: features.value,
57 pitch: pitch.value, // 地图俯仰角度,有效范围 0 度- 83 度 56 pitch: pitch.value, // 地图俯仰角度,有效范围 0 度- 83 度
@@ -60,6 +59,14 @@ const initMap = (newData: any) => { @@ -60,6 +59,14 @@ const initMap = (newData: any) => {
60 willReadFrequently: true 59 willReadFrequently: true
61 }) 60 })
62 dataHandle(props.chartConfig.option.dataset) 61 dataHandle(props.chartConfig.option.dataset)
  62 + let satellite = new AMap.TileLayer.Satellite()
  63 + let roadNet = new AMap.TileLayer.RoadNet()
  64 + if (newData.amapStyleKey === ThemeEnum.WEIXIN) {
  65 + mapIns.add([satellite, roadNet])
  66 + } else {
  67 + mapIns.remove([satellite, roadNet])
  68 + mapIns.setMapStyle(`amap://styles/${amapStyleKeyCustom.value !== '' ? amapStyleKeyCustom.value : amapStyleKey.value}`)
  69 + }
63 }) 70 })
64 .catch(e => {}) 71 .catch(e => {})
65 } 72 }
  1 +import { echartOptionProfixHandle, PublicConfigClass } from '@/packages/public'
  2 +import { DialConfig } from './index'
  3 +import { CreateComponentType } from '@/packages/index.d'
  4 +import cloneDeep from 'lodash/cloneDeep'
  5 +
  6 +export const includes = []
  7 +const option = {
  8 + backgroundColor: '#0E1327',
  9 + dataset:70,
  10 + series: [{
  11 + type: "gauge",
  12 + data: [{
  13 + value: 70,
  14 + itemStyle: { // 指针样式
  15 + color: '#2AF4FF'
  16 + }
  17 + }],
  18 + min: 0, //最小刻度
  19 + max: 100, //最大刻度
  20 + splitNumber: 10, //刻度数量
  21 + center: ['50%', '55%'],
  22 + radius: '80%',
  23 + axisLine: {
  24 + lineStyle: {
  25 + color: [
  26 + [0, 'rgba(0,212,230,0.5)'],
  27 + [1, 'rgba(28,128,245,0)']
  28 + ],
  29 + width: 170
  30 + }
  31 + },
  32 + axisLabel: { // 文字样式
  33 + color: '#eee',
  34 + fontSize: 14,
  35 + },
  36 + axisTick: {
  37 + show: false,
  38 + },
  39 + splitLine: {
  40 + show: false,
  41 + },
  42 + detail: {
  43 + show: false,
  44 + },
  45 + pointer: {
  46 + length: '80%',
  47 + width: 4
  48 + },
  49 + animationDuration: 2000,
  50 + },
  51 + {
  52 + name: '外部刻度',
  53 + type: 'gauge',
  54 + center: ['50%', '55%'],
  55 + radius: '90%',
  56 + axisLine: {
  57 + show: true,
  58 + lineStyle: {
  59 + width: 25,
  60 + color: [ // 表盘外部颜色
  61 + [0, '#1369E380'],
  62 + [1, '#1369E380']
  63 + ],
  64 + }
  65 + },
  66 + axisLabel: {
  67 + show:false,
  68 + },
  69 + axisTick: {
  70 + splitNumber: 5,
  71 + lineStyle: { //刻度颜色
  72 + color: '#42E5FB',
  73 + width: 2,
  74 + },
  75 + },
  76 + splitLine: {
  77 + length: 15,
  78 + lineStyle: {
  79 + color: '#42E5FB',
  80 + }
  81 + },
  82 + },
  83 + ]
  84 +};
  85 +
  86 +export default class Config extends PublicConfigClass implements CreateComponentType {
  87 + public key: string = DialConfig.key
  88 + public chartConfig = cloneDeep(DialConfig)
  89 + // 图表配置项
  90 + public option = echartOptionProfixHandle(option, includes)
  91 +}
  1 +<template>
  2 + <!-- 遍历 seriesList -->
  3 + <CollapseItem :name="`圆环`" :expanded="true">
  4 + <SettingItemBox name="数据">
  5 + <SettingItem name="数值">
  6 + <n-input-number v-model:value="config.dataset" :min="dialConfig.min" :max="dialConfig.max" :step="1" size="small" placeholder="数值">
  7 + </n-input-number>
  8 + </SettingItem>
  9 + </SettingItemBox>
  10 + <!-- Echarts 全局设置 -->
  11 + <!-- 表盘刻度字体 -->
  12 + <SettingItemBox name="字体">
  13 + <SettingItem name="颜色">
  14 + <n-color-picker size="small" :modes="['hex']" v-model:value="dialConfig.axisLabel.color"></n-color-picker>
  15 + </SettingItem>
  16 + <SettingItem name="字体大小">
  17 + <n-input-number
  18 + v-model:value="dialConfig.axisLabel.fontSize"
  19 + :min="0"
  20 + :step="1"
  21 + size="small"
  22 + placeholder="字体大小"
  23 + >
  24 + </n-input-number>
  25 + </SettingItem>
  26 + </SettingItemBox>
  27 + <!-- 表盘 -->
  28 + <SettingItemBox name="表盘外部">
  29 + <SettingItem name="颜色" >
  30 + <n-color-picker size="small" :modes="['hex']" v-model:value="config.series[1].axisLine.lineStyle.color[1][1]"></n-color-picker>
  31 + </SettingItem>
  32 + </SettingItemBox>
  33 + <!-- 指针 -->
  34 + <SettingItemBox name="指针">
  35 + <SettingItem name="颜色" >
  36 + <n-color-picker size="small" :modes="['hex']" v-model:value="dialConfig.data[0].itemStyle.color"></n-color-picker>
  37 + </SettingItem>
  38 + <SettingItem name="宽度">
  39 + <n-input-number v-model:value="dialConfig.pointer.width" :min="0" :step="1" size="small" placeholder="数值">
  40 + </n-input-number>
  41 + </SettingItem>
  42 + </SettingItemBox>
  43 + <SettingItemBox name="刻度">
  44 + <SettingItem name="最小值">
  45 + <n-input-number v-model:value="dialConfig.min" :min="0" :step="1" size="small" placeholder="数值">
  46 + </n-input-number>
  47 + </SettingItem>
  48 + <SettingItem name="最大值">
  49 + <n-input-number v-model:value="dialConfig.max" :min="0" :step="1" size="small" placeholder="数值">
  50 + </n-input-number>
  51 + </SettingItem>
  52 + <SettingItem name="颜色" >
  53 + <n-color-picker size="small" :modes="['hex']" v-model:value="config.series[1].axisTick.lineStyle.color" @update:value="updateClick"></n-color-picker>
  54 + </SettingItem>
  55 + </SettingItemBox>
  56 +
  57 + </CollapseItem>
  58 + </template>
  59 +
  60 + <script setup lang="ts">
  61 + import { PropType, computed } from 'vue'
  62 + import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
  63 + import { GlobalThemeJsonType } from '@/settings/chartThemes'
  64 +
  65 + const props = defineProps({
  66 + optionData: {
  67 + type: Object as PropType<GlobalThemeJsonType>,
  68 + required: true
  69 + }
  70 + })
  71 +
  72 + const config = computed(() => {
  73 + return props.optionData
  74 + })
  75 +
  76 + const dialConfig = computed(() => {
  77 + return props.optionData.series[0]
  78 + })
  79 +
  80 + const updateClick = (val: any) => {
  81 + props.optionData.series[1].splitLine.lineStyle.color=val
  82 + }
  83 + </script>
  84 +
  1 +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
  2 +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
  3 +
  4 +export const DialConfig: ConfigType = {
  5 + key: 'Dial',
  6 + chartKey: 'VDial',
  7 + conKey: 'VCDial',
  8 + title: '表盘',
  9 + category: ChatCategoryEnum.MORE,
  10 + categoryName: ChatCategoryEnumName.MORE,
  11 + package: PackagesCategoryEnum.CHARTS,
  12 + chartFrame: ChartFrameEnum.COMMON,
  13 + image:'dial.png'
  14 +}
  1 +<template>
  2 + <v-chart :theme="themeColor" :init-options="initOptions" :option="option.value" autoresize> </v-chart>
  3 +</template>
  4 +
  5 +<script setup lang="ts">
  6 +import { PropType, reactive, watch } from 'vue'
  7 +import VChart from 'vue-echarts'
  8 +import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
  9 +import { use } from 'echarts/core'
  10 +import { CanvasRenderer } from 'echarts/renderers'
  11 +import { PieChart } from 'echarts/charts'
  12 +import { mergeTheme } from '@/packages/public/chart'
  13 +import config, { includes } from './config'
  14 +import { useChartDataFetch } from '@/hooks'
  15 +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
  16 +import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent, TitleComponent } from 'echarts/components'
  17 +
  18 +const props = defineProps({
  19 + themeSetting: {
  20 + type: Object,
  21 + required: true
  22 + },
  23 + themeColor: {
  24 + type: Object,
  25 + required: true
  26 + },
  27 + chartConfig: {
  28 + type: Object as PropType<config>,
  29 + required: true
  30 + }
  31 +})
  32 +
  33 +const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
  34 +
  35 +use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent, TitleComponent])
  36 +
  37 +const option = reactive({
  38 + value: {}
  39 +})
  40 +
  41 +const dataHandle = (newData: any) => {
  42 + let config = props.chartConfig.option
  43 + config.series[0].data[0].value = newData
  44 + option.value = mergeTheme(props.chartConfig.option, props.themeSetting, includes)
  45 + option.value = props.chartConfig.option
  46 +}
  47 +
  48 +// 配置时
  49 +watch(
  50 + () => props.chartConfig.option.dataset,
  51 + newData => {
  52 + try {
  53 + dataHandle(newData)
  54 + } catch (error) {
  55 + console.log(error)
  56 + }
  57 + },
  58 + {
  59 + immediate: true,
  60 + deep: false
  61 + }
  62 +)
  63 +
  64 +// 预览时
  65 +useChartDataFetch(props.chartConfig, useChartEditStore, (resData: number) => {
  66 + // @ts-ignore
  67 + option.value.series[0].data[0].value = resData
  68 +})
  69 +</script>
  1 +import { echartOptionProfixHandle, PublicConfigClass } from '@/packages/public'
  2 +import { GraphConfig } from './index'
  3 +import { CreateComponentType } from '@/packages/index.d'
  4 +import cloneDeep from 'lodash/cloneDeep'
  5 +import dataJson from './data.json'
  6 +
  7 +export const includes = []
  8 +
  9 +// 关系图布局
  10 +export const GraphLayout = [
  11 + { label: '无', value: 'none' },
  12 + { label: '环形', value: 'circular' }
  13 +]
  14 +
  15 +// 标签开关
  16 +export const LabelSwitch = [
  17 + { label: '开启', value: 1 },
  18 + { label: '关闭', value: 0 }
  19 +]
  20 +
  21 +// 标签位置
  22 +export const LabelPosition = [
  23 + { label: '左侧', value: 'left' },
  24 + { label: '右侧', value: 'right' },
  25 + { label: '顶部', value: 'top' },
  26 + { label: '底部', value: 'bottom' },
  27 + { label: '内部', value: 'inside' },
  28 +]
  29 +
  30 +export const option = {
  31 + dataset: { ...dataJson },
  32 + tooltip: {},
  33 + legend:{
  34 + show:true,
  35 + textStyle:{
  36 + color:"#eee",
  37 + fontSize: 14 ,
  38 + },
  39 + data: dataJson.categories.map(function (a) {
  40 + return a.name;
  41 + })
  42 + },
  43 + series: [
  44 + {
  45 + type: 'graph',
  46 + layout: 'none', // none circular环形布局
  47 + data: dataJson.nodes,
  48 + links: dataJson.links,
  49 + categories: dataJson.categories,
  50 + label: { // 标签
  51 + show: 1,
  52 + position: 'right',
  53 + formatter: '{b}'
  54 + },
  55 + labelLayout: {
  56 + hideOverlap: true
  57 + },
  58 + lineStyle: {
  59 + color: 'source', // 线条颜色
  60 + curveness: 0.2 // 线条卷曲程度
  61 + }
  62 + }
  63 + ]
  64 + };
  65 +
  66 +export default class Config extends PublicConfigClass implements CreateComponentType {
  67 + public key = GraphConfig.key
  68 + public chartConfig = cloneDeep(GraphConfig)
  69 + // 图表配置项
  70 + public option = echartOptionProfixHandle(option, includes)
  71 +}
  1 +<template>
  2 + <div>
  3 + <CollapseItem name="关系图" :expanded="true">
  4 + <SettingItemBox name="样式">
  5 + <setting-item name="布局">
  6 + <n-select v-model:value="graphConfig.layout" :options="GraphLayout" size="small" />
  7 + </setting-item>
  8 + </SettingItemBox>
  9 + <SettingItemBox name="标签">
  10 + <setting-item name="展示">
  11 + <n-select v-model:value="graphConfig.label.show" :options="LabelSwitch" size="small" />
  12 + </setting-item>
  13 + <setting-item name="位置">
  14 + <n-select v-model:value="graphConfig.label.position" :options="LabelPosition" size="small" />
  15 + </setting-item>
  16 + </SettingItemBox>
  17 + <SettingItemBox name="线条">
  18 + <SettingItem name="弧线">
  19 + <!-- 需要输入两位的小数才会变化 -->
  20 + <n-input-number
  21 + v-model:value="optionData.series[0].lineStyle.curveness"
  22 + :min="0"
  23 + :step="0.01"
  24 + placeholder="弯曲程度"
  25 + size="small"
  26 + ></n-input-number>
  27 + </SettingItem>
  28 + </SettingItemBox>
  29 + <SettingItemBox name="图例">
  30 + <SettingItem name="颜色">
  31 + <n-color-picker
  32 + size="small"
  33 + :modes="['hex']"
  34 + v-model:value="optionData.legend.textStyle.color"
  35 + ></n-color-picker>
  36 + </SettingItem>
  37 + <SettingItem name="文本">
  38 + <n-input-number v-model:value="optionData.legend.textStyle.fontSize" :min="0" :step="1" size="small" placeholder="文字大小">
  39 + </n-input-number>
  40 + </SettingItem>
  41 + </SettingItemBox>
  42 + </CollapseItem>
  43 + </div>
  44 +</template>
  45 +
  46 +<script setup lang="ts">
  47 +import { PropType, computed } from 'vue'
  48 +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
  49 +import { option, GraphLayout, LabelSwitch, LabelPosition } from './config'
  50 +import { GlobalThemeJsonType } from '@/settings/chartThemes/index'
  51 +
  52 +const props = defineProps({
  53 + optionData: {
  54 + type: Object as PropType<typeof option & GlobalThemeJsonType>,
  55 + required: true
  56 + }
  57 +})
  58 +
  59 +const graphConfig = computed<typeof option.series[0]>(() => {
  60 + return props.optionData.series[0]
  61 +})
  62 +</script>
  1 +{
  2 + "nodes": [
  3 + {
  4 + "id": "0",
  5 + "name": "Myriel",
  6 + "symbolSize": 19.12381,
  7 + "x": -266.82776,
  8 + "y": 299.6904,
  9 + "value": 28.685715,
  10 + "category": 0
  11 + },
  12 + {
  13 + "id": "1",
  14 + "name": "Napoleon",
  15 + "symbolSize": 2.6666666666666665,
  16 + "x": -418.08344,
  17 + "y": 446.8853,
  18 + "value": 4,
  19 + "category": 0
  20 + },
  21 + {
  22 + "id": "2",
  23 + "name": "MlleBaptistine",
  24 + "symbolSize": 6.323809333333333,
  25 + "x": -212.76357,
  26 + "y": 245.29176,
  27 + "value": 9.485714,
  28 + "category": 1
  29 + },
  30 + {
  31 + "id": "3",
  32 + "name": "MmeMagloire",
  33 + "symbolSize": 6.323809333333333,
  34 + "x": -242.82404,
  35 + "y": 235.26283,
  36 + "value": 9.485714,
  37 + "category": 1
  38 + },
  39 + {
  40 + "id": "4",
  41 + "name": "CountessDeLo",
  42 + "symbolSize": 2.6666666666666665,
  43 + "x": -379.30386,
  44 + "y": 429.06424,
  45 + "value": 4,
  46 + "category": 0
  47 + },
  48 + {
  49 + "id": "5",
  50 + "name": "Geborand",
  51 + "symbolSize": 2.6666666666666665,
  52 + "x": -417.26337,
  53 + "y": 406.03506,
  54 + "value": 4,
  55 + "category": 0
  56 + },
  57 + {
  58 + "id": "6",
  59 + "name": "Champtercier",
  60 + "symbolSize": 2.6666666666666665,
  61 + "x": -332.6012,
  62 + "y": 485.16974,
  63 + "value": 4,
  64 + "category": 0
  65 + },
  66 + {
  67 + "id": "7",
  68 + "name": "Cravatte",
  69 + "symbolSize": 2.6666666666666665,
  70 + "x": -382.69568,
  71 + "y": 475.09113,
  72 + "value": 4,
  73 + "category": 0
  74 + },
  75 + {
  76 + "id": "8",
  77 + "name": "Count",
  78 + "symbolSize": 2.6666666666666665,
  79 + "x": -320.384,
  80 + "y": 387.17325,
  81 + "value": 4,
  82 + "category": 0
  83 + },
  84 + {
  85 + "id": "9",
  86 + "name": "OldMan",
  87 + "symbolSize": 2.6666666666666665,
  88 + "x": -344.39832,
  89 + "y": 451.16772,
  90 + "value": 4,
  91 + "category": 0
  92 + },
  93 + {
  94 + "id": "10",
  95 + "name": "Labarre",
  96 + "symbolSize": 2.6666666666666665,
  97 + "x": -89.34107,
  98 + "y": 234.56128,
  99 + "value": 4,
  100 + "category": 1
  101 + },
  102 + {
  103 + "id": "11",
  104 + "name": "Valjean",
  105 + "symbolSize": 66.66666666666667,
  106 + "x": -87.93029,
  107 + "y": -6.8120565,
  108 + "value": 100,
  109 + "category": 1
  110 + },
  111 + {
  112 + "id": "12",
  113 + "name": "Marguerite",
  114 + "symbolSize": 4.495239333333333,
  115 + "x": -339.77908,
  116 + "y": -184.69139,
  117 + "value": 6.742859,
  118 + "category": 1
  119 + },
  120 + {
  121 + "id": "13",
  122 + "name": "MmeDeR",
  123 + "symbolSize": 2.6666666666666665,
  124 + "x": -194.31313,
  125 + "y": 178.55301,
  126 + "value": 4,
  127 + "category": 1
  128 + },
  129 + {
  130 + "id": "14",
  131 + "name": "Isabeau",
  132 + "symbolSize": 2.6666666666666665,
  133 + "x": -158.05168,
  134 + "y": 201.99768,
  135 + "value": 4,
  136 + "category": 1
  137 + },
  138 + {
  139 + "id": "15",
  140 + "name": "Gervais",
  141 + "symbolSize": 2.6666666666666665,
  142 + "x": -127.701546,
  143 + "y": 242.55057,
  144 + "value": 4,
  145 + "category": 1
  146 + },
  147 + {
  148 + "id": "16",
  149 + "name": "Tholomyes",
  150 + "symbolSize": 17.295237333333333,
  151 + "x": -385.2226,
  152 + "y": -393.5572,
  153 + "value": 25.942856,
  154 + "category": 2
  155 + },
  156 + {
  157 + "id": "17",
  158 + "name": "Listolier",
  159 + "symbolSize": 13.638097333333334,
  160 + "x": -516.55884,
  161 + "y": -393.98975,
  162 + "value": 20.457146,
  163 + "category": 2
  164 + },
  165 + {
  166 + "id": "18",
  167 + "name": "Fameuil",
  168 + "symbolSize": 13.638097333333334,
  169 + "x": -464.79382,
  170 + "y": -493.57944,
  171 + "value": 20.457146,
  172 + "category": 2
  173 + },
  174 + {
  175 + "id": "19",
  176 + "name": "Blacheville",
  177 + "symbolSize": 13.638097333333334,
  178 + "x": -515.1624,
  179 + "y": -456.9891,
  180 + "value": 20.457146,
  181 + "category": 2
  182 + },
  183 + {
  184 + "id": "20",
  185 + "name": "Favourite",
  186 + "symbolSize": 13.638097333333334,
  187 + "x": -408.12122,
  188 + "y": -464.5048,
  189 + "value": 20.457146,
  190 + "category": 2
  191 + },
  192 + {
  193 + "id": "21",
  194 + "name": "Dahlia",
  195 + "symbolSize": 13.638097333333334,
  196 + "x": -456.44113,
  197 + "y": -425.13303,
  198 + "value": 20.457146,
  199 + "category": 2
  200 + },
  201 + {
  202 + "id": "22",
  203 + "name": "Zephine",
  204 + "symbolSize": 13.638097333333334,
  205 + "x": -459.1107,
  206 + "y": -362.5133,
  207 + "value": 20.457146,
  208 + "category": 2
  209 + },
  210 + {
  211 + "id": "23",
  212 + "name": "Fantine",
  213 + "symbolSize": 28.266666666666666,
  214 + "x": -313.42786,
  215 + "y": -289.44803,
  216 + "value": 42.4,
  217 + "category": 2
  218 + },
  219 + {
  220 + "id": "24",
  221 + "name": "MmeThenardier",
  222 + "symbolSize": 20.95238266666667,
  223 + "x": 4.6313396,
  224 + "y": -273.8517,
  225 + "value": 31.428574,
  226 + "category": 7
  227 + },
  228 + {
  229 + "id": "25",
  230 + "name": "Thenardier",
  231 + "symbolSize": 30.095235333333335,
  232 + "x": 82.80825,
  233 + "y": -203.1144,
  234 + "value": 45.142853,
  235 + "category": 7
  236 + },
  237 + {
  238 + "id": "26",
  239 + "name": "Cosette",
  240 + "symbolSize": 20.95238266666667,
  241 + "x": 78.64646,
  242 + "y": -31.512747,
  243 + "value": 31.428574,
  244 + "category": 6
  245 + },
  246 + {
  247 + "id": "27",
  248 + "name": "Javert",
  249 + "symbolSize": 31.923806666666668,
  250 + "x": -81.46074,
  251 + "y": -204.20204,
  252 + "value": 47.88571,
  253 + "category": 7
  254 + },
  255 + {
  256 + "id": "28",
  257 + "name": "Fauchelevent",
  258 + "symbolSize": 8.152382000000001,
  259 + "x": -225.73984,
  260 + "y": 82.41631,
  261 + "value": 12.228573,
  262 + "category": 4
  263 + },
  264 + {
  265 + "id": "29",
  266 + "name": "Bamatabois",
  267 + "symbolSize": 15.466666666666667,
  268 + "x": -385.6842,
  269 + "y": -20.206686,
  270 + "value": 23.2,
  271 + "category": 3
  272 + },
  273 + {
  274 + "id": "30",
  275 + "name": "Perpetue",
  276 + "symbolSize": 4.495239333333333,
  277 + "x": -403.92447,
  278 + "y": -197.69823,
  279 + "value": 6.742859,
  280 + "category": 2
  281 + },
  282 + {
  283 + "id": "31",
  284 + "name": "Simplice",
  285 + "symbolSize": 8.152382000000001,
  286 + "x": -281.4253,
  287 + "y": -158.45137,
  288 + "value": 12.228573,
  289 + "category": 2
  290 + },
  291 + {
  292 + "id": "32",
  293 + "name": "Scaufflaire",
  294 + "symbolSize": 2.6666666666666665,
  295 + "x": -122.41348,
  296 + "y": 210.37503,
  297 + "value": 4,
  298 + "category": 1
  299 + },
  300 + {
  301 + "id": "33",
  302 + "name": "Woman1",
  303 + "symbolSize": 4.495239333333333,
  304 + "x": -234.6001,
  305 + "y": -113.15067,
  306 + "value": 6.742859,
  307 + "category": 1
  308 + },
  309 + {
  310 + "id": "34",
  311 + "name": "Judge",
  312 + "symbolSize": 11.809524666666666,
  313 + "x": -387.84915,
  314 + "y": 58.7059,
  315 + "value": 17.714287,
  316 + "category": 3
  317 + },
  318 + {
  319 + "id": "35",
  320 + "name": "Champmathieu",
  321 + "symbolSize": 11.809524666666666,
  322 + "x": -338.2307,
  323 + "y": 87.48405,
  324 + "value": 17.714287,
  325 + "category": 3
  326 + },
  327 + {
  328 + "id": "36",
  329 + "name": "Brevet",
  330 + "symbolSize": 11.809524666666666,
  331 + "x": -453.26874,
  332 + "y": 58.94648,
  333 + "value": 17.714287,
  334 + "category": 3
  335 + },
  336 + {
  337 + "id": "37",
  338 + "name": "Chenildieu",
  339 + "symbolSize": 11.809524666666666,
  340 + "x": -386.44904,
  341 + "y": 140.05937,
  342 + "value": 17.714287,
  343 + "category": 3
  344 + },
  345 + {
  346 + "id": "38",
  347 + "name": "Cochepaille",
  348 + "symbolSize": 11.809524666666666,
  349 + "x": -446.7876,
  350 + "y": 123.38005,
  351 + "value": 17.714287,
  352 + "category": 3
  353 + },
  354 + {
  355 + "id": "39",
  356 + "name": "Pontmercy",
  357 + "symbolSize": 6.323809333333333,
  358 + "x": 336.49738,
  359 + "y": -269.55914,
  360 + "value": 9.485714,
  361 + "category": 6
  362 + },
  363 + {
  364 + "id": "40",
  365 + "name": "Boulatruelle",
  366 + "symbolSize": 2.6666666666666665,
  367 + "x": 29.187843,
  368 + "y": -460.13132,
  369 + "value": 4,
  370 + "category": 7
  371 + },
  372 + {
  373 + "id": "41",
  374 + "name": "Eponine",
  375 + "symbolSize": 20.95238266666667,
  376 + "x": 238.36697,
  377 + "y": -210.00926,
  378 + "value": 31.428574,
  379 + "category": 7
  380 + },
  381 + {
  382 + "id": "42",
  383 + "name": "Anzelma",
  384 + "symbolSize": 6.323809333333333,
  385 + "x": 189.69513,
  386 + "y": -346.50662,
  387 + "value": 9.485714,
  388 + "category": 7
  389 + },
  390 + {
  391 + "id": "43",
  392 + "name": "Woman2",
  393 + "symbolSize": 6.323809333333333,
  394 + "x": -187.00418,
  395 + "y": -145.02663,
  396 + "value": 9.485714,
  397 + "category": 6
  398 + },
  399 + {
  400 + "id": "44",
  401 + "name": "MotherInnocent",
  402 + "symbolSize": 4.495239333333333,
  403 + "x": -252.99521,
  404 + "y": 129.87549,
  405 + "value": 6.742859,
  406 + "category": 4
  407 + },
  408 + {
  409 + "id": "45",
  410 + "name": "Gribier",
  411 + "symbolSize": 2.6666666666666665,
  412 + "x": -296.07935,
  413 + "y": 163.11964,
  414 + "value": 4,
  415 + "category": 4
  416 + },
  417 + {
  418 + "id": "46",
  419 + "name": "Jondrette",
  420 + "symbolSize": 2.6666666666666665,
  421 + "x": 550.3201,
  422 + "y": 522.4031,
  423 + "value": 4,
  424 + "category": 5
  425 + },
  426 + {
  427 + "id": "47",
  428 + "name": "MmeBurgon",
  429 + "symbolSize": 4.495239333333333,
  430 + "x": 488.13535,
  431 + "y": 356.8573,
  432 + "value": 6.742859,
  433 + "category": 5
  434 + },
  435 + {
  436 + "id": "48",
  437 + "name": "Gavroche",
  438 + "symbolSize": 41.06667066666667,
  439 + "x": 387.89572,
  440 + "y": 110.462326,
  441 + "value": 61.600006,
  442 + "category": 8
  443 + },
  444 + {
  445 + "id": "49",
  446 + "name": "Gillenormand",
  447 + "symbolSize": 13.638097333333334,
  448 + "x": 126.4831,
  449 + "y": 68.10622,
  450 + "value": 20.457146,
  451 + "category": 6
  452 + },
  453 + {
  454 + "id": "50",
  455 + "name": "Magnon",
  456 + "symbolSize": 4.495239333333333,
  457 + "x": 127.07365,
  458 + "y": -113.05923,
  459 + "value": 6.742859,
  460 + "category": 6
  461 + },
  462 + {
  463 + "id": "51",
  464 + "name": "MlleGillenormand",
  465 + "symbolSize": 13.638097333333334,
  466 + "x": 162.63559,
  467 + "y": 117.6565,
  468 + "value": 20.457146,
  469 + "category": 6
  470 + },
  471 + {
  472 + "id": "52",
  473 + "name": "MmePontmercy",
  474 + "symbolSize": 4.495239333333333,
  475 + "x": 353.66415,
  476 + "y": -205.89165,
  477 + "value": 6.742859,
  478 + "category": 6
  479 + },
  480 + {
  481 + "id": "53",
  482 + "name": "MlleVaubois",
  483 + "symbolSize": 2.6666666666666665,
  484 + "x": 165.43939,
  485 + "y": 339.7736,
  486 + "value": 4,
  487 + "category": 6
  488 + },
  489 + {
  490 + "id": "54",
  491 + "name": "LtGillenormand",
  492 + "symbolSize": 8.152382000000001,
  493 + "x": 137.69348,
  494 + "y": 196.1069,
  495 + "value": 12.228573,
  496 + "category": 6
  497 + },
  498 + {
  499 + "id": "55",
  500 + "name": "Marius",
  501 + "symbolSize": 35.58095333333333,
  502 + "x": 206.44687,
  503 + "y": -13.805411,
  504 + "value": 53.37143,
  505 + "category": 6
  506 + },
  507 + {
  508 + "id": "56",
  509 + "name": "BaronessT",
  510 + "symbolSize": 4.495239333333333,
  511 + "x": 194.82993,
  512 + "y": 224.78036,
  513 + "value": 6.742859,
  514 + "category": 6
  515 + },
  516 + {
  517 + "id": "57",
  518 + "name": "Mabeuf",
  519 + "symbolSize": 20.95238266666667,
  520 + "x": 597.6618,
  521 + "y": 135.18481,
  522 + "value": 31.428574,
  523 + "category": 8
  524 + },
  525 + {
  526 + "id": "58",
  527 + "name": "Enjolras",
  528 + "symbolSize": 28.266666666666666,
  529 + "x": 355.78366,
  530 + "y": -74.882454,
  531 + "value": 42.4,
  532 + "category": 8
  533 + },
  534 + {
  535 + "id": "59",
  536 + "name": "Combeferre",
  537 + "symbolSize": 20.95238266666667,
  538 + "x": 515.2961,
  539 + "y": -46.167564,
  540 + "value": 31.428574,
  541 + "category": 8
  542 + },
  543 + {
  544 + "id": "60",
  545 + "name": "Prouvaire",
  546 + "symbolSize": 17.295237333333333,
  547 + "x": 614.29285,
  548 + "y": -69.3104,
  549 + "value": 25.942856,
  550 + "category": 8
  551 + },
  552 + {
  553 + "id": "61",
  554 + "name": "Feuilly",
  555 + "symbolSize": 20.95238266666667,
  556 + "x": 550.1917,
  557 + "y": -128.17537,
  558 + "value": 31.428574,
  559 + "category": 8
  560 + },
  561 + {
  562 + "id": "62",
  563 + "name": "Courfeyrac",
  564 + "symbolSize": 24.609526666666667,
  565 + "x": 436.17184,
  566 + "y": -12.7286825,
  567 + "value": 36.91429,
  568 + "category": 8
  569 + },
  570 + {
  571 + "id": "63",
  572 + "name": "Bahorel",
  573 + "symbolSize": 22.780953333333333,
  574 + "x": 602.55225,
  575 + "y": 16.421427,
  576 + "value": 34.17143,
  577 + "category": 8
  578 + },
  579 + {
  580 + "id": "64",
  581 + "name": "Bossuet",
  582 + "symbolSize": 24.609526666666667,
  583 + "x": 455.81955,
  584 + "y": -115.45826,
  585 + "value": 36.91429,
  586 + "category": 8
  587 + },
  588 + {
  589 + "id": "65",
  590 + "name": "Joly",
  591 + "symbolSize": 22.780953333333333,
  592 + "x": 516.40784,
  593 + "y": 47.242233,
  594 + "value": 34.17143,
  595 + "category": 8
  596 + },
  597 + {
  598 + "id": "66",
  599 + "name": "Grantaire",
  600 + "symbolSize": 19.12381,
  601 + "x": 646.4313,
  602 + "y": -151.06331,
  603 + "value": 28.685715,
  604 + "category": 8
  605 + },
  606 + {
  607 + "id": "67",
  608 + "name": "MotherPlutarch",
  609 + "symbolSize": 2.6666666666666665,
  610 + "x": 668.9568,
  611 + "y": 204.65488,
  612 + "value": 4,
  613 + "category": 8
  614 + },
  615 + {
  616 + "id": "68",
  617 + "name": "Gueulemer",
  618 + "symbolSize": 19.12381,
  619 + "x": 78.4799,
  620 + "y": -347.15146,
  621 + "value": 28.685715,
  622 + "category": 7
  623 + },
  624 + {
  625 + "id": "69",
  626 + "name": "Babet",
  627 + "symbolSize": 19.12381,
  628 + "x": 150.35959,
  629 + "y": -298.50797,
  630 + "value": 28.685715,
  631 + "category": 7
  632 + },
  633 + {
  634 + "id": "70",
  635 + "name": "Claquesous",
  636 + "symbolSize": 19.12381,
  637 + "x": 137.3717,
  638 + "y": -410.2809,
  639 + "value": 28.685715,
  640 + "category": 7
  641 + },
  642 + {
  643 + "id": "71",
  644 + "name": "Montparnasse",
  645 + "symbolSize": 17.295237333333333,
  646 + "x": 234.87747,
  647 + "y": -400.85983,
  648 + "value": 25.942856,
  649 + "category": 7
  650 + },
  651 + {
  652 + "id": "72",
  653 + "name": "Toussaint",
  654 + "symbolSize": 6.323809333333333,
  655 + "x": 40.942253,
  656 + "y": 113.78272,
  657 + "value": 9.485714,
  658 + "category": 1
  659 + },
  660 + {
  661 + "id": "73",
  662 + "name": "Child1",
  663 + "symbolSize": 4.495239333333333,
  664 + "x": 437.939,
  665 + "y": 291.58234,
  666 + "value": 6.742859,
  667 + "category": 8
  668 + },
  669 + {
  670 + "id": "74",
  671 + "name": "Child2",
  672 + "symbolSize": 4.495239333333333,
  673 + "x": 466.04922,
  674 + "y": 283.3606,
  675 + "value": 6.742859,
  676 + "category": 8
  677 + },
  678 + {
  679 + "id": "75",
  680 + "name": "Brujon",
  681 + "symbolSize": 13.638097333333334,
  682 + "x": 238.79364,
  683 + "y": -314.06345,
  684 + "value": 20.457146,
  685 + "category": 7
  686 + },
  687 + {
  688 + "id": "76",
  689 + "name": "MmeHucheloup",
  690 + "symbolSize": 13.638097333333334,
  691 + "x": 712.18353,
  692 + "y": 4.8131495,
  693 + "value": 20.457146,
  694 + "category": 8
  695 + }
  696 + ],
  697 + "links": [
  698 + {
  699 + "source": "1",
  700 + "target": "0"
  701 + },
  702 + {
  703 + "source": "2",
  704 + "target": "0"
  705 + },
  706 + {
  707 + "source": "3",
  708 + "target": "0"
  709 + },
  710 + {
  711 + "source": "3",
  712 + "target": "2"
  713 + },
  714 + {
  715 + "source": "4",
  716 + "target": "0"
  717 + },
  718 + {
  719 + "source": "5",
  720 + "target": "0"
  721 + },
  722 + {
  723 + "source": "6",
  724 + "target": "0"
  725 + },
  726 + {
  727 + "source": "7",
  728 + "target": "0"
  729 + },
  730 + {
  731 + "source": "8",
  732 + "target": "0"
  733 + },
  734 + {
  735 + "source": "9",
  736 + "target": "0"
  737 + },
  738 + {
  739 + "source": "11",
  740 + "target": "0"
  741 + },
  742 + {
  743 + "source": "11",
  744 + "target": "2"
  745 + },
  746 + {
  747 + "source": "11",
  748 + "target": "3"
  749 + },
  750 + {
  751 + "source": "11",
  752 + "target": "10"
  753 + },
  754 + {
  755 + "source": "12",
  756 + "target": "11"
  757 + },
  758 + {
  759 + "source": "13",
  760 + "target": "11"
  761 + },
  762 + {
  763 + "source": "14",
  764 + "target": "11"
  765 + },
  766 + {
  767 + "source": "15",
  768 + "target": "11"
  769 + },
  770 + {
  771 + "source": "17",
  772 + "target": "16"
  773 + },
  774 + {
  775 + "source": "18",
  776 + "target": "16"
  777 + },
  778 + {
  779 + "source": "18",
  780 + "target": "17"
  781 + },
  782 + {
  783 + "source": "19",
  784 + "target": "16"
  785 + },
  786 + {
  787 + "source": "19",
  788 + "target": "17"
  789 + },
  790 + {
  791 + "source": "19",
  792 + "target": "18"
  793 + },
  794 + {
  795 + "source": "20",
  796 + "target": "16"
  797 + },
  798 + {
  799 + "source": "20",
  800 + "target": "17"
  801 + },
  802 + {
  803 + "source": "20",
  804 + "target": "18"
  805 + },
  806 + {
  807 + "source": "20",
  808 + "target": "19"
  809 + },
  810 + {
  811 + "source": "21",
  812 + "target": "16"
  813 + },
  814 + {
  815 + "source": "21",
  816 + "target": "17"
  817 + },
  818 + {
  819 + "source": "21",
  820 + "target": "18"
  821 + },
  822 + {
  823 + "source": "21",
  824 + "target": "19"
  825 + },
  826 + {
  827 + "source": "21",
  828 + "target": "20"
  829 + },
  830 + {
  831 + "source": "22",
  832 + "target": "16"
  833 + },
  834 + {
  835 + "source": "22",
  836 + "target": "17"
  837 + },
  838 + {
  839 + "source": "22",
  840 + "target": "18"
  841 + },
  842 + {
  843 + "source": "22",
  844 + "target": "19"
  845 + },
  846 + {
  847 + "source": "22",
  848 + "target": "20"
  849 + },
  850 + {
  851 + "source": "22",
  852 + "target": "21"
  853 + },
  854 + {
  855 + "source": "23",
  856 + "target": "11"
  857 + },
  858 + {
  859 + "source": "23",
  860 + "target": "12"
  861 + },
  862 + {
  863 + "source": "23",
  864 + "target": "16"
  865 + },
  866 + {
  867 + "source": "23",
  868 + "target": "17"
  869 + },
  870 + {
  871 + "source": "23",
  872 + "target": "18"
  873 + },
  874 + {
  875 + "source": "23",
  876 + "target": "19"
  877 + },
  878 + {
  879 + "source": "23",
  880 + "target": "20"
  881 + },
  882 + {
  883 + "source": "23",
  884 + "target": "21"
  885 + },
  886 + {
  887 + "source": "23",
  888 + "target": "22"
  889 + },
  890 + {
  891 + "source": "24",
  892 + "target": "11"
  893 + },
  894 + {
  895 + "source": "24",
  896 + "target": "23"
  897 + },
  898 + {
  899 + "source": "25",
  900 + "target": "11"
  901 + },
  902 + {
  903 + "source": "25",
  904 + "target": "23"
  905 + },
  906 + {
  907 + "source": "25",
  908 + "target": "24"
  909 + },
  910 + {
  911 + "source": "26",
  912 + "target": "11"
  913 + },
  914 + {
  915 + "source": "26",
  916 + "target": "16"
  917 + },
  918 + {
  919 + "source": "26",
  920 + "target": "24"
  921 + },
  922 + {
  923 + "source": "26",
  924 + "target": "25"
  925 + },
  926 + {
  927 + "source": "27",
  928 + "target": "11"
  929 + },
  930 + {
  931 + "source": "27",
  932 + "target": "23"
  933 + },
  934 + {
  935 + "source": "27",
  936 + "target": "24"
  937 + },
  938 + {
  939 + "source": "27",
  940 + "target": "25"
  941 + },
  942 + {
  943 + "source": "27",
  944 + "target": "26"
  945 + },
  946 + {
  947 + "source": "28",
  948 + "target": "11"
  949 + },
  950 + {
  951 + "source": "28",
  952 + "target": "27"
  953 + },
  954 + {
  955 + "source": "29",
  956 + "target": "11"
  957 + },
  958 + {
  959 + "source": "29",
  960 + "target": "23"
  961 + },
  962 + {
  963 + "source": "29",
  964 + "target": "27"
  965 + },
  966 + {
  967 + "source": "30",
  968 + "target": "23"
  969 + },
  970 + {
  971 + "source": "31",
  972 + "target": "11"
  973 + },
  974 + {
  975 + "source": "31",
  976 + "target": "23"
  977 + },
  978 + {
  979 + "source": "31",
  980 + "target": "27"
  981 + },
  982 + {
  983 + "source": "31",
  984 + "target": "30"
  985 + },
  986 + {
  987 + "source": "32",
  988 + "target": "11"
  989 + },
  990 + {
  991 + "source": "33",
  992 + "target": "11"
  993 + },
  994 + {
  995 + "source": "33",
  996 + "target": "27"
  997 + },
  998 + {
  999 + "source": "34",
  1000 + "target": "11"
  1001 + },
  1002 + {
  1003 + "source": "34",
  1004 + "target": "29"
  1005 + },
  1006 + {
  1007 + "source": "35",
  1008 + "target": "11"
  1009 + },
  1010 + {
  1011 + "source": "35",
  1012 + "target": "29"
  1013 + },
  1014 + {
  1015 + "source": "35",
  1016 + "target": "34"
  1017 + },
  1018 + {
  1019 + "source": "36",
  1020 + "target": "11"
  1021 + },
  1022 + {
  1023 + "source": "36",
  1024 + "target": "29"
  1025 + },
  1026 + {
  1027 + "source": "36",
  1028 + "target": "34"
  1029 + },
  1030 + {
  1031 + "source": "36",
  1032 + "target": "35"
  1033 + },
  1034 + {
  1035 + "source": "37",
  1036 + "target": "11"
  1037 + },
  1038 + {
  1039 + "source": "37",
  1040 + "target": "29"
  1041 + },
  1042 + {
  1043 + "source": "37",
  1044 + "target": "34"
  1045 + },
  1046 + {
  1047 + "source": "37",
  1048 + "target": "35"
  1049 + },
  1050 + {
  1051 + "source": "37",
  1052 + "target": "36"
  1053 + },
  1054 + {
  1055 + "source": "38",
  1056 + "target": "11"
  1057 + },
  1058 + {
  1059 + "source": "38",
  1060 + "target": "29"
  1061 + },
  1062 + {
  1063 + "source": "38",
  1064 + "target": "34"
  1065 + },
  1066 + {
  1067 + "source": "38",
  1068 + "target": "35"
  1069 + },
  1070 + {
  1071 + "source": "38",
  1072 + "target": "36"
  1073 + },
  1074 + {
  1075 + "source": "38",
  1076 + "target": "37"
  1077 + },
  1078 + {
  1079 + "source": "39",
  1080 + "target": "25"
  1081 + },
  1082 + {
  1083 + "source": "40",
  1084 + "target": "25"
  1085 + },
  1086 + {
  1087 + "source": "41",
  1088 + "target": "24"
  1089 + },
  1090 + {
  1091 + "source": "41",
  1092 + "target": "25"
  1093 + },
  1094 + {
  1095 + "source": "42",
  1096 + "target": "24"
  1097 + },
  1098 + {
  1099 + "source": "42",
  1100 + "target": "25"
  1101 + },
  1102 + {
  1103 + "source": "42",
  1104 + "target": "41"
  1105 + },
  1106 + {
  1107 + "source": "43",
  1108 + "target": "11"
  1109 + },
  1110 + {
  1111 + "source": "43",
  1112 + "target": "26"
  1113 + },
  1114 + {
  1115 + "source": "43",
  1116 + "target": "27"
  1117 + },
  1118 + {
  1119 + "source": "44",
  1120 + "target": "11"
  1121 + },
  1122 + {
  1123 + "source": "44",
  1124 + "target": "28"
  1125 + },
  1126 + {
  1127 + "source": "45",
  1128 + "target": "28"
  1129 + },
  1130 + {
  1131 + "source": "47",
  1132 + "target": "46"
  1133 + },
  1134 + {
  1135 + "source": "48",
  1136 + "target": "11"
  1137 + },
  1138 + {
  1139 + "source": "48",
  1140 + "target": "25"
  1141 + },
  1142 + {
  1143 + "source": "48",
  1144 + "target": "27"
  1145 + },
  1146 + {
  1147 + "source": "48",
  1148 + "target": "47"
  1149 + },
  1150 + {
  1151 + "source": "49",
  1152 + "target": "11"
  1153 + },
  1154 + {
  1155 + "source": "49",
  1156 + "target": "26"
  1157 + },
  1158 + {
  1159 + "source": "50",
  1160 + "target": "24"
  1161 + },
  1162 + {
  1163 + "source": "50",
  1164 + "target": "49"
  1165 + },
  1166 + {
  1167 + "source": "51",
  1168 + "target": "11"
  1169 + },
  1170 + {
  1171 + "source": "51",
  1172 + "target": "26"
  1173 + },
  1174 + {
  1175 + "source": "51",
  1176 + "target": "49"
  1177 + },
  1178 + {
  1179 + "source": "52",
  1180 + "target": "39"
  1181 + },
  1182 + {
  1183 + "source": "52",
  1184 + "target": "51"
  1185 + },
  1186 + {
  1187 + "source": "53",
  1188 + "target": "51"
  1189 + },
  1190 + {
  1191 + "source": "54",
  1192 + "target": "26"
  1193 + },
  1194 + {
  1195 + "source": "54",
  1196 + "target": "49"
  1197 + },
  1198 + {
  1199 + "source": "54",
  1200 + "target": "51"
  1201 + },
  1202 + {
  1203 + "source": "55",
  1204 + "target": "11"
  1205 + },
  1206 + {
  1207 + "source": "55",
  1208 + "target": "16"
  1209 + },
  1210 + {
  1211 + "source": "55",
  1212 + "target": "25"
  1213 + },
  1214 + {
  1215 + "source": "55",
  1216 + "target": "26"
  1217 + },
  1218 + {
  1219 + "source": "55",
  1220 + "target": "39"
  1221 + },
  1222 + {
  1223 + "source": "55",
  1224 + "target": "41"
  1225 + },
  1226 + {
  1227 + "source": "55",
  1228 + "target": "48"
  1229 + },
  1230 + {
  1231 + "source": "55",
  1232 + "target": "49"
  1233 + },
  1234 + {
  1235 + "source": "55",
  1236 + "target": "51"
  1237 + },
  1238 + {
  1239 + "source": "55",
  1240 + "target": "54"
  1241 + },
  1242 + {
  1243 + "source": "56",
  1244 + "target": "49"
  1245 + },
  1246 + {
  1247 + "source": "56",
  1248 + "target": "55"
  1249 + },
  1250 + {
  1251 + "source": "57",
  1252 + "target": "41"
  1253 + },
  1254 + {
  1255 + "source": "57",
  1256 + "target": "48"
  1257 + },
  1258 + {
  1259 + "source": "57",
  1260 + "target": "55"
  1261 + },
  1262 + {
  1263 + "source": "58",
  1264 + "target": "11"
  1265 + },
  1266 + {
  1267 + "source": "58",
  1268 + "target": "27"
  1269 + },
  1270 + {
  1271 + "source": "58",
  1272 + "target": "48"
  1273 + },
  1274 + {
  1275 + "source": "58",
  1276 + "target": "55"
  1277 + },
  1278 + {
  1279 + "source": "58",
  1280 + "target": "57"
  1281 + },
  1282 + {
  1283 + "source": "59",
  1284 + "target": "48"
  1285 + },
  1286 + {
  1287 + "source": "59",
  1288 + "target": "55"
  1289 + },
  1290 + {
  1291 + "source": "59",
  1292 + "target": "57"
  1293 + },
  1294 + {
  1295 + "source": "59",
  1296 + "target": "58"
  1297 + },
  1298 + {
  1299 + "source": "60",
  1300 + "target": "48"
  1301 + },
  1302 + {
  1303 + "source": "60",
  1304 + "target": "58"
  1305 + },
  1306 + {
  1307 + "source": "60",
  1308 + "target": "59"
  1309 + },
  1310 + {
  1311 + "source": "61",
  1312 + "target": "48"
  1313 + },
  1314 + {
  1315 + "source": "61",
  1316 + "target": "55"
  1317 + },
  1318 + {
  1319 + "source": "61",
  1320 + "target": "57"
  1321 + },
  1322 + {
  1323 + "source": "61",
  1324 + "target": "58"
  1325 + },
  1326 + {
  1327 + "source": "61",
  1328 + "target": "59"
  1329 + },
  1330 + {
  1331 + "source": "61",
  1332 + "target": "60"
  1333 + },
  1334 + {
  1335 + "source": "62",
  1336 + "target": "41"
  1337 + },
  1338 + {
  1339 + "source": "62",
  1340 + "target": "48"
  1341 + },
  1342 + {
  1343 + "source": "62",
  1344 + "target": "55"
  1345 + },
  1346 + {
  1347 + "source": "62",
  1348 + "target": "57"
  1349 + },
  1350 + {
  1351 + "source": "62",
  1352 + "target": "58"
  1353 + },
  1354 + {
  1355 + "source": "62",
  1356 + "target": "59"
  1357 + },
  1358 + {
  1359 + "source": "62",
  1360 + "target": "60"
  1361 + },
  1362 + {
  1363 + "source": "62",
  1364 + "target": "61"
  1365 + },
  1366 + {
  1367 + "source": "63",
  1368 + "target": "48"
  1369 + },
  1370 + {
  1371 + "source": "63",
  1372 + "target": "55"
  1373 + },
  1374 + {
  1375 + "source": "63",
  1376 + "target": "57"
  1377 + },
  1378 + {
  1379 + "source": "63",
  1380 + "target": "58"
  1381 + },
  1382 + {
  1383 + "source": "63",
  1384 + "target": "59"
  1385 + },
  1386 + {
  1387 + "source": "63",
  1388 + "target": "60"
  1389 + },
  1390 + {
  1391 + "source": "63",
  1392 + "target": "61"
  1393 + },
  1394 + {
  1395 + "source": "63",
  1396 + "target": "62"
  1397 + },
  1398 + {
  1399 + "source": "64",
  1400 + "target": "11"
  1401 + },
  1402 + {
  1403 + "source": "64",
  1404 + "target": "48"
  1405 + },
  1406 + {
  1407 + "source": "64",
  1408 + "target": "55"
  1409 + },
  1410 + {
  1411 + "source": "64",
  1412 + "target": "57"
  1413 + },
  1414 + {
  1415 + "source": "64",
  1416 + "target": "58"
  1417 + },
  1418 + {
  1419 + "source": "64",
  1420 + "target": "59"
  1421 + },
  1422 + {
  1423 + "source": "64",
  1424 + "target": "60"
  1425 + },
  1426 + {
  1427 + "source": "64",
  1428 + "target": "61"
  1429 + },
  1430 + {
  1431 + "source": "64",
  1432 + "target": "62"
  1433 + },
  1434 + {
  1435 + "source": "64",
  1436 + "target": "63"
  1437 + },
  1438 + {
  1439 + "source": "65",
  1440 + "target": "48"
  1441 + },
  1442 + {
  1443 + "source": "65",
  1444 + "target": "55"
  1445 + },
  1446 + {
  1447 + "source": "65",
  1448 + "target": "57"
  1449 + },
  1450 + {
  1451 + "source": "65",
  1452 + "target": "58"
  1453 + },
  1454 + {
  1455 + "source": "65",
  1456 + "target": "59"
  1457 + },
  1458 + {
  1459 + "source": "65",
  1460 + "target": "60"
  1461 + },
  1462 + {
  1463 + "source": "65",
  1464 + "target": "61"
  1465 + },
  1466 + {
  1467 + "source": "65",
  1468 + "target": "62"
  1469 + },
  1470 + {
  1471 + "source": "65",
  1472 + "target": "63"
  1473 + },
  1474 + {
  1475 + "source": "65",
  1476 + "target": "64"
  1477 + },
  1478 + {
  1479 + "source": "66",
  1480 + "target": "48"
  1481 + },
  1482 + {
  1483 + "source": "66",
  1484 + "target": "58"
  1485 + },
  1486 + {
  1487 + "source": "66",
  1488 + "target": "59"
  1489 + },
  1490 + {
  1491 + "source": "66",
  1492 + "target": "60"
  1493 + },
  1494 + {
  1495 + "source": "66",
  1496 + "target": "61"
  1497 + },
  1498 + {
  1499 + "source": "66",
  1500 + "target": "62"
  1501 + },
  1502 + {
  1503 + "source": "66",
  1504 + "target": "63"
  1505 + },
  1506 + {
  1507 + "source": "66",
  1508 + "target": "64"
  1509 + },
  1510 + {
  1511 + "source": "66",
  1512 + "target": "65"
  1513 + },
  1514 + {
  1515 + "source": "67",
  1516 + "target": "57"
  1517 + },
  1518 + {
  1519 + "source": "68",
  1520 + "target": "11"
  1521 + },
  1522 + {
  1523 + "source": "68",
  1524 + "target": "24"
  1525 + },
  1526 + {
  1527 + "source": "68",
  1528 + "target": "25"
  1529 + },
  1530 + {
  1531 + "source": "68",
  1532 + "target": "27"
  1533 + },
  1534 + {
  1535 + "source": "68",
  1536 + "target": "41"
  1537 + },
  1538 + {
  1539 + "source": "68",
  1540 + "target": "48"
  1541 + },
  1542 + {
  1543 + "source": "69",
  1544 + "target": "11"
  1545 + },
  1546 + {
  1547 + "source": "69",
  1548 + "target": "24"
  1549 + },
  1550 + {
  1551 + "source": "69",
  1552 + "target": "25"
  1553 + },
  1554 + {
  1555 + "source": "69",
  1556 + "target": "27"
  1557 + },
  1558 + {
  1559 + "source": "69",
  1560 + "target": "41"
  1561 + },
  1562 + {
  1563 + "source": "69",
  1564 + "target": "48"
  1565 + },
  1566 + {
  1567 + "source": "69",
  1568 + "target": "68"
  1569 + },
  1570 + {
  1571 + "source": "70",
  1572 + "target": "11"
  1573 + },
  1574 + {
  1575 + "source": "70",
  1576 + "target": "24"
  1577 + },
  1578 + {
  1579 + "source": "70",
  1580 + "target": "25"
  1581 + },
  1582 + {
  1583 + "source": "70",
  1584 + "target": "27"
  1585 + },
  1586 + {
  1587 + "source": "70",
  1588 + "target": "41"
  1589 + },
  1590 + {
  1591 + "source": "70",
  1592 + "target": "58"
  1593 + },
  1594 + {
  1595 + "source": "70",
  1596 + "target": "68"
  1597 + },
  1598 + {
  1599 + "source": "70",
  1600 + "target": "69"
  1601 + },
  1602 + {
  1603 + "source": "71",
  1604 + "target": "11"
  1605 + },
  1606 + {
  1607 + "source": "71",
  1608 + "target": "25"
  1609 + },
  1610 + {
  1611 + "source": "71",
  1612 + "target": "27"
  1613 + },
  1614 + {
  1615 + "source": "71",
  1616 + "target": "41"
  1617 + },
  1618 + {
  1619 + "source": "71",
  1620 + "target": "48"
  1621 + },
  1622 + {
  1623 + "source": "71",
  1624 + "target": "68"
  1625 + },
  1626 + {
  1627 + "source": "71",
  1628 + "target": "69"
  1629 + },
  1630 + {
  1631 + "source": "71",
  1632 + "target": "70"
  1633 + },
  1634 + {
  1635 + "source": "72",
  1636 + "target": "11"
  1637 + },
  1638 + {
  1639 + "source": "72",
  1640 + "target": "26"
  1641 + },
  1642 + {
  1643 + "source": "72",
  1644 + "target": "27"
  1645 + },
  1646 + {
  1647 + "source": "73",
  1648 + "target": "48"
  1649 + },
  1650 + {
  1651 + "source": "74",
  1652 + "target": "48"
  1653 + },
  1654 + {
  1655 + "source": "74",
  1656 + "target": "73"
  1657 + },
  1658 + {
  1659 + "source": "75",
  1660 + "target": "25"
  1661 + },
  1662 + {
  1663 + "source": "75",
  1664 + "target": "41"
  1665 + },
  1666 + {
  1667 + "source": "75",
  1668 + "target": "48"
  1669 + },
  1670 + {
  1671 + "source": "75",
  1672 + "target": "68"
  1673 + },
  1674 + {
  1675 + "source": "75",
  1676 + "target": "69"
  1677 + },
  1678 + {
  1679 + "source": "75",
  1680 + "target": "70"
  1681 + },
  1682 + {
  1683 + "source": "75",
  1684 + "target": "71"
  1685 + },
  1686 + {
  1687 + "source": "76",
  1688 + "target": "48"
  1689 + },
  1690 + {
  1691 + "source": "76",
  1692 + "target": "58"
  1693 + },
  1694 + {
  1695 + "source": "76",
  1696 + "target": "62"
  1697 + },
  1698 + {
  1699 + "source": "76",
  1700 + "target": "63"
  1701 + },
  1702 + {
  1703 + "source": "76",
  1704 + "target": "64"
  1705 + },
  1706 + {
  1707 + "source": "76",
  1708 + "target": "65"
  1709 + },
  1710 + {
  1711 + "source": "76",
  1712 + "target": "66"
  1713 + }
  1714 + ],
  1715 + "categories": [
  1716 + {
  1717 + "name": "A"
  1718 + },
  1719 + {
  1720 + "name": "B"
  1721 + },
  1722 + {
  1723 + "name": "C"
  1724 + },
  1725 + {
  1726 + "name": "D"
  1727 + },
  1728 + {
  1729 + "name": "E"
  1730 + },
  1731 + {
  1732 + "name": "F"
  1733 + },
  1734 + {
  1735 + "name": "G"
  1736 + },
  1737 + {
  1738 + "name": "H"
  1739 + },
  1740 + {
  1741 + "name": "I"
  1742 + }
  1743 + ]
  1744 + }
  1 +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
  2 +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
  3 +
  4 +export const GraphConfig: ConfigType = {
  5 + key: 'Graph',
  6 + chartKey: 'VGraph',
  7 + conKey: 'VCGraph',
  8 + title: '关系图',
  9 + category: ChatCategoryEnum.MORE,
  10 + categoryName: ChatCategoryEnumName.MORE,
  11 + package: PackagesCategoryEnum.CHARTS,
  12 + chartFrame: ChartFrameEnum.COMMON,
  13 + image: 'graph.png'
  14 +}
  1 +<template>
  2 + <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart>
  3 +</template>
  4 +
  5 +<script setup lang="ts">
  6 +import { ref, computed, PropType, watch } from 'vue'
  7 +import VChart from 'vue-echarts'
  8 +import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
  9 +import dataJson from './data.json'
  10 +import { use } from 'echarts/core'
  11 +import { CanvasRenderer } from 'echarts/renderers'
  12 +import { RadarChart } from 'echarts/charts'
  13 +import { includes } from './config'
  14 +import { mergeTheme, setOption } from '@/packages/public/chart'
  15 +import { useChartDataFetch } from '@/hooks'
  16 +import { CreateComponentType } from '@/packages/index.d'
  17 +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
  18 +import { isPreview } from '@/utils'
  19 +import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components'
  20 +
  21 +const props = defineProps({
  22 + themeSetting: {
  23 + type: Object,
  24 + required: true
  25 + },
  26 + themeColor: {
  27 + type: Object,
  28 + required: true
  29 + },
  30 + chartConfig: {
  31 + type: Object as PropType<CreateComponentType>,
  32 + required: true
  33 + }
  34 +})
  35 +
  36 +const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
  37 +
  38 +use([DatasetComponent, CanvasRenderer, RadarChart, GridComponent, TooltipComponent, LegendComponent])
  39 +
  40 +const vChartRef = ref<typeof VChart>()
  41 +
  42 +const option = computed(() => {
  43 + return mergeTheme(props.chartConfig.option, props.themeSetting, includes)
  44 +})
  45 +
  46 +const dataSetHandle = (dataset: typeof dataJson) => {
  47 + if (dataset.nodes) {
  48 + props.chartConfig.option.series[0].data = dataset.nodes
  49 + }
  50 + if (dataset.links) {
  51 + props.chartConfig.option.series[0].links = dataset.links
  52 + }
  53 + if (dataset.categories) {
  54 + props.chartConfig.option.series[0].categories = dataset.categories
  55 + // @ts-ignore
  56 + props.chartConfig.option.legend.data = dataset.categories.map((i: { name: string }) => i.name)
  57 + }
  58 + if (vChartRef.value && isPreview()) {
  59 + setOption(vChartRef.value, props.chartConfig.option)
  60 + }
  61 +}
  62 +
  63 +watch(
  64 + () => props.chartConfig.option.dataset,
  65 + newData => {
  66 + try {
  67 + dataSetHandle(newData)
  68 + } catch (error) {
  69 + console.log(error)
  70 + }
  71 + },
  72 + {
  73 + deep: false
  74 + }
  75 +)
  76 +
  77 +useChartDataFetch(props.chartConfig, useChartEditStore, (newData: typeof dataJson) => {
  78 + dataSetHandle(newData)
  79 +})
  80 +</script>
  1 +import { echartOptionProfixHandle, PublicConfigClass } from '@/packages/public'
  2 +import { SankeyConfig } from './index'
  3 +import { CreateComponentType } from '@/packages/index.d'
  4 +import cloneDeep from 'lodash/cloneDeep'
  5 +import dataJson from './data.json'
  6 +
  7 +export const includes = ['legend']
  8 +
  9 +// 图表方向
  10 +export const orientList = [
  11 + { label: '水平', value: 'horizontal' },
  12 + { label: '垂直', value: 'vertical' }
  13 +]
  14 +
  15 +// 标签展示
  16 +export const toolTipSwitch = [
  17 + { label: '开启', value: 1 },
  18 + { label: '关闭', value: 0 }
  19 +]
  20 +
  21 +export const option = {
  22 + dataset: { ...dataJson },
  23 + tooltip: {
  24 + show: 1,
  25 + trigger: 'item',
  26 + triggerOn: 'mousemove'
  27 + },
  28 + series: {
  29 + type: 'sankey',
  30 + layout: 'none',
  31 + orient:'horizontal',
  32 + data: dataJson.label,
  33 + links: dataJson.links,
  34 + levels: dataJson.levels
  35 + }
  36 +};
  37 +
  38 +export default class Config extends PublicConfigClass implements CreateComponentType {
  39 + public key = SankeyConfig.key
  40 + public chartConfig = cloneDeep(SankeyConfig)
  41 + // 图表配置项
  42 + public option = echartOptionProfixHandle(option, includes)
  43 +}
  1 +<template>
  2 + <div>
  3 + <CollapseItem name="桑基图" :expanded="true">
  4 + <SettingItemBox name="样式">
  5 + <SettingItem name="方向">
  6 + <n-select
  7 + v-model:value="sankeyConfig.orient"
  8 + size="small"
  9 + :options="orientList"
  10 + placeholder="选择方向"
  11 + />
  12 + </SettingItem>
  13 + <SettingItem name="提示标签">
  14 + <n-select
  15 + v-model:value="optionData.tooltip.show"
  16 + size="small"
  17 + :options="toolTipSwitch"
  18 + placeholder="是否开启"
  19 + />
  20 + </SettingItem>
  21 + </SettingItemBox>
  22 + </CollapseItem>
  23 + </div>
  24 +</template>
  25 +
  26 +<script setup lang="ts">
  27 +import { PropType, computed } from 'vue'
  28 +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
  29 +import { option, orientList, toolTipSwitch } from './config'
  30 +import { GlobalThemeJsonType } from '@/settings/chartThemes/index'
  31 +
  32 +const props = defineProps({
  33 + optionData: {
  34 + type: Object as PropType<typeof option & GlobalThemeJsonType>,
  35 + required: true
  36 + }
  37 +})
  38 +
  39 +const sankeyConfig = computed<typeof option.series>(() => {
  40 + return props.optionData.series
  41 +})
  42 +
  43 +</script>
  1 +{
  2 + "label": [
  3 + {
  4 + "name": "a"
  5 + },
  6 + {
  7 + "name": "b"
  8 + },
  9 + {
  10 + "name": "a1"
  11 + },
  12 + {
  13 + "name": "a2"
  14 + },
  15 + {
  16 + "name": "b1"
  17 + },
  18 + {
  19 + "name": "b2"
  20 + }
  21 + ],
  22 + "links": [
  23 + {
  24 + "source": "a",
  25 + "target": "a1",
  26 + "value": 5
  27 + },
  28 + {
  29 + "source": "a",
  30 + "target": "a2",
  31 + "value": 3
  32 + },
  33 + {
  34 + "source": "b",
  35 + "target": "b1",
  36 + "value": 8
  37 + },
  38 + {
  39 + "source": "a",
  40 + "target": "b1",
  41 + "value": 3
  42 + },
  43 + {
  44 + "source": "b1",
  45 + "target": "a1",
  46 + "value": 1
  47 + },
  48 + {
  49 + "source": "b1",
  50 + "target": "b2",
  51 + "value": 2
  52 + }
  53 + ],
  54 + "levels": [
  55 + {
  56 + "depth": 0,
  57 + "itemStyle": {
  58 + "color": "#decbe4"
  59 + },
  60 + "lineStyle": {
  61 + "color": "source",
  62 + "opacity": 0.9
  63 + }
  64 + },
  65 + {
  66 + "depth": 1,
  67 + "itemStyle": {
  68 + "color": "#b3cde3"
  69 + },
  70 + "lineStyle": {
  71 + "color": "source",
  72 + "opacity": 0.6
  73 + }
  74 + },
  75 + {
  76 + "depth": 2,
  77 + "itemStyle": {
  78 + "color": "#ccebc5"
  79 + },
  80 + "lineStyle": {
  81 + "color": "source",
  82 + "opacity": 0.6
  83 + }
  84 + }
  85 + ]
  86 +}
  1 +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
  2 +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
  3 +
  4 +export const SankeyConfig: ConfigType = {
  5 + key: 'Sankey',
  6 + chartKey: 'VSankey',
  7 + conKey: 'VCSankey',
  8 + title: '桑基图',
  9 + category: ChatCategoryEnum.MORE,
  10 + categoryName: ChatCategoryEnumName.MORE,
  11 + package: PackagesCategoryEnum.CHARTS,
  12 + chartFrame: ChartFrameEnum.COMMON,
  13 + image: 'sankey.png'
  14 +}
  1 +<template>
  2 + <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart>
  3 +</template>
  4 +
  5 +<script setup lang="ts">
  6 +import { ref, computed, PropType, watch } from 'vue'
  7 +import VChart from 'vue-echarts'
  8 +import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
  9 +import dataJson from './data.json'
  10 +import { use } from 'echarts/core'
  11 +import { CanvasRenderer } from 'echarts/renderers'
  12 +import { RadarChart } from 'echarts/charts'
  13 +import { includes } from './config'
  14 +import { mergeTheme, setOption } from '@/packages/public/chart'
  15 +import { useChartDataFetch } from '@/hooks'
  16 +import { CreateComponentType } from '@/packages/index.d'
  17 +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
  18 +import { isPreview } from '@/utils'
  19 +import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components'
  20 +
  21 +const props = defineProps({
  22 + themeSetting: {
  23 + type: Object,
  24 + required: true
  25 + },
  26 + themeColor: {
  27 + type: Object,
  28 + required: true
  29 + },
  30 + chartConfig: {
  31 + type: Object as PropType<CreateComponentType>,
  32 + required: true
  33 + }
  34 +})
  35 +
  36 +const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
  37 +
  38 +use([DatasetComponent, CanvasRenderer, RadarChart, GridComponent, TooltipComponent, LegendComponent])
  39 +
  40 +const vChartRef = ref<typeof VChart>()
  41 +
  42 +const option = computed(() => {
  43 + return mergeTheme(props.chartConfig.option, props.themeSetting, includes)
  44 +})
  45 +
  46 +const dataHandle = (dataset: typeof dataJson) => {
  47 + if (dataset.label) {
  48 + props.chartConfig.option.series.data = dataset.label
  49 + }
  50 + if (dataset.links) {
  51 + props.chartConfig.option.series.links = dataset.links
  52 + }
  53 + if (dataset.levels) {
  54 + props.chartConfig.option.series.levels = dataset.levels
  55 + }
  56 + if (vChartRef.value && isPreview()) {
  57 + setOption(vChartRef.value, props.chartConfig.option)
  58 + }
  59 +}
  60 +
  61 +watch(
  62 + () => props.chartConfig.option.dataset,
  63 + newData => {
  64 + try {
  65 + dataHandle(newData)
  66 + } catch (error) {
  67 + console.log(error)
  68 + }
  69 + },
  70 + {
  71 + deep: true
  72 + }
  73 +)
  74 +
  75 +useChartDataFetch(props.chartConfig, useChartEditStore, (newData: typeof dataJson) => {
  76 + dataHandle(newData)
  77 +})
  78 +</script>
@@ -8,7 +8,6 @@ @@ -8,7 +8,6 @@
8 <SettingItemBox name="内容"> 8 <SettingItemBox name="内容">
9 <SettingItem name="数值"> 9 <SettingItem name="数值">
10 <n-input-number 10 <n-input-number
11 - :disabled="true"  
12 v-model:value="item.data[0]" 11 v-model:value="item.data[0]"
13 :min="0" 12 :min="0"
14 :step="0.01" 13 :step="0.01"
@@ -4,5 +4,8 @@ import { FunnelConfig } from './Funnel/index' @@ -4,5 +4,8 @@ import { FunnelConfig } from './Funnel/index'
4 import { HeatmapConfig } from './Heatmap/index' 4 import { HeatmapConfig } from './Heatmap/index'
5 import { WaterPoloConfig } from './WaterPolo/index' 5 import { WaterPoloConfig } from './WaterPolo/index'
6 import { TreeMapConfig } from './TreeMap/index' 6 import { TreeMapConfig } from './TreeMap/index'
  7 +import { DialConfig } from './Dial/index'
  8 +import { SankeyConfig } from './Sankey/index'
  9 +import { GraphConfig } from './Graph/index'
7 10
8 -export default [ProcessConfig, RadarConfig, FunnelConfig, HeatmapConfig, WaterPoloConfig, TreeMapConfig] 11 +export default [ProcessConfig, RadarConfig, FunnelConfig, HeatmapConfig, WaterPoloConfig, TreeMapConfig, GraphConfig, SankeyConfig, DialConfig]
@@ -18,7 +18,14 @@ export const PieTypeObject = { @@ -18,7 +18,14 @@ export const PieTypeObject = {
18 [PieTypeEnum.ROSE]: 'rose' 18 [PieTypeEnum.ROSE]: 'rose'
19 } 19 }
20 20
  21 +// 其它配置
  22 +const otherConfig = {
  23 + // 轮播动画
  24 + isCarousel: false,
  25 +}
  26 +
21 const option = { 27 const option = {
  28 + ...otherConfig,
22 type: 'ring', 29 type: 'ring',
23 tooltip: { 30 tooltip: {
24 show: true, 31 show: true,
@@ -7,6 +7,17 @@ @@ -7,6 +7,17 @@
7 <n-select v-model:value="optionData.type" size="small" :options="fontWeightOptions" /> 7 <n-select v-model:value="optionData.type" size="small" :options="fontWeightOptions" />
8 </SettingItem> 8 </SettingItem>
9 </SettingItemBox> 9 </SettingItemBox>
  10 + <SettingItemBox name="动画" :alone="true">
  11 + <SettingItem>
  12 + <n-space>
  13 + <n-switch v-model:value="optionData.isCarousel" size="small"></n-switch>
  14 + <n-text>开启<n-text :depth="3">(将自动隐藏图例)</n-text></n-text>
  15 + </n-space>
  16 + </SettingItem>
  17 + <SettingItem>
  18 + <n-text :depth="3">无鼠标点击图例场景时,可强行打开图例</n-text>
  19 + </SettingItem>
  20 + </SettingItemBox>
10 <SettingItemBox name="标签"> 21 <SettingItemBox name="标签">
11 <SettingItem> 22 <SettingItem>
12 <n-space> 23 <n-space>
1 <template> 1 <template>
2 - <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart> 2 + <v-chart ref="vChartRef" autoresize :init-options="initOptions" :theme="themeColor" :option="option"
  3 + :manual-update="isPreview()" @mouseover="handleHighlight" @mouseout="handleDownplay"></v-chart>
3 </template> 4 </template>
4 5
5 <script setup lang="ts"> 6 <script setup lang="ts">
6 -import { computed, PropType, reactive, watch } from 'vue' 7 +import { computed, onMounted, PropType, reactive, watch } from 'vue'
7 import VChart from 'vue-echarts' 8 import VChart from 'vue-echarts'
8 import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook' 9 import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
9 import { use } from 'echarts/core' 10 import { use } from 'echarts/core'
@@ -15,6 +16,7 @@ import { useChartDataFetch } from '@/hooks' @@ -15,6 +16,7 @@ import { useChartDataFetch } from '@/hooks'
15 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' 16 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
16 import { isPreview } from '@/utils' 17 import { isPreview } from '@/utils'
17 import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components' 18 import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components'
  19 +import dataJson from './data.json'
18 20
19 const props = defineProps({ 21 const props = defineProps({
20 themeSetting: { 22 themeSetting: {
@@ -30,8 +32,10 @@ const props = defineProps({ @@ -30,8 +32,10 @@ const props = defineProps({
30 required: true 32 required: true
31 } 33 }
32 }) 34 })
33 -  
34 const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting) 35 const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
  36 +let seriesDataNum = -1
  37 +let seriesDataMaxLength = 0
  38 +let intervalInstance: any = null
35 39
36 use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent]) 40 use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent])
37 41
@@ -39,6 +43,54 @@ const option = computed(() => { @@ -39,6 +43,54 @@ const option = computed(() => {
39 return mergeTheme(props.chartConfig.option, props.themeSetting, includes) 43 return mergeTheme(props.chartConfig.option, props.themeSetting, includes)
40 }) 44 })
41 45
  46 +// 会重新选择需要选中和展示的数据
  47 +const handleSeriesData = () => {
  48 + if (seriesDataNum > -1) {
  49 + vChartRef.value?.dispatchAction({
  50 + type: 'downplay',
  51 + dataIndex: seriesDataNum
  52 + })
  53 + }
  54 + seriesDataNum = seriesDataNum >= seriesDataMaxLength - 1 ? 0 : seriesDataNum + 1
  55 + vChartRef.value?.dispatchAction({
  56 + type: 'highlight',
  57 + dataIndex: seriesDataNum
  58 + })
  59 +}
  60 +
  61 +// 新增轮播
  62 +const addPieInterval = (newData?: typeof dataJson, skipPre = false) => {
  63 + if (!skipPre && !Array.isArray(newData?.source)) return
  64 + if (!skipPre) seriesDataMaxLength = newData?.source.length || 0
  65 + clearInterval(intervalInstance)
  66 + intervalInstance = setInterval(() => {
  67 + handleSeriesData()
  68 + }, 1000)
  69 +}
  70 +
  71 +// 取消轮播
  72 +const clearPieInterval = () => {
  73 + vChartRef.value?.dispatchAction({
  74 + type: 'downplay',
  75 + dataIndex: seriesDataNum
  76 + })
  77 + clearInterval(intervalInstance)
  78 + intervalInstance = null
  79 +}
  80 +
  81 +// 处理鼠标聚焦高亮内容
  82 +const handleHighlight = () => {
  83 + clearPieInterval()
  84 +}
  85 +
  86 +// 处理鼠标取消悬浮
  87 +const handleDownplay = () => {
  88 + if (props.chartConfig.option.isCarousel && !intervalInstance) {
  89 + // 恢复轮播
  90 + addPieInterval(undefined, true)
  91 + }
  92 +}
  93 +
42 watch( 94 watch(
43 () => props.chartConfig.option.type, 95 () => props.chartConfig.option.type,
44 newData => { 96 newData => {
@@ -60,5 +112,27 @@ watch( @@ -60,5 +112,27 @@ watch(
60 { deep: false, immediate: true } 112 { deep: false, immediate: true }
61 ) 113 )
62 114
  115 +watch(
  116 + () => props.chartConfig.option.isCarousel,
  117 + newData => {
  118 + if (newData) {
  119 + addPieInterval(undefined, true)
  120 + props.chartConfig.option.legend.show = false
  121 + } else {
  122 + props.chartConfig.option.legend.show = true
  123 + clearPieInterval()
  124 + }
  125 + }
  126 +)
  127 +
63 const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore) 128 const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore)
  129 +
  130 +
  131 +
  132 +onMounted(() => {
  133 + seriesDataMaxLength = dataJson.source.length
  134 + if (props.chartConfig.option.isCarousel) {
  135 + addPieInterval(undefined, true)
  136 + }
  137 +})
64 </script> 138 </script>
@@ -16,6 +16,7 @@ export interface OptionType { @@ -16,6 +16,7 @@ export interface OptionType {
16 flipperGap: number 16 flipperGap: number
17 flipperType: FlipType 17 flipperType: FlipType
18 flipperSpeed: number 18 flipperSpeed: number
  19 + flipperBorderWidth: number
19 } 20 }
20 21
21 export const option: OptionType = { 22 export const option: OptionType = {
@@ -28,7 +29,8 @@ export const option: OptionType = { @@ -28,7 +29,8 @@ export const option: OptionType = {
28 flipperRadius: 5, 29 flipperRadius: 5,
29 flipperGap: 10, 30 flipperGap: 10,
30 flipperType: 'down', 31 flipperType: 'down',
31 - flipperSpeed: 450 32 + flipperSpeed: 450,
  33 + flipperBorderWidth: 0,
32 } 34 }
33 35
34 export default class Config extends PublicConfigClass implements CreateComponentType { 36 export default class Config extends PublicConfigClass implements CreateComponentType {
@@ -16,12 +16,16 @@ @@ -16,12 +16,16 @@
16 <setting-item name="高度"> 16 <setting-item name="高度">
17 <n-input-number v-model:value="optionData.flipperHeight" size="small" :min="1"></n-input-number> 17 <n-input-number v-model:value="optionData.flipperHeight" size="small" :min="1"></n-input-number>
18 </setting-item> 18 </setting-item>
19 - <setting-item name="间隔">  
20 - <n-input-number v-model:value="optionData.flipperGap" size="small" :min="0"></n-input-number> 19 + <setting-item name="边框">
  20 + <n-input-number v-model:value="optionData.flipperBorderWidth" size="small" :min="0" :max="10"></n-input-number>
21 </setting-item> 21 </setting-item>
22 <setting-item name="圆角"> 22 <setting-item name="圆角">
23 <n-input-number v-model:value="optionData.flipperRadius" size="small" :min="0"></n-input-number> 23 <n-input-number v-model:value="optionData.flipperRadius" size="small" :min="0"></n-input-number>
24 </setting-item> 24 </setting-item>
  25 + <setting-item name="翻牌间隔">
  26 + <n-input-number v-model:value="optionData.flipperGap" size="small" :min="0"></n-input-number>
  27 + </setting-item>
  28 + <setting-item />
25 <setting-item name="背景色"> 29 <setting-item name="背景色">
26 <n-color-picker 30 <n-color-picker
27 size="small" 31 size="small"
@@ -9,6 +9,7 @@ @@ -9,6 +9,7 @@
9 :radius="flipperRadius" 9 :radius="flipperRadius"
10 :flip-type="flipperType" 10 :flip-type="flipperType"
11 :duration="flipperSpeed" 11 :duration="flipperSpeed"
  12 + :border-width="flipperBorderWidth"
12 v-for="(item, index) in flipperData" 13 v-for="(item, index) in flipperData"
13 :key="index" 14 :key="index"
14 class="go-d-block" 15 class="go-d-block"
@@ -42,7 +43,8 @@ const { @@ -42,7 +43,8 @@ const {
42 flipperRadius, 43 flipperRadius,
43 flipperGap, 44 flipperGap,
44 flipperType, 45 flipperType,
45 - flipperSpeed 46 + flipperSpeed,
  47 + flipperBorderWidth
46 } = toRefs(props.chartConfig.option as OptionType) 48 } = toRefs(props.chartConfig.option as OptionType)
47 49
48 const flipperData = ref<string[] | number[]>([]) 50 const flipperData = ref<string[] | number[]>([])
  1 +import { PublicConfigClass } from '@/packages/public'
  2 +import { CreateComponentType } from '@/packages/index.d'
  3 +import { chartInitConfig } from '@/settings/designSetting'
  4 +import { PipelineHConfig } from './index'
  5 +import cloneDeep from 'lodash/cloneDeep'
  6 +
  7 +export const option = {
  8 + color_type: 1,
  9 + o_color: '#0a7ae2',
  10 + i_color: '#119bfa',
  11 + line_class: 'svg_ani_flow'
  12 +}
  13 +
  14 +export default class Config extends PublicConfigClass implements CreateComponentType {
  15 + public key = PipelineHConfig.key
  16 + public attr = { ...chartInitConfig, w: 500, h: 15, zIndex: -1 }
  17 + public chartConfig = cloneDeep(PipelineHConfig)
  18 + public option = cloneDeep(option)
  19 +}
  1 +<template>
  2 + <CollapseItem name="管道" :expanded="true">
  3 + <SettingItemBox name="默认颜色">
  4 + <SettingItem>
  5 + <n-select v-model:value="optionData.color_type" :options="colorOptions" @update:value="handleColorChange" />
  6 + </SettingItem>
  7 + </SettingItemBox>
  8 + <SettingItemBox name="管道颜色">
  9 + <SettingItem>
  10 + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.o_color"></n-color-picker>
  11 + </SettingItem>
  12 + </SettingItemBox>
  13 + <SettingItemBox name="水流颜色">
  14 + <SettingItem>
  15 + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.i_color"></n-color-picker>
  16 + </SettingItem>
  17 + </SettingItemBox>
  18 + <SettingItemBox name="流向">
  19 + <SettingItem>
  20 + <n-select v-model:value="optionData.line_class" :options="options" />
  21 + </SettingItem>
  22 + </SettingItemBox>
  23 + </CollapseItem>
  24 +</template>
  25 +
  26 +<script setup lang="ts">
  27 +import { PropType, ref } from 'vue'
  28 +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
  29 +import { option } from './config'
  30 +
  31 +const props = defineProps({
  32 + optionData: {
  33 + type: Object as PropType<typeof option>,
  34 + required: true
  35 + }
  36 +})
  37 +
  38 +const options = ref([
  39 + {
  40 + value: 'svg_ani_flow',
  41 + label: '正向'
  42 + },
  43 + {
  44 + value: 'svg_ani_flow_back',
  45 + label: '反向'
  46 + },
  47 + {
  48 + value: 'svg_ani_flow_stop',
  49 + label: '停止'
  50 + }
  51 +])
  52 +
  53 +const colorOptions = ref([
  54 + {
  55 + value: 1,
  56 + label: '蓝'
  57 + },
  58 + {
  59 + value: 2,
  60 + label: '黄'
  61 + }
  62 +])
  63 +
  64 +// 默认颜色
  65 +const handleColorChange = (e: number) => {
  66 + switch (e) {
  67 + case 1:
  68 + props.optionData.o_color = '#0a7ae2'
  69 + props.optionData.i_color = '#119bfa'
  70 + break
  71 + case 2:
  72 + props.optionData.o_color = '#ff9d00'
  73 + props.optionData.i_color = '#f7ea37'
  74 + break
  75 + }
  76 +}
  77 +</script>
  1 +import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
  2 +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
  3 +
  4 +export const PipelineHConfig: ConfigType = {
  5 + key: 'PipelineH',
  6 + chartKey: 'VPipelineH',
  7 + conKey: 'VCPipelineH',
  8 + title: '管道-横向',
  9 + category: ChatCategoryEnum.MORE,
  10 + categoryName: ChatCategoryEnumName.MORE,
  11 + package: PackagesCategoryEnum.DECORATES,
  12 + image: 'Pipeline_H.png'
  13 +}
  1 +<template>
  2 + <div class="go-decorates-line">
  3 + <svg :width="w" :height="h">
  4 + <line :x1="0" :y1="h / 2" :x2="w" :y2="h / 2" :stroke="o_color" :stroke-width="h"></line>
  5 + <line :x1="0" :y1="h / 2" :x2="w" :y2="h / 2" :stroke="i_color" :stroke-width="h / 2" :class="line_class"></line>
  6 + </svg>
  7 + </div>
  8 +</template>
  9 +
  10 +<script setup lang="ts">
  11 +import { PropType, toRefs } from 'vue'
  12 +import { CreateComponentType } from '@/packages/index.d'
  13 +
  14 +const props = defineProps({
  15 + chartConfig: {
  16 + type: Object as PropType<CreateComponentType>,
  17 + required: true
  18 + }
  19 +})
  20 +
  21 +const { w, h } = toRefs(props.chartConfig.attr)
  22 +const { o_color, i_color, line_class } = toRefs(props.chartConfig.option)
  23 +</script>
  24 +
  25 +<style lang="scss" scoped>
  26 +.go-decorates-line {
  27 + font-size: 0;
  28 +}
  29 +
  30 +/* 正向流动效果 */
  31 +.svg_ani_flow {
  32 + stroke-dasharray: 1000;
  33 + stroke-dashoffset: 1000;
  34 + animation: ani_flow 10s linear infinite;
  35 + animation-fill-mode: forwards;
  36 + -webkit-animation: ani_flow 10s linear infinite;
  37 + -webkit-animation-fill-mode: forwards;
  38 +}
  39 +
  40 +@keyframes ani_flow {
  41 + from {
  42 + stroke-dasharray: 10, 5;
  43 + }
  44 +
  45 + to {
  46 + stroke-dasharray: 13, 5;
  47 + }
  48 +}
  49 +@-webkit-keyframes ani_flow {
  50 + from {
  51 + stroke-dasharray: 10, 5;
  52 + }
  53 +
  54 + to {
  55 + stroke-dasharray: 13, 5;
  56 + }
  57 +}
  58 +
  59 +/* 停止流动效果 */
  60 +.svg_ani_flow_stop {
  61 + stroke-dasharray: 1000;
  62 + stroke-dashoffset: 1000;
  63 + animation: ani_flow_stop 10s linear infinite;
  64 + animation-fill-mode: forwards;
  65 + -webkit-animation: ani_flow_stop 10s linear infinite;
  66 + -webkit-animation-fill-mode: forwards;
  67 +}
  68 +
  69 +@keyframes ani_flow_stop {
  70 + from {
  71 + stroke-dasharray: 10, 5;
  72 + }
  73 +
  74 + to {
  75 + stroke-dasharray: 10, 5;
  76 + }
  77 +}
  78 +@-webkit-keyframes ani_flow_stop {
  79 + from {
  80 + stroke-dasharray: 10, 5;
  81 + }
  82 +
  83 + to {
  84 + stroke-dasharray: 10, 5;
  85 + }
  86 +}
  87 +/* 反向流动效果 */
  88 +.svg_ani_flow_back {
  89 + stroke-dasharray: 1000;
  90 + stroke-dashoffset: 1000;
  91 + animation: ani_flow_back 10s linear infinite;
  92 + animation-fill-mode: forwards;
  93 + -webkit-animation: ani_flow_back 10s linear infinite;
  94 + -webkit-animation-fill-mode: forwards;
  95 +}
  96 +
  97 +@keyframes ani_flow_back {
  98 + from {
  99 + stroke-dasharray: 13, 5;
  100 + }
  101 +
  102 + to {
  103 + stroke-dasharray: 10, 5;
  104 + }
  105 +}
  106 +@-webkit-keyframes ani_flow_stop {
  107 + from {
  108 + stroke-dasharray: 10, 5;
  109 + }
  110 +
  111 + to {
  112 + stroke-dasharray: 10, 5;
  113 + }
  114 +}
  115 +/* 以最大40高度填充 */
  116 +.svg_ani_fill_h40 {
  117 + animation: ani_fill_h40 5s linear infinite;
  118 + animation-fill-mode: forwards;
  119 + -webkit-animation: ani_fill_h40 5s linear infinite;
  120 + -webkit-animation-fill-mode: forwards;
  121 +}
  122 +
  123 +@keyframes ani_fill_h40 {
  124 + from {
  125 + height: 0px;
  126 + }
  127 +
  128 + to {
  129 + height: 40px;
  130 + }
  131 +}
  132 +@-webkit-keyframes ani_flow_stop {
  133 + from {
  134 + stroke-dasharray: 10, 5;
  135 + }
  136 +
  137 + to {
  138 + stroke-dasharray: 10, 5;
  139 + }
  140 +}
  141 +</style>
  1 +import { PublicConfigClass } from '@/packages/public'
  2 +import { CreateComponentType } from '@/packages/index.d'
  3 +import { chartInitConfig } from '@/settings/designSetting'
  4 +import { PipelineVConfig } from './index'
  5 +import cloneDeep from 'lodash/cloneDeep'
  6 +
  7 +export const option = {
  8 + color_type: 1,
  9 + o_color: '#0a7ae2',
  10 + i_color: '#119bfa',
  11 + line_class: 'svg_ani_flow'
  12 +}
  13 +
  14 +export default class Config extends PublicConfigClass implements CreateComponentType {
  15 + public key = PipelineVConfig.key
  16 + public attr = { ...chartInitConfig, w: 15, h: 500, zIndex: -1 }
  17 + public chartConfig = cloneDeep(PipelineVConfig)
  18 + public option = cloneDeep(option)
  19 +}
  1 +<template>
  2 + <CollapseItem name="管道" :expanded="true">
  3 + <SettingItemBox name="默认颜色">
  4 + <SettingItem>
  5 + <n-select v-model:value="optionData.color_type" :options="colorOptions" @update:value="handleColorChange" />
  6 + </SettingItem>
  7 + </SettingItemBox>
  8 + <SettingItemBox name="管道颜色">
  9 + <SettingItem>
  10 + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.o_color"></n-color-picker>
  11 + </SettingItem>
  12 + </SettingItemBox>
  13 + <SettingItemBox name="水流颜色">
  14 + <SettingItem>
  15 + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.i_color"></n-color-picker>
  16 + </SettingItem>
  17 + </SettingItemBox>
  18 + <SettingItemBox name="流向">
  19 + <SettingItem>
  20 + <n-select v-model:value="optionData.line_class" :options="options" />
  21 + </SettingItem>
  22 + </SettingItemBox>
  23 + </CollapseItem>
  24 +</template>
  25 +
  26 +<script setup lang="ts">
  27 +import { PropType, ref } from 'vue'
  28 +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
  29 +import { option } from './config'
  30 +
  31 +const props = defineProps({
  32 + optionData: {
  33 + type: Object as PropType<typeof option>,
  34 + required: true
  35 + }
  36 +})
  37 +
  38 +const options = ref([
  39 + {
  40 + value: 'svg_ani_flow',
  41 + label: '正向'
  42 + },
  43 + {
  44 + value: 'svg_ani_flow_back',
  45 + label: '反向'
  46 + },
  47 + {
  48 + value: 'svg_ani_flow_stop',
  49 + label: '停止'
  50 + }
  51 +])
  52 +
  53 +const colorOptions = ref([
  54 + {
  55 + value: 1,
  56 + label: '蓝'
  57 + },
  58 + {
  59 + value: 2,
  60 + label: '黄'
  61 + }
  62 +])
  63 +
  64 +// 默认颜色
  65 +const handleColorChange = (e: number) => {
  66 + switch (e) {
  67 + case 1:
  68 + props.optionData.o_color = '#0a7ae2'
  69 + props.optionData.i_color = '#119bfa'
  70 + break
  71 + case 2:
  72 + props.optionData.o_color = '#ff9d00'
  73 + props.optionData.i_color = '#f7ea37'
  74 + break
  75 + }
  76 +}
  77 +</script>
  1 +import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
  2 +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
  3 +
  4 +export const PipelineVConfig: ConfigType = {
  5 + key: 'PipelineV',
  6 + chartKey: 'VPipelineV',
  7 + conKey: 'VCPipelineV',
  8 + title: '管道-纵向',
  9 + category: ChatCategoryEnum.MORE,
  10 + categoryName: ChatCategoryEnumName.MORE,
  11 + package: PackagesCategoryEnum.DECORATES,
  12 + image: 'Pipeline_V.png'
  13 +}
  14 +
  1 +<template>
  2 + <div class="go-decorates-line">
  3 + <svg :width="w" :height="h">
  4 + <line :x1="w / 2" :y1="0" :x2="w / 2" :y2="h" :stroke="o_color" :stroke-width="w"></line>
  5 + <line :x1="w / 2" :y1="0" :x2="w / 2" :y2="h" :stroke="i_color" :stroke-width="w / 2" :class="line_class"></line>
  6 + </svg>
  7 + </div>
  8 +</template>
  9 +
  10 +<script setup lang="ts">
  11 +import { PropType, toRefs } from 'vue'
  12 +import { CreateComponentType } from '@/packages/index.d'
  13 +
  14 +const props = defineProps({
  15 + chartConfig: {
  16 + type: Object as PropType<CreateComponentType>,
  17 + required: true
  18 + }
  19 +})
  20 +
  21 +const { w, h } = toRefs(props.chartConfig.attr)
  22 +const { o_color, i_color, line_class } = toRefs(props.chartConfig.option)
  23 +</script>
  24 +
  25 +<style lang="scss" scoped>
  26 +.go-decorates-line {
  27 + font-size: 0;
  28 +}
  29 +
  30 +/* 正向流动效果 */
  31 +.svg_ani_flow {
  32 + stroke-dasharray: 1000;
  33 + stroke-dashoffset: 1000;
  34 + animation: ani_flow 10s linear infinite;
  35 + animation-fill-mode: forwards;
  36 + -webkit-animation: ani_flow 10s linear infinite;
  37 + -webkit-animation-fill-mode: forwards;
  38 +}
  39 +
  40 +@keyframes ani_flow {
  41 + from {
  42 + stroke-dasharray: 10, 5;
  43 + }
  44 +
  45 + to {
  46 + stroke-dasharray: 13, 5;
  47 + }
  48 +}
  49 +@-webkit-keyframes ani_flow {
  50 + from {
  51 + stroke-dasharray: 10, 5;
  52 + }
  53 +
  54 + to {
  55 + stroke-dasharray: 13, 5;
  56 + }
  57 +}
  58 +
  59 +/* 停止流动效果 */
  60 +.svg_ani_flow_stop {
  61 + stroke-dasharray: 1000;
  62 + stroke-dashoffset: 1000;
  63 + animation: ani_flow_stop 10s linear infinite;
  64 + animation-fill-mode: forwards;
  65 + -webkit-animation: ani_flow_stop 10s linear infinite;
  66 + -webkit-animation-fill-mode: forwards;
  67 +}
  68 +
  69 +@keyframes ani_flow_stop {
  70 + from {
  71 + stroke-dasharray: 10, 5;
  72 + }
  73 +
  74 + to {
  75 + stroke-dasharray: 10, 5;
  76 + }
  77 +}
  78 +@-webkit-keyframes ani_flow_stop {
  79 + from {
  80 + stroke-dasharray: 10, 5;
  81 + }
  82 +
  83 + to {
  84 + stroke-dasharray: 10, 5;
  85 + }
  86 +}
  87 +/* 反向流动效果 */
  88 +.svg_ani_flow_back {
  89 + stroke-dasharray: 1000;
  90 + stroke-dashoffset: 1000;
  91 + animation: ani_flow_back 10s linear infinite;
  92 + animation-fill-mode: forwards;
  93 + -webkit-animation: ani_flow_back 10s linear infinite;
  94 + -webkit-animation-fill-mode: forwards;
  95 +}
  96 +
  97 +@keyframes ani_flow_back {
  98 + from {
  99 + stroke-dasharray: 13, 5;
  100 + }
  101 +
  102 + to {
  103 + stroke-dasharray: 10, 5;
  104 + }
  105 +}
  106 +@-webkit-keyframes ani_flow_back {
  107 + from {
  108 + stroke-dasharray: 13, 5;
  109 + }
  110 +
  111 + to {
  112 + stroke-dasharray: 10, 5;
  113 + }
  114 +}
  115 +</style>
@@ -3,5 +3,7 @@ import { TimeCommonConfig } from './TimeCommon/index' @@ -3,5 +3,7 @@ import { TimeCommonConfig } from './TimeCommon/index'
3 import { ClockConfig } from './Clock/index' 3 import { ClockConfig } from './Clock/index'
4 import { CountDownConfig } from './CountDown/index' 4 import { CountDownConfig } from './CountDown/index'
5 import { FlipperNumberConfig } from './FlipperNumber' 5 import { FlipperNumberConfig } from './FlipperNumber'
  6 +import { PipelineHConfig } from './PipelineH/index'
  7 +import { PipelineVConfig } from './PipelineV/index'
6 8
7 -export default [NumberConfig, FlipperNumberConfig, TimeCommonConfig, CountDownConfig, ClockConfig] 9 +export default [NumberConfig, FlipperNumberConfig, TimeCommonConfig, CountDownConfig, ClockConfig, PipelineHConfig, PipelineVConfig]
  1 +import { IconConfig } from '../Default/Icon/index'
  2 +import { PackagesCategoryEnum } from '@/packages/index.d'
  3 +import { ChatCategoryEnum, ChatCategoryEnumName } from '../index.d'
  4 +
  5 +const iconNames = [
  6 + 'uim:adobe',
  7 + 'uim:airplay',
  8 + 'uim:align',
  9 + 'uim:angle-double-down',
  10 + 'uim:angle-double-left',
  11 + 'uim:angle-double-right',
  12 + 'uim:angle-double-up',
  13 + 'uim:angle-down',
  14 + 'uim:angle-left',
  15 + 'uim:angle-right',
  16 + 'uim:angle-up',
  17 + 'uim:android-alt',
  18 + 'uim:apple',
  19 + 'uim:apps',
  20 + 'uim:bag',
  21 + 'uim:battery-bolt',
  22 + 'uim:bing',
  23 + 'uim:box',
  24 + 'uim:briefcase',
  25 + 'uim:calender',
  26 + 'uim:chart',
  27 + 'uim:chart-pie',
  28 + 'uim:circle-layer',
  29 + 'uim:clinic-medical',
  30 + 'uim:clock',
  31 + 'uim:comment-alt',
  32 + 'uim:comment-alt-dots',
  33 + 'uim:docker',
  34 + 'uim:download-alt',
  35 + 'uim:dribbble',
  36 + 'uim:dropbox',
  37 + 'uim:entry',
  38 + 'uim:exclamation-circle',
  39 + 'uim:exclamation-triangle',
  40 + 'uim:exit',
  41 + 'uim:facebook',
  42 + 'uim:facebook-messenger',
  43 + 'uim:facebook-messenger-alt',
  44 + 'uim:google-drive',
  45 + 'uim:google-play',
  46 + 'uim:graph-bar',
  47 + 'uim:head-side-mask',
  48 + 'uim:horizontal-align-left',
  49 + 'uim:hospital',
  50 + 'uim:house-user',
  51 + 'uim:image-v',
  52 + 'uim:key-skeleton',
  53 + 'uim:layer-group',
  54 + 'uim:layers-alt',
  55 + 'uim:link-h',
  56 + 'uim:microscope',
  57 + 'uim:microsoft',
  58 + 'uim:object-group',
  59 + 'uim:object-ungroup',
  60 + 'uim:paypal',
  61 + 'uim:refresh',
  62 + 'uim:repeat',
  63 + 'uim:right-indent-alt',
  64 + 'uim:rocket',
  65 + 'uim:shield-plus',
  66 + 'uim:social-distancing',
  67 + 'uim:telegram-alt',
  68 + 'uim:user-md',
  69 + 'uim:toilet-paper',
  70 + 'uim:youtube'
  71 +]
  72 +const iconList = iconNames.map(name => ({
  73 + ...IconConfig,
  74 + category: ChatCategoryEnum.COMMON,
  75 + categoryName: ChatCategoryEnumName.COMMON,
  76 + package: PackagesCategoryEnum.ICONS,
  77 + image: name,
  78 + icon: name,
  79 + dataset: name,
  80 + title: name.replace('uim:', ''),
  81 + redirectComponent: `${IconConfig.package}/${IconConfig.category}/${IconConfig.key}` // 跳转组件路径规则:packageName/categoryName/componentKey
  82 +}))
  83 +
  84 +export default iconList
  1 +import { PublicConfigClass } from '@/packages/public'
  2 +import { CreateComponentType } from '@/packages/index.d'
  3 +import { chartInitConfig } from '@/settings/designSetting'
  4 +import { IconConfig } from './index'
  5 +import cloneDeep from 'lodash/cloneDeep'
  6 +
  7 +export const option = {
  8 + // 图标名称
  9 + dataset: 'uim:apple',
  10 + color: '#03A9F4',
  11 + size: 64,
  12 + rotate: 0 // 旋转角度
  13 +}
  14 +
  15 +export default class Config extends PublicConfigClass implements CreateComponentType {
  16 + public key = IconConfig.key
  17 + public attr = { ...chartInitConfig, w: 64, h: 64, zIndex: 1 }
  18 + public chartConfig = cloneDeep(IconConfig)
  19 + public option = cloneDeep(option)
  20 +}
  1 +<template>
  2 + <collapse-item name="属性" :expanded="true">
  3 + <setting-item-box name="样式">
  4 + <setting-item name="颜色">
  5 + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.color"></n-color-picker>
  6 + </setting-item>
  7 + <setting-item name="尺寸">
  8 + <n-input-number v-model:value="optionData.size" size="small" :min="0" placeholder="尺寸"></n-input-number>
  9 + </setting-item>
  10 + </setting-item-box>
  11 + <setting-item-box name="旋转">
  12 + <setting-item name="旋转">
  13 + <n-select v-model:value="optionData.rotate" size="small" :options="rotateMode"></n-select>
  14 + </setting-item>
  15 + </setting-item-box>
  16 + </collapse-item>
  17 +</template>
  18 +
  19 +<script setup lang="ts">
  20 +import { PropType } from 'vue'
  21 +import { option } from './config'
  22 +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
  23 +
  24 +const props = defineProps({
  25 + optionData: {
  26 + type: Object as PropType<typeof option>,
  27 + required: true
  28 + }
  29 +})
  30 +
  31 +// 旋转方式
  32 +const rotateMode = [
  33 + {
  34 + value: 0,
  35 + label: '0°'
  36 + },
  37 + {
  38 + value: 1,
  39 + label: '90°'
  40 + },
  41 + {
  42 + value: 2,
  43 + label: '180°'
  44 + },
  45 + {
  46 + value: 3,
  47 + label: '270°'
  48 + }
  49 +]
  50 +</script>
  1 +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
  2 +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
  3 +
  4 +export const IconConfig: ConfigType = {
  5 + key: 'Icon',
  6 + chartKey: 'VIcon',
  7 + conKey: 'VCIcon',
  8 + title: '图标',
  9 + category: ChatCategoryEnum.DEFAULT,
  10 + categoryName: ChatCategoryEnumName.DEFAULT,
  11 + package: PackagesCategoryEnum.ICONS,
  12 + chartFrame: ChartFrameEnum.STATIC,
  13 + image: 'icon.png'
  14 +}
  1 +<template>
  2 + <div class="go-icon-box">
  3 + <Icon :icon="((dataset || '') as string)" :color="color" :width="size" :rotate="rotate" />
  4 + </div>
  5 +</template>
  6 +
  7 +<script setup lang="ts">
  8 +import { PropType, toRefs } from 'vue'
  9 +import { CreateComponentType } from '@/packages/index.d'
  10 +import { Icon } from '@iconify/vue'
  11 +
  12 +const props = defineProps({
  13 + chartConfig: {
  14 + type: Object as PropType<CreateComponentType>,
  15 + required: true
  16 + }
  17 +})
  18 +
  19 +const { w, h } = toRefs(props.chartConfig.attr)
  20 +const { dataset, color, size, rotate } = toRefs(props.chartConfig.option)
  21 +</script>
  22 +
  23 +<style lang="scss" scoped>
  24 +@include go('icon-box') {
  25 + display: flex;
  26 + align-items: center;
  27 + justify-content: center;
  28 + width: v-bind('`${w}px`');
  29 + height: v-bind('`${h}px`');
  30 +}
  31 +</style>
  1 +import { IconConfig } from '../Default/Icon/index'
  2 +import { PackagesCategoryEnum } from '@/packages/index.d'
  3 +import { ChatCategoryEnum, ChatCategoryEnumName } from '../index.d'
  4 +
  5 +const iconNames = [
  6 + 'line-md:beer-alt-filled-loop',
  7 + 'line-md:beer-alt-twotone-loop',
  8 + 'line-md:cloud-braces-loop',
  9 + 'line-md:cloud-download-loop',
  10 + 'line-md:cloud-download-outline-loop',
  11 + 'line-md:cloud-upload-loop',
  12 + 'line-md:cloud-upload-outline-loop',
  13 + 'line-md:coffee-half-empty-twotone-loop',
  14 + 'line-md:coffee-loop',
  15 + 'line-md:coffee-twotone-loop',
  16 + 'line-md:downloading-loop',
  17 + 'line-md:github-loop',
  18 + 'line-md:light-dark-loop',
  19 + 'line-md:loading-alt-loop',
  20 + 'line-md:loading-loop',
  21 + 'line-md:loading-twotone-loop',
  22 + 'line-md:moon-alt-loop',
  23 + 'line-md:moon-alt-to-sunny-outline-loop-transition',
  24 + 'line-md:moon-filled-loop',
  25 + 'line-md:moon-filled-to-sunny-filled-loop-transition',
  26 + 'line-md:star-pulsating-filled-loop',
  27 + 'line-md:star-pulsating-loop',
  28 + 'line-md:star-pulsating-twotone-loop',
  29 + 'line-md:upload-loop',
  30 + 'line-md:upload-outline-loop',
  31 + 'line-md:uploading-loop'
  32 +]
  33 +const iconList = iconNames.map(name => ({
  34 + ...IconConfig,
  35 + category: ChatCategoryEnum.ML,
  36 + categoryName: ChatCategoryEnumName.ML,
  37 + package: PackagesCategoryEnum.ICONS,
  38 + image: name,
  39 + icon: name,
  40 + dataset: name,
  41 + title: name.replace('line-md:', ''),
  42 + redirectComponent: `${IconConfig.package}/${IconConfig.category}/${IconConfig.key}` // 跳转组件路径规则:packageName/categoryName/componentKey
  43 +}))
  44 +
  45 +export default iconList
  1 +import { IconConfig } from '../Default/Icon/index'
  2 +import { PackagesCategoryEnum } from '@/packages/index.d'
  3 +import { ChatCategoryEnum, ChatCategoryEnumName } from '../index.d'
  4 +
  5 +const iconNames = [
  6 + 'wi:cloud',
  7 + 'wi:cloudy',
  8 + 'wi:cloudy-gusts',
  9 + 'wi:cloudy-windy',
  10 + 'wi:day-cloudy',
  11 + 'wi:day-cloudy-high',
  12 + 'wi:day-hail',
  13 + 'wi:day-haze',
  14 + 'wi:day-light-wind',
  15 + 'wi:day-lightning',
  16 + 'wi:day-rain',
  17 + 'wi:day-rain-mix',
  18 + 'wi:day-rain-wind',
  19 + 'wi:day-showers',
  20 + 'wi:day-sleet',
  21 + 'wi:day-sleet-storm',
  22 + 'wi:day-snow',
  23 + 'wi:day-snow-thunderstorm',
  24 + 'wi:day-snow-wind',
  25 + 'wi:day-sprinkle',
  26 + 'wi:day-storm-showers',
  27 + 'wi:day-sunny',
  28 + 'wi:day-sunny-overcast',
  29 + 'wi:hail',
  30 + 'wi:horizon',
  31 + 'wi:horizon-alt',
  32 + 'wi:hot',
  33 + 'wi:lightning',
  34 + 'wi:night-alt-cloudy',
  35 + 'wi:night-alt-cloudy-gusts',
  36 + 'wi:night-alt-cloudy-high',
  37 + 'wi:night-alt-hail',
  38 + 'wi:night-alt-lightning',
  39 + 'wi:umbrella'
  40 +]
  41 +const iconList = iconNames.map(name => ({
  42 + ...IconConfig,
  43 + category: ChatCategoryEnum.WEATHER,
  44 + categoryName: ChatCategoryEnumName.WEATHER,
  45 + package: PackagesCategoryEnum.ICONS,
  46 + image: name,
  47 + icon: name,
  48 + dataset: name,
  49 + title: name.replace('wi:', ''),
  50 + redirectComponent: `${IconConfig.package}/${IconConfig.category}/${IconConfig.key}` // 跳转组件路径规则:packageName/categoryName/componentKey
  51 +}))
  52 +
  53 +export default iconList
  1 +export enum ChatCategoryEnum {
  2 + ML = 'MaterialLine',
  3 + COMMON = 'Common',
  4 + WEATHER = 'Weather',
  5 + DEFAULT = 'Default' // 这个仅用来表示组件分类目录,不要在 index.ts 中导入
  6 +}
  7 +
  8 +export enum ChatCategoryEnumName {
  9 + ML = '动画',
  10 + COMMON = '通用',
  11 + WEATHER = '天气',
  12 + DEFAULT = '默认'
  13 +}
  1 +import MaterialLine from './MaterialLine'
  2 +import Common from './Common'
  3 +import Weather from './Weather'
  4 +
  5 +export const IconList = [...MaterialLine, ...Weather, ...Common]
@@ -12,7 +12,9 @@ export const option = { @@ -12,7 +12,9 @@ export const option = {
12 [COMPONENT_INTERACT_EVENT_KET]: ComponentInteractEventEnum.DATE, 12 [COMPONENT_INTERACT_EVENT_KET]: ComponentInteractEventEnum.DATE,
13 // 下拉展示 13 // 下拉展示
14 isPanel: 0, 14 isPanel: 0,
15 - dataset: dayjs().valueOf() 15 + dataset: dayjs().valueOf(),
  16 + differValue: 0
  17 +
16 } 18 }
17 19
18 export default class Config extends PublicConfigClass implements CreateComponentType { 20 export default class Config extends PublicConfigClass implements CreateComponentType {
1 <template> 1 <template>
2 <collapse-item name="展示方式" :expanded="true"> 2 <collapse-item name="展示方式" :expanded="true">
3 <setting-item-box name="选择方式"> 3 <setting-item-box name="选择方式">
4 - <n-select  
5 - v-model:value="optionData.isPanel"  
6 - size="small"  
7 - :options="panelOptions"  
8 - /> 4 + <n-select v-model:value="optionData.isPanel" size="small" :options="panelOptions" />
9 </setting-item-box> 5 </setting-item-box>
10 </collapse-item> 6 </collapse-item>
11 7
12 <collapse-item name="时间配置" :expanded="true"> 8 <collapse-item name="时间配置" :expanded="true">
13 <setting-item-box name="基础"> 9 <setting-item-box name="基础">
14 <setting-item name="类型"> 10 <setting-item name="类型">
15 - <n-select  
16 - v-model:value="optionData.componentInteractEventKey"  
17 - size="small"  
18 - :options="datePickerTypeOptions"  
19 - /> 11 + <n-select v-model:value="optionData.componentInteractEventKey" size="small" :options="datePickerTypeOptions" />
20 </setting-item> 12 </setting-item>
21 </setting-item-box> 13 </setting-item-box>
22 14
23 <setting-item-box name="默认值" :alone="true"> 15 <setting-item-box name="默认值" :alone="true">
24 - <n-date-picker  
25 - size="small"  
26 - v-model:value="optionData.dataset"  
27 - :type="optionData.componentInteractEventKey"  
28 - /> 16 + <n-date-picker size="small" v-model:value="optionData.dataset" :type="optionData.componentInteractEventKey" />
  17 + </setting-item-box>
  18 +
  19 + <setting-item-box :alone="true">
  20 + <template #name>
  21 + <n-text>动态</n-text>
  22 + <n-tooltip trigger="hover">
  23 + <template #trigger>
  24 + <n-icon size="21" :depth="3">
  25 + <help-outline-icon></help-outline-icon>
  26 + </n-icon>
  27 + </template>
  28 + <n-text>动态值不为0时,默认值:取当天时间相加当前值</n-text>
  29 + </n-tooltip>
  30 + </template>
  31 + <n-input-number v-model:value="optionData.differValue" class="input-num-width" size="small" :min="-40" :max="40">
  32 + <template #suffix> 天 </template>
  33 + </n-input-number>
29 </setting-item-box> 34 </setting-item-box>
30 </collapse-item> 35 </collapse-item>
31 </template> 36 </template>
@@ -39,9 +39,9 @@ const onChange = (v: number | number[]) => { @@ -39,9 +39,9 @@ const onChange = (v: number | number[]) => {
39 props.chartConfig, 39 props.chartConfig,
40 useChartEditStore, 40 useChartEditStore,
41 { 41 {
42 - [ComponentInteractParamsEnum.DATE_START]: v[0] | dayjs().valueOf(),  
43 - [ComponentInteractParamsEnum.DATE_END]: v[1] | dayjs().valueOf(),  
44 - [ComponentInteractParamsEnum.DATE_RANGE]: `${v[0]}-${v[1]}` 42 + [ComponentInteractParamsEnum.DATE_START]: v[0] || dayjs().valueOf(),
  43 + [ComponentInteractParamsEnum.DATE_END]: v[1] || dayjs().valueOf(),
  44 + [ComponentInteractParamsEnum.DATE_RANGE]: `${v[0] || dayjs().valueOf()}-${v[1] || dayjs().valueOf()}`
45 }, 45 },
46 InteractEventOn.CHANGE 46 InteractEventOn.CHANGE
47 ) 47 )
@@ -50,7 +50,7 @@ const onChange = (v: number | number[]) => { @@ -50,7 +50,7 @@ const onChange = (v: number | number[]) => {
50 useChartInteract( 50 useChartInteract(
51 props.chartConfig, 51 props.chartConfig,
52 useChartEditStore, 52 useChartEditStore,
53 - { [ComponentInteractParamsEnum.DATE]: v }, 53 + { [ComponentInteractParamsEnum.DATE]: v || dayjs().valueOf() },
54 InteractEventOn.CHANGE 54 InteractEventOn.CHANGE
55 ) 55 )
56 } 56 }
@@ -68,6 +68,25 @@ watch( @@ -68,6 +68,25 @@ watch(
68 immediate: true 68 immediate: true
69 } 69 }
70 ) 70 )
  71 +
  72 +// 手动更新
  73 +watch(
  74 + () => props.chartConfig.option.differValue,
  75 + (newData: number) => {
  76 + if (props.chartConfig.option.differValue === 0) return
  77 + if (typeof option.dataset === 'object') {
  78 + option.dataset[0] = dayjs().add(newData, 'day').valueOf()
  79 + option.dataset[1] = dayjs().add(newData, 'day').valueOf()
  80 + } else {
  81 + option.dataset = dayjs().add(newData, 'day').valueOf()
  82 + }
  83 + // 关联目标组件首次请求带上默认内容
  84 + onChange(newData)
  85 + },
  86 + {
  87 + immediate: true
  88 + }
  89 +)
71 </script> 90 </script>
72 91
73 <style lang="scss" scoped> 92 <style lang="scss" scoped>
@@ -7,7 +7,8 @@ @@ -7,7 +7,8 @@
7 :fallback-src="requireErrorImg()" 7 :fallback-src="requireErrorImg()"
8 :width="w" 8 :width="w"
9 :height="h" 9 :height="h"
10 - ></n-image> 10 + lazy
  11 + />
11 </div> 12 </div>
12 </template> 13 </template>
13 14
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 <collapse-item name="信息" :expanded="true"> 2 <collapse-item name="信息" :expanded="true">
3 <setting-item-box name="文字" :alone="true"> 3 <setting-item-box name="文字" :alone="true">
4 <setting-item> 4 <setting-item>
5 - <n-input v-model:value="optionData.dataset" size="small"></n-input> 5 + <n-input v-model:value="optionData.dataset" type="textarea" size="small"></n-input>
6 </setting-item> 6 </setting-item>
7 </setting-item-box> 7 </setting-item-box>
8 <setting-item-box name="链接" :alone="true"> 8 <setting-item-box name="链接" :alone="true">
@@ -30,11 +30,7 @@ @@ -30,11 +30,7 @@
30 <n-input-number v-model:value="optionData.fontSize" size="small" placeholder="字体大小"></n-input-number> 30 <n-input-number v-model:value="optionData.fontSize" size="small" placeholder="字体大小"></n-input-number>
31 </setting-item> 31 </setting-item>
32 <setting-item name="字体粗细"> 32 <setting-item name="字体粗细">
33 - <n-select  
34 - v-model:value="optionData.fontWeight"  
35 - size="small"  
36 - :options="fontWeightOptions"  
37 - /> 33 + <n-select v-model:value="optionData.fontWeight" size="small" :options="fontWeightOptions" />
38 </setting-item> 34 </setting-item>
39 <setting-item name="X轴内边距"> 35 <setting-item name="X轴内边距">
40 <n-input-number v-model:value="optionData.paddingX" size="small" placeholder="输入内边距"></n-input-number> 36 <n-input-number v-model:value="optionData.paddingX" size="small" placeholder="输入内边距"></n-input-number>
@@ -87,9 +83,7 @@ @@ -87,9 +83,7 @@
87 83
88 <script setup lang="ts"> 84 <script setup lang="ts">
89 import { PropType } from 'vue' 85 import { PropType } from 'vue'
90 -import { option, WritingModeEnum, WritingModeObject,  
91 - FontWeightEnum,  
92 - FontWeightObject, } from './config' 86 +import { option, WritingModeEnum, WritingModeObject, FontWeightEnum, FontWeightObject } from './config'
93 import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' 87 import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
94 const props = defineProps({ 88 const props = defineProps({
95 optionData: { 89 optionData: {
@@ -117,13 +111,13 @@ const verticalOptions = [ @@ -117,13 +111,13 @@ const verticalOptions = [
117 const fontWeightOptions = [ 111 const fontWeightOptions = [
118 { 112 {
119 label: FontWeightEnum.NORMAL, 113 label: FontWeightEnum.NORMAL,
120 - value: FontWeightObject[FontWeightEnum.NORMAL], 114 + value: FontWeightObject[FontWeightEnum.NORMAL]
121 }, 115 },
122 { 116 {
123 label: FontWeightEnum.BOLD, 117 label: FontWeightEnum.BOLD,
124 - value: FontWeightObject[FontWeightEnum.BOLD],  
125 - },  
126 -]; 118 + value: FontWeightObject[FontWeightEnum.BOLD]
  119 + }
  120 +]
127 const handleLinkClick = () => { 121 const handleLinkClick = () => {
128 window.open(props.optionData.linkHead + props.optionData.link) 122 window.open(props.optionData.linkHead + props.optionData.link)
129 } 123 }
1 <template> 1 <template>
2 <div class="go-text-box"> 2 <div class="go-text-box">
3 <div class="content"> 3 <div class="content">
4 - <span style="cursor: pointer" v-if="link" @click="click">{{ option.dataset }}</span>  
5 - <span v-else>{{ option.dataset }}</span> 4 + <span style="cursor: pointer; white-space: pre-wrap" v-if="link" @click="click"></span>
  5 + <span style="white-space: pre-wrap" v-else>{{ option.dataset }}</span>
6 </div> 6 </div>
7 </div> 7 </div>
8 </template> 8 </template>
@@ -82,7 +82,7 @@ const click = () => { @@ -82,7 +82,7 @@ const click = () => {
82 border-width: v-bind('borderWidth + "px"'); 82 border-width: v-bind('borderWidth + "px"');
83 border-radius: v-bind('borderRadius + "px"'); 83 border-radius: v-bind('borderRadius + "px"');
84 border-color: v-bind('borderColor'); 84 border-color: v-bind('borderColor');
85 - 85 +
86 background-color: v-bind('backgroundColor'); 86 background-color: v-bind('backgroundColor');
87 } 87 }
88 } 88 }
  1 +import { ChartFrameEnum, ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
  2 +import { ImageConfig } from '@/packages/components/Informations/Mores/Image/index'
  3 +import { ChatCategoryEnum, ChatCategoryEnumName } from '../index.d'
  4 +import { setLocalStorage, getLocalStorage, goDialog } from '@/utils'
  5 +import { StorageEnum } from '@/enums/storageEnum'
  6 +import { FileTypeEnum } from '@/enums/fileTypeEnum'
  7 +import { backgroundImageSize } from '@/settings/designSetting'
  8 +import { usePackagesStore } from '@/store/modules/packagesStore/packagesStore'
  9 +
  10 +const StoreKey = StorageEnum.GO_USER_MEDIA_PHOTOS
  11 +
  12 +/**
  13 + * 上传完成事件类型
  14 + */
  15 +type UploadCompletedEventType = {
  16 + fileName: string
  17 + url: string
  18 +}
  19 +
  20 +const userPhotosList: ConfigType[] = getLocalStorage(StoreKey) || []
  21 +
  22 +const uploadFile = (callback: Function | null = null) => {
  23 + const input = document.createElement('input')
  24 + input.type = 'file'
  25 + input.accept = '.png,.jpg,.jpeg,.gif' // 这里只允许部分图片类型
  26 + input.onchange = async () => {
  27 + if (!input.files || !input.files.length) return
  28 + const file = input.files[0]
  29 + const { name, size, type } = file
  30 + if (size > 1024 * 1024 * backgroundImageSize) {
  31 + window['$message'].warning(`图片超出 ${backgroundImageSize}M 限制,请重新上传!`)
  32 + return false
  33 + }
  34 + if (type !== FileTypeEnum.PNG && type !== FileTypeEnum.JPEG && type !== FileTypeEnum.GIF) {
  35 + window['$message'].warning('文件格式不符合,请重新上传!')
  36 + return false
  37 + }
  38 + const reader = new FileReader()
  39 + reader.onload = () => {
  40 + const eventObj: UploadCompletedEventType = { fileName: name, url: reader.result as string }
  41 + callback && callback(eventObj)
  42 + }
  43 + reader.readAsDataURL(file)
  44 + }
  45 + input.click()
  46 +}
  47 +
  48 +const addConfig = {
  49 + ...ImageConfig,
  50 + category: ChatCategoryEnum.PRIVATE,
  51 + categoryName: ChatCategoryEnumName.PRIVATE,
  52 + package: PackagesCategoryEnum.PHOTOS,
  53 + chartFrame: ChartFrameEnum.STATIC,
  54 + title: '点击上传图片',
  55 + image: 'upload.png',
  56 + redirectComponent: `${ImageConfig.package}/${ImageConfig.category}/${ImageConfig.key}`, // 跳转组件路径规则:packageName/categoryName/componentKey
  57 + disabled: true,
  58 + configEvents: {
  59 + // 点击上传事件
  60 + addHandle: (photoConfig: ConfigType) => {
  61 + goDialog({
  62 + message: `图片需小于 ${backgroundImageSize}M 且只暂存在浏览器中。当前图片暂存上限5M,超过不再缓存新图片,请自行对接后端接口!现编译成 base64 进行渲染,对接后端后请使用【URL地址】进行交互!`,
  63 + transformOrigin: 'center',
  64 + onPositiveCallback: () => {
  65 + uploadFile((e: UploadCompletedEventType) => {
  66 + // 和上传组件一样配置,更换标题,图片,预设数据
  67 + const packagesStore = usePackagesStore()
  68 + const newPhoto = {
  69 + ...ImageConfig,
  70 + category: ChatCategoryEnum.PRIVATE,
  71 + categoryName: ChatCategoryEnumName.PRIVATE,
  72 + package: PackagesCategoryEnum.PHOTOS,
  73 + chartFrame: ChartFrameEnum.STATIC,
  74 + title: e.fileName,
  75 + image: e.url,
  76 + dataset: e.url,
  77 + redirectComponent: `${ImageConfig.package}/${ImageConfig.category}/${ImageConfig.key}` // 跳转组件路径规则:packageName/categoryName/componentKey
  78 + }
  79 + userPhotosList.unshift(newPhoto)
  80 + // 存储在本地数据中
  81 + setLocalStorage(StoreKey, userPhotosList)
  82 + // 插入到上传按钮前的位置
  83 + packagesStore.addPhotos(newPhoto, 1)
  84 + })
  85 + }
  86 + })
  87 + }
  88 + }
  89 +}
  90 +
  91 +export default [addConfig, ...userPhotosList]
  1 +import { ChartFrameEnum, PackagesCategoryEnum } from '@/packages/index.d'
  2 +import { ImageConfig } from '@/packages/components/Informations/Mores/Image/index'
  3 +import { ChatCategoryEnum, ChatCategoryEnumName } from '../index.d'
  4 +
  5 +// 远程共享库(调接口获取图像列表)
  6 +const imageList = [
  7 + { imageName: 'carousel1', imageUrl: 'https://naive-ui.oss-cn-beijing.aliyuncs.com/carousel-img/carousel1.jpeg' },
  8 + { imageName: 'carousel2', imageUrl: 'https://naive-ui.oss-cn-beijing.aliyuncs.com/carousel-img/carousel2.jpeg' }
  9 +]
  10 +
  11 +const photoConfigList = imageList.map(i => ({
  12 + ...ImageConfig,
  13 + category: ChatCategoryEnum.SHARE,
  14 + categoryName: ChatCategoryEnumName.SHARE,
  15 + package: PackagesCategoryEnum.PHOTOS,
  16 + chartFrame: ChartFrameEnum.STATIC,
  17 + image: i.imageUrl,
  18 + dataset: i.imageUrl,
  19 + title: i.imageName,
  20 + redirectComponent: `${ImageConfig.package}/${ImageConfig.category}/${ImageConfig.key}` // 跳转组件路径规则:packageName/categoryName/componentKey
  21 +}))
  22 +
  23 +export default photoConfigList
  1 +export enum ChatCategoryEnum {
  2 + PRIVATE = 'Private',
  3 + SHARE = 'Share'
  4 +}
  5 +
  6 +export enum ChatCategoryEnumName {
  7 + PRIVATE = '私有图',
  8 + SHARE = '共享图'
  9 +}
  1 +import Private from './Private'
  2 +import Share from './Share'
  3 +
  4 +export const PhotoList = [...Private, ...Share]
@@ -3,16 +3,24 @@ import { ConfigType } from "../index.d" @@ -3,16 +3,24 @@ import { ConfigType } from "../index.d"
3 import { matchExternalPrefixReg } from "./useWidgetKey" 3 import { matchExternalPrefixReg } from "./useWidgetKey"
4 4
5 const getAllConfigFile = async () => { 5 const getAllConfigFile = async () => {
6 - return import.meta.glob('../components/**/config.ts') 6 + return import.meta.glob('../components/**/config.ts', )
7 } 7 }
8 8
9 const getChartConfigFile = async (path: string) => { 9 const getChartConfigFile = async (path: string) => {
10 const fileList = await getAllConfigFile() 10 const fileList = await getAllConfigFile()
11 return fileList[path]() as any 11 return fileList[path]() as any
12 -} 12 +}
13 13
14 export const createComponent = async (configType: ConfigType) => { 14 export const createComponent = async (configType: ConfigType) => {
15 - const { key, chartKey, category, package: packageName } = configType 15 + const { key, chartKey, category, package: packageName, redirectComponent } = configType
  16 + // redirectComponent 是给图片组件库和图标组件库使用的
  17 + if (redirectComponent) {
  18 + const [packageName, categoryName, keyName] = redirectComponent.split('/')
  19 + const filePath = `../components/${packageName}/${categoryName}/${keyName}/config.ts`
  20 + const redirectChart = await getChartConfigFile(filePath)
  21 + return new redirectChart.default()
  22 + }
  23 +
16 const hasExternalPrefix = matchExternalPrefixReg.test(chartKey) 24 const hasExternalPrefix = matchExternalPrefixReg.test(chartKey)
17 const filePath = `../components${hasExternalPrefix ? '/external' : ''}/${packageName}/${category}/${key}/config.ts` 25 const filePath = `../components${hasExternalPrefix ? '/external' : ''}/${packageName}/${category}/${key}/config.ts`
18 const chart = await getChartConfigFile(filePath) 26 const chart = await getChartConfigFile(filePath)
@@ -15,15 +15,34 @@ export enum ChartFrameEnum { @@ -15,15 +15,34 @@ export enum ChartFrameEnum {
15 15
16 // 组件配置 16 // 组件配置
17 export type ConfigType = { 17 export type ConfigType = {
  18 + // 组件 key
18 key: string 19 key: string
  20 + // 画布组件 key
19 chartKey: string 21 chartKey: string
  22 + // 右侧设置面板组件 key
20 conKey: string 23 conKey: string
  24 + // 标题
21 title: string 25 title: string
  26 + // 分类
22 category: string 27 category: string
  28 + // 分类名称
23 categoryName: string 29 categoryName: string
  30 + // 所属包
24 package: string 31 package: string
  32 + // 归类
25 chartFrame?: ChartFrameEnum 33 chartFrame?: ChartFrameEnum
  34 + // 预览图
26 image: string 35 image: string
  36 + // 从指定路径创建创建该组件
  37 + redirectComponent?: string
  38 + // 组件预设的 dataset 值(图片/图标)
  39 + dataset?: any
  40 + // 禁用 拖拽或双击生成组件
  41 + disabled?: boolean
  42 + // 图标
  43 + icon?: string
  44 + // 事件
  45 + configEvents?: { [T: string]: Function }
27 } 46 }
28 47
29 // 数据请求 48 // 数据请求
@@ -120,7 +139,7 @@ export interface PublicConfigType { @@ -120,7 +139,7 @@ export interface PublicConfigType {
120 } 139 }
121 filter?: string 140 filter?: string
122 status: StatusType 141 status: StatusType
123 - interactActions?: InteractActionsType[], 142 + interactActions?: InteractActionsType[]
124 events: { 143 events: {
125 baseEvent: { 144 baseEvent: {
126 [K in BaseEvent]?: string 145 [K in BaseEvent]?: string
@@ -139,7 +158,8 @@ export interface PublicConfigType { @@ -139,7 +158,8 @@ export interface PublicConfigType {
139 export interface CreateComponentType extends PublicConfigType, requestConfig { 158 export interface CreateComponentType extends PublicConfigType, requestConfig {
140 key: string 159 key: string
141 chartConfig: ConfigType 160 chartConfig: ConfigType
142 - option: GlobalThemeJsonType, 161 + option: GlobalThemeJsonType
  162 + groupList?: Array<CreateComponentType>
143 } 163 }
144 164
145 // 组件成组实例类 165 // 组件成组实例类
@@ -155,6 +175,8 @@ export enum PackagesCategoryEnum { @@ -155,6 +175,8 @@ export enum PackagesCategoryEnum {
155 CHARTS = 'Charts', 175 CHARTS = 'Charts',
156 TABLES = 'Tables', 176 TABLES = 'Tables',
157 INFORMATIONS = 'Informations', 177 INFORMATIONS = 'Informations',
  178 + PHOTOS = 'Photos',
  179 + ICONS = 'Icons',
158 DECORATES = 'Decorates' 180 DECORATES = 'Decorates'
159 } 181 }
160 182
@@ -163,6 +185,8 @@ export enum PackagesCategoryName { @@ -163,6 +185,8 @@ export enum PackagesCategoryName {
163 CHARTS = '图表', 185 CHARTS = '图表',
164 TABLES = '列表', 186 TABLES = '列表',
165 INFORMATIONS = '信息', 187 INFORMATIONS = '信息',
  188 + PHOTOS = '图片',
  189 + ICONS = '图标',
166 DECORATES = '小组件' 190 DECORATES = '小组件'
167 } 191 }
168 192
@@ -177,5 +201,7 @@ export type PackagesType = { @@ -177,5 +201,7 @@ export type PackagesType = {
177 [PackagesCategoryEnum.CHARTS]: ConfigType[] 201 [PackagesCategoryEnum.CHARTS]: ConfigType[]
178 [PackagesCategoryEnum.INFORMATIONS]: ConfigType[] 202 [PackagesCategoryEnum.INFORMATIONS]: ConfigType[]
179 [PackagesCategoryEnum.TABLES]: ConfigType[] 203 [PackagesCategoryEnum.TABLES]: ConfigType[]
  204 + [PackagesCategoryEnum.PHOTOS]: ConfigType[]
  205 + [PackagesCategoryEnum.ICONS]: ConfigType[]
180 [PackagesCategoryEnum.DECORATES]: ConfigType[] 206 [PackagesCategoryEnum.DECORATES]: ConfigType[]
181 } 207 }
@@ -2,19 +2,31 @@ import { ChartList } from '@/packages/components/Charts/index' @@ -2,19 +2,31 @@ import { ChartList } from '@/packages/components/Charts/index'
2 import { DecorateList } from '@/packages/components/Decorates/index' 2 import { DecorateList } from '@/packages/components/Decorates/index'
3 import { InformationList } from '@/packages/components/Informations/index' 3 import { InformationList } from '@/packages/components/Informations/index'
4 import { TableList } from '@/packages/components/Tables/index' 4 import { TableList } from '@/packages/components/Tables/index'
  5 +import { PhotoList } from '@/packages/components/Photos/index'
  6 +import { IconList } from '@/packages/components/Icons/index'
  7 +
5 import { PackagesCategoryEnum, PackagesType, ConfigType, FetchComFlagType } from '@/packages/index.d' 8 import { PackagesCategoryEnum, PackagesType, ConfigType, FetchComFlagType } from '@/packages/index.d'
6 import { useInjectLib } from './components/external/utils/useInjectLib' 9 import { useInjectLib } from './components/external/utils/useInjectLib'
7 10
8 -const configModules = import.meta.globEager('./components/**/config.vue')  
9 -const indexModules = import.meta.globEager('./components/**/index.vue')  
10 -const imagesModules = import.meta.globEager('../assets/images/chart/**') 11 +const configModules: Record<string, { default: string }> = import.meta.glob('./components/**/config.vue', {
  12 + eager: true
  13 +})
  14 +const indexModules: Record<string, { default: string }> = import.meta.glob('./components/**/index.vue', {
  15 + eager: true
  16 +})
  17 +const imagesModules: Record<string, { default: string }> = import.meta.glob('../assets/images/chart/**', {
  18 + eager: true
  19 +})
  20 +
11 21
12 -// * 所有图表 22 +// * 所有图表
13 export const packagesList: PackagesType = { 23 export const packagesList: PackagesType = {
14 [PackagesCategoryEnum.CHARTS]: ChartList, 24 [PackagesCategoryEnum.CHARTS]: ChartList,
15 [PackagesCategoryEnum.INFORMATIONS]: InformationList, 25 [PackagesCategoryEnum.INFORMATIONS]: InformationList,
16 [PackagesCategoryEnum.TABLES]: TableList, 26 [PackagesCategoryEnum.TABLES]: TableList,
17 - [PackagesCategoryEnum.DECORATES]: DecorateList 27 + [PackagesCategoryEnum.DECORATES]: DecorateList,
  28 + [PackagesCategoryEnum.PHOTOS]: PhotoList,
  29 + [PackagesCategoryEnum.ICONS]: IconList
18 } 30 }
19 31
20 /** 32 /**
@@ -22,7 +34,13 @@ export const packagesList: PackagesType = { @@ -22,7 +34,13 @@ export const packagesList: PackagesType = {
22 * @param targetData 34 * @param targetData
23 */ 35 */
24 export const createComponent = async (targetData: ConfigType) => { 36 export const createComponent = async (targetData: ConfigType) => {
25 - const { category, key } = targetData 37 + const { redirectComponent, category, key } = targetData
  38 + // redirectComponent 是给图片组件库和图标组件库使用的
  39 + if (redirectComponent) {
  40 + const [packageName, categoryName, keyName] = redirectComponent.split('/')
  41 + const redirectChart = await import(`./components/${packageName}/${categoryName}/${keyName}/config.ts`)
  42 + return new redirectChart.default()
  43 + }
26 const chart = await import(`./components/${targetData.package}/${category}/${key}/config.ts`) 44 const chart = await import(`./components/${targetData.package}/${category}/${key}/config.ts`)
27 return new chart.default() 45 return new chart.default()
28 } 46 }
@@ -66,6 +84,8 @@ export const fetchConfigComponent = (dropData: ConfigType) => { @@ -66,6 +84,8 @@ export const fetchConfigComponent = (dropData: ConfigType) => {
66 */ 84 */
67 export const fetchImages = async (targetData?: ConfigType) => { 85 export const fetchImages = async (targetData?: ConfigType) => {
68 if (!targetData) return '' 86 if (!targetData) return ''
  87 + // 正则判断图片是否为 url,是则直接返回该 url
  88 + if (/^(http|https):\/\/([\w.]+\/?)\S*/.test(targetData.image)) return targetData.image
69 // 新数据动态处理 89 // 新数据动态处理
70 const { image, package: targetDataPackage } = targetData 90 const { image, package: targetDataPackage } = targetData
71 // 兼容旧数据 91 // 兼容旧数据
@@ -61,13 +61,14 @@ import { @@ -61,13 +61,14 @@ import {
61 Pulse as PulseIcon, 61 Pulse as PulseIcon,
62 Folder as FolderIcon, 62 Folder as FolderIcon,
63 FolderOpen as FolderOpenIcon, 63 FolderOpen as FolderOpenIcon,
64 - Image as ImageIcon, 64 + ImageOutline as ImageIcon,
65 Images as ImagesIcon, 65 Images as ImagesIcon,
66 List as ListIcon, 66 List as ListIcon,
67 EyeOutline as EyeOutlineIcon, 67 EyeOutline as EyeOutlineIcon,
68 EyeOffOutline as EyeOffOutlineIcon, 68 EyeOffOutline as EyeOffOutlineIcon,
69 Albums as AlbumsIcon, 69 Albums as AlbumsIcon,
70 - Analytics as AnalyticsIcon 70 + Analytics as AnalyticsIcon,
  71 + AirplaneOutline as AirPlaneOutlineIcon
71 } from '@vicons/ionicons5' 72 } from '@vicons/ionicons5'
72 73
73 import { 74 import {
@@ -238,10 +239,12 @@ const ionicons5 = { @@ -238,10 +239,12 @@ const ionicons5 = {
238 // 眼睛 239 // 眼睛
239 EyeOutlineIcon, 240 EyeOutlineIcon,
240 EyeOffOutlineIcon, 241 EyeOffOutlineIcon,
241 - // 图表列表 242 + // 图表列表
242 AlbumsIcon, 243 AlbumsIcon,
243 // 分析 244 // 分析
244 - AnalyticsIcon 245 + AnalyticsIcon,
  246 + // 飞机
  247 + AirPlaneOutlineIcon
245 } 248 }
246 249
247 const carbon = { 250 const carbon = {
@@ -86,8 +86,18 @@ @@ -86,8 +86,18 @@
86 }, 86 },
87 "legend": { 87 "legend": {
88 "show": true, 88 "show": true,
89 - "top": "5%", 89 + "type": "scroll",
  90 + "x": "center",
  91 + "y": "top",
  92 + "icon": "circle",
  93 + "orient": "horizontal",
90 "textStyle": { 94 "textStyle": {
  95 + "color": "#B9B8CE",
  96 + "fontSize": 18
  97 + },
  98 + "itemHeight": 15,
  99 + "itemWidth": 15,
  100 + "pageTextStyle": {
91 "color": "#B9B8CE" 101 "color": "#B9B8CE"
92 } 102 }
93 }, 103 },
@@ -2212,9 +2212,9 @@ @@ -2212,9 +2212,9 @@
2212 "pinyin": "tengluozi" 2212 "pinyin": "tengluozi"
2213 }, 2213 },
2214 { 2214 {
2215 - "CMYK": [57, 62, 16, 2],  
2216 - "RGB": [128, 109, 158],  
2217 - "hex": "#806d9e", 2215 + "CMYK": [34, 39, 0, 24],
  2216 + "RGB": [128, 118, 195],
  2217 + "hex": "#8076c3",
2218 "name": "槿紫", 2218 "name": "槿紫",
2219 "pinyin": "jinzi" 2219 "pinyin": "jinzi"
2220 }, 2220 },
@@ -9,12 +9,12 @@ export const lang = LangEnum.ZH @@ -9,12 +9,12 @@ export const lang = LangEnum.ZH
9 export const watermarkText = "GoView 低代码平台" 9 export const watermarkText = "GoView 低代码平台"
10 10
11 // 分组名称 11 // 分组名称
12 -export const groupTitle = '分组' 12 +export const groupTitle = "分组"
13 13
14 // 主题配置 14 // 主题配置
15 export const theme = { 15 export const theme = {
16 // 默认是否开启深色主题 16 // 默认是否开启深色主题
17 - darkTheme: false, 17 + darkTheme: true,
18 //默认主题色 18 //默认主题色
19 appTheme: '#51d6a9', 19 appTheme: '#51d6a9',
20 appThemeDetail: null, 20 appThemeDetail: null,
@@ -191,7 +191,7 @@ export const useChartEditStore = defineStore({ @@ -191,7 +191,7 @@ export const useChartEditStore = defineStore({
191 this.targetChart.hoverId = hoverId 191 this.targetChart.hoverId = hoverId
192 }, 192 },
193 // * 设置目标数据 select 193 // * 设置目标数据 select
194 - setTargetSelectChart(selectId?: string | string[], push = false) { 194 + setTargetSelectChart(selectId?: string | string[], push: boolean = false) {
195 // 重复选中 195 // 重复选中
196 if (this.targetChart.selectId.find((e: string) => e === selectId)) return 196 if (this.targetChart.selectId.find((e: string) => e === selectId)) return
197 197
@@ -512,7 +512,7 @@ export const useChartEditStore = defineStore({ @@ -512,7 +512,7 @@ export const useChartEditStore = defineStore({
512 item.id = getUUID() 512 item.id = getUUID()
513 }) 513 })
514 } 514 }
515 - 515 +
516 return e 516 return e
517 } 517 }
518 const isCut = recordCharts.type === HistoryActionTypeEnum.CUT 518 const isCut = recordCharts.type === HistoryActionTypeEnum.CUT
@@ -55,7 +55,11 @@ export const useChartLayoutStore = defineStore({ @@ -55,7 +55,11 @@ export const useChartLayoutStore = defineStore({
55 } 55 }
56 }, 56 },
57 actions: { 57 actions: {
58 - setItem<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(key: T, value: K): void { 58 + setItem<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(
  59 + key: T,
  60 + value: K,
  61 + computedScale = true
  62 + ): void {
59 this.$patch(state => { 63 this.$patch(state => {
60 state[key] = value 64 state[key] = value
61 }) 65 })
@@ -64,9 +68,11 @@ export const useChartLayoutStore = defineStore({ @@ -64,9 +68,11 @@ export const useChartLayoutStore = defineStore({
64 // 这里需要标记重置画布位置 68 // 这里需要标记重置画布位置
65 this.rePositionCanvas = true; 69 this.rePositionCanvas = true;
66 // 重新计算拖拽区域缩放比例 70 // 重新计算拖拽区域缩放比例
67 - setTimeout(() => {  
68 - chartEditStore.computedScale()  
69 - }, 500) 71 + if (computedScale) {
  72 + setTimeout(() => {
  73 + chartEditStore.computedScale()
  74 + }, 500)
  75 + }
70 }, 76 },
71 setItemUnHandle<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(key: T, value: K): void { 77 setItemUnHandle<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(key: T, value: K): void {
72 this.$patch(state => { 78 this.$patch(state => {
@@ -4,5 +4,6 @@ export { ConfigType } @@ -4,5 +4,6 @@ export { ConfigType }
4 4
5 export { PackagesType } 5 export { PackagesType }
6 export interface PackagesStoreType { 6 export interface PackagesStoreType {
7 - packagesList: PackagesType 7 + packagesList: PackagesType,
  8 + newPhoto?: ConfigType
8 } 9 }
1 import { defineStore } from 'pinia' 1 import { defineStore } from 'pinia'
2 -import { PackagesStoreType, PackagesType } from './packagesStore.d'  
3 -import { packagesList } from '@/packages/index'  
4 -  
5 -// 组件 pakages 2 +import { ConfigType, PackagesStoreType, PackagesType } from './packagesStore.d'
  3 +import { packagesList } from '@/packages/index'
  4 +import { StorageEnum } from '@/enums/storageEnum'
  5 +import { getLocalStorage, setLocalStorage } from '@/utils'
  6 +
  7 +// 组件 packages
6 export const usePackagesStore = defineStore({ 8 export const usePackagesStore = defineStore({
7 id: 'usePackagesStore', 9 id: 'usePackagesStore',
8 state: (): PackagesStoreType => ({ 10 state: (): PackagesStoreType => ({
9 - packagesList: Object.freeze(packagesList) 11 + packagesList: Object.freeze(packagesList),
  12 + newPhoto: undefined
10 }), 13 }),
11 getters: { 14 getters: {
12 getPackagesList(): PackagesType { 15 getPackagesList(): PackagesType {
13 return this.packagesList 16 return this.packagesList
14 } 17 }
  18 + },
  19 + actions: {
  20 + addPhotos(newPhoto: ConfigType, index: number) {
  21 + this.newPhoto = newPhoto
  22 + this.packagesList.Photos.splice(index, 0, newPhoto)
  23 + },
  24 + deletePhotos(photoInfo: ConfigType, index: number) {
  25 + this.packagesList.Photos.splice(index, 1)
  26 + const StoreKey = StorageEnum.GO_USER_MEDIA_PHOTOS
  27 + const userPhotosList = getLocalStorage(StoreKey)
  28 + userPhotosList.splice(index - 1, 1)
  29 + setLocalStorage(StoreKey, userPhotosList)
  30 + }
15 } 31 }
16 }) 32 })
@@ -317,6 +317,11 @@ export const JSONStringify = <T>(data: T) => { @@ -317,6 +317,11 @@ export const JSONStringify = <T>(data: T) => {
317 ) 317 )
318 } 318 }
319 319
  320 +export const evalFn = (fn: string) => {
  321 + var Fun = Function // 一个变量指向Function,防止前端编译工具报错
  322 + return new Fun('return ' + fn)()
  323 +}
  324 +
320 /** 325 /**
321 * * JSON反序列化,支持函数和 undefined 326 * * JSON反序列化,支持函数和 undefined
322 * @param data 327 * @param data
@@ -9,11 +9,12 @@ @@ -9,11 +9,12 @@
9 <div 9 <div
10 class="item-box" 10 class="item-box"
11 v-for="(item, index) in menuOptions" 11 v-for="(item, index) in menuOptions"
12 - :key="index" 12 + :key="item.title"
13 draggable 13 draggable
14 - @dragstart="dragStartHandle($event, item)"  
15 - @dragend="dragendHandle" 14 + @dragstart="!item.disabled && dragStartHandle($event, item)"
  15 + @dragend="!item.disabled && dragendHandle"
16 @dblclick="dblclickHandle(item)" 16 @dblclick="dblclickHandle(item)"
  17 + @click="clickHandle(item)"
17 > 18 >
18 <div class="list-header"> 19 <div class="list-header">
19 <mac-os-control-btn class="list-header-control-btn" :mini="true" :disabled="true"></mac-os-control-btn> 20 <mac-os-control-btn class="list-header-control-btn" :mini="true" :disabled="true"></mac-os-control-btn>
@@ -21,14 +22,28 @@ @@ -21,14 +22,28 @@
21 <n-ellipsis>{{ item.title }}</n-ellipsis> 22 <n-ellipsis>{{ item.title }}</n-ellipsis>
22 </n-text> 23 </n-text>
23 </div> 24 </div>
24 - <div class="list-center go-flex-center go-transition">  
25 - <chart-glob-image class="list-img" :chartConfig="item"></chart-glob-image> 25 + <div class="list-center go-flex-center go-transition" draggable="true">
  26 + <Icon v-if="item.icon" class="list-img" :icon="item.icon" color="#999" width="48" />
  27 + <chart-glob-image v-else class="list-img" :chartConfig="item" />
26 </div> 28 </div>
27 <div class="list-bottom"> 29 <div class="list-bottom">
28 <n-text class="list-bottom-text" depth="3"> 30 <n-text class="list-bottom-text" depth="3">
29 <n-ellipsis style="max-width: 90%">{{ item.title }}</n-ellipsis> 31 <n-ellipsis style="max-width: 90%">{{ item.title }}</n-ellipsis>
30 </n-text> 32 </n-text>
31 </div> 33 </div>
  34 + <!-- 遮罩 -->
  35 + <div v-if="item.disabled" class="list-model"></div>
  36 + <!-- 工具栏 -->
  37 + <div v-if="isShowTools(item)" class="list-tools go-transition" @click="deleteHandle(item, index)">
  38 + <n-button text type="default" color="#ffffff">
  39 + <template #icon>
  40 + <n-icon>
  41 + <TrashIcon />
  42 + </n-icon>
  43 + </template>
  44 + <span>删除</span>
  45 + </n-button>
  46 + </div>
32 </div> 47 </div>
33 </div> 48 </div>
34 </div> 49 </div>
@@ -42,11 +57,15 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore @@ -42,11 +57,15 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore
42 import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d' 57 import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
43 import { ChartModeEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' 58 import { ChartModeEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
44 import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore' 59 import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore'
45 -import { componentInstall, loadingStart, loadingFinish, loadingError, JSONStringify } from '@/utils' 60 +import { usePackagesStore } from '@/store/modules/packagesStore/packagesStore'
  61 +import { componentInstall, loadingStart, loadingFinish, loadingError, JSONStringify, goDialog } from '@/utils'
46 import { DragKeyEnum } from '@/enums/editPageEnum' 62 import { DragKeyEnum } from '@/enums/editPageEnum'
47 // import { createComponent } from '@/packages' 63 // import { createComponent } from '@/packages'
48 -import { ConfigType, CreateComponentType } from '@/packages/index.d' 64 +import { ConfigType, CreateComponentType, PackagesCategoryEnum } from '@/packages/index.d'
  65 +import { ChatCategoryEnum } from '@/packages/components/Photos/index.d'
49 import { fetchConfigComponent, fetchChartComponent } from '@/packages/index' 66 import { fetchConfigComponent, fetchChartComponent } from '@/packages/index'
  67 +import { Icon } from '@iconify/vue'
  68 +import { icon } from '@/plugins'
50 69
51 // THINGS_KIT 覆盖原始创建组件逻辑 70 // THINGS_KIT 覆盖原始创建组件逻辑
52 import { createComponent } from '@/packages/external/override' 71 import { createComponent } from '@/packages/external/override'
@@ -54,8 +73,10 @@ import { createComponent } from '@/packages/external/override' @@ -54,8 +73,10 @@ import { createComponent } from '@/packages/external/override'
54 import omit from 'lodash/omit' 73 import omit from 'lodash/omit'
55 74
56 const chartEditStore = useChartEditStore() 75 const chartEditStore = useChartEditStore()
  76 +const { TrashIcon } = icon.ionicons5
57 77
58 -defineProps({ 78 +const emit = defineEmits(['deletePhoto'])
  79 +const props = defineProps({
59 menuOptions: { 80 menuOptions: {
60 type: Array as PropType<ConfigType[]>, 81 type: Array as PropType<ConfigType[]>,
61 default: () => [] 82 default: () => []
@@ -65,6 +86,11 @@ defineProps({ @@ -65,6 +86,11 @@ defineProps({
65 const chartLayoutStore = useChartLayoutStore() 86 const chartLayoutStore = useChartLayoutStore()
66 const contentChartsItemBoxRef = ref() 87 const contentChartsItemBoxRef = ref()
67 88
  89 +// 判断工具栏展示
  90 +const isShowTools = (item: ConfigType) => {
  91 + return !item.disabled && item.package === PackagesCategoryEnum.PHOTOS && item.category === ChatCategoryEnum.PRIVATE
  92 +}
  93 +
68 // 组件展示状态 94 // 组件展示状态
69 const chartMode: Ref<ChartModeEnum> = computed(() => { 95 const chartMode: Ref<ChartModeEnum> = computed(() => {
70 return chartLayoutStore.getChartType 96 return chartLayoutStore.getChartType
@@ -72,6 +98,7 @@ const chartMode: Ref<ChartModeEnum> = computed(() => { @@ -72,6 +98,7 @@ const chartMode: Ref<ChartModeEnum> = computed(() => {
72 98
73 // 拖拽处理 99 // 拖拽处理
74 const dragStartHandle = (e: DragEvent, item: ConfigType) => { 100 const dragStartHandle = (e: DragEvent, item: ConfigType) => {
  101 + if (item.disabled) return
75 // 动态注册图表组件 102 // 动态注册图表组件
76 componentInstall(item.chartKey, fetchChartComponent(item)) 103 componentInstall(item.chartKey, fetchChartComponent(item))
77 componentInstall(item.conKey, fetchConfigComponent(item)) 104 componentInstall(item.conKey, fetchConfigComponent(item))
@@ -88,6 +115,7 @@ const dragendHandle = () => { @@ -88,6 +115,7 @@ const dragendHandle = () => {
88 115
89 // 双击添加 116 // 双击添加
90 const dblclickHandle = async (item: ConfigType) => { 117 const dblclickHandle = async (item: ConfigType) => {
  118 + if (item.disabled) return
91 try { 119 try {
92 loadingStart() 120 loadingStart()
93 // 动态注册图表组件 121 // 动态注册图表组件
@@ -95,18 +123,39 @@ const dblclickHandle = async (item: ConfigType) => { @@ -95,18 +123,39 @@ const dblclickHandle = async (item: ConfigType) => {
95 componentInstall(item.conKey, fetchConfigComponent(item)) 123 componentInstall(item.conKey, fetchConfigComponent(item))
96 // 创建新图表组件 124 // 创建新图表组件
97 let newComponent: CreateComponentType = await createComponent(item) 125 let newComponent: CreateComponentType = await createComponent(item)
  126 + if (item.redirectComponent) {
  127 + item.dataset && (newComponent.option.dataset = item.dataset)
  128 + newComponent.chartConfig.title = item.title
  129 + newComponent.chartConfig.chartFrame = item.chartFrame
  130 + }
98 // 添加 131 // 添加
99 chartEditStore.addComponentList(newComponent, false, true) 132 chartEditStore.addComponentList(newComponent, false, true)
100 // 选中 133 // 选中
101 chartEditStore.setTargetSelectChart(newComponent.id) 134 chartEditStore.setTargetSelectChart(newComponent.id)
102 loadingFinish() 135 loadingFinish()
103 } catch (error) { 136 } catch (error) {
104 - console.log(error)  
105 loadingError() 137 loadingError()
106 window['$message'].warning(`图表正在研发中, 敬请期待...`) 138 window['$message'].warning(`图表正在研发中, 敬请期待...`)
107 } 139 }
108 } 140 }
109 141
  142 +// 单击事件
  143 +const clickHandle = (item: ConfigType) => {
  144 + item?.configEvents?.addHandle(item)
  145 +}
  146 +
  147 +const deleteHandle = (item: ConfigType, index: number) => {
  148 + goDialog({
  149 + message: '是否删除此图片?',
  150 + transformOrigin: 'center',
  151 + onPositiveCallback: () => {
  152 + const packagesStore = usePackagesStore()
  153 + emit('deletePhoto', item, index)
  154 + packagesStore.deletePhotos(item, index)
  155 + }
  156 + })
  157 +}
  158 +
110 watch( 159 watch(
111 () => chartMode.value, 160 () => chartMode.value,
112 (newValue: ChartModeEnum) => { 161 (newValue: ChartModeEnum) => {
@@ -139,6 +188,7 @@ $halfCenterHeight: 50px; @@ -139,6 +188,7 @@ $halfCenterHeight: 50px;
139 gap: 9px; 188 gap: 9px;
140 transition: all 0.7s linear; 189 transition: all 0.7s linear;
141 .item-box { 190 .item-box {
  191 + position: relative;
142 margin: 0; 192 margin: 0;
143 width: $itemWidth; 193 width: $itemWidth;
144 overflow: hidden; 194 overflow: hidden;
@@ -149,7 +199,10 @@ $halfCenterHeight: 50px; @@ -149,7 +199,10 @@ $halfCenterHeight: 50px;
149 &:hover { 199 &:hover {
150 @include hover-border-color('background-color4'); 200 @include hover-border-color('background-color4');
151 .list-img { 201 .list-img {
152 - transform: scale(1.1); 202 + transform: scale(1.08);
  203 + }
  204 + .list-tools {
  205 + opacity: 1;
153 } 206 }
154 } 207 }
155 .list-header { 208 .list-header {
@@ -161,6 +214,7 @@ $halfCenterHeight: 50px; @@ -161,6 +214,7 @@ $halfCenterHeight: 50px;
161 &-text { 214 &-text {
162 font-size: 12px; 215 font-size: 12px;
163 margin-left: 8px; 216 margin-left: 8px;
  217 + user-select: none;
164 } 218 }
165 } 219 }
166 .list-center { 220 .list-center {
@@ -169,8 +223,9 @@ $halfCenterHeight: 50px; @@ -169,8 +223,9 @@ $halfCenterHeight: 50px;
169 overflow: hidden; 223 overflow: hidden;
170 .list-img { 224 .list-img {
171 height: 100px; 225 height: 100px;
172 - width: 140px; 226 + max-width: 140px;
173 border-radius: 6px; 227 border-radius: 6px;
  228 + object-fit: contain;
174 @extend .go-transition; 229 @extend .go-transition;
175 } 230 }
176 } 231 }
@@ -181,6 +236,33 @@ $halfCenterHeight: 50px; @@ -181,6 +236,33 @@ $halfCenterHeight: 50px;
181 padding-left: 5px; 236 padding-left: 5px;
182 } 237 }
183 } 238 }
  239 + .list-model {
  240 + z-index: 1;
  241 + position: absolute;
  242 + top: 0;
  243 + left: 0;
  244 + width: 100%;
  245 + height: 100%;
  246 + background-color: rgba(0, 0, 0, 0);
  247 + }
  248 + .list-tools {
  249 + position: absolute;
  250 + display: flex;
  251 + justify-content: center;
  252 + align-items: center;
  253 + bottom: 0;
  254 + left: 0;
  255 + margin: 0 4px 2px;
  256 + height: 26px;
  257 + width: calc(100% - 8px);
  258 + opacity: 0;
  259 + border-radius: 6px;
  260 + backdrop-filter: blur(20px);
  261 + background-color: rgba(255, 255, 255, 0.15);
  262 + &:hover {
  263 + background-color: rgba(232, 128, 128, 0.7);
  264 + }
  265 + }
184 } 266 }
185 &.single { 267 &.single {
186 .item-box { 268 .item-box {
@@ -200,6 +282,9 @@ $halfCenterHeight: 50px; @@ -200,6 +282,9 @@ $halfCenterHeight: 50px;
200 .item-box { 282 .item-box {
201 width: $halfItemWidth; 283 width: $halfItemWidth;
202 max-width: $maxItemWidth; 284 max-width: $maxItemWidth;
  285 + .list-img {
  286 + max-width: 76px;
  287 + }
203 } 288 }
204 .list-center { 289 .list-center {
205 height: $halfCenterHeight; 290 height: $halfCenterHeight;
@@ -208,6 +293,7 @@ $halfCenterHeight: 50px; @@ -208,6 +293,7 @@ $halfCenterHeight: 50px;
208 height: $halfCenterHeight; 293 height: $halfCenterHeight;
209 width: auto; 294 width: auto;
210 transition: all 0.2s; 295 transition: all 0.2s;
  296 + object-fit: contain;
211 } 297 }
212 } 298 }
213 .list-bottom { 299 .list-bottom {
@@ -11,8 +11,8 @@ @@ -11,8 +11,8 @@
11 @update:value="clickItemHandle" 11 @update:value="clickItemHandle"
12 ></n-menu> 12 ></n-menu>
13 <div class="chart-content-list"> 13 <div class="chart-content-list">
14 - <n-scrollbar>  
15 - <charts-item-box :menuOptions="packages.selectOptions"></charts-item-box> 14 + <n-scrollbar trigger="none">
  15 + <charts-item-box :menuOptions="packages.selectOptions" @deletePhoto="deleteHandle"></charts-item-box>
16 </n-scrollbar> 16 </n-scrollbar>
17 </div> 17 </div>
18 </div> 18 </div>
@@ -23,8 +23,11 @@ import { ref, watch, computed, reactive } from 'vue' @@ -23,8 +23,11 @@ import { ref, watch, computed, reactive } from 'vue'
23 import { ConfigType } from '@/packages/index.d' 23 import { ConfigType } from '@/packages/index.d'
24 import { useSettingStore } from '@/store/modules/settingStore/settingStore' 24 import { useSettingStore } from '@/store/modules/settingStore/settingStore'
25 import { loadAsyncComponent } from '@/utils' 25 import { loadAsyncComponent } from '@/utils'
  26 +import { usePackagesStore } from '@/store/modules/packagesStore/packagesStore'
  27 +import { PackagesCategoryEnum } from '@/packages/index.d'
26 28
27 const ChartsItemBox = loadAsyncComponent(() => import('../ChartsItemBox/index.vue')) 29 const ChartsItemBox = loadAsyncComponent(() => import('../ChartsItemBox/index.vue'))
  30 +const packagesStore = usePackagesStore()
28 31
29 const props = defineProps({ 32 const props = defineProps({
30 selectOptions: { 33 selectOptions: {
@@ -61,7 +64,7 @@ let packages = reactive<{ @@ -61,7 +64,7 @@ let packages = reactive<{
61 saveSelectOptions: {} 64 saveSelectOptions: {}
62 }) 65 })
63 66
64 -const selectValue = ref<string>() 67 +const selectValue = ref<string>('all')
65 68
66 // 设置初始列表 69 // 设置初始列表
67 const setSelectOptions = (categorys: any) => { 70 const setSelectOptions = (categorys: any) => {
@@ -79,7 +82,6 @@ watch( @@ -79,7 +82,6 @@ watch(
79 if (!newData) return 82 if (!newData) return
80 newData.list.forEach((e: ConfigType) => { 83 newData.list.forEach((e: ConfigType) => {
81 const value: ConfigType[] = (packages.categorys as any)[e.category] 84 const value: ConfigType[] = (packages.categorys as any)[e.category]
82 - // @ts-ignore  
83 packages.categorys[e.category] = value && value.length ? [...value, e] : [e] 85 packages.categorys[e.category] = value && value.length ? [...value, e] : [e]
84 packages.categoryNames[e.category] = e.categoryName 86 packages.categoryNames[e.category] = e.categoryName
85 packages.categorys['all'].push(e) 87 packages.categorys['all'].push(e)
@@ -100,6 +102,22 @@ watch( @@ -100,6 +102,22 @@ watch(
100 } 102 }
101 ) 103 )
102 104
  105 +watch(
  106 + () => packagesStore.newPhoto,
  107 + newPhoto => {
  108 + if (!newPhoto) return
  109 + const newPhotoCategory = newPhoto.category
  110 + packages.categorys[newPhotoCategory].splice(1, 0, newPhoto)
  111 + packages.categorys['all'].splice(1, 0, newPhoto)
  112 + }
  113 +)
  114 +
  115 +// 删除图片
  116 +const deleteHandle = (item: ConfigType, index: number) => {
  117 + packages.categorys[item.category].splice(index, 1)
  118 + packages.categorys['all'].splice(index, 1)
  119 +}
  120 +
103 // 处理点击事件 121 // 处理点击事件
104 const clickItemHandle = (key: string) => { 122 const clickItemHandle = (key: string) => {
105 packages.selectOptions = packages.categorys[key] 123 packages.selectOptions = packages.categorys[key]
@@ -119,6 +137,7 @@ $menuWidth: 65px; @@ -119,6 +137,7 @@ $menuWidth: 65px;
119 @include fetch-bg-color('background-color2-shallow'); 137 @include fetch-bg-color('background-color2-shallow');
120 } 138 }
121 .chart-content-list { 139 .chart-content-list {
  140 + width: 200px;
122 flex: 1; 141 flex: 1;
123 display: flex; 142 display: flex;
124 flex-direction: column; 143 flex-direction: column;
@@ -37,7 +37,8 @@ @@ -37,7 +37,8 @@
37 :title="item.title" 37 :title="item.title"
38 @click="selectChartHandle(item)" 38 @click="selectChartHandle(item)"
39 > 39 >
40 - <chart-glob-image class="list-item-img" :chartConfig="item"></chart-glob-image> 40 + <Icon v-if="item.icon" class="list-img" :icon="item.icon" color="#999" width="20" />
  41 + <chart-glob-image v-else class="list-item-img" :chartConfig="item" />
41 <n-text class="list-item-fs" depth="2">{{ item.title }}</n-text> 42 <n-text class="list-item-fs" depth="2">{{ item.title }}</n-text>
42 </div> 43 </div>
43 </n-scrollbar> 44 </n-scrollbar>
@@ -72,7 +73,7 @@ import { icon } from '@/plugins' @@ -72,7 +73,7 @@ import { icon } from '@/plugins'
72 // THINGS_KIT 覆盖原始创建组件逻辑 73 // THINGS_KIT 覆盖原始创建组件逻辑
73 import { createComponent } from '@/packages/external/override' 74 import { createComponent } from '@/packages/external/override'
74 import { ConfigType, CreateComponentType } from '@/packages/index.d' 75 import { ConfigType, CreateComponentType } from '@/packages/index.d'
75 -import { themeColor, MenuOptionsType } from '../../hooks/useAside.hook' 76 +import { themeColor } from '../../hooks/useLayout.hook'
76 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' 77 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
77 import { ChartModeEnum, ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' 78 import { ChartModeEnum, ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
78 import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore' 79 import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore'
@@ -80,6 +81,7 @@ import { isString, addEventListener, removeEventListener } from '@/utils' @@ -80,6 +81,7 @@ import { isString, addEventListener, removeEventListener } from '@/utils'
80 import { fetchConfigComponent, fetchChartComponent } from '@/packages/index' 81 import { fetchConfigComponent, fetchChartComponent } from '@/packages/index'
81 import { componentInstall, loadingStart, loadingFinish, loadingError } from '@/utils' 82 import { componentInstall, loadingStart, loadingFinish, loadingError } from '@/utils'
82 import { ChartGlobImage } from '@/components/Pages/ChartGlobImage' 83 import { ChartGlobImage } from '@/components/Pages/ChartGlobImage'
  84 +import { Icon } from '@iconify/vue'
83 85
84 const props = defineProps({ 86 const props = defineProps({
85 menuOptions: { 87 menuOptions: {
@@ -131,7 +133,9 @@ const searchHandle = (key: string | null) => { @@ -131,7 +133,9 @@ const searchHandle = (key: string | null) => {
131 } 133 }
132 loading.value = true 134 loading.value = true
133 showPopover.value = true 135 showPopover.value = true
134 - searchRes.value = List.filter((e: ConfigType) => !key || e.title.toLowerCase().includes(key.toLowerCase())) 136 + searchRes.value = List.filter(
  137 + (e: ConfigType) => !e.disabled && (!key || e.title.toLowerCase().includes(key.toLowerCase()))
  138 + )
135 setTimeout(() => { 139 setTimeout(() => {
136 loading.value = undefined 140 loading.value = undefined
137 }, 500) 141 }, 500)
@@ -148,6 +152,7 @@ const listenerCloseHandle = (e: Event) => { @@ -148,6 +152,7 @@ const listenerCloseHandle = (e: Event) => {
148 152
149 // 选择处理 153 // 选择处理
150 const selectChartHandle = async (item: ConfigType) => { 154 const selectChartHandle = async (item: ConfigType) => {
  155 + if (item.disabled) return
151 try { 156 try {
152 loadingStart() 157 loadingStart()
153 // 动态注册图表组件 158 // 动态注册图表组件
@@ -155,6 +160,11 @@ const selectChartHandle = async (item: ConfigType) => { @@ -155,6 +160,11 @@ const selectChartHandle = async (item: ConfigType) => {
155 componentInstall(item.conKey, fetchConfigComponent(item)) 160 componentInstall(item.conKey, fetchConfigComponent(item))
156 // 创建新图表组件 161 // 创建新图表组件
157 let newComponent: CreateComponentType = await createComponent(item) 162 let newComponent: CreateComponentType = await createComponent(item)
  163 + if (item.redirectComponent) {
  164 + item.dataset && (newComponent.option.dataset = item.dataset)
  165 + newComponent.chartConfig.title = item.title
  166 + newComponent.chartConfig.chartFrame = item.chartFrame
  167 + }
158 // 添加 168 // 添加
159 chartEditStore.addComponentList(newComponent, false, true) 169 chartEditStore.addComponentList(newComponent, false, true)
160 // 选中 170 // 选中
@@ -163,7 +173,6 @@ const selectChartHandle = async (item: ConfigType) => { @@ -163,7 +173,6 @@ const selectChartHandle = async (item: ConfigType) => {
163 closeHandle() 173 closeHandle()
164 loadingFinish() 174 loadingFinish()
165 } catch (error) { 175 } catch (error) {
166 - console.log(error)  
167 loadingError() 176 loadingError()
168 window['$message'].warning(`图表正在研发中, 敬请期待...`) 177 window['$message'].warning(`图表正在研发中, 敬请期待...`)
169 } 178 }
@@ -224,10 +233,16 @@ $searchWidth: 176px; @@ -224,10 +233,16 @@ $searchWidth: 176px;
224 font-size: 12px; 233 font-size: 12px;
225 } 234 }
226 &-img { 235 &-img {
227 - height: 28px; 236 + height: 20px;
  237 + max-width: 30px;
228 margin-right: 5px; 238 margin-right: 5px;
229 border-radius: 5px; 239 border-radius: 5px;
230 } 240 }
  241 + & > svg {
  242 + min-width: 20px;
  243 + min-height: 20px;
  244 + margin-right: 5px;
  245 + }
231 &:hover { 246 &:hover {
232 &::before { 247 &::before {
233 content: ''; 248 content: '';
1 -import { shallowReactive, ref } from 'vue' 1 +import { ref, watch, computed } from 'vue'
2 import { icon } from '@/plugins' 2 import { icon } from '@/plugins'
3 import { renderLang, renderIcon } from '@/utils' 3 import { renderLang, renderIcon } from '@/utils'
4 import { themeColor, setItem, getCharts } from './useLayout.hook' 4 import { themeColor, setItem, getCharts } from './useLayout.hook'
5 -import { PackagesCategoryEnum, PackagesCategoryName, PackagesType } from '@/packages/index.d'  
6 -// 图表 5 +import { PackagesCategoryEnum, PackagesCategoryName, ConfigType, PackagesType } from '@/packages/index.d'
7 import { usePackagesStore } from '@/store/modules/packagesStore/packagesStore' 6 import { usePackagesStore } from '@/store/modules/packagesStore/packagesStore'
8 import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' 7 import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
9 // THINGS_KIT 追加组件库进入aside 侧边栏 8 // THINGS_KIT 追加组件库进入aside 侧边栏
10 import { useInjectAside } from './external/useInjectAside' 9 import { useInjectAside } from './external/useInjectAside'
  10 +
11 // 图标 11 // 图标
12 -const { BarChartIcon } = icon.ionicons5 12 +const { AirPlaneOutlineIcon, ImageIcon, BarChartIcon } = icon.ionicons5
13 const { 13 const {
14 TableSplitIcon, 14 TableSplitIcon,
15 RoadmapIcon, 15 RoadmapIcon,
@@ -32,65 +32,77 @@ const menuOptions: MenuOptionsType[] = [] @@ -32,65 +32,77 @@ const menuOptions: MenuOptionsType[] = []
32 const packagesListObj = { 32 const packagesListObj = {
33 [PackagesCategoryEnum.CHARTS]: { 33 [PackagesCategoryEnum.CHARTS]: {
34 icon: renderIcon(RoadmapIcon), 34 icon: renderIcon(RoadmapIcon),
35 - label: PackagesCategoryName.CHARTS, 35 + label: PackagesCategoryName.CHARTS
36 }, 36 },
37 [PackagesCategoryEnum.INFORMATIONS]: { 37 [PackagesCategoryEnum.INFORMATIONS]: {
38 icon: renderIcon(SpellCheckIcon), 38 icon: renderIcon(SpellCheckIcon),
39 - label: PackagesCategoryName.INFORMATIONS, 39 + label: PackagesCategoryName.INFORMATIONS
40 }, 40 },
41 [PackagesCategoryEnum.TABLES]: { 41 [PackagesCategoryEnum.TABLES]: {
42 icon: renderIcon(TableSplitIcon), 42 icon: renderIcon(TableSplitIcon),
43 - label: PackagesCategoryName.TABLES, 43 + label: PackagesCategoryName.TABLES
44 }, 44 },
45 [PackagesCategoryEnum.DECORATES]: { 45 [PackagesCategoryEnum.DECORATES]: {
46 icon: renderIcon(GraphicalDataFlowIcon), 46 icon: renderIcon(GraphicalDataFlowIcon),
47 - label: PackagesCategoryName.DECORATES, 47 + label: PackagesCategoryName.DECORATES
48 }, 48 },
  49 + [PackagesCategoryEnum.PHOTOS]: {
  50 + icon: renderIcon(ImageIcon),
  51 + label: PackagesCategoryName.PHOTOS
  52 + },
  53 + [PackagesCategoryEnum.ICONS]: {
  54 + icon: renderIcon(AirPlaneOutlineIcon),
  55 + label: PackagesCategoryName.ICONS
  56 + }
49 } 57 }
50 // THINGS_KIT 追加组件库进入aside 侧边栏 58 // THINGS_KIT 追加组件库进入aside 侧边栏
51 useInjectAside(packagesListObj as any) 59 useInjectAside(packagesListObj as any)
  60 +export const useAsideHook = () => {
  61 + const packagesStore = usePackagesStore()
  62 + const menuOptions: MenuOptionsType[] = []
52 63
53 -// 处理列表  
54 -const handlePackagesList = () => {  
55 - for (const val in getPackagesList) {  
56 - menuOptions.push({  
57 - key: val,  
58 - // @ts-ignore  
59 - icon: packagesListObj[val].icon,  
60 - // @ts-ignore  
61 - label: packagesListObj[val].label,  
62 - // @ts-ignore  
63 - list: getPackagesList[val],  
64 - }) 64 + // 处理列表
  65 + const handlePackagesList = () => {
  66 + for (const val in packagesStore.getPackagesList) {
  67 + menuOptions.push({
  68 + key: val,
  69 + // @ts-ignore
  70 + icon: packagesListObj[val].icon,
  71 + // @ts-ignore
  72 + label: packagesListObj[val].label,
  73 + // @ts-ignore
  74 + list: packagesStore.getPackagesList[val]
  75 + })
  76 + }
65 } 77 }
66 -}  
67 -handlePackagesList() 78 + handlePackagesList()
68 79
69 -// 记录选中值  
70 -let beforeSelect: string = menuOptions[0]['key']  
71 -const selectValue = ref<string>(menuOptions[0]['key']) 80 + // 记录选中值
  81 + let beforeSelect: string = menuOptions[0]['key']
  82 + const selectValue = ref<string>(menuOptions[0]['key'])
72 83
73 -// 选中的对象值  
74 -const selectOptions = ref(menuOptions[0]) 84 + // 选中的对象值
  85 + const selectOptions = ref(menuOptions[0])
75 86
76 -// 点击 item  
77 -const clickItemHandle = (key: string, item: any) => {  
78 - selectOptions.value = item  
79 - // 处理折叠  
80 - if (beforeSelect === key) {  
81 - setItem(ChartLayoutStoreEnum.CHARTS, !getCharts.value)  
82 - } else {  
83 - setItem(ChartLayoutStoreEnum.CHARTS, true) 87 + // 点击 item
  88 + const clickItemHandle = (key: string, item: any) => {
  89 + selectOptions.value = item
  90 + // 处理折叠
  91 + if (beforeSelect === key) {
  92 + setItem(ChartLayoutStoreEnum.CHARTS, !getCharts.value, false)
  93 + } else {
  94 + setItem(ChartLayoutStoreEnum.CHARTS, true, false)
  95 + }
  96 + beforeSelect = key
84 } 97 }
85 - beforeSelect = key  
86 -}  
87 98
88 -export {  
89 - getCharts,  
90 - BarChartIcon,  
91 - themeColor,  
92 - selectOptions,  
93 - selectValue,  
94 - clickItemHandle,  
95 - menuOptions, 99 + return {
  100 + getCharts,
  101 + BarChartIcon,
  102 + themeColor,
  103 + selectOptions,
  104 + selectValue,
  105 + clickItemHandle,
  106 + menuOptions,
  107 + }
96 } 108 }
@@ -9,7 +9,7 @@ import { useDesignStore } from '@/store/modules/designStore/designStore' @@ -9,7 +9,7 @@ import { useDesignStore } from '@/store/modules/designStore/designStore'
9 const designStore = useDesignStore() 9 const designStore = useDesignStore()
10 const themeColor = ref(designStore.getAppTheme) 10 const themeColor = ref(designStore.getAppTheme)
11 11
12 -// 结构控制 12 +// 结构控制
13 const { setItem } = useChartLayoutStore() 13 const { setItem } = useChartLayoutStore()
14 const { getCharts } = toRefs(useChartLayoutStore()) 14 const { getCharts } = toRefs(useChartLayoutStore())
15 15
@@ -17,4 +17,4 @@ export { @@ -17,4 +17,4 @@ export {
17 themeColor, 17 themeColor,
18 setItem, 18 setItem,
19 getCharts 19 getCharts
20 -}  
  20 +}
1 <template> 1 <template>
2 <!-- 左侧所有组件的展示列表 --> 2 <!-- 左侧所有组件的展示列表 -->
3 - <content-box  
4 - class="go-content-charts"  
5 - :class="{ scoped: !getCharts }"  
6 - title="组件"  
7 - :depth="1"  
8 - :backIcon="false"  
9 - > 3 + <content-box class="go-content-charts" :class="{ scoped: !getCharts }" title="组件" :depth="1" :backIcon="false">
10 <template #icon> 4 <template #icon>
11 <n-icon size="14" :depth="2"> 5 <n-icon size="14" :depth="2">
12 <bar-chart-icon></bar-chart-icon> 6 <bar-chart-icon></bar-chart-icon>
@@ -28,13 +22,7 @@ @@ -28,13 +22,7 @@
28 @update:value="clickItemHandle" 22 @update:value="clickItemHandle"
29 ></n-menu> 23 ></n-menu>
30 <div class="menu-component-box"> 24 <div class="menu-component-box">
31 - <go-skeleton  
32 - :load="!selectOptions"  
33 - round  
34 - text  
35 - :repeat="2"  
36 - style="width: 90%"  
37 - ></go-skeleton> 25 + <go-skeleton :load="!selectOptions" round text :repeat="2" style="width: 90%"></go-skeleton>
38 <charts-option-content 26 <charts-option-content
39 v-if="selectOptions" 27 v-if="selectOptions"
40 :selectOptions="selectOptions" 28 :selectOptions="selectOptions"
@@ -50,15 +38,9 @@ @@ -50,15 +38,9 @@
50 import { ContentBox } from '../ContentBox/index' 38 import { ContentBox } from '../ContentBox/index'
51 import { ChartsOptionContent } from './components/ChartsOptionContent' 39 import { ChartsOptionContent } from './components/ChartsOptionContent'
52 import { ChartsSearch } from './components/ChartsSearch' 40 import { ChartsSearch } from './components/ChartsSearch'
53 -import {  
54 - getCharts,  
55 - BarChartIcon,  
56 - themeColor,  
57 - selectOptions,  
58 - selectValue,  
59 - clickItemHandle,  
60 - menuOptions,  
61 -} from './hooks/useAside.hook' 41 +import { useAsideHook } from './hooks/useAside.hook'
  42 +
  43 +const { getCharts, BarChartIcon, themeColor, selectOptions, selectValue, clickItemHandle, menuOptions } = useAsideHook()
62 </script> 44 </script>
63 45
64 <style lang="scss" scoped> 46 <style lang="scss" scoped>
@@ -30,7 +30,7 @@ @@ -30,7 +30,7 @@
30 :onBeforeUpload="beforeUploadHandle" 30 :onBeforeUpload="beforeUploadHandle"
31 > 31 >
32 <n-upload-dragger> 32 <n-upload-dragger>
33 - <img v-if="canvasConfig.backgroundImage" class="upload-show" :src="getBackgroundImagePath(canvasConfig.backgroundImage)" alt="背景" /> 33 + <img v-if="canvasConfig.backgroundImage" class="upload-show" :src="canvasConfig.backgroundImage" alt="背景" />
34 <div class="upload-img" v-show="!canvasConfig.backgroundImage"> 34 <div class="upload-img" v-show="!canvasConfig.backgroundImage">
35 <img src="@/assets/images/canvas/noImage.png" /> 35 <img src="@/assets/images/canvas/noImage.png" />
36 <n-text class="upload-desc" depth="3"> 36 <n-text class="upload-desc" depth="3">
@@ -130,8 +130,9 @@ const sendHandle = async () => { @@ -130,8 +130,9 @@ const sendHandle = async () => {
130 const res = await customizeHttp(toRaw(targetData.value.request), toRaw(chartEditStore.getRequestGlobalConfig)) 130 const res = await customizeHttp(toRaw(targetData.value.request), toRaw(chartEditStore.getRequestGlobalConfig))
131 loading.value = false 131 loading.value = false
132 if (res) { 132 if (res) {
133 - if (!res?.data && !targetData.value.filter) window['$message'].warning('您的数据不符合默认格式,请配置过滤器!')  
134 - targetData.value.option.dataset = newFunctionHandle(res?.data, res, targetData.value.filter) 133 + const { data } = res
  134 + if (!data && !targetData.value.filter) window['$message'].warning('您的数据不符合默认格式,请配置过滤器!')
  135 + targetData.value.option.dataset = newFunctionHandle(data, res, targetData.value.filter)
135 showMatching.value = true 136 showMatching.value = true
136 return 137 return
137 } 138 }
1 <template> 1 <template>
2 <!-- 组件配置 --> 2 <!-- 组件配置 -->
3 <n-divider class="go-my-3" title-placement="left"></n-divider> 3 <n-divider class="go-my-3" title-placement="left"></n-divider>
4 - <setting-item-box  
5 - :itemRightStyle="{  
6 - gridTemplateColumns: '6fr 2fr'  
7 - }"  
8 - style="padding-right: 25px"  
9 - > 4 + <setting-item-box :itemRightStyle="{
  5 + gridTemplateColumns: '6fr 2fr'
  6 + }" style="padding-right: 25px">
10 <template #name> 7 <template #name>
11 地址 8 地址
12 <n-tooltip trigger="hover" v-if="isDev()"> 9 <n-tooltip trigger="hover" v-if="isDev()">
@@ -37,13 +34,8 @@ @@ -37,13 +34,8 @@
37 </setting-item> 34 </setting-item>
38 <setting-item name="更新间隔,为 0 只会初始化"> 35 <setting-item name="更新间隔,为 0 只会初始化">
39 <n-input-group> 36 <n-input-group>
40 - <n-input-number  
41 - v-model:value.trim="requestInterval"  
42 - class="select-time-number"  
43 - min="0"  
44 - :show-button="false"  
45 - placeholder="默认使用全局数据"  
46 - > 37 + <n-input-number v-model:value.trim="requestInterval" class="select-time-number" min="0" :show-button="false"
  38 + placeholder="默认使用全局数据">
47 </n-input-number> 39 </n-input-number>
48 <!-- 单位 --> 40 <!-- 单位 -->
49 <n-select class="select-time-options" v-model:value="requestIntervalUnit" :options="selectTimeOptions" /> 41 <n-select class="select-time-options" v-model:value="requestIntervalUnit" :options="selectTimeOptions" />
@@ -65,6 +57,7 @@ import { RequestHeader } from '../RequestHeader' @@ -65,6 +57,7 @@ import { RequestHeader } from '../RequestHeader'
65 import { isDev } from '@/utils' 57 import { isDev } from '@/utils'
66 import { icon } from '@/plugins' 58 import { icon } from '@/plugins'
67 import { 59 import {
  60 + graphUrl,
68 chartDataUrl, 61 chartDataUrl,
69 chartSingleDataUrl, 62 chartSingleDataUrl,
70 rankListUrl, 63 rankListUrl,
@@ -80,7 +73,8 @@ import { @@ -80,7 +73,8 @@ import {
80 capsuleUrl, 73 capsuleUrl,
81 wordCloudUrl, 74 wordCloudUrl,
82 treemapUrl, 75 treemapUrl,
83 - threeEarth01Url 76 + threeEarth01Url,
  77 + sankeyUrl
84 } from '@/api/mock' 78 } from '@/api/mock'
85 79
86 const props = defineProps({ 80 const props = defineProps({
@@ -142,6 +136,12 @@ const apiList = [ @@ -142,6 +136,12 @@ const apiList = [
142 }, 136 },
143 { 137 {
144 value: `【三维地球】${threeEarth01Url}` 138 value: `【三维地球】${threeEarth01Url}`
  139 + },
  140 + {
  141 + value: `【桑基图】${sankeyUrl}`
  142 + },
  143 + {
  144 + value: `【关系图】${graphUrl}`
145 } 145 }
146 ] 146 ]
147 </script> 147 </script>
@@ -150,9 +150,11 @@ const apiList = [ @@ -150,9 +150,11 @@ const apiList = [
150 .select-time-number { 150 .select-time-number {
151 width: 100%; 151 width: 100%;
152 } 152 }
  153 +
153 .select-time-options { 154 .select-time-options {
154 width: 100px; 155 width: 100px;
155 } 156 }
  157 +
156 .select-type-options { 158 .select-type-options {
157 width: 120px; 159 width: 120px;
158 } 160 }
@@ -58,7 +58,7 @@ @@ -58,7 +58,7 @@
58 <help-outline-icon></help-outline-icon> 58 <help-outline-icon></help-outline-icon>
59 </n-icon> 59 </n-icon>
60 </template> 60 </template>
61 - <n-text>不支持「静态组件」和「分组」</n-text> 61 + <n-text>不支持「静态组件」</n-text>
62 </n-tooltip> 62 </n-tooltip>
63 </template> 63 </template>
64 <n-select 64 <n-select
@@ -169,7 +169,27 @@ const fnDimensionsAndSource = (interactOn: InteractEventOn | undefined) => { @@ -169,7 +169,27 @@ const fnDimensionsAndSource = (interactOn: InteractEventOn | undefined) => {
169 169
170 // 绑定组件列表 170 // 绑定组件列表
171 const fnEventsOptions = (): Array<SelectOption | SelectGroupOption> => { 171 const fnEventsOptions = (): Array<SelectOption | SelectGroupOption> => {
172 - const filterOptionList = chartEditStore.componentList.filter(item => { 172 + // 扁平化树形数据
  173 + const fnFlattern = (
  174 + data: Array<CreateComponentType | CreateComponentGroupType>
  175 + ): Array<CreateComponentType | CreateComponentGroupType> => {
  176 + return data.reduce(
  177 + (
  178 + iter: Array<CreateComponentType | CreateComponentGroupType>,
  179 + val: CreateComponentType | CreateComponentGroupType
  180 + ) => {
  181 + if (val.groupList && val.groupList.length > 0) {
  182 + iter.push(val)
  183 + } else {
  184 + iter.push(val)
  185 + }
  186 + return val.groupList ? [...iter, ...fnFlattern(val.groupList)] : iter
  187 + },
  188 + []
  189 + )
  190 + }
  191 +
  192 + const filterOptionList = fnFlattern(chartEditStore.componentList).filter(item => {
173 // 排除自己 193 // 排除自己
174 const isNotSelf = item.id !== targetData.value.id 194 const isNotSelf = item.id !== targetData.value.id
175 // 排除静态组件 195 // 排除静态组件
@@ -23,6 +23,8 @@ @@ -23,6 +23,8 @@
23 <script setup lang="ts"> 23 <script setup lang="ts">
24 import { computed, PropType } from 'vue' 24 import { computed, PropType } from 'vue'
25 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' 25 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
  26 +import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
  27 +
26 import { useDesignStore } from '@/store/modules/designStore/designStore' 28 import { useDesignStore } from '@/store/modules/designStore/designStore'
27 import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' 29 import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
28 import { useSizeStyle, usePointStyle } from '../../hooks/useStyle.hook' 30 import { useSizeStyle, usePointStyle } from '../../hooks/useStyle.hook'
@@ -55,6 +57,9 @@ const themeColor = computed(() => { @@ -55,6 +57,9 @@ const themeColor = computed(() => {
55 57
56 // 计算当前选中目标 58 // 计算当前选中目标
57 const hover = computed(() => { 59 const hover = computed(() => {
  60 + const isDrag = chartEditStore.getEditCanvas[EditCanvasTypeEnum.IS_DRAG]
  61 + if (isDrag) return false
  62 +
58 if (props.item.status.lock) return false 63 if (props.item.status.lock) return false
59 return props.item.id === chartEditStore.getTargetChart.hoverId 64 return props.item.id === chartEditStore.getTargetChart.hoverId
60 }) 65 })
@@ -24,6 +24,11 @@ export const syncData = () => { @@ -24,6 +24,11 @@ export const syncData = () => {
24 }) 24 })
25 } 25 }
26 26
  27 +// 同步数据到预览页
  28 +export const syncDataToPreview = () => {
  29 + dispatchEvent(new CustomEvent(SavePageEnum.CHART_TO_PREVIEW, { detail: chartEditStore.getStorageInfo }))
  30 +}
  31 +
27 // 侦听器更新 32 // 侦听器更新
28 const useSyncUpdateHandle = () => { 33 const useSyncUpdateHandle = () => {
29 // 定义侦听器变量 34 // 定义侦听器变量
@@ -48,8 +53,8 @@ const useSyncUpdateHandle = () => { @@ -48,8 +53,8 @@ const useSyncUpdateHandle = () => {
48 // document.hasFocus() && syncData() 53 // document.hasFocus() && syncData()
49 // }, editToJsonInterval) 54 // }, editToJsonInterval)
50 55
51 - // 失焦同步数据(暂不开启)  
52 - // addEventListener('blur', syncData) 56 + // 失焦同步数据
  57 + addEventListener('blur', syncDataToPreview)
53 58
54 // 监听编辑器保存事件 刷新工作台图表 59 // 监听编辑器保存事件 刷新工作台图表
55 addEventListener(SavePageEnum.JSON, updateFn) 60 addEventListener(SavePageEnum.JSON, updateFn)
@@ -324,6 +324,15 @@ $asideBottom: 70px; @@ -324,6 +324,15 @@ $asideBottom: 70px;
324 border-radius: 25px; 324 border-radius: 25px;
325 } 325 }
326 } 326 }
  327 + &::after {
  328 + content: '';
  329 + position: absolute;
  330 + left: 0;
  331 + width: 100%;
  332 + height: 10px;
  333 + bottom: -10px;
  334 + cursor: pointer;
  335 + }
327 } 336 }
328 /* 最小化 */ 337 /* 最小化 */
329 &.isMini { 338 &.isMini {
@@ -350,6 +359,7 @@ $asideBottom: 70px; @@ -350,6 +359,7 @@ $asideBottom: 70px;
350 50% { 359 50% {
351 opacity: 0; 360 opacity: 0;
352 bottom: calc(#{$dockMiniBottom} - 10px); 361 bottom: calc(#{$dockMiniBottom} - 10px);
  362 + pointer-events: none;
353 } 363 }
354 100% { 364 100% {
355 opacity: 1; 365 opacity: 1;
@@ -364,15 +374,6 @@ $asideBottom: 70px; @@ -364,15 +374,6 @@ $asideBottom: 70px;
364 display: none; 374 display: none;
365 } 375 }
366 } 376 }
367 - &::after {  
368 - content: '';  
369 - position: absolute;  
370 - left: 0;  
371 - width: 100%;  
372 - height: 20px;  
373 - bottom: -20px;  
374 - cursor: pointer;  
375 - }  
376 } 377 }
377 } 378 }
378 </style> 379 </style>
@@ -30,9 +30,16 @@ export const dragHandle = async (e: DragEvent) => { @@ -30,9 +30,16 @@ export const dragHandle = async (e: DragEvent) => {
30 // 修改状态 30 // 修改状态
31 chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_CREATE, false) 31 chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_CREATE, false)
32 const dropData: Exclude<ConfigType, ['image']> = JSONParse(drayDataString) 32 const dropData: Exclude<ConfigType, ['image']> = JSONParse(drayDataString)
  33 + if (dropData.disabled) return
33 34
34 // 创建新图表组件 35 // 创建新图表组件
35 const newComponent: CreateComponentType = await createComponent(dropData) 36 const newComponent: CreateComponentType = await createComponent(dropData)
  37 + console.log(newComponent)
  38 + if (dropData.redirectComponent) {
  39 + dropData.dataset && (newComponent.option.dataset = dropData.dataset)
  40 + newComponent.chartConfig.title = dropData.title
  41 + newComponent.chartConfig.chartFrame = dropData.chartFrame
  42 + }
36 43
37 setComponentPosition(newComponent, e.offsetX - newComponent.attr.w / 2, e.offsetY - newComponent.attr.h / 2) 44 setComponentPosition(newComponent, e.offsetX - newComponent.attr.w / 2, e.offsetY - newComponent.attr.h / 2)
38 chartEditStore.addComponentList(newComponent, false, true) 45 chartEditStore.addComponentList(newComponent, false, true)
@@ -5,8 +5,9 @@ import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStor @@ -5,8 +5,9 @@ import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStor
5 const chartEditStore = useChartEditStore() 5 const chartEditStore = useChartEditStore()
6 6
7 // 布局处理 7 // 布局处理
8 -export const useLayout = () => {  
9 - onMounted(() => { 8 +export const useLayout = (fn: () => Promise<void>) => {
  9 + const removeScale: Function = () => { }
  10 + onMounted(async () => {
10 // 设置 Dom 值(ref 不生效先用 document) 11 // 设置 Dom 值(ref 不生效先用 document)
11 chartEditStore.setEditCanvas( 12 chartEditStore.setEditCanvas(
12 EditCanvasTypeEnum.EDIT_LAYOUT_DOM, 13 EditCanvasTypeEnum.EDIT_LAYOUT_DOM,
@@ -17,13 +18,16 @@ export const useLayout = () => { @@ -17,13 +18,16 @@ export const useLayout = () => {
17 document.getElementById('go-chart-edit-content') 18 document.getElementById('go-chart-edit-content')
18 ) 19 )
19 20
  21 + // 获取数据
  22 + await fn()
20 // 监听初始化 23 // 监听初始化
21 const removeScale = chartEditStore.listenerScale() 24 const removeScale = chartEditStore.listenerScale()
22 25
23 - onUnmounted(() => {  
24 - chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_LAYOUT_DOM, null)  
25 - chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_CONTENT_DOM, null)  
26 - removeScale()  
27 - })  
28 }) 26 })
29 -}  
  27 +
  28 + onUnmounted(() => {
  29 + chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_LAYOUT_DOM, null)
  30 + chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_CONTENT_DOM, null)
  31 + removeScale()
  32 + })
  33 +}
@@ -113,10 +113,10 @@ const { handleContextMenu } = useContextMenu() @@ -113,10 +113,10 @@ const { handleContextMenu } = useContextMenu()
113 const { dataSyncFetch, intervalDataSyncUpdate } = useSyncRemote() 113 const { dataSyncFetch, intervalDataSyncUpdate } = useSyncRemote()
114 114
115 // 编辑时注入scale变量,消除警告 115 // 编辑时注入scale变量,消除警告
116 -provide(SCALE_KEY, null); 116 +provide(SCALE_KEY, null)
117 117
118 // 布局处理 118 // 布局处理
119 -useLayout() 119 +useLayout(async () => {})
120 120
121 // 点击事件 121 // 点击事件
122 const { mouseenterHandle, mouseleaveHandle, mousedownHandle, mouseClickHandle } = useMouseHandle() 122 const { mouseenterHandle, mouseleaveHandle, mousedownHandle, mouseClickHandle } = useMouseHandle()
@@ -188,6 +188,7 @@ const rangeStyle = computed(() => { @@ -188,6 +188,7 @@ const rangeStyle = computed(() => {
188 // 键盘事件 188 // 键盘事件
189 onMounted(() => { 189 onMounted(() => {
190 useAddKeyboard() 190 useAddKeyboard()
  191 + // THINGS_KIT
191 // 获取数据 192 // 获取数据
192 dataSyncFetch() 193 dataSyncFetch()
193 // 定时更新数据 194 // 定时更新数据
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 <!-- 模块展示按钮 --> 11 <!-- 模块展示按钮 -->
12 <n-tooltip v-for="item in btnList" :key="item.key" placement="bottom" trigger="hover"> 12 <n-tooltip v-for="item in btnList" :key="item.key" placement="bottom" trigger="hover">
13 <template #trigger> 13 <template #trigger>
14 - <n-button size="small" ghost :type="styleHandle(item)" @click="clickHandle(item)"> 14 + <n-button size="small" ghost :type="styleHandle(item)" :focusable="false" @click="clickHandle(item)">
15 <component :is="item.icon"></component> 15 <component :is="item.icon"></component>
16 </n-button> 16 </n-button>
17 </template> 17 </template>
@@ -58,7 +58,7 @@ const previewHandle = () => { @@ -58,7 +58,7 @@ const previewHandle = () => {
58 // 发布 58 // 发布
59 const sendHandle = () => { 59 const sendHandle = () => {
60 goDialog({ 60 goDialog({
61 - message: '想体验发布功能,请前往 master-fetch 分支查看: https://demo.mtruning.club/#/login', 61 + message: '想体验发布功能,请前往查看: https://demo.mtruning.club/#/login。源码需切换到:master-fetch 分支。',
62 positiveText: '了然', 62 positiveText: '了然',
63 closeNegativeText: true, 63 closeNegativeText: true,
64 onPositiveCallback: () => {} 64 onPositiveCallback: () => {}
@@ -20,7 +20,7 @@ @@ -20,7 +20,7 @@
20 </template> 20 </template>
21 21
22 <script setup lang="ts"> 22 <script setup lang="ts">
23 -import { computed, PropType, ref, watch } from 'vue' 23 +import { computed, PropType, ref } from 'vue'
24 import { requireErrorImg } from '@/utils' 24 import { requireErrorImg } from '@/utils'
25 import { useDesignStore } from '@/store/modules/designStore/designStore' 25 import { useDesignStore } from '@/store/modules/designStore/designStore'
26 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' 26 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
@@ -88,6 +88,7 @@ export const useSyncRemote = () => { @@ -88,6 +88,7 @@ export const useSyncRemote = () => {
88 return 88 return
89 } 89 }
90 projectInfoStore.setSaveStatus(SyncEnum.START) 90 projectInfoStore.setSaveStatus(SyncEnum.START)
  91 + console.log(dataViewContent)
91 // 保存数据 92 // 保存数据
92 const saveContent = { 93 const saveContent = {
93 dataViewContent: { 94 dataViewContent: {
@@ -137,6 +137,11 @@ export const useSync = () => { @@ -137,6 +137,11 @@ export const useSync = () => {
137 ) => { 137 ) => {
138 // 补充 class 上的方法 138 // 补充 class 上的方法
139 let newComponent: CreateComponentType = await createComponent(_componentInstance.chartConfig) 139 let newComponent: CreateComponentType = await createComponent(_componentInstance.chartConfig)
  140 + if (_componentInstance.chartConfig.redirectComponent) {
  141 + _componentInstance.chartConfig.dataset && (newComponent.option.dataset = _componentInstance.chartConfig.dataset)
  142 + newComponent.chartConfig.title = _componentInstance.chartConfig.title
  143 + newComponent.chartConfig.chartFrame = _componentInstance.chartConfig.chartFrame
  144 + }
140 if (callBack) { 145 if (callBack) {
141 if (changeId) { 146 if (changeId) {
142 callBack(componentMerge(newComponent, { ..._componentInstance, id: getUUID() })) 147 callBack(componentMerge(newComponent, { ..._componentInstance, id: getUUID() }))
@@ -190,6 +195,11 @@ export const useSync = () => { @@ -190,6 +195,11 @@ export const useSync = () => {
190 } else { 195 } else {
191 await create(comItem as CreateComponentType) 196 await create(comItem as CreateComponentType)
192 } 197 }
  198 + if (percentage === 100) {
  199 + // 清除历史记录
  200 + chartHistoryStore.clearBackStack()
  201 + chartHistoryStore.clearForwardStack()
  202 + }
193 } 203 }
194 } else { 204 } else {
195 // 非组件(顺便排除脏数据) 205 // 非组件(顺便排除脏数据)
@@ -59,6 +59,8 @@ @@ -59,6 +59,8 @@
59 <n-form-item path="username"> 59 <n-form-item path="username">
60 <n-input 60 <n-input
61 v-model:value="formInline.username" 61 v-model:value="formInline.username"
  62 + type="text"
  63 + maxlength="16"
62 :placeholder="$t('global.form_account')" 64 :placeholder="$t('global.form_account')"
63 > 65 >
64 <template #prefix> 66 <template #prefix>
@@ -72,6 +74,7 @@ @@ -72,6 +74,7 @@
72 <n-input 74 <n-input
73 v-model:value="formInline.password" 75 v-model:value="formInline.password"
74 type="password" 76 type="password"
  77 + maxlength="16"
75 show-password-on="click" 78 show-password-on="click"
76 :placeholder="$t('global.form_password')" 79 :placeholder="$t('global.form_password')"
77 > 80 >
@@ -13,13 +13,13 @@ import Preview from './index.vue' @@ -13,13 +13,13 @@ import Preview from './index.vue'
13 13
14 let key = ref(Date.now()) 14 let key = ref(Date.now())
15 15
16 - // 数据变更 -> 组件销毁重建  
17 - ;[SavePageEnum.JSON, SavePageEnum.CHART].forEach((saveEvent: string) => {  
18 - if (!window.opener) return  
19 - window.opener.addEventListener(saveEvent, async (e: any) => {  
20 - const localStorageInfo: ChartEditStorageType = await getSessionStorageInfo() as unknown as ChartEditStorageType  
21 - setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [{ ...e.detail, id: localStorageInfo.id }])  
22 - key.value = Date.now()  
23 - })  
24 - }) 16 +// 数据变更 -> 组件销毁重建
  17 +;[SavePageEnum.JSON, SavePageEnum.CHART_TO_PREVIEW].forEach((saveEvent: string) => {
  18 + if (!window.opener) return
  19 + window.opener.addEventListener(saveEvent, async (e: any) => {
  20 + const localStorageInfo: ChartEditStorageType = await getSessionStorageInfo() as unknown as ChartEditStorageType
  21 + setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [{ ...e.detail, id: localStorageInfo.id }])
  22 + key.value = Date.now()
  23 + })
  24 +})
25 </script> 25 </script>
@@ -132,20 +132,6 @@ const selectOptions = ref([ @@ -132,20 +132,6 @@ const selectOptions = ref([
132 icon: renderIcon(BrowsersOutlineIcon) 132 icon: renderIcon(BrowsersOutlineIcon)
133 }, 133 },
134 { 134 {
135 - label: renderLang('global.r_copy'),  
136 - key: 'copy',  
137 - icon: renderIcon(CopyIcon)  
138 - },  
139 - {  
140 - label: renderLang('global.r_rename'),  
141 - key: 'rename',  
142 - icon: renderIcon(PencilIcon)  
143 - },  
144 - {  
145 - type: 'divider',  
146 - key: 'd1'  
147 - },  
148 - {  
149 label: props.cardData?.release 135 label: props.cardData?.release
150 ? renderLang('global.r_unpublish') 136 ? renderLang('global.r_unpublish')
151 : renderLang('global.r_publish'), 137 : renderLang('global.r_publish'),
@@ -153,15 +139,6 @@ const selectOptions = ref([ @@ -153,15 +139,6 @@ const selectOptions = ref([
153 icon: renderIcon(SendIcon) 139 icon: renderIcon(SendIcon)
154 }, 140 },
155 { 141 {
156 - label: renderLang('global.r_download'),  
157 - key: 'download',  
158 - icon: renderIcon(DownloadIcon)  
159 - },  
160 - {  
161 - type: 'divider',  
162 - key: 'd2'  
163 - },  
164 - {  
165 label: renderLang('global.r_delete'), 142 label: renderLang('global.r_delete'),
166 key: 'delete', 143 key: 'delete',
167 icon: renderIcon(TrashIcon) 144 icon: renderIcon(TrashIcon)
@@ -45,8 +45,7 @@ const collapsed = ref<boolean>(false) @@ -45,8 +45,7 @@ const collapsed = ref<boolean>(false)
45 const { getAsideCollapsedWidth } = toRefs(useSettingStore()) 45 const { getAsideCollapsedWidth } = toRefs(useSettingStore())
46 46
47 const route = useRoute() 47 const route = useRoute()
48 -const routeRame = computed(() => route.name)  
49 -const menuValue = ref(routeRame) 48 +const menuValue = computed(() => route.name)
50 49
51 const menuOptions = menuOptionsInit() 50 const menuOptions = menuOptionsInit()
52 51