1
0

2 Revīzijas 1db574f600 ... fdcbc8260a

Autors SHA1 Ziņojums Datums
  蔡青松 fdcbc8260a Merge branch 'master' of http://787255.xyz:4003/ydm/zl365 7 mēneši atpakaļ
  蔡青松 ff5e45fab6 列头弹出菜单排序 7 mēneši atpakaļ
1 mainītis faili ar 287 papildinājumiem un 268 dzēšanām
  1. 287 268
      src/pages/listnew/index.jsx

+ 287 - 268
src/pages/listnew/index.jsx

@@ -11,6 +11,7 @@ import {
   SelectAllOn16Regular,
   CommentAdd16Regular,
   MoreHorizontal16Filled,
+  NumberCircle116Regular
 } from "@fluentui/react-icons";
 import {
   DataGridBody,
@@ -31,299 +32,317 @@ import {
   MenuDivider,
 } from "@fluentui/react-components";
 
-//数据类型常量
-const DATA_TYPE = {
-  文本: "文本",
-  数字: "数字",
-  日期: "日期",
-  选项: "选项"
-}
 
-const items = [
-  {
-    序号: { label: 2 },
-    姓名: { label: "陈丹", icon: <DocumentRegular /> },
-    性别: { label: "女", status: "available" },
-    年龄: { label: "18岁", timestamp: 1 },
-    最后在线时间: { label: "2024/11/6 13:50" },
-  },
-  {
-    序号: { label: 1 },
-    姓名: { label: "蔡青松", icon: <FolderRegular /> },
-    性别: { label: "男", status: "busy" },
-    年龄: { label: "30岁", timestamp: 2 },
-    最后在线时间: { label: "2024/11/6 13:50" },
-  },
-  {
-    序号: { label: 3 },
-    姓名: { label: "杨东明", icon: <VideoRegular /> },
-    性别: { label: "男", status: "away" },
-    年龄: { label: "25岁", timestamp: 2 },
-    最后在线时间: { label: "2024/11/6 13:50" },
-  },
-  {
-    序号: { label: 4 },
-    姓名: { 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 - b.序号.label;
-    },
-    renderHeaderCell: () => {
-      return (
-        <TableCellLayout media={<TextField16Regular />}>
-          序号
-          <HeaderMenuList dataType={DATA_TYPE.数字} title="序号" />
-        </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="姓名" />
-        </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="性别" />
-        </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="年龄" />
-        </TableCellLayout>
-      );
-    },
-
-    renderCell: (item) => {
-      return item.年龄.label;
-    },
-  }),
-  createTableColumn({
-    columnId: "最后在线时间",
-    compare: (a, b) => {
-      return a.最后在线时间.label.localeCompare(b.最后在线时间.label);
-    },
-    renderHeaderCell: () => {
-      return (
-        <TableCellLayout media={<Calendar16Regular />}>
-          最后在线时间
-          <HeaderMenuList dataType={DATA_TYPE.日期} title="最后在线时间" />
-        </TableCellLayout>
-      );
-    },
-    renderCell: (item) => {
-      return (
-        <TableCellLayout media={item.最后在线时间.icon}>
-          {item.最后在线时间.label}
-        </TableCellLayout>
-      );
-    },
-  }),
-];
-
-/**
- * 列头下拉菜单
- * @param {*} dataType 表现类型
- */
-const HeaderMenuList = (props) => {
-  return (
-    <Menu>
-      <MenuTrigger disableButtonEnhancement>
-        <Button
-          appearance="subtle"
-          icon={<ChevronDown16Filled />}
-        ></Button>
-      </MenuTrigger>
-
-      <MenuPopover>
-        <MenuList>
-          <MenuItem onClick={() => {
-            alert("adfa");
-          }}>A到Z </MenuItem>
-          <MenuItem>Z到A</MenuItem>
-          <MenuDivider />
-          <MenuItem>筛选方式</MenuItem>
-          <MenuDivider />
-          <MenuItem>按“{props.title}”分组</MenuItem>
-          <MenuDivider />
-          <MenuItem><HeaderMenuColumnSet dataType={props.dataType} /></MenuItem>
-          <MenuDivider />
-          <MenuItem><HeaderMenuAmount dataType={props.dataType} /></MenuItem>
-        </MenuList>
-      </MenuPopover>
-    </Menu>
-  );
-}
+const List = () => {
+  const defaultSelectedItems = React.useMemo(() => new Set([1]), []);
 
-/**
- * 列设置的二级菜单
- * @returns 
- */
-const HeaderMenuColumnSet = (props) => {
-  return (
-    <Menu>
-      <MenuTrigger disableButtonEnhancement>
-        <MenuItem>列设置</MenuItem>
-      </MenuTrigger>
+  //数据类型常量
+  const DATA_TYPE = {
+    文本: "文本",
+    数字: "数字",
+    日期: "日期",
+    选项: "选项"
+  }
 
-      <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>
-  );
-}
+  /**
+   * 列头下拉菜单
+   * @param {*} dataType 表现类型
+   */
+  const HeaderMenuList = (props) => {
+    return (
+      <Menu>
+        <MenuTrigger disableButtonEnhancement>
+          <Button
+            appearance="subtle"
+            icon={<ChevronDown16Filled />}
+          ></Button>
+        </MenuTrigger>
 
-/**
- * 列头“合计”二级菜单
- */
-const HeaderMenuAmount = (props) => {
-  return (
-    <Menu>
-      <MenuTrigger disableButtonEnhancement>
-        <MenuItem>合计</MenuItem>
-      </MenuTrigger>
+        <MenuPopover>
+          <MenuList>
+            {props.dataType == DATA_TYPE.数字 && <MenuItem onClick={() => {
+              ascendingData(props.columnId);
+            }}>从小到大 </MenuItem>}
 
-      <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>
-  );
-}
+            {props.dataType == DATA_TYPE.数字 && <MenuItem onClick={() => {
+              descendingData(props.columnId);
+            }}>从大到小</MenuItem>}
 
+            {(props.dataType == DATA_TYPE.文本 || props.dataType == DATA_TYPE.选项) && <MenuItem onClick={() => {
+              ascendingData(props.columnId);
+            }}>A到Z </MenuItem>}
 
-/**
- * 鼠标移动到姓名列上时,显示两个按钮
- * @param item 包含姓名标签的对象
- * @returns 返回 JSX 元素
- */
-const ChangeBtnShowType = (props) => {
-  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}
-    >
-      {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>
-  );
-};
+            {(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 List = () => {
-  const defaultSelectedItems = React.useMemo(() => new Set([1]), []);
   const [dataSortType, setDataSortType] = useState(({
     sortColumn: "序号",
     sortDirection: "ascending",
   }));
-  const ascendingData = (props) => {
+  const ascendingData = (columnId) => {
     setDataSortType(({
-      sortColumn: "序号",
+      sortColumn: columnId,
       sortDirection: "ascending",
     }));
   }
-  const descendingData = (props) => {
+  const descendingData = (columnId) => {
     setDataSortType(({
-      sortColumn: "序号",
+      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>
+    );
+  }
+
+
+  /**
+   * 鼠标移动到姓名列上时,显示两个按钮
+   * @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"
+      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