This commit is contained in:
wintsa 2026-05-13 16:23:55 +08:00
parent 46325ee801
commit 58abe588aa
8 changed files with 235 additions and 8 deletions

View File

@ -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

View File

@ -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&currenttime=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&currenttime=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&currenttime=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&currenttime=1778660591693&__random__=1778660591693:0

View File

@ -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]: 加载中

View File

@ -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]: 加载中

View File

@ -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<Record<ContentKey, boolean>>({
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<Record<ContentKey, TreeNode[]>>({
geoLocation: [],
facilityType: [],
buildingFunction: [],
constructionStage: [],
planningForm: [],
});
const [treeLoadingByContent, setTreeLoadingByContent] = useState<Record<ContentKey, boolean>>({
geoLocation: false,
facilityType: false,
buildingFunction: false,
constructionStage: false,
planningForm: false,
});
const [treeErrorByContent, setTreeErrorByContent] = useState<Record<ContentKey, string | null>>({
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<AgCartesianChartOptions>(() => {
const groupNames: string[] = [];
@ -1869,6 +1906,7 @@ function App() {
region: [],
geoLocation: [],
facilityType: [],
buildingFunction: [],
constructionStage: [],
planningForm: [],
});

View File

@ -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);

1
vite-test.err.log Normal file
View File

@ -0,0 +1 @@
$ vite --host 0.0.0.0 --host "127.0.0.1" --port "5173"

6
vite-test.out.log Normal file
View File

@ -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