Преглед на файлове

Merge branch 'master' of http://787255.xyz:4003/ydm/zl365

唐渝林 преди 7 месеца
родител
ревизия
0c83f81db6

+ 7 - 0
.vscode/launch.json

@@ -4,6 +4,13 @@
     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
     "version": "0.2.0",
     "configurations": [
+        {
+            "name": "Launch Edge",
+            "request": "launch",
+            "type": "msedge",
+            "url": "http://localhost:3000",
+            "webRoot": "${workspaceFolder}"
+        },
         {
             "type": "chrome",
             "request": "launch",

+ 6 - 5
.vscode/settings.json

@@ -6,14 +6,15 @@
   "eslint.useFlatConfig": true,
   "editor.formatOnSave": false,
   "eslint.validate": ["html", "css", "scss", "json", "jsonc"],
-  "i18n-ally.displayLanguage": "zh-cn",
-  "i18n-ally.enabledParsers": ["ts"],
-  "i18n-ally.enabledFrameworks": ["vue"],
+  "i18n-ally.displayLanguage": "zh-CN",
+  "i18n-ally.enabledParsers": ["json"],
+  "i18n-ally.enabledFrameworks": ["react"],
   "i18n-ally.editor.preferEditor": true,
   "i18n-ally.keystyle": "nested",
   "i18n-ally.localesPaths": ["src/locales/langs"],
   "prettier.enable": false,
   "typescript.tsdk": "node_modules/typescript/lib",
-  "unocss.root": ["./"],
-  "vue.server.hybridMode": true
+  "unocss.root": [
+    "./"
+  ],
 }

+ 5 - 2
package.json

@@ -10,10 +10,13 @@
     "@testing-library/user-event": "^13.5.0",
     "@types/jest": "^28.1.8",
     "@types/node": "^14.18.63",
-    "@types/react": "^17.0.83",
-    "@types/react-dom": "^17.0.25",
+    "@types/react": "^18.3.12",
+    "@types/react-dom": "^18.3.1",
+    "i18next": "^23.16.4",
+    "i18next-browser-languagedetector": "^8.0.0",
     "react": "^18.3.1",
     "react-dom": "^18.3.1",
+    "react-i18next": "^15.1.0",
     "react-router-dom": "^6.27.0",
     "react-scripts": "5.0.1",
     "react-zl365": "file:",

+ 8 - 8
src/App.tsx

@@ -1,18 +1,18 @@
-import {Component} from "react";
+import React, { Component } from "react";
 import "./App.css";
 // import List from "./component/List";
 import Header from './component/hedaer';
 import Bar from './component/bar';
 import Content from './component/content';
 
-export class App extends Component{
-  render(){
+export class App extends Component {
+  render() {
     return (
-        <div className="zl-365-container">
-          <Header></Header>
-          <Bar></Bar>
-          <Content></Content>
-        </div>
+      <div className="zl-365-container">
+        <Header></Header>
+        <Bar></Bar>
+        <Content></Content>
+      </div>
     );
   }
 }

+ 54 - 52
src/component/content/content_side/index.jsx

@@ -1,61 +1,63 @@
 import React, { Component } from "react";
 import MyNavlink from '../../myNavLink';
 
-export default class ContentSide extends Component{
-    render(){
-        return (
+import { useTranslation } from "react-i18next";
+
+const ContentSide = () => {
+    const { t } = useTranslation();
+    return (
         <div class="zl-365-content-side">
-        <div class="zl-365-content-side-ul">
-            <div class="zl-365-content-side-li">
-                <MyNavlink to="/home" >主页</MyNavlink>
-            </div>
-            <div class="zl-365-content-side-li">
-                <a class="content-side-li-nav" href="#" title="对话" target="_self">
-                    <span class="content-side-li-nav-text">对话</span>
-                </a>
-            </div>
-            <div class="zl-365-content-side-li">
-                <a class="content-side-li-nav" href="/Microsoft365/document" title="文档" target="_self">
-                    <span class="content-side-li-nav-text">文档</span>
-                </a>
-            </div>
-            <div class="zl-365-content-side-li">
-                <a class="content-side-li-nav" href="#" title="笔记本" target="_self">
-                    <span class="content-side-li-nav-text">笔记本</span>
-                </a>
-            </div>
-            <div class="zl-365-content-side-li">
-                {/* <a class="content-side-li-nav" href="/Microsoft365/listnew" title="测试人员列表" target="_self">
+            <div class="zl-365-content-side-ul">
+                <div class="zl-365-content-side-li">
+                    <MyNavlink to="/home" >{t("menu.home")}</MyNavlink>
+                </div>
+                <div class="zl-365-content-side-li">
+                    <a class="content-side-li-nav" href="#" title="对话" target="_self">
+                        <span class="content-side-li-nav-text">{t("menu.dialogue")}</span>
+                    </a>
+                </div>
+                <div class="zl-365-content-side-li">
+                    <MyNavlink to="/document" >{t("menu.document")}</MyNavlink>
+                </div>
+                <div class="zl-365-content-side-li">
+                    <a class="content-side-li-nav" href="#" title={t("menu.book")} target="_self">
+                        <span class="content-side-li-nav-text">{t("menu.book")}</span>
+                    </a>
+                </div>
+                <div class="zl-365-content-side-li">
+                    {/* <a class="content-side-li-nav" href="/Microsoft365/listnew" title="测试人员列表" target="_self">
                     <span class="content-side-li-nav-text">测试人员列表</span>
                   
                 </a> */}
-                <MyNavlink to="/listnew" >测试人员列表</MyNavlink>
-            </div>
-            <div class="zl-365-content-side-li">
-                <a class="content-side-li-nav" href="#" title="页面" target="_self">
-                    <span class="content-side-li-nav-text">页面</span>
-                </a>
-            </div>
-            <div class="zl-365-content-side-li">
-                <a class="content-side-li-nav" href="#" title="网站内容" target="_self">
-                    <span class="content-side-li-nav-text">网站内容</span>
-                </a>
-            </div>
-            <div class="zl-365-content-side-li">
-                <a class="content-side-li-nav" href="#" title="回收站" target="_self">
-                    <span class="content-side-li-nav-text">回收站</span>
-                </a>
-            </div>
-            <div class="zl-365-content-side-li">
-                <a class="content-side-li-nav" href="#" title="编辑" target="_self">
-                    <span class="content-side-li-nav-text color-theme">编辑</span>
-                </a>
+                    <MyNavlink to="/listnew" >{t("menu.testList")}</MyNavlink>
+                </div>
+                <div class="zl-365-content-side-li">
+                    <a class="content-side-li-nav" href="#" title={t("menu.page")} target="_self">
+                        <span class="content-side-li-nav-text">{t("menu.page")}</span>
+                    </a>
+                </div>
+                <div class="zl-365-content-side-li">
+                    <a class="content-side-li-nav" href="#" title={t("menu.websiteContent")} target="_self">
+                        <span class="content-side-li-nav-text">{t("menu.websiteContent")}</span>
+                    </a>
+                </div>
+                <div class="zl-365-content-side-li">
+                    <a class="content-side-li-nav" href="#" title={t("menu.recycleBin")} target="_self">
+                        <span class="content-side-li-nav-text">{t("menu.recycleBin")}</span>
+                    </a>
+                </div>
+                <div class="zl-365-content-side-li">
+                    <a class="content-side-li-nav" href="#" title={t("menu.edit")} target="_self">
+                        <span class="content-side-li-nav-text color-theme">{t("menu.edit")}</span>
+                    </a>
+                </div>
+            </div>
+            <div class="zl-365-content-side-teamify">
+
             </div>
         </div>
-        <div class="zl-365-content-side-teamify">
-           
-        </div>
-    </div>
-        )
-    }
-}
+    )
+
+}
+
+export default ContentSide

+ 2 - 7
src/component/content/index.jsx

@@ -2,9 +2,7 @@ import React, { Component } from "react";
 import "./index.css";
 import ContentHeader from "./content_header";
 import ContentSide from "./content_side";
-import { Routes, Route } from "react-router-dom";
-import Home from "../../pages/home";
-import List from "../../pages/listnew";
+import { Outlet } from "react-router-dom";
 
 export default class Content extends Component {
   render() {
@@ -13,10 +11,7 @@ export default class Content extends Component {
         <ContentHeader></ContentHeader>
         <ContentSide></ContentSide>
         <div className="zl-365-list">
-          <Routes>
-            <Route path="/home" Component={Home}></Route>
-            <Route path="/listnew" Component={List}></Route>
-          </Routes>
+          <Outlet/>
         </div>
       </div>
     );

+ 12 - 13
src/index.tsx

@@ -1,21 +1,20 @@
 import React from "react";
-import ReactDOM from "react-dom";
+import { createRoot } from "react-dom/client";
 import "./index.css";
-import App from "./App";
+import "./locales";
 import reportWebVitals from "./reportWebVitals";
 import { FluentProvider, webLightTheme } from "@fluentui/react-components";
-import { BrowserRouter } from "react-router-dom";
+import { RouterProvider } from "react-router-dom";
+import router from "./router/index";
 
-ReactDOM.render(
-  <BrowserRouter>
-    <FluentProvider theme={webLightTheme}>
-      <App />
-    </FluentProvider>
-  </BrowserRouter>,
-  document.getElementById('root')
+const container = document.getElementById("root");
+const root = createRoot(container!); // 创建一个根
+
+// 使用 createRoot 渲染你的应用
+root.render(
+  <FluentProvider theme={webLightTheme}>
+    <RouterProvider router={router} />
+  </FluentProvider>
 );
 
-// If you want to start measuring performance in your app, pass a function
-// to log results (for example: reportWebVitals(console.log))
-// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
 reportWebVitals();

+ 24 - 0
src/locales/index.ts

@@ -0,0 +1,24 @@
+import i18n from 'i18next';
+import { initReactI18next } from 'react-i18next';
+import LanguageDetector from 'i18next-browser-languagedetector';
+import resources from './resources'
+
+i18n
+  // 检测用户当前使用的语言
+  // 文档: https://github.com/i18next/i18next-browser-languageDetector
+  .use(LanguageDetector)
+  // 注入 react-i18next 实例
+  .use(initReactI18next)
+  // 初始化 i18next
+  // 配置参数的文档: https://www.i18next.com/overview/configuration-options
+  .init({
+    debug: true,
+    fallbackLng: 'zh-CN',
+    lng: "zh-CN",
+    resources,
+    interpolation: {
+      escapeValue: false,
+    }
+  });
+
+export default i18n;

+ 13 - 0
src/locales/langs/en-US.json

@@ -0,0 +1,13 @@
+{
+    "menu": {
+        "home": "Home",
+        "dialogue": "Dialogue",
+        "document": "Document",
+        "book": "Book",
+        "page": "Page",
+        "websiteContent": "WebsiteContent",
+        "recycleBin": "RecycleBin",
+        "edit": "Edit",
+        "testList": "TestList"
+    }
+}

+ 13 - 0
src/locales/langs/zh-CN.json

@@ -0,0 +1,13 @@
+{
+  "menu": {
+    "home": "主页",
+    "dialogue": "对话",
+    "document": "文档",
+    "book": "笔记本",
+    "page": "页面",
+    "websiteContent": "网站内容",
+    "recycleBin": "回收站",
+    "edit": "编辑",
+    "testList": "测试列表"
+  }
+}

+ 13 - 0
src/locales/resources.ts

@@ -0,0 +1,13 @@
+import zhCN from './langs/zh-CN.json'
+import enUS from './langs/en-US.json';
+
+const resources = {
+	"zh-CN": {
+		translation: zhCN
+	},
+	"en-US": {
+		translation: enUS
+	},
+}
+
+export default resources;

+ 9 - 7
src/pages/home/index.tsx

@@ -1,9 +1,11 @@
 import React, { Component } from "react";
+import { useTranslation } from "react-i18next";
 
-export default class MyNavlink extends Component {
-    render() {
-        return (
-            <div>主页</div>
-        )
-    }
-}
+function MyNavlink() {
+    const { t } = useTranslation();
+    return (
+        <div>{t('menu.home')}</div>
+    );
+}
+
+export default MyNavlink;

+ 302 - 211
src/pages/listnew/index.jsx

@@ -11,6 +11,7 @@ import {
   SelectAllOn16Regular,
   CommentAdd16Regular,
   MoreHorizontal16Filled,
+  NumberCircle116Regular
 } from "@fluentui/react-icons";
 import {
   DataGridBody,
@@ -20,7 +21,6 @@ import {
   DataGridHeaderCell,
   DataGridCell,
   TableCellLayout,
-  TableColumnDefinition,
   createTableColumn,
   Button,
   Menu,
@@ -29,231 +29,322 @@ import {
   MenuItem,
   MenuPopover,
   Tooltip,
+  MenuDivider,
 } from "@fluentui/react-components";
 
-const items = [
-  {
-    姓名: { label: "陈丹", icon: <DocumentRegular /> },
-    性别: { label: "女", status: "available" },
-    年龄: { label: "18岁", timestamp: 1 },
-    最后在线时间: { label: "2024/11/6 13:50" },
-  },
-  {
-    姓名: { label: "蔡青松", icon: <FolderRegular /> },
-    性别: { label: "男", status: "busy" },
-    年龄: { label: "30岁", timestamp: 2 },
-    最后在线时间: { label: "2024/11/6 13:50" },
-  },
-  {
-    姓名: { label: "杨东明", icon: <VideoRegular /> },
-    性别: { label: "男", status: "away" },
-    年龄: { label: "25岁", timestamp: 2 },
-    最后在线时间: { label: "2024/11/6 13:50" },
-  },
-  {
-    姓名: { label: "吴瑞强", icon: <DocumentPdfRegular /> },
-    性别: { label: "男", status: "offline" },
-    年龄: { label: "25岁", timestamp: 3 },
-    最后在线时间: { label: "2024/11/6 13:50" },
-  },
-];
 
-const columns = [
-  createTableColumn({
-    columnId: "姓名",
-    compare: (a, b) => {
-      return a.姓名.label.localeCompare(b.姓名.label);
-    },
-    renderHeaderCell: () => {
-      return (
-        <TableCellLayout media={<TextField16Regular />}>
-          姓名
-          <Menu>
-            <MenuTrigger disableButtonEnhancement>
-              <Button
-                appearance="subtle"
-                icon={<ChevronDown16Filled />}
-              ></Button>
-            </MenuTrigger>
+const List = () => {
+  const defaultSelectedItems = React.useMemo(() => new Set([1]), []);
 
-            <MenuPopover>
-              <MenuList>
-                <MenuItem>New </MenuItem>
-                <MenuItem>New Window</MenuItem>
-                <MenuItem disabled>Open File</MenuItem>
-                <MenuItem>Open Folder</MenuItem>
-              </MenuList>
-            </MenuPopover>
-          </Menu>
-        </TableCellLayout>
-      );
-    },
-    renderCell: (item) => {
-      return ChangeBtnShowType(item);
-    },
-  }),
-  createTableColumn({
-    columnId: "性别",
-    compare: (a, b) => {
-      return a.性别.label.localeCompare(b.性别.label);
-    },
-    renderHeaderCell: () => {
-      return (
-        <TableCellLayout media={<SelectAllOn16Regular />}>
-          性别
-          <Menu>
-            <MenuTrigger disableButtonEnhancement>
-              <Button
-                appearance="subtle"
-                icon={<ChevronDown16Filled />}
-              ></Button>
-            </MenuTrigger>
+  //数据类型常量
+  const DATA_TYPE = {
+    文本: "文本",
+    数字: "数字",
+    日期: "日期",
+    选项: "选项"
+  }
 
-            <MenuPopover>
-              <MenuList>
-                <MenuItem>New </MenuItem>
-                <MenuItem>New Window</MenuItem>
-                <MenuItem disabled>Open File</MenuItem>
-                <MenuItem>Open Folder</MenuItem>
-              </MenuList>
-            </MenuPopover>
-          </Menu>
-        </TableCellLayout>
-      );
-    },
-    renderCell: (item) => {
-      return item.性别.label;
-    },
-  }),
-  createTableColumn({
-    columnId: "年龄",
-    compare: (a, b) => {
-      return a.年龄.timestamp - b.年龄.timestamp;
-    },
-    renderHeaderCell: () => {
-      return (
-        <TableCellLayout media={<TextField16Regular />}>
-          年龄
-          <Menu>
-            <MenuTrigger disableButtonEnhancement>
-              <Button
-                appearance="subtle"
-                icon={<ChevronDown16Filled />}
-              ></Button>
-            </MenuTrigger>
+  /**
+   * 列头下拉菜单
+   * @param {*} dataType 表现类型
+   */
+  const HeaderMenuList = (props) => {
+    return (
+      <Menu>
+        <MenuTrigger disableButtonEnhancement>
+          <Button
+            appearance="subtle"
+            icon={<ChevronDown16Filled />}
+          ></Button>
+        </MenuTrigger>
 
-            <MenuPopover>
-              <MenuList>
-                <MenuItem>New </MenuItem>
-                <MenuItem>New Window</MenuItem>
-                <MenuItem disabled>Open File</MenuItem>
-                <MenuItem>Open Folder</MenuItem>
-              </MenuList>
-            </MenuPopover>
-          </Menu>
-        </TableCellLayout>
-      );
-    },
+        <MenuPopover>
+          <MenuList>
+            {props.dataType == DATA_TYPE.数字 && <MenuItem onClick={() => {
+              ascendingData(props.columnId);
+            }}>从小到大 </MenuItem>}
 
-    renderCell: (item) => {
-      return item.年龄.label;
-    },
-  }),
-  createTableColumn({
-    columnId: "最后在线时间",
-    compare: (a, b) => {
-      return a.最后在线时间.label.localeCompare(b.最后在线时间.label);
-    },
-    renderHeaderCell: () => {
-      return (
-        <TableCellLayout media={<Calendar16Regular />}>
-          最后在线时间
-          <Menu>
-            <MenuTrigger disableButtonEnhancement>
-              <Button
-                appearance="subtle"
-                icon={<ChevronDown16Filled />}
-              ></Button>
-            </MenuTrigger>
+            {props.dataType == DATA_TYPE.数字 && <MenuItem onClick={() => {
+              descendingData(props.columnId);
+            }}>从大到小</MenuItem>}
 
-            <MenuPopover>
-              <MenuList>
-                <MenuItem>New </MenuItem>
-                <MenuItem>New Window</MenuItem>
-                <MenuItem disabled>Open File</MenuItem>
-                <MenuItem>Open Folder</MenuItem>
-              </MenuList>
-            </MenuPopover>
-          </Menu>
-        </TableCellLayout>
-      );
-    },
-    renderCell: (item) => {
-      return (
-        <TableCellLayout media={item.最后在线时间.icon}>
-          {item.最后在线时间.label}
-        </TableCellLayout>
-      );
-    },
-  }),
-];
+            {(props.dataType == DATA_TYPE.文本 || props.dataType == DATA_TYPE.选项) && <MenuItem onClick={() => {
+              ascendingData(props.columnId);
+            }}>A到Z </MenuItem>}
 
-/**
- * 鼠标移动到姓名列上时,显示两个按钮
- * @param item 包含姓名标签的对象
- * @returns 返回 JSX 元素
- */
-const ChangeBtnShowType = (item) => {
-  const [showButton, setShowButton] = useState(false);
-  const handleMouseEnter = () => {
-    setShowButton(true);
-  };
+            {(props.dataType == DATA_TYPE.文本 || props.dataType == DATA_TYPE.选项) && <MenuItem onClick={() => {
+              descendingData(props.columnId);
+            }}>Z到A </MenuItem>}
 
-  const handleMouseLeave = () => {
-    setShowButton(false);
-  };
+            {(props.dataType == DATA_TYPE.日期) && <MenuItem onClick={() => {
+              ascendingData(props.columnId);
+            }}>从旧到新 </MenuItem>}
 
-  return (
-    <div
-      style={{
-        width: "100%",
-        display: "flex",
-        justifyContent: "space-between",
-        alignItems: "center",
-      }}
-      onMouseEnter={handleMouseEnter}
-      onMouseLeave={handleMouseLeave}
-    >
-      {item.姓名.label}
-      {showButton && (
-        <div>
-          <Tooltip content="更多操作" positioning="below">
-            <Button
-              appearance="subtle"
-              icon={<MoreHorizontal16Filled />}
-              onClick={() => {
-                alert("更多操作");
-              }}
-            ></Button>
-          </Tooltip>
-          <Tooltip content="添加注释" positioning="below">
-            <Button appearance="subtle" icon={<CommentAdd16Regular />}></Button>
-          </Tooltip>
-        </div>
-      )}
-    </div>
-  );
-};
+            {(props.dataType == DATA_TYPE.日期) && <MenuItem onClick={() => {
+              descendingData(props.columnId);
+            }}>从新到旧 </MenuItem>}
+            <MenuDivider />
+            <MenuItem>筛选方式</MenuItem>
+            <MenuDivider />
+            <MenuItem>按“{props.columnId}”分组</MenuItem>
+            <MenuDivider />
+            <MenuItem><HeaderMenuColumnSet dataType={props.dataType} /></MenuItem>
+            <MenuDivider />
+            <MenuItem><HeaderMenuAmount dataType={props.dataType} /></MenuItem>
+          </MenuList>
+        </MenuPopover>
+      </Menu>
+    );
+  }
+
+  const [dataSortType, setDataSortType] = useState(({
+    sortColumn: "序号",
+    sortDirection: "ascending",
+  }));
+  const ascendingData = (columnId) => {
+    setDataSortType(({
+      sortColumn: columnId,
+      sortDirection: "ascending",
+    }));
+  }
+  const descendingData = (columnId) => {
+    setDataSortType(({
+      sortColumn: columnId,
+      sortDirection: "descending",
+    }));
+  }
+
+  /**
+   * 列设置的二级菜单
+   * @returns 
+   */
+  const HeaderMenuColumnSet = (props) => {
+    return (
+      <Menu>
+        <MenuTrigger disableButtonEnhancement>
+          <MenuItem>列设置</MenuItem>
+        </MenuTrigger>
+
+        <MenuPopover>
+          <MenuList>
+            <MenuItem>编辑</MenuItem>
+            <MenuItem>隐藏此列</MenuItem>
+            <MenuItem>设置此列的格式</MenuItem>
+            <MenuItem>向左移动</MenuItem>
+            <MenuItem>向右移动</MenuItem>
+            <MenuItem>显示/隐藏列</MenuItem>
+            <MenuItem>加宽列</MenuItem>
+            <MenuItem>窄列</MenuItem>
+            <MenuItem>固定到筛选器窗口</MenuItem>
+            <MenuItem>添加列</MenuItem>
+          </MenuList>
+        </MenuPopover>
+      </Menu>
+    );
+  }
+
+  /**
+   * 列头“合计”二级菜单
+   */
+  const HeaderMenuAmount = (props) => {
+    return (
+      <Menu>
+        <MenuTrigger disableButtonEnhancement>
+          <MenuItem>合计</MenuItem>
+        </MenuTrigger>
+
+        <MenuPopover>
+          <MenuList>
+            <MenuItem>无</MenuItem>
+            <MenuItem>计数</MenuItem>
+            {props.dataType == DATA_TYPE.数字 && <MenuItem>平均值</MenuItem>}
+            {props.dataType == DATA_TYPE.数字 && <MenuItem>最大值</MenuItem>}
+            {props.dataType == DATA_TYPE.数字 && <MenuItem>最小值</MenuItem>}
+            {props.dataType == DATA_TYPE.数字 && <MenuItem>求和</MenuItem>}
+            {props.dataType == DATA_TYPE.数字 && <MenuItem>标准偏差</MenuItem>}
+            {props.dataType == DATA_TYPE.数字 && <MenuItem>方差</MenuItem>}
+          </MenuList>
+        </MenuPopover>
+      </Menu>
+    );
+  }
 
-const List = () => {
-  const defaultSelectedItems = React.useMemo(() => new Set([1]), []);
+
+  /**
+   * 鼠标移动到姓名列上时,显示两个按钮
+   * @param item 包含姓名标签的对象
+   * @returns 返回 JSX 元素
+   */
+  const ChangeBtnShowType = (props) => {
+    const [showButton, setShowButton] = useState(false);
+    const handleMouseEnter = () => {
+      setShowButton(true);
+    };
+
+    const handleMouseLeave = () => {
+      setShowButton(false);
+    };
+
+    return (
+      <div
+        style={{
+          width: "100%",
+          display: "flex",
+          justifyContent: "space-between",
+          alignItems: "center",
+        }}
+        onMouseEnter={handleMouseEnter}
+        onMouseLeave={handleMouseLeave}
+      >
+        {props.cellData}
+        {showButton && (
+          <div>
+            <Tooltip content="更多操作" positioning="below">
+              <Button
+                appearance="subtle"
+                icon={<MoreHorizontal16Filled />}
+                onClick={() => {
+                  alert("更多操作");
+                }}
+              ></Button>
+            </Tooltip>
+            <Tooltip content="添加注释" positioning="below">
+              <Button appearance="subtle" icon={<CommentAdd16Regular />}></Button>
+            </Tooltip>
+          </div>
+        )}
+      </div>
+    );
+  };
 
   return (
     <DataGrid
-      items={items}
-      columns={columns}
-      selectionMode="single"
-      // sortable
+      items={[
+        {
+          序号: { label: 1 },
+          姓名: { label: "陈丹", icon: <DocumentRegular /> },
+          性别: { label: "女", status: "available" },
+          年龄: { label: "18岁", timestamp: 1 },
+          最后在线时间: { label: "2024/11/6 13:50" },
+        },
+        {
+          序号: { label: 2 },
+          姓名: { label: "蔡青松", icon: <FolderRegular /> },
+          性别: { label: "男", status: "busy" },
+          年龄: { label: "30岁", timestamp: 2 },
+          最后在线时间: { label: "2024/11/6 13:51" },
+        },
+        {
+          序号: { label: 3 },
+          姓名: { label: "杨东明", icon: <VideoRegular /> },
+          性别: { label: "男", status: "away" },
+          年龄: { label: "25岁", timestamp: 2 },
+          最后在线时间: { label: "2024/11/6 13:52" },
+        },
+        {
+          序号: { label: 4 },
+          姓名: { label: "吴瑞强", icon: <DocumentPdfRegular /> },
+          性别: { label: "男", status: "offline" },
+          年龄: { label: "25岁", timestamp: 3 },
+          最后在线时间: { label: "2024/11/6 13:53" },
+        },
+      ]}
+      columns={[
+        createTableColumn({
+          columnId: "序号",
+          fixed: true,
+          compare: (a, b) => {
+            return a.序号.label - b.序号.label;
+          },
+          renderHeaderCell: () => {
+            return (
+              <TableCellLayout media={<NumberCircle116Regular />}>
+                序号
+                <HeaderMenuList dataType={DATA_TYPE.数字} title="序号" columnId="序号" />
+              </TableCellLayout>
+            );
+          },
+          renderCell: (item) => {
+            return item.序号.label;
+          },
+        }),
+        createTableColumn({
+          columnId: "姓名",
+          compare: (a, b) => {
+            return a.姓名.label.localeCompare(b.姓名.label);
+          },
+          renderHeaderCell: () => {
+            return (
+              <TableCellLayout media={<TextField16Regular />}>
+                姓名
+                <HeaderMenuList dataType={DATA_TYPE.文本} title="姓名" columnId="姓名" />
+              </TableCellLayout>
+            );
+          },
+          renderCell: (item) => {
+            return <ChangeBtnShowType cellData={item.姓名.label} />
+          },
+        }),
+        createTableColumn({
+          columnId: "性别",
+          compare: (a, b) => {
+            return a.性别.label.localeCompare(b.性别.label);
+          },
+          renderHeaderCell: () => {
+            return (
+              <TableCellLayout media={<SelectAllOn16Regular />}>
+                性别
+                <HeaderMenuList dataType={DATA_TYPE.选项} title="性别" columnId="性别" />
+              </TableCellLayout>
+            );
+          },
+          renderCell: (item) => {
+            return item.性别.label;
+          },
+        }),
+        createTableColumn({
+          columnId: "年龄",
+          compare: (a, b) => {
+            return a.年龄.timestamp - b.年龄.timestamp;
+          },
+          renderHeaderCell: () => {
+            return (
+              <TableCellLayout media={<TextField16Regular />}>
+                年龄
+                <HeaderMenuList dataType={DATA_TYPE.文本} title="年龄" columnId="年龄" />
+              </TableCellLayout>
+            );
+          },
+
+          renderCell: (item) => {
+            return item.年龄.label;
+          },
+        }),
+        createTableColumn({
+          columnId: "最后在线时间",
+          compare: (a, b) => {
+            return new Date(a.最后在线时间.label) - new Date(b.最后在线时间.label);
+          },
+          renderHeaderCell: () => {
+            return (
+              <TableCellLayout media={<Calendar16Regular />}>
+                最后在线时间
+                <HeaderMenuList dataType={DATA_TYPE.日期} title="最后在线时间" columnId="最后在线时间" />
+              </TableCellLayout>
+            );
+          },
+          renderCell: (item) => {
+            return (
+              <TableCellLayout media={item.最后在线时间.icon}>
+                {item.最后在线时间.label}
+              </TableCellLayout>
+            );
+          },
+        }),
+      ]}
+      selectionMode="multiselect"
+      sortable
+      sortState={dataSortType}
       subtleSelection
       resizableColumns
       defaultSelectedItems={defaultSelectedItems}

+ 28 - 0
src/router/index.js

@@ -0,0 +1,28 @@
+import { createBrowserRouter } from "react-router-dom";
+import { App } from "../App";
+import Document from '../pages/document';
+import Home from '../pages/home';
+import ListNew from '../pages/listnew';
+
+const router = createBrowserRouter([
+    {
+        path: '/',
+        element: <App />,
+        children:[
+            {
+                path: '/document',
+                element: <Document/>
+            },
+            {
+                path: '/home',
+                element: <Home/>
+            },
+            {
+                path: '/listnew',
+                element: <ListNew/>
+            }
+        ]
+    }
+])
+
+export default router;

+ 1 - 1
tsconfig.json

@@ -18,7 +18,7 @@
     "resolveJsonModule": true,
     "isolatedModules": true,
     "noEmit": true,
-    "jsx": "react-jsx"
+    "jsx": "react",
   },
   "include": [
     "src"