Commit 6d9f6e40 authored by chenshouchao's avatar chenshouchao

feat: 云平台表格替换

parent 1db98e3f
...@@ -26,7 +26,7 @@ export type sortState = { ...@@ -26,7 +26,7 @@ export type sortState = {
interface IMyTableProps { interface IMyTableProps {
rows: Array<any>; // 表格数据 rows: Array<any>; // 表格数据
headCells: Array<any>; // 表头配置 headCells: Array<any>; // 表头配置
key?: string; // 表格数据的key tableKey?: string; // 表格数据的key
loading?: boolean; // 是否正在加载数据 loading?: boolean; // 是否正在加载数据
hasCheckbox?: boolean; // 是否有复选框 hasCheckbox?: boolean; // 是否有复选框
selectItems?: Array<any>; // 选中的项 selectItems?: Array<any>; // 选中的项
...@@ -50,7 +50,7 @@ const MyTable = (props: IMyTableProps) => { ...@@ -50,7 +50,7 @@ const MyTable = (props: IMyTableProps) => {
const { const {
rows, rows,
headCells, headCells,
key = "id", tableKey = "id",
loading = false, loading = false,
hasCheckbox = false, hasCheckbox = false,
selectItems = [], selectItems = [],
...@@ -204,12 +204,12 @@ const MyTable = (props: IMyTableProps) => { ...@@ -204,12 +204,12 @@ const MyTable = (props: IMyTableProps) => {
const onSelectAllClick = useCallback( const onSelectAllClick = useCallback(
(e: any) => { (e: any) => {
if (e.target.checked) { if (e.target.checked) {
setSelectItems && setSelectItems(rows.map((row) => row[key])); setSelectItems && setSelectItems(rows.map((row) => row[tableKey]));
} else { } else {
setSelectItems && setSelectItems([]); setSelectItems && setSelectItems([]);
} }
}, },
[setSelectItems, key, rows] [setSelectItems, tableKey, rows]
); );
const onSelectRowClick = useCallback( const onSelectRowClick = useCallback(
...@@ -360,7 +360,7 @@ const MyTable = (props: IMyTableProps) => { ...@@ -360,7 +360,7 @@ const MyTable = (props: IMyTableProps) => {
return ( return (
<TableBody> <TableBody>
{rows.map((row) => ( {rows.map((row) => (
<TableRow key={row[key]}> <TableRow key={row[tableKey]}>
{hasCheckbox && ( {hasCheckbox && (
<TableCell <TableCell
align="left" align="left"
...@@ -368,10 +368,11 @@ const MyTable = (props: IMyTableProps) => { ...@@ -368,10 +368,11 @@ const MyTable = (props: IMyTableProps) => {
> >
<Checkbox <Checkbox
checked={ checked={
selectItems.filter((selectItem) => selectItem === row[key]) selectItems.filter(
.length > 0 (selectItem) => selectItem === row[tableKey]
).length > 0
} }
onChange={(e) => onSelectRowClick(e, row[key])} onChange={(e) => onSelectRowClick(e, row[tableKey])}
/> />
</TableCell> </TableCell>
)} )}
...@@ -410,7 +411,7 @@ const MyTable = (props: IMyTableProps) => { ...@@ -410,7 +411,7 @@ const MyTable = (props: IMyTableProps) => {
); );
}, [ }, [
rows, rows,
key, tableKey,
hasCheckbox, hasCheckbox,
selectItems, selectItems,
onSelectRowClick, onSelectRowClick,
......
...@@ -9,15 +9,17 @@ ...@@ -9,15 +9,17 @@
import { toJS } from "mobx"; import { toJS } from "mobx";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import _ from "lodash"; import _ from "lodash";
import { memo, useCallback, useEffect, useMemo, useState } from "react"; import { memo, useCallback, useEffect, useState } from "react";
import { Box, OutlinedInput } from "@mui/material"; import { Box } from "@mui/material";
import Dialog from "@/components/mui/MyDialog"; import Dialog from "@/components/mui/MyDialog";
import useMyRequest from "@/hooks/useMyRequest"; import useMyRequest from "@/hooks/useMyRequest";
import { useStores } from "@/store"; import { useStores } from "@/store";
import { useMessage } from "@/components/MySnackbar"; import { useMessage } from "@/components/MySnackbar";
import MyBorderlessSelect, { IOption } from "@/components/mui/MyBorderlessSelect"; import MyBorderlessSelect, {
import MyTable from "@/components/mui/MyTable"; IOption,
} from "@/components/mui/MyBorderlessSelect";
import MyTable from "@/components/mui/MyTableNew";
import SearchInput from "@/components/BusinessComponents/SearchInput"; import SearchInput from "@/components/BusinessComponents/SearchInput";
import { import {
addProjectUser, addProjectUser,
...@@ -35,7 +37,6 @@ const AddMember = observer((props: IProps) => { ...@@ -35,7 +37,6 @@ const AddMember = observer((props: IProps) => {
const { addMemberDialog, setAddMemberDialog, getTableList } = props; const { addMemberDialog, setAddMemberDialog, getTableList } = props;
const { currentProjectStore } = useStores(); const { currentProjectStore } = useStores();
const [tableData, setTableData] = useState([]); const [tableData, setTableData] = useState([]);
const [projectMember, setProjectMember] = useState(""); const [projectMember, setProjectMember] = useState("");
const [filterTableData, setFilterTableData] = useState([]); const [filterTableData, setFilterTableData] = useState([]);
...@@ -54,30 +55,29 @@ const AddMember = observer((props: IProps) => { ...@@ -54,30 +55,29 @@ const AddMember = observer((props: IProps) => {
[tableData] [tableData]
); );
const columns = useMemo(() => { const columns = [
return [ { id: "username", label: "项目成员", width: 200 },
{ id: "checkbox", width: 50 }, {
{ id: "username", label: "项目成员", width: 160 }, id: "projectRole",
{ label: "项目权限",
id: "projectRole", width: 100,
label: "项目权限", },
width: 160, ];
render: (item: string, row: any, index: number) => {
const defaultValue = selectOptions.filter( const randerRole = (item: any, index: number) => {
(every) => every.value === item const defaultValue = selectOptions.filter(
); (every) => every.value === item.projectRole
return ( );
<MyBorderlessSelect return (
value={defaultValue?.length ? defaultValue[0]?.value : "VIEWER"} <MyBorderlessSelect
onChange={(val) => changePermission(val, index)} value={defaultValue?.length ? defaultValue[0]?.value : "VIEWER"}
options={selectOptions} onChange={(val) => changePermission(val, index)}
size="small" options={selectOptions}
/> size="small"
); sx={{ position: "relative", left: "-13px" }}
}, />
}, );
]; };
}, [changePermission, selectOptions]);
/** 过滤表格数据 */ /** 过滤表格数据 */
useEffect(() => { useEffect(() => {
...@@ -93,11 +93,14 @@ const AddMember = observer((props: IProps) => { ...@@ -93,11 +93,14 @@ const AddMember = observer((props: IProps) => {
}, [projectMember, tableData]); }, [projectMember, tableData]);
// 获取表格数据接口 // 获取表格数据接口
const { run: getProjectUsersList } = useMyRequest(fetchProjectUsersList, { const { run: getProjectUsersList, loading } = useMyRequest(
onSuccess: (res: any) => { fetchProjectUsersList,
setTableData(res?.data); {
}, onSuccess: (res: any) => {
}); setTableData(res?.data);
},
}
);
// 获取项目权限 // 获取项目权限
const { run: getProjectPower } = useMyRequest(fetchProjectPower, { const { run: getProjectPower } = useMyRequest(fetchProjectPower, {
...@@ -173,23 +176,22 @@ const AddMember = observer((props: IProps) => { ...@@ -173,23 +176,22 @@ const AddMember = observer((props: IProps) => {
placeholder="搜索项目成员" placeholder="搜索项目成员"
sx={{ mb: 2 }} sx={{ mb: 2 }}
/> />
<div style={{ overflow: "overlay", maxHeight: 400 }}> <div style={{ height: "320px" }}>
<MyTable <MyTable
noDataText={ noDataText={
projectMember ? `暂无 "${projectMember}" 搜索结果` : undefined projectMember ? `暂无 "${projectMember}" 搜索结果` : undefined
} }
tableContainerStyle={{ height: 346 }} tableKey="username"
checkboxData={(val: string[]) => setCheckData(val)} hasCheckbox={true}
param="username" selectItems={checkData}
disabledParam={"enabled"} setSelectItems={setCheckData}
rowHover={true} fixedHead={true}
stickyHeader={true} rows={filterTableData.map((item: any, idnex) => ({
rows={filterTableData} ...item,
rowsPerPage="99" projectRole: randerRole(item, idnex),
}))}
headCells={columns} headCells={columns}
footer={false} loading={loading}
tableStyle={{ minWidth: "auto" }}
borderBottom="none"
/> />
</div> </div>
</Box> </Box>
......
.headerBox { .headerBox {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 20px; margin-bottom: 20px;
} }
.removeItemBox { .removeItemBox {
color: #ff4e4e; color: #ff4e4e;
margin-left: 32px; margin-left: 32px;
cursor: pointer; cursor: pointer;
}
.tableBox {
height: calc(100vh - 300px);
} }
...@@ -7,15 +7,12 @@ ...@@ -7,15 +7,12 @@
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
import { memo, useCallback, useEffect, useMemo, useState } from "react"; import { memo, useCallback, useEffect, useMemo, useState } from "react";
import _ from "lodash";
import OutlinedInput from "@mui/material/OutlinedInput";
import { Box } from "@mui/material"; import { Box } from "@mui/material";
import SearchIcon from "@mui/icons-material/Search";
import Add from "@mui/icons-material/Add"; import Add from "@mui/icons-material/Add";
import { toJS } from "mobx"; import { toJS } from "mobx";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import MyTable from "@/components/mui/MyTable"; import MyTable from "@/components/mui/MyTableNew";
import { IResponse, useHttp } from "@/api/http"; import { IResponse, useHttp } from "@/api/http";
import RemoveItem from "./components/RemoveItem"; import RemoveItem from "./components/RemoveItem";
import ChangePermission from "./components/ChangePermission"; import ChangePermission from "./components/ChangePermission";
...@@ -52,44 +49,44 @@ const ProjectMembers = observer(() => { ...@@ -52,44 +49,44 @@ const ProjectMembers = observer(() => {
const [projectName, setProjectMember] = useState(""); const [projectName, setProjectMember] = useState("");
/** 过滤后数据 */ /** 过滤后数据 */
const [filterTableData, setFilterTableData] = useState([]); const [filterTableData, setFilterTableData] = useState([]);
const [loading, setLoading] = useState(false);
const randerOperation = (item: any) => {
return item?.projectRole === "OWNER" ? null : (
<>
<span
style={{ color: "#1370FF", cursor: "pointer" }}
onClick={() => {
onPermissionBtn(item);
}}
>
更改权限
</span>
<span
className={styles.removeItemBox}
onClick={() => {
onRemoveItemBtn(item.username);
}}
>
移出项目
</span>
</>
);
};
const columns = useMemo(() => { const columns = useMemo(() => {
const val: any = [ let val: any = [
{ id: "username", label: "成员名称" }, { id: "username", label: "成员名称", width: 200 },
{ id: "projectRoleDesc", label: "项目权限" }, { id: "projectRoleDesc", label: "项目权限", width: 200 },
{ id: "phone", label: "联系方式" }, { id: "phone", label: "联系方式" },
...(projectRole !== "OWNER"
? []
: [
{
id: "operation",
label: "操作",
width: 160,
render: (item: any, row: any) => {
return row?.projectRole === "OWNER" ? null : (
<>
<span
style={{ color: "#1370FF", cursor: "pointer" }}
onClick={() => {
onPermissionBtn(row);
}}
>
更改权限
</span>
<span
className={styles.removeItemBox}
onClick={() => {
onRemoveItemBtn(row.username);
}}
>
移出项目
</span>
</>
);
},
},
]),
]; ];
if (projectRole === "OWNER") {
val.push({
id: "operation",
label: "操作",
width: 180,
});
}
return val; return val;
}, [projectRole]); }, [projectRole]);
...@@ -97,14 +94,19 @@ const ProjectMembers = observer(() => { ...@@ -97,14 +94,19 @@ const ProjectMembers = observer(() => {
const getTableList = useCallback(() => { const getTableList = useCallback(() => {
const projectInfo = toJS(currentProjectStore?.currentProjectInfo); const projectInfo = toJS(currentProjectStore?.currentProjectInfo);
if (!projectInfo?.id) return; if (!projectInfo?.id) return;
setLoading(true);
http http
.get<IResponse<any>>("/cpp/project/get", { .get<IResponse<any>>("/cpp/project/get", {
params: { id: projectInfo?.id || "" }, params: { id: projectInfo?.id || "" },
}) })
.then((res) => { .then((res) => {
setLoading(false);
const { data = {} } = res; const { data = {} } = res;
setTableData(data?.members || []); setTableData(data?.members || []);
setProjectRole(data?.projectRole || ""); setProjectRole(data?.projectRole || "");
})
.catch(() => {
setLoading(false);
}); });
}, [currentProjectStore?.currentProjectInfo, http]); }, [currentProjectStore?.currentProjectInfo, http]);
...@@ -142,12 +144,12 @@ const ProjectMembers = observer(() => { ...@@ -142,12 +144,12 @@ const ProjectMembers = observer(() => {
projectRole: row?.projectRole || "", projectRole: row?.projectRole || "",
}); });
}; };
// 回车搜索 // 回车搜索
const handleKeyWordChangeKeyUp = (e: any) => { const handleKeyWordChangeKeyUp = (e: any) => {
if (e.keyCode === 13) { if (e.keyCode === 13) {
setProjectMember(e.target.value); setProjectMember(e.target.value);
} }
} };
return ( return (
<> <>
...@@ -159,7 +161,7 @@ const ProjectMembers = observer(() => { ...@@ -159,7 +161,7 @@ const ProjectMembers = observer(() => {
/> />
{currentProjectStore?.currentProjectInfo?.projectRole === "OWNER" ? ( {currentProjectStore?.currentProjectInfo?.projectRole === "OWNER" ? (
<MyButton <MyButton
text='添加成员' text="添加成员"
style={{ backgroundColor: "#1370FF " }} style={{ backgroundColor: "#1370FF " }}
variant="contained" variant="contained"
onClick={onAddMember} onClick={onAddMember}
...@@ -168,16 +170,18 @@ const ProjectMembers = observer(() => { ...@@ -168,16 +170,18 @@ const ProjectMembers = observer(() => {
/> />
) : null} ) : null}
</Box> </Box>
<MyTable <div className={styles.tableBox}>
rowHover={true} <MyTable
stickyHeader={true} fixedHead={true}
rows={filterTableData} rows={filterTableData.map((item: any, index) => ({
rowsPerPage={"99"} ...item,
headCells={columns} operation: randerOperation(item),
footer={false} }))}
tableStyle={{ minWidth: "auto" }} tableKey="username"
borderBottom={"none"} headCells={columns}
/> loading={loading}
/>
</div>
<RemoveItem <RemoveItem
removeDialog={removeDialog} removeDialog={removeDialog}
setRemoveDialog={setRemoveDialog} setRemoveDialog={setRemoveDialog}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment