diff --git a/common/changes/@visactor/vtable/fix-updateChartSize_2024-01-11-08-56.json b/common/changes/@visactor/vtable/fix-updateChartSize_2024-01-11-08-56.json new file mode 100644 index 000000000..84d71fa11 --- /dev/null +++ b/common/changes/@visactor/vtable/fix-updateChartSize_2024-01-11-08-56.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "comment": "fix: toggele tree node updateChartSize\n\n", + "type": "none", + "packageName": "@visactor/vtable" + } + ], + "packageName": "@visactor/vtable", + "email": "892739385@qq.com" +} \ No newline at end of file diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 34f0f9475..0a74cc879 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -14,7 +14,7 @@ importers: '@types/markdown-it': ^13.0.0 '@types/react': ^18.0.0 '@types/react-dom': ^18.0.0 - '@visactor/vchart': 1.8.5 + '@visactor/vchart': 1.8.7 '@visactor/vtable': workspace:* '@visactor/vtable-editors': workspace:* '@visactor/vtable-export': workspace:* @@ -37,7 +37,7 @@ importers: yargs: ^17.1.1 dependencies: '@arco-design/web-react': 2.46.1_yok4whjnfjlfyjmdmcaku5uzjq - '@visactor/vchart': 1.8.5 + '@visactor/vchart': 1.8.7 '@visactor/vtable': link:../packages/vtable '@visactor/vtable-editors': link:../packages/vtable-editors '@visactor/vtable-export': link:../packages/vtable-export @@ -82,7 +82,7 @@ importers: '@types/react': ^18.0.0 '@types/react-dom': ^18.0.0 '@types/react-is': ^17.0.3 - '@visactor/vchart': 1.8.5 + '@visactor/vchart': 1.8.7 '@visactor/vtable': workspace:* '@visactor/vutils': ~0.17.1 '@vitejs/plugin-react': 3.1.0 @@ -133,7 +133,7 @@ importers: '@types/react': 18.2.46 '@types/react-dom': 18.2.18 '@types/react-is': 17.0.7 - '@visactor/vchart': 1.8.5 + '@visactor/vchart': 1.8.7 '@vitejs/plugin-react': 3.1.0_vite@3.2.6 axios: 1.6.3 chai: 4.3.4 @@ -179,7 +179,7 @@ importers: '@types/offscreencanvas': 2019.6.4 '@types/react': ^18.0.0 '@types/react-dom': ^18.0.0 - '@visactor/vchart': 1.8.5 + '@visactor/vchart': 1.8.7 '@visactor/vdataset': ~0.17.1 '@visactor/vrender': 0.17.12-alpha.1 '@visactor/vrender-components': 0.17.12-alpha.1 @@ -247,7 +247,7 @@ importers: '@types/offscreencanvas': 2019.6.4 '@types/react': 18.2.46 '@types/react-dom': 18.2.18 - '@visactor/vchart': 1.8.5 + '@visactor/vchart': 1.8.7 '@vitejs/plugin-react': 3.1.0_vite@3.2.6 axios: 1.6.3 chai: 4.3.4 @@ -346,7 +346,7 @@ importers: '@types/react': ^18.0.0 '@types/react-dom': ^18.0.0 '@types/react-is': ^17.0.3 - '@visactor/vchart': 1.8.5 + '@visactor/vchart': 1.8.7 '@visactor/vtable': workspace:* '@visactor/vutils': ~0.17.1 '@vitejs/plugin-react': 3.1.0 @@ -400,7 +400,7 @@ importers: '@types/react': 18.2.46 '@types/react-dom': 18.2.18 '@types/react-is': 17.0.7 - '@visactor/vchart': 1.8.5 + '@visactor/vchart': 1.8.7 '@vitejs/plugin-react': 3.1.0_vite@3.2.6 axios: 1.6.3 chai: 4.3.4 @@ -3352,23 +3352,23 @@ packages: resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} dev: true - /@visactor/vchart/1.8.5: - resolution: {integrity: sha512-Egph5fne5/zzvh2jO9h7Ppq33/Gb7mY3mFo7/tJBcrjOT7g5yfXn5+RoqDypRmeu3TIhDwiFntvAkfpzMYAcwQ==} + /@visactor/vchart/1.8.7: + resolution: {integrity: sha512-M0kFlZ17TcamZSRrO/8X45mjBxBPrPAQyJK2amKb4LR6yu2tJNMQJMVSUzC3TPeoyZBC6Qhthj0h6PLB88qTRA==} dependencies: '@visactor/vdataset': 0.17.3 - '@visactor/vgrammar-core': 0.10.6 - '@visactor/vgrammar-hierarchy': 0.10.6 - '@visactor/vgrammar-projection': 0.10.6 - '@visactor/vgrammar-sankey': 0.10.6 - '@visactor/vgrammar-util': 0.10.6 - '@visactor/vgrammar-wordcloud': 0.10.6 - '@visactor/vgrammar-wordcloud-shape': 0.10.6 - '@visactor/vrender-components': 0.17.12-alpha.1 - '@visactor/vrender-core': 0.17.10 - '@visactor/vrender-kits': 0.17.10 + '@visactor/vgrammar-core': 0.10.8 + '@visactor/vgrammar-hierarchy': 0.10.8 + '@visactor/vgrammar-projection': 0.10.8 + '@visactor/vgrammar-sankey': 0.10.8 + '@visactor/vgrammar-util': 0.10.8 + '@visactor/vgrammar-wordcloud': 0.10.8 + '@visactor/vgrammar-wordcloud-shape': 0.10.8 + '@visactor/vrender-components': 0.17.13 + '@visactor/vrender-core': 0.17.13 + '@visactor/vrender-kits': 0.17.13 '@visactor/vscale': 0.17.3 '@visactor/vutils': 0.17.3 - '@visactor/vutils-extension': 1.8.5 + '@visactor/vutils-extension': 1.8.7 /@visactor/vdataset/0.17.3: resolution: {integrity: sha512-uckfCq1gLvqUlbyi3p9GiY8qcv2uNZ2KzLxO0/CVfDUXZ1IsERT8363ue7vejctEpqEa112vgqYrw73qlumH9Q==} @@ -3391,72 +3391,72 @@ packages: simplify-geojson: 1.0.5 topojson-client: 3.1.0 - /@visactor/vgrammar-coordinate/0.10.6: - resolution: {integrity: sha512-gdY/EDMCR7DBjDdcdmemrvtmWaYRROyvedjy1hb3jJ0/6VBDzu41T643TGmbqsxonnEuSvS5/2tCGyyFY/Yi2w==} + /@visactor/vgrammar-coordinate/0.10.8: + resolution: {integrity: sha512-AfewiepfTElin5G2pUuINXoDGHb1xVenIzGDDY4AfJsVRAaRqXLJv4tqBo1Qas9RqS5W3m77697J+b6ExvDLgQ==} dependencies: - '@visactor/vgrammar-util': 0.10.6 + '@visactor/vgrammar-util': 0.10.8 '@visactor/vutils': 0.17.3 - /@visactor/vgrammar-core/0.10.6: - resolution: {integrity: sha512-gfuVa852J7Xf+7KEN1Krtia5p1ux+CDl2DHM5RC2/aPSYJ0pA/bMojbSvFA8K+P/LCvXwI7BR8dSkLA9Pxj5Vw==} + /@visactor/vgrammar-core/0.10.8: + resolution: {integrity: sha512-lQIQBZhARyCOObYwXF8Miwnh8L6AsnGqZJ45P+1X/Pk3ZqUPBXjonW2fWcrgKVGaZ59G3P9OEp1rwErmIsrhBg==} dependencies: '@visactor/vdataset': 0.17.3 - '@visactor/vgrammar-coordinate': 0.10.6 - '@visactor/vgrammar-util': 0.10.6 - '@visactor/vrender-components': 0.17.12-alpha.1 - '@visactor/vrender-core': 0.17.10 - '@visactor/vrender-kits': 0.17.10 + '@visactor/vgrammar-coordinate': 0.10.8 + '@visactor/vgrammar-util': 0.10.8 + '@visactor/vrender-components': 0.17.13 + '@visactor/vrender-core': 0.17.13 + '@visactor/vrender-kits': 0.17.13 '@visactor/vscale': 0.17.3 '@visactor/vutils': 0.17.3 - /@visactor/vgrammar-hierarchy/0.10.6: - resolution: {integrity: sha512-dSVwTXsbDJwQxg3Dn1CGEkQJFW94WyyDNznmBw7ZTbPhXM6vrwTEfCxRZIwzen8/ZEzyQ9Ry9KC5LgHKadqliQ==} + /@visactor/vgrammar-hierarchy/0.10.8: + resolution: {integrity: sha512-eXZgzCDbj+8YqgLgAKdS3ad3ZcpxsnLFeZibSkNKvgi8Wc5zHTZ2kf/IQ525t/0I/CtZlfccVfUkhA6O/QJXBg==} dependencies: - '@visactor/vgrammar-core': 0.10.6 - '@visactor/vgrammar-util': 0.10.6 - '@visactor/vrender-core': 0.17.10 - '@visactor/vrender-kits': 0.17.10 + '@visactor/vgrammar-core': 0.10.8 + '@visactor/vgrammar-util': 0.10.8 + '@visactor/vrender-core': 0.17.13 + '@visactor/vrender-kits': 0.17.13 '@visactor/vutils': 0.17.3 - /@visactor/vgrammar-projection/0.10.6: - resolution: {integrity: sha512-4dDVyCtEsVImwtZ76YDtsGHeplBhLgiekOOar+33NtPSa8miEJnXG6Um5LNqzYPFIJ0ixdUOzzrGFoLiQTXyXw==} + /@visactor/vgrammar-projection/0.10.8: + resolution: {integrity: sha512-u6LLGcedly1ZlgcaAWakFJUBm5WcctrfYwQqi5vJ9iiCnKu9Yhw3y5wjlTcxFcTYpnPKyfucF7Sk0Px+w/Q6Xw==} dependencies: - '@visactor/vgrammar-core': 0.10.6 - '@visactor/vgrammar-util': 0.10.6 + '@visactor/vgrammar-core': 0.10.8 + '@visactor/vgrammar-util': 0.10.8 '@visactor/vutils': 0.17.3 d3-geo: 1.12.1 - /@visactor/vgrammar-sankey/0.10.6: - resolution: {integrity: sha512-xW4928kmkv1BerUQMpv85FX/U6FQA35p2jd3Oow7+Dd8NNQtHG9ixQzzhSIm9oNh9X6vgpwbnmfW9FZISvNZJA==} + /@visactor/vgrammar-sankey/0.10.8: + resolution: {integrity: sha512-cH1lcNU+N/wTtGYTh2ny21kQUaA0/zFFL2j4gUGh1dWx4jT1/jL+/ANDYTW7hAbMcQFrv+2pBrU4G4gQXfSMQg==} dependencies: - '@visactor/vgrammar-core': 0.10.6 - '@visactor/vgrammar-util': 0.10.6 - '@visactor/vrender-core': 0.17.10 - '@visactor/vrender-kits': 0.17.10 + '@visactor/vgrammar-core': 0.10.8 + '@visactor/vgrammar-util': 0.10.8 + '@visactor/vrender-core': 0.17.13 + '@visactor/vrender-kits': 0.17.13 '@visactor/vutils': 0.17.3 - /@visactor/vgrammar-util/0.10.6: - resolution: {integrity: sha512-FDvO5R0arELIhJjmZ5K03P0LMQdOxe9/ScCi2+Q//RpnzpAgyTNKUIf+ooBauJG82m3E4TnUNiEeJW3fSnybZQ==} + /@visactor/vgrammar-util/0.10.8: + resolution: {integrity: sha512-VgdeoX1yWYiJv/KXVRA2maMhiqTXfducGEwMq4HAJ6PWJDklQv2HovENZUpqynXRh/1VbgSN4O/dHryujMucNw==} dependencies: '@visactor/vutils': 0.17.3 - /@visactor/vgrammar-wordcloud-shape/0.10.6: - resolution: {integrity: sha512-BaYl5XfCohQ/HRz1YJT3UDctfLV655S+1mnAxRDC7fqMxC6l9OY5lfopwZGJXzSXCYU8Z7Hv+B2bSZTqQm8NyA==} + /@visactor/vgrammar-wordcloud-shape/0.10.8: + resolution: {integrity: sha512-YTcMpnWSGcQo8SXQcPzjXkd8e3UuCKgyYcfpn4G5L+yvpYEza6DM+hGwKG0gL73qs2YTvFnO3nkdnmxmZwAoKw==} dependencies: - '@visactor/vgrammar-core': 0.10.6 - '@visactor/vgrammar-util': 0.10.6 - '@visactor/vrender-core': 0.17.10 - '@visactor/vrender-kits': 0.17.10 + '@visactor/vgrammar-core': 0.10.8 + '@visactor/vgrammar-util': 0.10.8 + '@visactor/vrender-core': 0.17.13 + '@visactor/vrender-kits': 0.17.13 '@visactor/vscale': 0.17.3 '@visactor/vutils': 0.17.3 - /@visactor/vgrammar-wordcloud/0.10.6: - resolution: {integrity: sha512-8vkKkq113ea5w/qQJEsybR8KdQ/MwA7vPhsHGC4Cm4Lr1TTClm+6+CnJTBqWTAaFOzEQu/Ri6r/TIUQMcv4F1A==} + /@visactor/vgrammar-wordcloud/0.10.8: + resolution: {integrity: sha512-HXdXcG/pkFkQsKN+T2O6FLStl/ePjVTKOUZK5Kk+vQcK0+/v1R8eldv3b0aqoIuZLoMqc0ku4bPNHc7vmLQh5Q==} dependencies: - '@visactor/vgrammar-core': 0.10.6 - '@visactor/vgrammar-util': 0.10.6 - '@visactor/vrender-core': 0.17.10 - '@visactor/vrender-kits': 0.17.10 + '@visactor/vgrammar-core': 0.10.8 + '@visactor/vgrammar-util': 0.10.8 + '@visactor/vrender-core': 0.17.13 + '@visactor/vrender-kits': 0.17.13 '@visactor/vutils': 0.17.3 /@visactor/vrender-components/0.17.12-alpha.1: @@ -3466,18 +3466,35 @@ packages: '@visactor/vrender-kits': 0.17.12-alpha.1 '@visactor/vscale': 0.17.3 '@visactor/vutils': 0.17.3 + dev: false + + /@visactor/vrender-components/0.17.13: + resolution: {integrity: sha512-bB7YnVvXr4iMsFrjN1sjTA9sV2mpBx+Vq48qXCEZnJewwF+HczdCBAjINWfbERLFqEC6NYc690hjcnQjC5asXw==} + dependencies: + '@visactor/vrender-core': 0.17.13 + '@visactor/vrender-kits': 0.17.13 + '@visactor/vscale': 0.17.3 + '@visactor/vutils': 0.17.3 /@visactor/vrender-core/0.17.10: resolution: {integrity: sha512-SzbVOo1DaK/8Yszi+OsqFokcIboTG8FekFvlptyJgohWZNRLpLXuVRT5FM9KI9ARblwQC63xNrB3QvyLwBqGSw==} dependencies: '@visactor/vutils': 0.17.3 color-convert: 2.0.1 + dev: false /@visactor/vrender-core/0.17.12-alpha.1: resolution: {integrity: sha512-6q7bbpFRJZ6pYuexyf2TJaJULBCk2cTyca3FSQe9u4oVS6X2SKlVJz/gn52n12zIX6Y0INmi+qi3KtYpwt9RGA==} dependencies: '@visactor/vutils': 0.17.3 color-convert: 2.0.1 + dev: false + + /@visactor/vrender-core/0.17.13: + resolution: {integrity: sha512-4s/e5YTun7XdxAxYaZWkwZ8VDBGks06DZqrvi7LXenkXN3IBP6G784z4k6eJG+/MyFGiKOJVl3mDb+2Ftqeg3Q==} + dependencies: + '@visactor/vutils': 0.17.3 + color-convert: 2.0.1 /@visactor/vrender-kits/0.17.10: resolution: {integrity: sha512-I7IKKLnceFtyx8XVFWYJXNrYxYHsVQwaopHpY2rZZBbct2CRoMves0ZV6ZGVK7kZGjYXmssuZBTGQPWsjGzmrg==} @@ -3486,6 +3503,7 @@ packages: '@visactor/vrender-core': 0.17.10 '@visactor/vutils': 0.17.3 roughjs: 4.5.2 + dev: false /@visactor/vrender-kits/0.17.12-alpha.1: resolution: {integrity: sha512-z8Agd+4u0XsZzhhqBvPmqmLKNRR0lQSKQEE2GLtrpkIdMGeC/n2biH2xRUDSIL9Wj243plERXGfSfaDw+PHHDQ==} @@ -3494,6 +3512,15 @@ packages: '@visactor/vrender-core': 0.17.12-alpha.1 '@visactor/vutils': 0.17.3 roughjs: 4.5.2 + dev: false + + /@visactor/vrender-kits/0.17.13: + resolution: {integrity: sha512-8YRmDTo6mEPIpDLhP1X1IT6CyK9c3LkzR9VPjdZWqYDY03y5A76f2AkhbADBH00pZQU5cWaliPWBPsVLMWeIPg==} + dependencies: + '@resvg/resvg-js': 2.4.1 + '@visactor/vrender-core': 0.17.13 + '@visactor/vutils': 0.17.3 + roughjs: 4.5.2 /@visactor/vrender/0.17.12-alpha.1: resolution: {integrity: sha512-d0QZQgxS6cMIDjhKxprct/4ypkXQ7IN78juAxbpeE6z086M23grxRXVdS2PLagbW213+hf8PYnSaZ4i7yXTJVA==} @@ -3514,6 +3541,15 @@ packages: '@visactor/vrender-kits': 0.17.10 '@visactor/vscale': 0.17.3 '@visactor/vutils': 0.17.3 + dev: false + + /@visactor/vutils-extension/1.8.7: + resolution: {integrity: sha512-o6Hw5+jqj9IzPS6babV0fyQ8RC9r2DHfvSx5fC/cEuHdvCVYjtzdHJHGmjJ42EAp4PGGUUn2MtGyaxFtzxSD5A==} + dependencies: + '@visactor/vrender-core': 0.17.13 + '@visactor/vrender-kits': 0.17.13 + '@visactor/vscale': 0.17.3 + '@visactor/vutils': 0.17.3 /@visactor/vutils/0.17.3: resolution: {integrity: sha512-o3iq+NnvXujwXdXiyWt0t2mTzOfIxQl0M9++DtstOWy21LApqCZfj1hzZZ4424Ie3/mwPQsgtUDILvoWKhGWXA==} @@ -3533,7 +3569,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.23.3_@babel+core@7.20.12 magic-string: 0.27.0 react-refresh: 0.14.0 - vite: 3.2.6 + vite: 3.2.6_ut5he7gwva27cnmyxmfrlluelu transitivePeerDependencies: - supports-color dev: true diff --git a/docs/assets/demo/en/cell-type/chart.md b/docs/assets/demo/en/cell-type/chart.md index 5bd198638..fbca22627 100644 --- a/docs/assets/demo/en/cell-type/chart.md +++ b/docs/assets/demo/en/cell-type/chart.md @@ -1,14 +1,13 @@ --- category: examples -group: Cell Type -title: Chart Type +group: Cell Type In PivotTable +title: Chart Type Use in PivotTable cover: https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/preview/chart.png -order: 2-3 link: '../guide/cell_type/chart' -option: ListTable-columns-chart#cellType +option: PivotTable-indicators-chart#cellType --- -# Chart Type +# Chart Type Use in PivotTable Combine the vchart chart library with rendering into tables to enrich visual display forms and improve multi-chart rendering performance. diff --git a/docs/assets/demo/en/cell-type/list-table-chart.md b/docs/assets/demo/en/cell-type/list-table-chart.md new file mode 100644 index 000000000..1eeff33e0 --- /dev/null +++ b/docs/assets/demo/en/cell-type/list-table-chart.md @@ -0,0 +1,253 @@ +--- +category: examples +group: Cell Type In ListTable +title: List table integrated chart +cover: https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/preview/list-chart.png +link: '../guide/cell_type/chart' +option: ListTable-columns-chart#cellType +--- + +# Basic table integrated chart + +Combine vchart chart library and render it into tables to enrich visual display forms and improve multi-chart rendering performance. This example refers to vchart’s bar progress bar. For details, please refer to: https://visactor.io/vchart/demo/progress/linear-progress-with-target-value + +## Key Configurations + +- `VTable.register.chartModule('vchart', VChart)` registers the chart library for drawing charts. Currently supports VChart +- `cellType: 'chart'` specifies the type chart +- `chartModule: 'vchart'` specifies the registered chart library name +- `chartSpec: {}` chart spec + +## Code Demo + +```javascript livedemo template=vtable + VTable.register.chartModule('vchart', VChart); + const records = [ + { + projectName: 'Project No.1', + startTime: '2023/5/1', + endTime: '2023/5/10', + estimateDays: 10, + goal: 0.6, + progress: [ + { + value: 0.5, + label: '50%', + goal: 0.6 + } + ], + master:'Julin' + }, + { + projectName: 'Project No.2', + startTime: '2023/5/1', + endTime: '2023/5/5', + estimateDays: 5, + goal: 0.5, + progress: [ + { + value: 0.5, + label: '50%', + goal: 0.5 + } + ], + master:'Jack' + }, + { + projectName: 'Project No.3', + startTime: '2023/5/7', + endTime: '2023/5/8', + estimateDays: 3, + goal: 0.2, + progress: [ + { + value: 0.3, + label: '30%', + goal: 0.2 + } + ], + master:'Mary' + }, + { + projectName: 'Project No.4', + startTime: '2023/5/11', + endTime: '2023/5/12', + estimateDays: 2, + goal: 0.8, + progress: [ + { + value: 0.9, + label: '90%', + goal: 0.8 + } + ], + master:'Porry' + }, + { + projectName: 'Project No.5', + startTime: '2023/5/0', + endTime: '2023/5/10', + estimateDays: 2, + goal: 1, + progress: [ + { + value: 0.8, + label: '80%', + goal: 1 + } + ], + master:'Sheery' + } + ]; + const columns = [ + { + field: 'projectName', + title: 'Project Name', + width: 'auto', + style: { + color: '#ff689d', + fontWeight: 'bold' + } + }, + { + field: 'progress', + title: 'Schedule', + width: 300, + cellType: 'chart', + chartModule: 'vchart', + style: { + padding: 1 + }, + chartSpec: { + type: 'linearProgress', + progress: { + style: { + fill: '#32a645', + lineCap: '' + } + }, + data: { + id: 'id0' + }, + direction: 'horizontal', + xField: 'value', + yField: 'label', + seriesField: 'type', + height: 150, + cornerRadius: 20, + bandWidth: 12, + axes: [ + { + orient: 'right', + type: 'band', + domainLine: { visible: false }, + tick: { visible: false }, + label: { + formatMethod: val => val, + style: { + fontSize: 14, + fontWeight: 'bold', + fill: '#32a645' + } + }, + maxWidth: '60%' // 配置坐标轴的最大空间 + }, + { + orient: 'bottom', + label: { visible: true, inside: true }, + type: 'linear', + visible: false, + grid: { + visible: false + } + } + ], + extensionMark: [ + { + type: 'rule', + dataId: 'id0', + visible: true, + style: { + x: (datum, ctx, elements, dataView) => { + debugger; + return ctx.valueToX([datum.goal]); + }, + y: (datum, ctx, elements, dataView) => { + return ctx.valueToY([datum.label]) - 5; + }, + x1: (datum, ctx, elements, dataView) => { + return ctx.valueToX([datum.goal]); + }, + y1: (datum, ctx, elements, dataView) => { + return ctx.valueToY([datum.label]) + 5; + }, + stroke: 'red', + lineWidth: 2 + } + }, + { + type: 'symbol', + dataId: 'id0', + visible: true, + style: { + symbolType: 'triangleDown', + x: (datum, ctx, elements, dataView) => { + return ctx.valueToX([datum.goal]); + }, + y: (datum, ctx, elements, dataView) => { + return ctx.valueToY([datum.label]) - 10; + }, + size: 15, + scaleY: 0.5, + fill: 'red' + } + } + ] + } + }, + { + field: 'goal', + title: 'Target', + width: 'auto', + fieldFormat(rec) { + return rec.goal * 100 + '%'; + }, + style: { + color: 'red', + fontWeight: 'bold' + } + }, + { + field: 'startTime', + title: 'Start Time', + width: 'auto' + }, + { + field: 'endTime', + title: 'End Time', + width: 'auto' + }, + { + field: 'master', + title: 'Master', + width: 'auto', + style: { + color: 'purple', + fontWeight: 'bold' + } + } + ]; + + const option = { + records, + columns, + widthMode: 'standard', + hover: { + highlightMode: 'cross' + }, + defaultRowHeight: 60, + autoFillWidth:true, + }; +const tableInstance = new VTable.ListTable(document.getElementById(CONTAINER_ID),option); +window['tableInstance'] = tableInstance; +``` diff --git a/docs/assets/demo/menu.json b/docs/assets/demo/menu.json index e3d388ea6..febfe2f14 100644 --- a/docs/assets/demo/menu.json +++ b/docs/assets/demo/menu.json @@ -251,17 +251,15 @@ { "path": "chart", "title": { - "zh": "图表类型", - "en": "Chart Type" - }, - "meta": { - "title": "Chart Type", - "keywords": "", - "category": "demo", - "group": "Cell Type", - "cover": "https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/preview/chart.png", - "link": "", - "option": "" + "zh": "透视表图表展示", + "en": "Chart Type In PivotTable" + } + }, + { + "path": "list-table-chart", + "title": { + "zh": "基本表格图表展示", + "en": "Chart Type In ListTable" } }, { diff --git a/docs/assets/demo/zh/cell-type/chart.md b/docs/assets/demo/zh/cell-type/chart.md index 26ea93048..86cd1b477 100644 --- a/docs/assets/demo/zh/cell-type/chart.md +++ b/docs/assets/demo/zh/cell-type/chart.md @@ -1,14 +1,13 @@ --- category: examples -group: Cell Type -title: 图表类型 +group: Cell Type In PivotTable +title: 透视表集成图表 cover: https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/preview/chart.png -order: 2-3 link: '../guide/cell_type/chart' -option: ListTable-columns-chart#cellType +option: PivotTable-indicators-chart#cellType --- -# 图表类型 +# 图表类型集成到透视表 将vchart图表库结合渲染到表格中,丰富可视化展示形式,提升多图表渲染性能。 diff --git a/docs/assets/demo/zh/cell-type/list-table-chart.md b/docs/assets/demo/zh/cell-type/list-table-chart.md new file mode 100644 index 000000000..c6fdaa8fa --- /dev/null +++ b/docs/assets/demo/zh/cell-type/list-table-chart.md @@ -0,0 +1,253 @@ +--- +category: examples +group: Cell Type In ListTable +title: 基本表格集成图表 +cover: https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/VTable/preview/list-chart.png +link: '../guide/cell_type/chart' +option: ListTable-columns-chart#cellType +--- + +# 基本表格集成图表 + +将vchart图表库结合渲染到表格中,丰富可视化展示形式,提升多图表渲染性能。该示例引用了vchart的条形进度条,具体可参考:https://visactor.io/vchart/demo/progress/linear-progress-with-target-value + +## 关键配置 + +- `VTable.register.chartModule('vchart', VChart)` 注册绘制图表的图表库 目前支持VChart +- `cellType: 'chart'` 指定类型chart +- `chartModule: 'vchart'` 指定注册的图表库名称 +- `chartSpec: {}` 图表spec + +## 代码演示 + +```javascript livedemo template=vtable + VTable.register.chartModule('vchart', VChart); + const records = [ + { + projectName: 'Project No.1', + startTime: '2023/5/1', + endTime: '2023/5/10', + estimateDays: 10, + goal: 0.6, + progress: [ + { + value: 0.5, + label: '50%', + goal: 0.6 + } + ], + master:'Julin' + }, + { + projectName: 'Project No.2', + startTime: '2023/5/1', + endTime: '2023/5/5', + estimateDays: 5, + goal: 0.5, + progress: [ + { + value: 0.5, + label: '50%', + goal: 0.5 + } + ], + master:'Jack' + }, + { + projectName: 'Project No.3', + startTime: '2023/5/7', + endTime: '2023/5/8', + estimateDays: 3, + goal: 0.2, + progress: [ + { + value: 0.3, + label: '30%', + goal: 0.2 + } + ], + master:'Mary' + }, + { + projectName: 'Project No.4', + startTime: '2023/5/11', + endTime: '2023/5/12', + estimateDays: 2, + goal: 0.8, + progress: [ + { + value: 0.9, + label: '90%', + goal: 0.8 + } + ], + master:'Porry' + }, + { + projectName: 'Project No.5', + startTime: '2023/5/0', + endTime: '2023/5/10', + estimateDays: 2, + goal: 1, + progress: [ + { + value: 0.8, + label: '80%', + goal: 1 + } + ], + master:'Sheery' + } + ]; + const columns = [ + { + field: 'projectName', + title: 'Project Name', + width: 'auto', + style: { + color: '#ff689d', + fontWeight: 'bold' + } + }, + { + field: 'progress', + title: 'Schedule', + width: 300, + cellType: 'chart', + chartModule: 'vchart', + style: { + padding: 1 + }, + chartSpec: { + type: 'linearProgress', + progress: { + style: { + fill: '#32a645', + lineCap: '' + } + }, + data: { + id: 'id0' + }, + direction: 'horizontal', + xField: 'value', + yField: 'label', + seriesField: 'type', + height: 150, + cornerRadius: 20, + bandWidth: 12, + axes: [ + { + orient: 'right', + type: 'band', + domainLine: { visible: false }, + tick: { visible: false }, + label: { + formatMethod: val => val, + style: { + fontSize: 14, + fontWeight: 'bold', + fill: '#32a645' + } + }, + maxWidth: '60%' // 配置坐标轴的最大空间 + }, + { + orient: 'bottom', + label: { visible: true, inside: true }, + type: 'linear', + visible: false, + grid: { + visible: false + } + } + ], + extensionMark: [ + { + type: 'rule', + dataId: 'id0', + visible: true, + style: { + x: (datum, ctx, elements, dataView) => { + debugger; + return ctx.valueToX([datum.goal]); + }, + y: (datum, ctx, elements, dataView) => { + return ctx.valueToY([datum.label]) - 5; + }, + x1: (datum, ctx, elements, dataView) => { + return ctx.valueToX([datum.goal]); + }, + y1: (datum, ctx, elements, dataView) => { + return ctx.valueToY([datum.label]) + 5; + }, + stroke: 'red', + lineWidth: 2 + } + }, + { + type: 'symbol', + dataId: 'id0', + visible: true, + style: { + symbolType: 'triangleDown', + x: (datum, ctx, elements, dataView) => { + return ctx.valueToX([datum.goal]); + }, + y: (datum, ctx, elements, dataView) => { + return ctx.valueToY([datum.label]) - 10; + }, + size: 15, + scaleY: 0.5, + fill: 'red' + } + } + ] + } + }, + { + field: 'goal', + title: 'Target', + width: 'auto', + fieldFormat(rec) { + return rec.goal * 100 + '%'; + }, + style: { + color: 'red', + fontWeight: 'bold' + } + }, + { + field: 'startTime', + title: 'Start Time', + width: 'auto' + }, + { + field: 'endTime', + title: 'End Time', + width: 'auto' + }, + { + field: 'master', + title: 'Master', + width: 'auto', + style: { + color: 'purple', + fontWeight: 'bold' + } + } + ]; + + const option = { + records, + columns, + widthMode: 'standard', + hover: { + highlightMode: 'cross' + }, + defaultRowHeight: 60, + autoFillWidth:true, + }; +const tableInstance = new VTable.ListTable(document.getElementById(CONTAINER_ID),option); +window['tableInstance'] = tableInstance; +``` diff --git a/docs/package.json b/docs/package.json index e45bb8197..e137e19ab 100644 --- a/docs/package.json +++ b/docs/package.json @@ -13,7 +13,7 @@ "@visactor/vtable": "workspace:*", "@visactor/vtable-editors": "workspace:*", "@visactor/vtable-export": "workspace:*", - "@visactor/vchart": "1.8.5", + "@visactor/vchart": "1.8.7", "markdown-it": "^13.0.0", "highlight.js": "^11.8.0", "axios": "^1.4.0", diff --git a/packages/react-vtable/package.json b/packages/react-vtable/package.json index 13d8e1657..c53fde057 100644 --- a/packages/react-vtable/package.json +++ b/packages/react-vtable/package.json @@ -52,7 +52,7 @@ "react-is": "^18.2.0" }, "devDependencies": { - "@visactor/vchart": "1.8.5", + "@visactor/vchart": "1.8.7", "@internal/bundler": "workspace:*", "@internal/eslint-config": "workspace:*", "@internal/ts-config": "workspace:*", @@ -96,4 +96,4 @@ "axios": "^1.4.0", "@types/react-is": "^17.0.3" } -} +} \ No newline at end of file diff --git a/packages/vtable-export/package.json b/packages/vtable-export/package.json index 63c4f44a9..cb1eb5a19 100644 --- a/packages/vtable-export/package.json +++ b/packages/vtable-export/package.json @@ -40,7 +40,7 @@ "exceljs": "4.4.0" }, "devDependencies": { - "@visactor/vchart": "1.8.5", + "@visactor/vchart": "1.8.7", "@internal/bundler": "workspace:*", "@internal/eslint-config": "workspace:*", "@internal/ts-config": "workspace:*", @@ -85,4 +85,4 @@ "@types/react-is": "^17.0.3", "rollup-plugin-node-resolve": "5.2.0" } -} +} \ No newline at end of file diff --git a/packages/vtable/examples/list/list-chart-bar.ts b/packages/vtable/examples/list/list-chart-bar.ts new file mode 100644 index 000000000..242d90d13 --- /dev/null +++ b/packages/vtable/examples/list/list-chart-bar.ts @@ -0,0 +1,249 @@ +import * as VTable from '../../src'; +import VChart from '@visactor/vchart'; +const CONTAINER_ID = 'vTable'; + +export function createTable() { + VTable.register.chartModule('vchart', VChart); + const records = [ + { + projectName: 'Project No.1', + startTime: '2023/5/1', + endTime: '2023/5/10', + estimateDays: 10, + goal: 0.6, + progress: [ + { + value: 0.5, + label: '50%', + goal: 0.6 + } + ], + master: 'Julin' + }, + { + projectName: 'Project No.2', + startTime: '2023/5/1', + endTime: '2023/5/5', + estimateDays: 5, + goal: 0.5, + progress: [ + { + value: 0.5, + label: '50%', + goal: 0.5 + } + ], + master: 'Jack' + }, + { + projectName: 'Project No.3', + startTime: '2023/5/7', + endTime: '2023/5/8', + estimateDays: 3, + goal: 0.2, + progress: [ + { + value: 0.3, + label: '30%', + goal: 0.2 + } + ], + master: 'Mary' + }, + { + projectName: 'Project No.4', + startTime: '2023/5/11', + endTime: '2023/5/12', + estimateDays: 2, + goal: 0.8, + progress: [ + { + value: 0.9, + label: '90%', + goal: 0.8 + } + ], + master: 'Porry' + }, + { + projectName: 'Project No.5', + startTime: '2023/5/0', + endTime: '2023/5/10', + estimateDays: 2, + goal: 1, + progress: [ + { + value: 0.8, + label: '80%', + goal: 1 + } + ], + master: 'Sheery' + } + ]; + const columns = [ + { + field: 'projectName', + title: 'Project Name', + width: 'auto', + style: { + color: '#ff689d', + fontWeight: 'bold' + } + }, + { + field: 'progress', + title: 'Schedule', + width: 300, + cellType: 'chart', + chartModule: 'vchart', + style: { + padding: 1 + }, + chartSpec: { + type: 'linearProgress', + progress: { + style: { + fill: '#32a645', + lineCap: '' + } + }, + data: { + id: 'id0' + }, + direction: 'horizontal', + xField: 'value', + yField: 'label', + seriesField: 'type', + height: 150, + cornerRadius: 20, + bandWidth: 12, + axes: [ + { + orient: 'right', + type: 'band', + domainLine: { visible: false }, + tick: { visible: false }, + label: { + formatMethod: val => val, + style: { + fontSize: 14, + fontWeight: 'bold', + fill: '#32a645' + } + }, + maxWidth: '60%' // 配置坐标轴的最大空间 + }, + { + orient: 'bottom', + label: { visible: true, inside: true }, + type: 'linear', + visible: false, + grid: { + visible: false + } + } + ], + extensionMark: [ + { + type: 'rule', + dataId: 'id0', + visible: true, + style: { + x: (datum, ctx, elements, dataView) => { + return ctx.valueToX([datum.goal]); + }, + y: (datum, ctx, elements, dataView) => { + return ctx.valueToY([datum.label]) - 5; + }, + x1: (datum, ctx, elements, dataView) => { + return ctx.valueToX([datum.goal]); + }, + y1: (datum, ctx, elements, dataView) => { + return ctx.valueToY([datum.label]) + 5; + }, + stroke: 'red', + lineWidth: 2 + } + }, + { + type: 'symbol', + dataId: 'id0', + visible: true, + style: { + symbolType: 'triangleDown', + x: (datum, ctx, elements, dataView) => { + return ctx.valueToX([datum.goal]); + }, + y: (datum, ctx, elements, dataView) => { + return ctx.valueToY([datum.label]) - 10; + }, + size: 15, + scaleY: 0.5, + fill: 'red' + } + } + ] + } + }, + { + field: 'goal', + title: 'Target', + width: 'auto', + fieldFormat(rec) { + return rec.goal * 100 + '%'; + }, + style: { + color: 'red', + fontWeight: 'bold' + } + }, + { + field: 'startTime', + title: 'Start Time', + width: 'auto' + }, + { + field: 'endTime', + title: 'End Time', + width: 'auto' + }, + { + field: 'master', + title: 'Master', + width: 'auto', + style: { + color: 'purple', + fontWeight: 'bold' + } + } + ]; + + const option = { + records, + columns, + widthMode: 'standard', + hover: { + highlightMode: 'cross' + }, + defaultRowHeight: 60, + autoFillWidth: true, + frozenColCount: 2 + }; + const tableInstance = new VTable.ListTable(document.getElementById(CONTAINER_ID), option); + + window.tableInstance = tableInstance; + tableInstance.on('change_cell_value', arg => { + console.log(arg); + }); + // tableInstance.on('sort_click', args => { + // tableInstance.updateSortState( + // { + // field: args.field, + // order: Date.now() % 3 === 0 ? 'desc' : Date.now() % 3 === 1 ? 'asc' : 'normal' + // }, + // false + // ); + // return false; //return false代表不执行内部排序逻辑 + // }); +} diff --git a/packages/vtable/examples/menu.ts b/packages/vtable/examples/menu.ts index 8a5767ae1..b67f48f11 100644 --- a/packages/vtable/examples/menu.ts +++ b/packages/vtable/examples/menu.ts @@ -59,6 +59,10 @@ export const menus = [ path: 'list', name: 'list-chart' }, + { + path: 'list', + name: 'list-chart-bar' + }, { path: 'list', name: 'list-updateOption' diff --git a/packages/vtable/package.json b/packages/vtable/package.json index 22ba60eab..3c475f697 100644 --- a/packages/vtable/package.json +++ b/packages/vtable/package.json @@ -60,7 +60,7 @@ }, "devDependencies": { "luxon": "*", - "@visactor/vchart": "1.8.5", + "@visactor/vchart": "1.8.7", "@internal/bundler": "workspace:*", "@internal/eslint-config": "workspace:*", "@internal/ts-config": "workspace:*", @@ -123,4 +123,4 @@ "url": "https://github.com/VisActor/VTable.git", "directory": "packages/vtable" } -} +} \ No newline at end of file diff --git a/packages/vtable/src/ListTable.ts b/packages/vtable/src/ListTable.ts index 7833a1a11..1531d2909 100644 --- a/packages/vtable/src/ListTable.ts +++ b/packages/vtable/src/ListTable.ts @@ -657,6 +657,18 @@ export class ListTable extends BaseTable implements ListTableAPI { } /** 刷新当前节点收起展开状态,如手动更改过 */ _refreshHierarchyState(col: number, row: number) { + let notFillWidth = false; + let notFillHeight = false; + const checkHasChart = this.internalProps.layoutMap.checkHasChart(); + // 检查当前状态总宽高未撑满autoFill是否在起作用 + if (checkHasChart) { + if (this.autoFillWidth) { + notFillWidth = this.getAllColsWidth() <= this.tableNoFrameWidth; + } + if (this.autoFillHeight) { + notFillHeight = this.getAllRowsHeight() <= this.tableNoFrameHeight; + } + } const index = this.getRecordShowIndexByCell(col, row); const diffDataIndices = this.dataSource.toggleHierarchyState(index); const diffPositions = this.internalProps.layoutMap.toggleHierarchyState(diffDataIndices); @@ -666,6 +678,18 @@ export class ListTable extends BaseTable implements ListTableAPI { this.clearCellStyleCache(); this.scenegraph.updateHierarchyIcon(col, row); this.scenegraph.updateRow(diffPositions.removeCellPositions, diffPositions.addCellPositions); + if (checkHasChart) { + // 检查更新节点状态后总宽高未撑满autoFill是否在起作用 + if (this.autoFillWidth && !notFillWidth) { + notFillWidth = this.getAllColsWidth() <= this.tableNoFrameWidth; + } + if (this.autoFillHeight && !notFillHeight) { + notFillHeight = this.getAllRowsHeight() <= this.tableNoFrameHeight; + } + if (this.widthMode === 'adaptive' || notFillWidth || this.heightMode === 'adaptive' || notFillHeight) { + this.scenegraph.updateChartSize(0); // 如果收起展开有性能问题 可以排查下这个防范 + } + } } _hasHierarchyTreeHeader() { diff --git a/packages/vtable/src/PivotTable.ts b/packages/vtable/src/PivotTable.ts index 149cde1e2..e34721c95 100644 --- a/packages/vtable/src/PivotTable.ts +++ b/packages/vtable/src/PivotTable.ts @@ -843,6 +843,18 @@ export class PivotTable extends BaseTable implements PivotTableAPI { * @param row */ toggleHierarchyState(col: number, row: number) { + let notFillWidth = false; + let notFillHeight = false; + const checkHasChart = this.internalProps.layoutMap.checkHasChart(); + // 检查当前状态总宽高未撑满autoFill是否在起作用 + if (checkHasChart) { + if (this.autoFillWidth) { + notFillWidth = this.getAllColsWidth() <= this.tableNoFrameWidth; + } + if (this.autoFillHeight) { + notFillHeight = this.getAllRowsHeight() <= this.tableNoFrameHeight; + } + } const hierarchyState = this.getHierarchyState(col, row); if (hierarchyState === HierarchyState.expand) { this.fireListeners(PIVOT_TABLE_EVENT_TYPE.TREE_HIERARCHY_STATE_CHANGE, { @@ -868,6 +880,18 @@ export class PivotTable extends BaseTable implements PivotTableAPI { this.clearCellStyleCache(); this.scenegraph.updateHierarchyIcon(col, row); this.scenegraph.updateRow(result.removeCellPositions, result.addCellPositions, result.updateCellPositions); + if (checkHasChart) { + // 检查更新节点状态后总宽高未撑满autoFill是否在起作用 + if (this.autoFillWidth && !notFillWidth) { + notFillWidth = this.getAllColsWidth() <= this.tableNoFrameWidth; + } + if (this.autoFillHeight && !notFillHeight) { + notFillHeight = this.getAllRowsHeight() <= this.tableNoFrameHeight; + } + if (this.widthMode === 'adaptive' || notFillWidth || this.heightMode === 'adaptive' || notFillHeight) { + this.scenegraph.updateChartSize(0); // 如果收起展开有性能问题 可以排查下这个防范 + } + } } /** * 通过表头的维度值路径来计算单元格位置 getCellAddressByHeaderPaths接口更强大一些 不限表头 不限参数格式 diff --git a/packages/vtable/src/core/BaseTable.ts b/packages/vtable/src/core/BaseTable.ts index e10729f84..80345536b 100644 --- a/packages/vtable/src/core/BaseTable.ts +++ b/packages/vtable/src/core/BaseTable.ts @@ -119,8 +119,8 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI { _vDataSet: DataSet; scenegraph: Scenegraph; - stateManager?: StateManager; - eventManager?: EventManager; + stateManager: StateManager; + eventManager: EventManager; _pixelRatio: number; // bottomFrozenRowCount: number = 0; diff --git a/packages/vtable/src/event/event.ts b/packages/vtable/src/event/event.ts index 31a068938..1859ae958 100644 --- a/packages/vtable/src/event/event.ts +++ b/packages/vtable/src/event/event.ts @@ -132,9 +132,9 @@ export class EventManager { if (this.table._canResizeColumn(resizeCol.col, resizeCol.row) && resizeCol.col >= 0) { this.table.scenegraph.updateAutoColWidth(resizeCol.col); - if (this.table.isPivotChart()) { - this.table.scenegraph.updateChartSize(resizeCol.col); - } + // if (this.table.isPivotChart()) { + this.table.scenegraph.updateChartSize(resizeCol.col); + // } const state = this.table.stateManager; // update frozen shadowline component if ( diff --git a/packages/vtable/src/layout/chart-helper/get-chart-spec.ts b/packages/vtable/src/layout/chart-helper/get-chart-spec.ts index 5137003b7..a159a7744 100644 --- a/packages/vtable/src/layout/chart-helper/get-chart-spec.ts +++ b/packages/vtable/src/layout/chart-helper/get-chart-spec.ts @@ -4,6 +4,7 @@ import type { SimpleHeaderLayoutMap } from '../simple-header-layout'; import { checkZeroAlign, getAxisOption, getAxisRange } from './get-axis-config'; import { getAxisDomainRangeAndLabels } from './get-axis-domain'; import { getNewRangeToAlign } from './zero-align'; +import type { ColumnData, IndicatorData } from '../../ts-types/list-table/layout-map/api'; const NO_AXISID_FRO_VTABLE = 'NO_AXISID_FRO_VTABLE'; @@ -321,3 +322,15 @@ function getRange( axisOption }; } +/** 检查是否有直角坐标系的图表 */ +export function checkHasChart(layout: PivotHeaderLayoutMap | SimpleHeaderLayoutMap) { + let isHasChart = false; + for (let i = 0; i < layout.columnObjects.length; i++) { + const columnObj = layout.columnObjects[i]; + if (columnObj.chartSpec) { + isHasChart = true; + break; + } + } + return isHasChart; +} diff --git a/packages/vtable/src/layout/pivot-header-layout.ts b/packages/vtable/src/layout/pivot-header-layout.ts index b6b87456c..926d51367 100644 --- a/packages/vtable/src/layout/pivot-header-layout.ts +++ b/packages/vtable/src/layout/pivot-header-layout.ts @@ -34,7 +34,13 @@ import { IndicatorDimensionKeyPlaceholder } from '../tools/global'; import { diffCellAddress } from '../tools/diff-cell'; import type { ILinkDimension } from '../ts-types/pivot-table/dimension/link-dimension'; import type { IImageDimension } from '../ts-types/pivot-table/dimension/image-dimension'; -import { getChartAxes, getChartDataId, getChartSpec, getRawChartSpec } from './chart-helper/get-chart-spec'; +import { + checkHasChart, + getChartAxes, + getChartDataId, + getChartSpec, + getRawChartSpec +} from './chart-helper/get-chart-spec'; import type { LayouTreeNode, IPivotLayoutHeadNode } from './pivot-layout-helper'; import { DimensionTree, @@ -2284,6 +2290,9 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI { } return indicatorObj?.chartInstance; } + checkHasChart() { + return checkHasChart(this); + } getDimension(dimensionKey: string, type: 'column' | 'row'): any { if (type === 'column') { diff --git a/packages/vtable/src/layout/simple-header-layout.ts b/packages/vtable/src/layout/simple-header-layout.ts index 7717a3381..b9336bf0d 100644 --- a/packages/vtable/src/layout/simple-header-layout.ts +++ b/packages/vtable/src/layout/simple-header-layout.ts @@ -11,7 +11,7 @@ import type { LayoutMapAPI, WidthData } from '../ts-types/list-table/layout-map/api'; -import { getChartDataId } from './chart-helper/get-chart-spec'; +import { checkHasChart, getChartDataId } from './chart-helper/get-chart-spec'; // import { EmptyDataCache } from './utils'; // let seqId = 0; @@ -900,6 +900,10 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI { const columnObj = this.transpose ? this._columns[_row] : this._columns[_col]; return columnObj.chartInstance; } + checkHasChart() { + return checkHasChart(this); + } + getAxisConfigInPivotChart(col: number, row: number): any { return undefined; } diff --git a/packages/vtable/src/scenegraph/layout/compute-col-width.ts b/packages/vtable/src/scenegraph/layout/compute-col-width.ts index 088f23e28..eb0fabad0 100644 --- a/packages/vtable/src/scenegraph/layout/compute-col-width.ts +++ b/packages/vtable/src/scenegraph/layout/compute-col-width.ts @@ -127,7 +127,6 @@ export function computeColsWidth(table: BaseTableAPI, colStart?: number, colEnd? // } // } } else if (table.autoFillWidth) { - // 处理风神列宽特殊逻辑 table._clearColRangeWidthsMap(); const canvasWidth = table.tableNoFrameWidth; let actualHeaderWidth = 0; @@ -188,10 +187,11 @@ export function computeColsWidth(table: BaseTableAPI, colStart?: number, colEnd? const newColWidth = newWidths[col] ?? table.getColWidth(col); if (newColWidth !== oldColWidths[col]) { // update the column width in scenegraph - table._setColWidth(col, newColWidth); + table._setColWidth(col, newColWidth, false, true); // table.scenegraph.updateColWidth(col, newColWidth - oldColWidths[col], true, true); } } + table.stateManager.checkFrozen(); for (let col = 0; col < table.colCount; col++) { // newColWidth could not be in column min max range possibly // const newColWidth = table._adjustColWidth(col, newWidths[col]) ?? table.getColWidth(col); diff --git a/packages/vtable/src/scenegraph/refresh-node/update-chart.ts b/packages/vtable/src/scenegraph/refresh-node/update-chart.ts index 209725a5b..3f4b06281 100644 --- a/packages/vtable/src/scenegraph/refresh-node/update-chart.ts +++ b/packages/vtable/src/scenegraph/refresh-node/update-chart.ts @@ -63,6 +63,34 @@ export function updateChartSize(scenegraph: Scenegraph, col: number) { }); // } } + // 右侧冻结的单元格也需要调整 + if (!scenegraph.table.isPivotChart() && scenegraph.table.rightFrozenColCount >= 1) { + for ( + let c = scenegraph.table.colCount - scenegraph.table.rightFrozenColCount; + c <= scenegraph.table.colCount - 1; + c++ + ) { + const columnGroup = scenegraph.getColGroup(c); + columnGroup?.getChildren()?.forEach((cellNode: Group) => { + const width = scenegraph.table.getColWidth(cellNode.col); + const height = scenegraph.table.getRowHeight(cellNode.row); + + cellNode.children.forEach((node: Chart) => { + if ((node as any).type === 'chart') { + node.cacheCanvas = null; + node.setAttribute( + 'width', + Math.ceil(width - node.attribute.cellPadding[3] - node.attribute.cellPadding[1]) + ); + node.setAttribute( + 'height', + Math.ceil(height - node.attribute.cellPadding[0] - node.attribute.cellPadding[2]) + ); + } + }); + }); + } + } } /** 清理所有chart节点的 图表缓存图片 */ diff --git a/packages/vtable/src/scenegraph/scenegraph.ts b/packages/vtable/src/scenegraph/scenegraph.ts index 7f52613cc..df173bb43 100644 --- a/packages/vtable/src/scenegraph/scenegraph.ts +++ b/packages/vtable/src/scenegraph/scenegraph.ts @@ -1118,7 +1118,6 @@ export class Scenegraph { const endCol = table.isPivotChart() ? table.colCount - table.rightFrozenColCount : table.colCount; getAdaptiveWidth(canvasWidth - actualHeaderWidth, startCol, endCol, false, [], table, true); } else if (table.autoFillWidth) { - // 处理风神列宽特殊逻辑 table._clearColRangeWidthsMap(); const canvasWidth = table.tableNoFrameWidth; let actualHeaderWidth = 0; @@ -1162,7 +1161,6 @@ export class Scenegraph { cornerHeaderWidth += column.attribute.width; }); this.cornerHeaderGroup.setAttribute('width', cornerHeaderWidth); - this.colHeaderGroup.setAttribute('x', this.cornerHeaderGroup.attribute.width); this.rowHeaderGroup.setAttribute('y', this.colHeaderGroup.attribute.height); this.bodyGroup.setAttributes({ @@ -1366,7 +1364,6 @@ export class Scenegraph { this.rightTopCornerGroup.setDeltaWidth(rightX - this.rightTopCornerGroup.attribute.width); this.rightBottomCornerGroup.setDeltaWidth(rightX - this.rightBottomCornerGroup.attribute.width); this.bodyGroup.setDeltaWidth(bodyX - this.bodyGroup.attribute.width); - this.colHeaderGroup.setAttribute('x', this.cornerHeaderGroup.attribute.width); this.bottomFrozenGroup.setAttribute('x', this.table.getFrozenColsWidth()); this.bodyGroup.setAttribute('x', this.rowHeaderGroup.attribute.width); diff --git a/packages/vtable/src/ts-types/base-table.ts b/packages/vtable/src/ts-types/base-table.ts index 726cfa08f..85b494b48 100644 --- a/packages/vtable/src/ts-types/base-table.ts +++ b/packages/vtable/src/ts-types/base-table.ts @@ -450,9 +450,9 @@ export interface BaseTableAPI { /** 场景树对象 */ scenegraph: Scenegraph; /** 状态管理模块 */ - stateManager?: StateManager; + stateManager: StateManager; /** 事件管理模块 */ - eventManager?: EventManager; + eventManager: EventManager; /** 行表头的层数 */ rowHeaderLevelCount: number; /** 列表头的层数 */