From 58abe588aa1392627c2e9c6448083a47bb166b58 Mon Sep 17 00:00:00 2001 From: wintsa <770775984@qq.com> Date: Wed, 13 May 2026 16:23:55 +0800 Subject: [PATCH] 1 --- .../console-2026-05-13T08-06-15-907Z.log | 3 + .../console-2026-05-13T08-22-17-883Z.log | 6 ++ .../page-2026-05-13T08-06-23-224Z.yml | 84 +++++++++++++++++++ .../page-2026-05-13T08-22-19-114Z.yml | 84 +++++++++++++++++++ src/App.tsx | 50 +++++++++-- src/styles.css | 9 +- vite-test.err.log | 1 + vite-test.out.log | 6 ++ 8 files changed, 235 insertions(+), 8 deletions(-) create mode 100644 .playwright-mcp/console-2026-05-13T08-06-15-907Z.log create mode 100644 .playwright-mcp/console-2026-05-13T08-22-17-883Z.log create mode 100644 .playwright-mcp/page-2026-05-13T08-06-23-224Z.yml create mode 100644 .playwright-mcp/page-2026-05-13T08-22-19-114Z.yml create mode 100644 vite-test.err.log create mode 100644 vite-test.out.log diff --git a/.playwright-mcp/console-2026-05-13T08-06-15-907Z.log b/.playwright-mcp/console-2026-05-13T08-06-15-907Z.log new file mode 100644 index 0000000..b32a960 --- /dev/null +++ b/.playwright-mcp/console-2026-05-13T08-06-15-907Z.log @@ -0,0 +1,3 @@ +[ 6918ms] [INFO] %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold @ http://127.0.0.1:5173/node_modules/.vite/deps/react-dom_client.js?v=ae174d51:20102 +[ 7315ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://127.0.0.1:5173/favicon.ico:0 +[ 331036ms] [INFO] %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold @ http://127.0.0.1:5173/node_modules/.vite/deps/react-dom_client.js?v=ae174d51:20102 diff --git a/.playwright-mcp/console-2026-05-13T08-22-17-883Z.log b/.playwright-mcp/console-2026-05-13T08-22-17-883Z.log new file mode 100644 index 0000000..30ceb82 --- /dev/null +++ b/.playwright-mcp/console-2026-05-13T08-22-17-883Z.log @@ -0,0 +1,6 @@ +[ 300ms] [INFO] %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold @ http://127.0.0.1:5173/node_modules/.vite/deps/react-dom_client.js?v=ae174d51:20102 +[ 1230ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://127.0.0.1:5173/favicon.ico:0 +[ 40506ms] [ERROR] Failed to load resource: the server responded with a status of 401 () @ https://nest.zwgczx.com/api/v1/zw/getBuildingFunctionCostFilterTree?key=templateLibrary¤ttime=1778660578349&__random__=1778660578349:0 +[ 40812ms] [ERROR] Failed to load resource: the server responded with a status of 401 () @ https://nest.zwgczx.com/api/v1/zw/getBuildingFunctionCostFilterTree?key=indicatorTree&templateId=3¤ttime=1778660578682&__random__=1778660578682:0 +[ 52231ms] [ERROR] Failed to load resource: the server responded with a status of 401 () @ https://nest.zwgczx.com/api/v1/zw/getBuildingFunctionCostFilterTree?key=templateLibrary¤ttime=1778660590101&__random__=1778660590101:0 +[ 53824ms] [ERROR] Failed to load resource: the server responded with a status of 401 () @ https://nest.zwgczx.com/api/v1/zw/getBuildingFunctionCostFilterTree?key=indicatorTree&templateId=3¤ttime=1778660591693&__random__=1778660591693:0 diff --git a/.playwright-mcp/page-2026-05-13T08-06-23-224Z.yml b/.playwright-mcp/page-2026-05-13T08-06-23-224Z.yml new file mode 100644 index 0000000..d5289f3 --- /dev/null +++ b/.playwright-mcp/page-2026-05-13T08-06-23-224Z.yml @@ -0,0 +1,84 @@ +- main [ref=e3]: + - generic: + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - region "年度费用模板" [ref=e4]: + - generic "筛选条件" [ref=e5]: + - button "省市区" [ref=e6] [cursor=pointer]: + - img [ref=e7] + - generic [ref=e11]: 省市区 + - button "自然地理区位" [ref=e12] [cursor=pointer]: + - img [ref=e13] + - generic [ref=e16]: 自然地理区位 + - button "设施类别" [ref=e17] [cursor=pointer]: + - img [ref=e18] + - generic [ref=e22]: 设施类别 + - button "建筑功能" [ref=e23] [cursor=pointer]: + - img [ref=e24] + - generic [ref=e27]: 建筑功能 + - button "建设阶段" [ref=e28] [cursor=pointer]: + - img [ref=e29] + - generic [ref=e34]: 建设阶段 + - button "规划形式" [ref=e35] [cursor=pointer]: + - img [ref=e36] + - generic [ref=e41]: 规划形式 + - region "年度总费用图表" [ref=e42]: + - generic [ref=e43]: + - button "纵坐标:造价(元)" [ref=e45] [cursor=pointer]: 造价(元) + - generic [ref=e46]: + - figure "图表,共有0个系列": + - generic [ref=e47]: + - img "interactive chart": + - generic: + - img + - img + - region [ref=e48] + - toolbar "标注" [ref=e49]: + - button "库" [ref=e50] [cursor=pointer]: + - generic: + - generic: 库 + - button "树" [ref=e51] [cursor=pointer]: + - generic: + - generic: 树 + - button "均" [ref=e52] [cursor=pointer]: + - generic: 均 + - button "Line Tool" [disabled] [ref=e53] + - button "Text Tool" [disabled] [ref=e54] + - button "Shape Tool" [disabled] [ref=e55] + - button "Fibonacci Tool" [disabled] [ref=e56] + - button "全屏(F11)" [ref=e57] [cursor=pointer] + - button "Clear annotations" [disabled] [ref=e58] + - status: + - generic: 请选择右侧分类项 + - toolbar "缩放" [ref=e59]: + - button "缩小" [disabled] [ref=e60] + - button "放大" [ref=e61] [cursor=pointer] + - button "左移" [disabled] [ref=e62] + - button "右移" [disabled] [ref=e63] + - button "重置" [disabled] [ref=e64] + - complementary "选择内容" [ref=e65]: + - tablist "选择内容切换项" [ref=e66]: + - tab "自然地理区位" [selected] [ref=e67] [cursor=pointer] + - tab "设施类别" [ref=e68] [cursor=pointer] + - tab "建筑功能" [ref=e69] [cursor=pointer] + - tab "建设阶段" [ref=e70] [cursor=pointer] + - tab "规划形式" [ref=e71] [cursor=pointer] + - generic [ref=e72]: + - generic [ref=e73]: 自然地理区位 + - generic [ref=e74]: 加载中 \ No newline at end of file diff --git a/.playwright-mcp/page-2026-05-13T08-22-19-114Z.yml b/.playwright-mcp/page-2026-05-13T08-22-19-114Z.yml new file mode 100644 index 0000000..d5289f3 --- /dev/null +++ b/.playwright-mcp/page-2026-05-13T08-22-19-114Z.yml @@ -0,0 +1,84 @@ +- main [ref=e3]: + - generic: + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - region "年度费用模板" [ref=e4]: + - generic "筛选条件" [ref=e5]: + - button "省市区" [ref=e6] [cursor=pointer]: + - img [ref=e7] + - generic [ref=e11]: 省市区 + - button "自然地理区位" [ref=e12] [cursor=pointer]: + - img [ref=e13] + - generic [ref=e16]: 自然地理区位 + - button "设施类别" [ref=e17] [cursor=pointer]: + - img [ref=e18] + - generic [ref=e22]: 设施类别 + - button "建筑功能" [ref=e23] [cursor=pointer]: + - img [ref=e24] + - generic [ref=e27]: 建筑功能 + - button "建设阶段" [ref=e28] [cursor=pointer]: + - img [ref=e29] + - generic [ref=e34]: 建设阶段 + - button "规划形式" [ref=e35] [cursor=pointer]: + - img [ref=e36] + - generic [ref=e41]: 规划形式 + - region "年度总费用图表" [ref=e42]: + - generic [ref=e43]: + - button "纵坐标:造价(元)" [ref=e45] [cursor=pointer]: 造价(元) + - generic [ref=e46]: + - figure "图表,共有0个系列": + - generic [ref=e47]: + - img "interactive chart": + - generic: + - img + - img + - region [ref=e48] + - toolbar "标注" [ref=e49]: + - button "库" [ref=e50] [cursor=pointer]: + - generic: + - generic: 库 + - button "树" [ref=e51] [cursor=pointer]: + - generic: + - generic: 树 + - button "均" [ref=e52] [cursor=pointer]: + - generic: 均 + - button "Line Tool" [disabled] [ref=e53] + - button "Text Tool" [disabled] [ref=e54] + - button "Shape Tool" [disabled] [ref=e55] + - button "Fibonacci Tool" [disabled] [ref=e56] + - button "全屏(F11)" [ref=e57] [cursor=pointer] + - button "Clear annotations" [disabled] [ref=e58] + - status: + - generic: 请选择右侧分类项 + - toolbar "缩放" [ref=e59]: + - button "缩小" [disabled] [ref=e60] + - button "放大" [ref=e61] [cursor=pointer] + - button "左移" [disabled] [ref=e62] + - button "右移" [disabled] [ref=e63] + - button "重置" [disabled] [ref=e64] + - complementary "选择内容" [ref=e65]: + - tablist "选择内容切换项" [ref=e66]: + - tab "自然地理区位" [selected] [ref=e67] [cursor=pointer] + - tab "设施类别" [ref=e68] [cursor=pointer] + - tab "建筑功能" [ref=e69] [cursor=pointer] + - tab "建设阶段" [ref=e70] [cursor=pointer] + - tab "规划形式" [ref=e71] [cursor=pointer] + - generic [ref=e72]: + - generic [ref=e73]: 自然地理区位 + - generic [ref=e74]: 加载中 \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 741370f..210d9da 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,7 +2,7 @@ import { useEffect, useMemo, useRef, useState } from 'react'; import { AgCharts } from 'ag-charts-react'; import type { AgCartesianChartOptions } from 'ag-charts-community'; import { ModuleRegistry } from 'ag-charts-community'; -import { Building2, Construction, LayoutGrid, Library, LocateFixed, MapPinned, Waypoints } from 'lucide-react'; +import { Building2, Construction, LayoutGrid, Library, LocateFixed, MapPinned, SquareFunction, Waypoints } from 'lucide-react'; import { AnnotationsModule, ContextMenuModule, @@ -42,6 +42,7 @@ const metricOptions = [ const contentOptions = [ { key: 'geoLocation', label: '自然地理区位' }, { key: 'facilityType', label: '设施类别' }, + { key: 'buildingFunction', label: '建筑功能' }, { key: 'constructionStage', label: '建设阶段' }, { key: 'planningForm', label: '规划形式' }, ] as const; @@ -52,6 +53,7 @@ const filterOptions = [ { key: 'region', label: '省市区', icon: MapPinned }, { key: 'geoLocation', label: '自然地理区位', icon: LocateFixed }, { key: 'facilityType', label: '设施类别', icon: Building2 }, + { key: 'buildingFunction', label: '建筑功能', icon: SquareFunction }, { key: 'constructionStage', label: '建设阶段', icon: Construction }, { key: 'planningForm', label: '规划形式', icon: LayoutGrid }, ] as const; @@ -90,6 +92,17 @@ const contentTreeConfigs = { fieldid: '305426', defaultExpandedLevel: 3, }, + buildingFunction: { + endpoint: '/api/public/browser/data/256', + treeid: '95004', + fieldid: '305919', + defaultExpandedLevel: 0, + browserParams: { + workflowid: '182032', + wfid: '182032', + billid: '-1817', + }, + }, constructionStage: { endpoint: '/api/public/browser/data/256', treeid: '94007', @@ -649,6 +662,7 @@ function App() { const treeInitialLoadStartedRef = useRef>({ geoLocation: false, facilityType: false, + buildingFunction: false, constructionStage: false, planningForm: false, }); @@ -658,6 +672,7 @@ function App() { region: false, geoLocation: false, facilityType: false, + buildingFunction: false, constructionStage: false, planningForm: false, }); @@ -670,18 +685,21 @@ function App() { const [treeByContent, setTreeByContent] = useState>({ geoLocation: [], facilityType: [], + buildingFunction: [], constructionStage: [], planningForm: [], }); const [treeLoadingByContent, setTreeLoadingByContent] = useState>({ geoLocation: false, facilityType: false, + buildingFunction: false, constructionStage: false, planningForm: false, }); const [treeErrorByContent, setTreeErrorByContent] = useState>({ geoLocation: null, facilityType: null, + buildingFunction: null, constructionStage: null, planningForm: null, }); @@ -697,6 +715,7 @@ function App() { region: [], geoLocation: [], facilityType: [], + buildingFunction: [], constructionStage: [], planningForm: [], }); @@ -706,6 +725,7 @@ function App() { region: false, geoLocation: false, facilityType: false, + buildingFunction: false, constructionStage: false, planningForm: false, }); @@ -715,6 +735,7 @@ function App() { region: null, geoLocation: null, facilityType: null, + buildingFunction: null, constructionStage: null, planningForm: null, }); @@ -724,6 +745,7 @@ function App() { region: [], geoLocation: [], facilityType: [], + buildingFunction: [], constructionStage: [], planningForm: [], }); @@ -733,6 +755,7 @@ function App() { region: false, geoLocation: false, facilityType: false, + buildingFunction: false, constructionStage: false, planningForm: false, }); @@ -742,6 +765,7 @@ function App() { region: null, geoLocation: null, facilityType: null, + buildingFunction: null, constructionStage: null, planningForm: null, }); @@ -751,6 +775,7 @@ function App() { region: [], geoLocation: [], facilityType: [], + buildingFunction: [], constructionStage: [], planningForm: [], }); @@ -765,6 +790,7 @@ function App() { region: 0, geoLocation: 0, facilityType: 0, + buildingFunction: 0, constructionStage: 0, planningForm: 0, }); @@ -834,6 +860,7 @@ function App() { } const treeParams = { ...browserTreeDefaults, + ...('browserParams' in config ? config.browserParams : {}), treeid: config.treeid, cube_treeid: config.treeid, fieldid: config.fieldid, @@ -1469,18 +1496,27 @@ function App() { button.setAttribute(name, value); } }; + const enableCustomToolbarButton = (button: HTMLButtonElement) => { + if (button.disabled) { + button.disabled = false; + } + if (button.hasAttribute('disabled')) { + button.removeAttribute('disabled'); + } + setButtonAttribute(button, 'aria-disabled', 'false'); + }; const syncToolbarButtons = () => { const templateButton = getTemplateButton(); if (templateButton) { templateButton.classList.add('chart-template-button'); - setButtonAttribute(templateButton, 'aria-disabled', 'false'); + enableCustomToolbarButton(templateButton); setButtonAttribute(templateButton, 'aria-expanded', String(filterModalKey === 'templateLibrary')); } const indicatorButton = getIndicatorButton(); if (indicatorButton) { indicatorButton.classList.add('chart-indicator-button'); - setButtonAttribute(indicatorButton, 'aria-disabled', 'false'); + enableCustomToolbarButton(indicatorButton); setButtonAttribute(indicatorButton, 'aria-expanded', String(filterModalKey === 'indicatorTree')); } @@ -1495,7 +1531,7 @@ function App() { const isFullscreen = document.fullscreenElement === fullscreenTarget; button.classList.add('chart-fullscreen-button'); button.classList.toggle('ag-charts-toolbar__button--active', isFullscreen); - setButtonAttribute(button, 'aria-disabled', 'false'); + enableCustomToolbarButton(button); setButtonAttribute(button, 'aria-pressed', String(isFullscreen)); icon?.classList.toggle('anticon-arrow-salt', !isFullscreen); icon?.classList.toggle('anticon-shrink', isFullscreen); @@ -1504,7 +1540,7 @@ function App() { const statisticButton = getStatisticButton(); if (statisticButton) { statisticButton.classList.add('chart-statistic-button'); - setButtonAttribute(statisticButton, 'aria-disabled', 'false'); + enableCustomToolbarButton(statisticButton); setButtonAttribute(statisticButton, 'aria-expanded', String(statisticMenuOpen)); } }; @@ -1592,6 +1628,7 @@ function App() { window.setTimeout(syncToolbarButtons, 0), window.setTimeout(syncToolbarButtons, 100), window.setTimeout(syncToolbarButtons, 500), + window.setTimeout(syncToolbarButtons, 1000), ]; document.addEventListener('keydown', handleKeyDown, true); document.addEventListener('fullscreenchange', handleFullscreenChange); @@ -1612,7 +1649,7 @@ function App() { frame.removeEventListener('keydown', handleToolbarKeyDown, true); observer.disconnect(); }; - }, [appliedFilters, filterModalKey, filterTreeByKey, statisticMenuOpen]); + }, [activeContentKey, appliedFilters, filterModalKey, filterTreeByKey, selectedContentNodes.length, statisticMenuOpen]); const chartOptions = useMemo(() => { const groupNames: string[] = []; @@ -1869,6 +1906,7 @@ function App() { region: [], geoLocation: [], facilityType: [], + buildingFunction: [], constructionStage: [], planningForm: [], }); diff --git a/src/styles.css b/src/styles.css index d62a484..114aec7 100644 --- a/src/styles.css +++ b/src/styles.css @@ -361,8 +361,12 @@ button { .chart-frame .chart-template-button, .chart-frame .chart-indicator-button, -.chart-frame .chart-statistic-button { +.chart-frame .chart-statistic-button, +.chart-frame .chart-fullscreen-button { color: #46413b; + cursor: pointer !important; + opacity: 1 !important; + pointer-events: auto !important; } .chart-frame .ag-charts-myButton-template, @@ -378,7 +382,8 @@ button { .chart-frame .chart-template-button[aria-expanded="true"], .chart-frame .chart-indicator-button[aria-expanded="true"], -.chart-frame .chart-statistic-button[aria-expanded="true"] { +.chart-frame .chart-statistic-button[aria-expanded="true"], +.chart-frame .chart-fullscreen-button.ag-charts-toolbar__button--active { color: #0078a8; border-color: rgba(0, 120, 168, 0.36); background: rgba(255, 252, 248, 0.94); diff --git a/vite-test.err.log b/vite-test.err.log new file mode 100644 index 0000000..d5308a4 --- /dev/null +++ b/vite-test.err.log @@ -0,0 +1 @@ +$ vite --host 0.0.0.0 --host "127.0.0.1" --port "5173" diff --git a/vite-test.out.log b/vite-test.out.log new file mode 100644 index 0000000..aee022d --- /dev/null +++ b/vite-test.out.log @@ -0,0 +1,6 @@ + + VITE v7.3.2 ready in 307 ms + + ➜ Local: http://127.0.0.1:5173/ + ➜ press h + enter to show help +16:10:18 [vite] (client) hmr update /src/App.tsx