import { Button as AntButton, Drawer, Dropdown, QRCode, Tag } from "antd";
import { AimOutlined, ApartmentOutlined, BarsOutlined, BlockOutlined, CaretDownOutlined, CaretRightOutlined, ControlOutlined, CopyOutlined, DeleteOutlined, DownloadOutlined, EditOutlined, EllipsisOutlined, EyeOutlined, LinkOutlined, PlusOutlined, PlusSquareOutlined, RobotOutlined, SearchOutlined, SnippetsOutlined, UploadOutlined, ZoomInOutlined, ZoomOutOutlined } from "@ant-design/icons";
-type PageKey = "login" | "projects" | "siteEdit" | "basic" | "assets" | "pageConfig" | "functions" | "generate" | "result" | "preview" | "domains" | "domainDetail" | "styleLibrary" | "deviceTemplates" | "toolSettings" | "domainSettings" | "dashboard";
+type PageKey = "login" | "projects" | "siteEdit" | "basic" | "assets" | "pageConfig" | "functions" | "generate" | "result" | "preview" | "domains" | "domainDetail" | "styleLibrary" | "deviceTemplates" | "toolSettings" | "domainSettings" | "dashboard" | "report-dashboard" | "report-doc" | "basic-components" | "func-components" | "filters" | "datasource";
type ModalKey = "" | "feedback" | "download" | "history" | "prompt" | "completePrompt";
const meta: Record<PageKey, { label: string; icon: string; subtitle: string }> = {
styleLibrary:{label:"页面样式",icon:"❖",subtitle:"管理可复用的 Cube 页面视觉样式与预览资源"},
toolSettings:{label:"内部工具配置",icon:"",subtitle:"配置 StationBuilder 使用的内部能力、AI 服务和默认模型"},
domainSettings:{label:"领域配置",icon:"",subtitle:"维护领域分类,供领域方案与站点项目统一使用"},
- dashboard:{label:"仪表盘",icon:"◈",subtitle:"仅展示仪表盘示意图片"},
+ dashboard:{label:"仪表板",icon:"◈",subtitle:"仅展示仪表盘示意图片"},
+ "report-dashboard":{label:"仪表板报表",icon:"",subtitle:""},
+ "report-doc":{label:"文档报表",icon:"",subtitle:""},
+ "basic-components":{label:"基础组件库",icon:"",subtitle:""},
+ "func-components":{label:"功能组件库",icon:"",subtitle:""},
+ filters:{label:"筛选器",icon:"",subtitle:""},
+ datasource:{label:"数据源",icon:"",subtitle:""},
};
const projectArea = (["projects","siteEdit","basic","assets","pageConfig","functions","generate","result","preview"] as PageKey[]).includes(page);
const resourceArea = (["domains","domainDetail","deviceTemplates","styleLibrary"] as PageKey[]).includes(page);
const systemArea = (["toolSettings","domainSettings"] as PageKey[]).includes(page);
- const extensionArea = (["dashboard"] as PageKey[]).includes(page);
+ const extensionArea = (["dashboard","report-dashboard","report-doc","basic-components","func-components","filters","datasource"] as PageKey[]).includes(page);
const siteEditMeta = meta[siteEditSection];
const manualAssetActive = assetConfigMode==="manual" && (page==="assets" || (page==="siteEdit"&&siteEditSection==="assets"));
<section className={extensionArea?"menu-section extension-menu-section current":"menu-section extension-menu-section"} aria-label="扩展页面菜单">
<button className="menu-section-title" aria-expanded={extensionNavOpen} onClick={()=>setExtensionNavOpen(v=>!v)}><span>扩展页面</span>{extensionNavOpen?<CaretDownOutlined/>:<CaretRightOutlined/>}</button>
{extensionNavOpen&&<div className="menu-section-items extension-menu-items">
- <button className={page==="dashboard"?"extension-menu-item clickable active":"extension-menu-item clickable"} onClick={()=>go("dashboard")}>仪表盘</button>
- <div className="extension-menu-item">数据源</div>
+ <button className={page==="dashboard"?"extension-menu-item clickable active":"extension-menu-item clickable"} onClick={()=>go("dashboard")}>仪表板</button>
<div className="extension-submenu">
<button className="extension-menu-item extension-submenu-title" aria-expanded={reportNavOpen} onClick={()=>setReportNavOpen(v=>!v)}><span>报表</span>{reportNavOpen?<CaretDownOutlined/>:<CaretRightOutlined/>}</button>
{reportNavOpen&&<div className="extension-third-menu">
- <div>仪表盘报表</div>
- <div>文档报表</div>
+ <button className={page==="report-dashboard"?"extension-third-menu-item clickable active":"extension-third-menu-item clickable"} onClick={()=>go("report-dashboard")}>仪表板报表</button>
+ <button className={page==="report-doc"?"extension-third-menu-item clickable active":"extension-third-menu-item clickable"} onClick={()=>go("report-doc")}>文档报表</button>
</div>}
</div>
- <div className="extension-menu-item">数据源</div>
+ <button className={page==="basic-components"?"extension-menu-item clickable active":"extension-menu-item clickable"} onClick={()=>go("basic-components")}>基础组件库</button>
+ <button className={page==="func-components"?"extension-menu-item clickable active":"extension-menu-item clickable"} onClick={()=>go("func-components")}>功能组件库</button>
+ <button className={page==="filters"?"extension-menu-item clickable active":"extension-menu-item clickable"} onClick={()=>go("filters")}>筛选器</button>
+ <button className={page==="datasource"?"extension-menu-item clickable active":"extension-menu-item clickable"} onClick={()=>go("datasource")}>数据源</button>
</div>}
</section>
<section className={resourceArea?"menu-section current":"menu-section"}>
--- /dev/null
+import { chromium } from 'playwright';
+const BASE='https://aidemo.istation.cloud/t/stationbuilder';
+const b=await chromium.launch();
+const p=await b.newPage({viewport:{width:1440,height:900}});
+const errs=[];
+p.on('console',m=>{if(m.type()==='error')errs.push(m.text());});
+await p.goto(`${BASE}/?page=projects`,{waitUntil:'networkidle'});
+await p.waitForSelector('.company-side-nav',{timeout:15000});
+// collect menu text
+const menuText = await p.evaluate(()=>{
+ const sec=[...document.querySelectorAll('.extension-menu-section')][0];
+ return sec? sec.innerText.replace(/\n+/g,' | ') : 'NO SECTION';
+});
+console.log('MENU:', menuText);
+for (const key of ['dashboard','report-dashboard','report-doc','basic-components','func-components','filters','datasource']) {
+ await p.goto(`${BASE}/?page=${key}`,{waitUntil:'networkidle'});
+ await p.waitForSelector('.page-heading h1',{timeout:10000}).catch(()=>{});
+ const title = await p.evaluate(()=>document.querySelector('.page-heading h1')?.textContent||'(none)');
+ console.log('PAGE', key, '=>', title);
+}
+console.log('ERRORS', errs.slice(0,8));
+await b.close();