模块增加分页
This commit is contained in:
@@ -6,8 +6,6 @@ class SupabaseService {
|
||||
let query = supabase
|
||||
.from(table)
|
||||
.select(options.select || "*", { count: "exact" });
|
||||
|
||||
// 处理精确匹配条件
|
||||
if (options.match) {
|
||||
query = query.match(options.match);
|
||||
}
|
||||
|
||||
@@ -68,11 +68,18 @@ const ServicePage = () => {
|
||||
},
|
||||
};
|
||||
|
||||
// 添加分页相关状态
|
||||
const [pagination, setPagination] = useState({
|
||||
current: 1,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
});
|
||||
|
||||
// 获取服务模板列表
|
||||
const fetchServices = async () => {
|
||||
const fetchServices = async (page = pagination.current, pageSize = pagination.pageSize) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
const { data: services } = await supabaseService.select("resources", {
|
||||
const { data: services, total } = await supabaseService.select("resources", {
|
||||
filter: {
|
||||
type: { eq: "serviceTemplate" },
|
||||
...(selectedType
|
||||
@@ -83,9 +90,17 @@ const ServicePage = () => {
|
||||
column: "created_at",
|
||||
ascending: false,
|
||||
},
|
||||
page,
|
||||
pageSize,
|
||||
});
|
||||
|
||||
setData(services || []);
|
||||
setPagination((prev) => ({
|
||||
...prev,
|
||||
current: page,
|
||||
pageSize,
|
||||
total,
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error("获取服务模板失败:", error);
|
||||
message.error("获取服务模板失败");
|
||||
@@ -93,12 +108,15 @@ const ServicePage = () => {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
setPagination((prev) => ({ ...prev, current: 1 }));
|
||||
fetchServices(1, pagination.pageSize);
|
||||
}, [selectedType]);
|
||||
|
||||
useEffect(() => {
|
||||
fetchUnits();
|
||||
}, []);
|
||||
useEffect(() => {
|
||||
fetchServices();
|
||||
}, [selectedType]);
|
||||
|
||||
const fetchUnits = async () => {
|
||||
setloadingUnits(true);
|
||||
@@ -864,8 +882,19 @@ const ServicePage = () => {
|
||||
rowExpandable: (record) => record.attributes.sections?.length > 0,
|
||||
}}
|
||||
pagination={{
|
||||
pageSize: 10,
|
||||
showTotal: (total) => `共 ${total} 条`,
|
||||
...pagination,
|
||||
showSizeChanger: true,
|
||||
showQuickJumper: true,
|
||||
showTotal: (total) => `共 ${total} 条记录`,
|
||||
onChange: (page, pageSize) => {
|
||||
// 页码或页大小改变时触发
|
||||
if (pageSize !== pagination.pageSize) {
|
||||
// 如果是页大小改变,重置到第一页
|
||||
fetchServices(1, pageSize);
|
||||
} else {
|
||||
fetchServices(page, pageSize);
|
||||
}
|
||||
},
|
||||
}}
|
||||
className="rounded-lg"
|
||||
/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { Table, Button, Form, Input, Space, message, Popconfirm, Drawer, Select, Segmented, Badge } from 'antd';
|
||||
import { PlusOutlined, FileTextOutlined, ProjectOutlined, CheckSquareOutlined } from '@ant-design/icons';
|
||||
import { Table, Button, Form, Input, Space, message, Popconfirm, Select, Segmented } from 'antd';
|
||||
import { PlusOutlined } from '@ant-design/icons';
|
||||
import { supabaseService } from '@/hooks/supabaseService';
|
||||
const Classify = ({activeType,typeList}) => {
|
||||
const [data, setData] = useState([]);
|
||||
@@ -8,8 +8,13 @@ const Classify = ({activeType,typeList}) => {
|
||||
const [editingKey, setEditingKey] = useState('');
|
||||
const [form] = Form.useForm();
|
||||
const [filterType, setFilterType] = useState('all'); // 'all', 'common', 'current'
|
||||
const [pagination, setPagination] = useState({
|
||||
current: 1,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
});
|
||||
|
||||
const fetchCategories = async (type = activeType, filterTypeValue = filterType) => {
|
||||
const fetchCategories = async (type = activeType, filterTypeValue = filterType, page = pagination.current, pageSize = pagination.pageSize) => {
|
||||
setLoading(true);
|
||||
try {
|
||||
let filterCondition;
|
||||
@@ -25,7 +30,7 @@ const Classify = ({activeType,typeList}) => {
|
||||
filterCondition = { in: `(${type},common)` };
|
||||
}
|
||||
|
||||
const { data: categories } = await supabaseService.select('resources', {
|
||||
const { data: categories, total } = await supabaseService.select('resources', {
|
||||
filter: {
|
||||
'type': { eq: 'categories' },
|
||||
'attributes->>template_type': filterCondition
|
||||
@@ -33,10 +38,18 @@ const Classify = ({activeType,typeList}) => {
|
||||
order: {
|
||||
column: 'created_at',
|
||||
ascending: false
|
||||
}
|
||||
},
|
||||
page,
|
||||
pageSize
|
||||
});
|
||||
|
||||
setData(categories || []);
|
||||
setPagination(prev => ({
|
||||
...prev,
|
||||
current: page,
|
||||
pageSize,
|
||||
total
|
||||
}));
|
||||
} catch (error) {
|
||||
message.error('获取分类数据失败');
|
||||
console.error(error);
|
||||
@@ -46,8 +59,9 @@ const Classify = ({activeType,typeList}) => {
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
fetchCategories(activeType, filterType);
|
||||
}, [activeType]);
|
||||
setPagination(prev => ({ ...prev, current: 1 }));
|
||||
fetchCategories(activeType, filterType, 1, pagination.pageSize);
|
||||
}, [activeType, filterType]);
|
||||
|
||||
|
||||
// 新增分类
|
||||
@@ -273,9 +287,17 @@ const Classify = ({activeType,typeList}) => {
|
||||
rowKey="id"
|
||||
loading={loading}
|
||||
pagination={{
|
||||
pageSize: 10,
|
||||
showTotal: (total) => `共 ${total} 条`,
|
||||
className: "px-4"
|
||||
...pagination,
|
||||
showSizeChanger: true,
|
||||
showQuickJumper: true,
|
||||
showTotal: (total) => `共 ${total} 条记录`,
|
||||
onChange: (page, pageSize) => {
|
||||
if (pageSize !== pagination.pageSize) {
|
||||
fetchCategories(activeType, filterType, 1, pageSize);
|
||||
} else {
|
||||
fetchCategories(activeType, filterType, page, pageSize);
|
||||
}
|
||||
}
|
||||
}}
|
||||
className="rounded-lg"
|
||||
/>
|
||||
|
||||
@@ -9,8 +9,10 @@ export default function SectionComponent({ activeType }) {
|
||||
return <QuataSections />;
|
||||
case "task":
|
||||
return <TaskSections />;
|
||||
case "project":
|
||||
return <Project/>
|
||||
default:
|
||||
return <Project></Project>;
|
||||
return <div>暂无数据</div>
|
||||
}
|
||||
};
|
||||
return <>{renderFn(activeType)}</>;
|
||||
|
||||
@@ -24,7 +24,6 @@ import { supabaseService } from '@/hooks/supabaseService';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import { supabase } from "@/config/supabase";
|
||||
|
||||
const { Text } = Typography;
|
||||
const TYPE = 'project';
|
||||
|
||||
const ProjectSections = () => {
|
||||
@@ -37,11 +36,15 @@ const ProjectSections = () => {
|
||||
const [formValues, setFormValues] = useState({});
|
||||
const [uploadModalVisible, setUploadModalVisible] = useState(false);
|
||||
const [currentAddItem, setCurrentAddItem] = useState(null);
|
||||
|
||||
const fetchSections = async () => {
|
||||
const [pagination, setPagination] = useState({
|
||||
current: 1,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
});
|
||||
const fetchSections = async (page = pagination.current, pageSize = pagination.pageSize) => {
|
||||
setLoading(true);
|
||||
try {
|
||||
const { data: sections } = await supabaseService.select('resources', {
|
||||
const { data: sections, total } = await supabaseService.select('resources', {
|
||||
filter: {
|
||||
'type': { eq: 'sections' },
|
||||
'attributes->>template_type': { eq: TYPE }
|
||||
@@ -49,9 +52,18 @@ const ProjectSections = () => {
|
||||
order: {
|
||||
column: 'created_at',
|
||||
ascending: false
|
||||
}
|
||||
},
|
||||
page,
|
||||
pageSize
|
||||
});
|
||||
|
||||
setData(sections || []);
|
||||
setPagination(prev => ({
|
||||
...prev,
|
||||
current: page,
|
||||
pageSize,
|
||||
total
|
||||
}));
|
||||
} catch (error) {
|
||||
message.error('获取模块数据失败');
|
||||
console.error(error);
|
||||
@@ -83,9 +95,9 @@ const ProjectSections = () => {
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
fetchSections();
|
||||
fetchSections(1, pagination.pageSize);
|
||||
fetchUnits();
|
||||
}, []);
|
||||
}, [TYPE]);
|
||||
|
||||
const handleAdd = () => {
|
||||
const newData = {
|
||||
@@ -151,7 +163,7 @@ const ProjectSections = () => {
|
||||
|
||||
message.success('保存成功');
|
||||
setEditingKey('');
|
||||
fetchSections();
|
||||
fetchSections(pagination.current, pagination.pageSize);
|
||||
} catch (error) {
|
||||
message.error('保存失败');
|
||||
console.error(error);
|
||||
@@ -162,7 +174,11 @@ const ProjectSections = () => {
|
||||
try {
|
||||
await supabaseService.delete('resources', { id: record.id });
|
||||
message.success('删除成功');
|
||||
fetchSections();
|
||||
if (data.length === 1 && pagination.current > 1) {
|
||||
fetchSections(pagination.current - 1, pagination.pageSize);
|
||||
} else {
|
||||
fetchSections(pagination.current, pagination.pageSize);
|
||||
}
|
||||
} catch (error) {
|
||||
message.error('删除失败');
|
||||
console.error(error);
|
||||
@@ -528,9 +544,19 @@ const ProjectSections = () => {
|
||||
rowKey="id"
|
||||
loading={loading}
|
||||
pagination={{
|
||||
pageSize: 10,
|
||||
showTotal: (total) => `共 ${total} 条`,
|
||||
className: "px-4"
|
||||
...pagination,
|
||||
showSizeChanger: true,
|
||||
showQuickJumper: true,
|
||||
showTotal: (total) => `共 ${total} 条记录`,
|
||||
pageSizeOptions: ['10', '20', '50', '100'],
|
||||
onChange: (page, pageSize) => {
|
||||
if (pageSize !== pagination.pageSize) {
|
||||
setPagination(prev => ({ ...prev, pageSize }));
|
||||
fetchSections(1, pageSize);
|
||||
} else {
|
||||
fetchSections(page, pageSize);
|
||||
}
|
||||
}
|
||||
}}
|
||||
className="rounded-lg"
|
||||
/>
|
||||
|
||||
@@ -27,11 +27,15 @@ const SectionsManagement = () => {
|
||||
const [loadingUnits,setLoadingUnits]=useState(false)
|
||||
const [units,setUnit]=useState([])
|
||||
const [formValues, setFormValues] = useState({});
|
||||
const fetchSections = async () => {
|
||||
const [pagination, setPagination] = useState({
|
||||
current: 1,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
});
|
||||
const fetchSections = async (page = pagination.current, pageSize = pagination.pageSize) => {
|
||||
setLoading(true);
|
||||
try {
|
||||
|
||||
const { data: sections } = await supabaseService.select('resources', {
|
||||
const { data: sections, total } = await supabaseService.select('resources', {
|
||||
filter: {
|
||||
'type': { eq: 'sections' },
|
||||
'attributes->>template_type': { eq: TYPE }
|
||||
@@ -39,10 +43,18 @@ const [formValues, setFormValues] = useState({});
|
||||
order: {
|
||||
column: 'created_at',
|
||||
ascending: false
|
||||
}
|
||||
},
|
||||
page,
|
||||
pageSize
|
||||
});
|
||||
|
||||
setData(sections || []);
|
||||
setPagination(prev => ({
|
||||
...prev,
|
||||
current: page,
|
||||
pageSize,
|
||||
total
|
||||
}));
|
||||
} catch (error) {
|
||||
message.error('获取模块数据失败');
|
||||
console.error(error);
|
||||
@@ -72,8 +84,7 @@ const [formValues, setFormValues] = useState({});
|
||||
}
|
||||
};
|
||||
useEffect(() => {
|
||||
fetchSections();
|
||||
|
||||
fetchSections(1, pagination.pageSize);
|
||||
}, [TYPE]);
|
||||
|
||||
const handleAdd = () => {
|
||||
@@ -115,7 +126,7 @@ const [formValues, setFormValues] = useState({});
|
||||
attributes: {
|
||||
name: values.name,
|
||||
template_type: TYPE,
|
||||
items: items.filter(item => item.name), // 只保存有名称的项目
|
||||
items: items.filter(item => item.name),
|
||||
},
|
||||
schema_version: 1
|
||||
});
|
||||
@@ -135,7 +146,7 @@ const [formValues, setFormValues] = useState({});
|
||||
|
||||
message.success('保存成功');
|
||||
setEditingKey('');
|
||||
fetchSections();
|
||||
fetchSections(pagination.current, pagination.pageSize);
|
||||
} catch (error) {
|
||||
message.error('保存失败');
|
||||
console.error(error);
|
||||
@@ -146,7 +157,11 @@ const [formValues, setFormValues] = useState({});
|
||||
try {
|
||||
await supabaseService.delete('resources', { id: record.id });
|
||||
message.success('删除成功');
|
||||
fetchSections();
|
||||
if (data.length === 1 && pagination.current > 1) {
|
||||
fetchSections(pagination.current - 1, pagination.pageSize);
|
||||
} else {
|
||||
fetchSections(pagination.current, pagination.pageSize);
|
||||
}
|
||||
} catch (error) {
|
||||
message.error('删除失败');
|
||||
console.error(error);
|
||||
@@ -450,9 +465,17 @@ const [formValues, setFormValues] = useState({});
|
||||
rowKey="id"
|
||||
loading={loading}
|
||||
pagination={{
|
||||
pageSize: 10,
|
||||
showTotal: (total) => `共 ${total} 条`,
|
||||
className: "px-4"
|
||||
...pagination,
|
||||
showSizeChanger: true,
|
||||
showQuickJumper: true,
|
||||
showTotal: (total) => `共 ${total} 条记录`,
|
||||
onChange: (page, pageSize) => {
|
||||
if (pageSize !== pagination.pageSize) {
|
||||
fetchSections(1, pageSize);
|
||||
} else {
|
||||
fetchSections(page, pageSize);
|
||||
}
|
||||
}
|
||||
}}
|
||||
className="rounded-lg"
|
||||
/>
|
||||
|
||||
@@ -18,7 +18,6 @@ import { supabaseService } from '@/hooks/supabaseService';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
const { Text } = Typography;
|
||||
const TYPE = 'task';
|
||||
|
||||
const TaskSections = () => {
|
||||
@@ -29,11 +28,16 @@ const TaskSections = () => {
|
||||
const [loadingUnits, setLoadingUnits] = useState(false);
|
||||
const [units, setUnit] = useState([]);
|
||||
const [formValues, setFormValues] = useState({});
|
||||
const [pagination, setPagination] = useState({
|
||||
current: 1,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
});
|
||||
|
||||
const fetchSections = async () => {
|
||||
const fetchSections = async (page = pagination.current, pageSize = pagination.pageSize) => {
|
||||
setLoading(true);
|
||||
try {
|
||||
const { data: sections } = await supabaseService.select('resources', {
|
||||
const { data: sections, total } = await supabaseService.select('resources', {
|
||||
filter: {
|
||||
'type': { eq: 'sections' },
|
||||
'attributes->>template_type': { eq: TYPE }
|
||||
@@ -41,9 +45,18 @@ const TaskSections = () => {
|
||||
order: {
|
||||
column: 'created_at',
|
||||
ascending: false
|
||||
}
|
||||
},
|
||||
page,
|
||||
pageSize
|
||||
});
|
||||
|
||||
setData(sections || []);
|
||||
setPagination(prev => ({
|
||||
...prev,
|
||||
current: page,
|
||||
pageSize,
|
||||
total
|
||||
}));
|
||||
} catch (error) {
|
||||
message.error('获取模块数据失败');
|
||||
console.error(error);
|
||||
@@ -75,9 +88,9 @@ const TaskSections = () => {
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
fetchSections();
|
||||
fetchSections(1, pagination.pageSize);
|
||||
fetchUnits();
|
||||
}, []);
|
||||
}, [TYPE]);
|
||||
|
||||
const handleAdd = () => {
|
||||
const newData = {
|
||||
@@ -144,7 +157,7 @@ const TaskSections = () => {
|
||||
|
||||
message.success('保存成功');
|
||||
setEditingKey('');
|
||||
fetchSections();
|
||||
fetchSections(pagination.current, pagination.pageSize);
|
||||
} catch (error) {
|
||||
message.error('保存失败');
|
||||
console.error(error);
|
||||
@@ -155,7 +168,11 @@ const TaskSections = () => {
|
||||
try {
|
||||
await supabaseService.delete('resources', { id: record.id });
|
||||
message.success('删除成功');
|
||||
fetchSections();
|
||||
if (data.length === 1 && pagination.current > 1) {
|
||||
fetchSections(pagination.current - 1, pagination.pageSize);
|
||||
} else {
|
||||
fetchSections(pagination.current, pagination.pageSize);
|
||||
}
|
||||
} catch (error) {
|
||||
message.error('删除失败');
|
||||
console.error(error);
|
||||
@@ -440,9 +457,19 @@ const TaskSections = () => {
|
||||
rowKey="id"
|
||||
loading={loading}
|
||||
pagination={{
|
||||
pageSize: 10,
|
||||
showTotal: (total) => `共 ${total} 条`,
|
||||
className: "px-4"
|
||||
...pagination,
|
||||
showSizeChanger: true,
|
||||
showQuickJumper: true,
|
||||
showTotal: (total) => `共 ${total} 条记录`,
|
||||
pageSizeOptions: ['10', '20', '50', '100'],
|
||||
onChange: (page, pageSize) => {
|
||||
if (pageSize !== pagination.pageSize) {
|
||||
setPagination(prev => ({ ...prev, pageSize }));
|
||||
fetchSections(1, pageSize);
|
||||
} else {
|
||||
fetchSections(page, pageSize);
|
||||
}
|
||||
}
|
||||
}}
|
||||
className="rounded-lg"
|
||||
/>
|
||||
|
||||
@@ -9,8 +9,13 @@ const UnitManagement = ({ activeType, typeList }) => {
|
||||
const [editingKey, setEditingKey] = useState('');
|
||||
const [form] = Form.useForm();
|
||||
const [filterType, setFilterType] = useState('all');
|
||||
const [pagination, setPagination] = useState({
|
||||
current: 1,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
});
|
||||
|
||||
const fetchUnits = async (type = activeType, filterTypeValue = filterType) => {
|
||||
const fetchUnits = async (type = activeType, filterTypeValue = filterType, page = pagination.current, pageSize = pagination.pageSize) => {
|
||||
setLoading(true);
|
||||
try {
|
||||
let filterCondition;
|
||||
@@ -26,7 +31,7 @@ const UnitManagement = ({ activeType, typeList }) => {
|
||||
filterCondition = { in: `(${type},common)` };
|
||||
}
|
||||
|
||||
const { data: units } = await supabaseService.select('resources', {
|
||||
const { data: units, total } = await supabaseService.select('resources', {
|
||||
filter: {
|
||||
'type': { eq: 'units' },
|
||||
'attributes->>template_type': filterCondition
|
||||
@@ -34,10 +39,18 @@ const UnitManagement = ({ activeType, typeList }) => {
|
||||
order: {
|
||||
column: 'created_at',
|
||||
ascending: false
|
||||
}
|
||||
},
|
||||
page,
|
||||
pageSize
|
||||
});
|
||||
|
||||
setData(units || []);
|
||||
setPagination(prev => ({
|
||||
...prev,
|
||||
current: page,
|
||||
pageSize,
|
||||
total
|
||||
}));
|
||||
} catch (error) {
|
||||
message.error('获取单位数据失败');
|
||||
console.error(error);
|
||||
@@ -47,8 +60,9 @@ const UnitManagement = ({ activeType, typeList }) => {
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
fetchUnits(activeType, filterType);
|
||||
}, [activeType]);
|
||||
setPagination(prev => ({ ...prev, current: 1 }));
|
||||
fetchUnits(activeType, filterType, 1, pagination.pageSize);
|
||||
}, [activeType, filterType]);
|
||||
|
||||
const handleAdd = () => {
|
||||
const newData = {
|
||||
@@ -269,9 +283,17 @@ const UnitManagement = ({ activeType, typeList }) => {
|
||||
rowKey="id"
|
||||
loading={loading}
|
||||
pagination={{
|
||||
pageSize: 10,
|
||||
showTotal: (total) => `共 ${total} 条`,
|
||||
className: "px-4"
|
||||
...pagination,
|
||||
showSizeChanger: true,
|
||||
showQuickJumper: true,
|
||||
showTotal: (total) => `共 ${total} 条记录`,
|
||||
onChange: (page, pageSize) => {
|
||||
if (pageSize !== pagination.pageSize) {
|
||||
fetchUnits(activeType, filterType, 1, pageSize);
|
||||
} else {
|
||||
fetchUnits(activeType, filterType, page, pageSize);
|
||||
}
|
||||
}
|
||||
}}
|
||||
className="rounded-lg"
|
||||
/>
|
||||
|
||||
@@ -13,7 +13,7 @@ import {
|
||||
TreeSelect
|
||||
} from 'antd';
|
||||
import { getAllRouteOptions, allRoutes } from '@/routes/routes';
|
||||
import { supabase } from '@/config/supabase';
|
||||
import { supabaseService } from '@/hooks/supabaseService';
|
||||
import { PlusOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons';
|
||||
|
||||
const { Title } = Typography;
|
||||
@@ -25,6 +25,11 @@ export default function MenuManagement() {
|
||||
const [menuList, setMenuList] = useState([]);
|
||||
const [form] = Form.useForm();
|
||||
const [roles, setRoles] = useState([]);
|
||||
const [pagination, setPagination] = useState({
|
||||
current: 1,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
});
|
||||
|
||||
// 获取所有路由选项
|
||||
const routeOptions = getAllRouteOptions();
|
||||
@@ -80,19 +85,31 @@ export default function MenuManagement() {
|
||||
];
|
||||
|
||||
// 获取菜单数据
|
||||
const fetchMenuList = async () => {
|
||||
try {
|
||||
const fetchMenuList = async (page = pagination.current, pageSize = pagination.pageSize) => {
|
||||
setLoading(true);
|
||||
const { data, error } = await supabase
|
||||
.from('resources')
|
||||
.select('*')
|
||||
.eq('type', TYPE)
|
||||
.order('created_at', { ascending: false });
|
||||
try {
|
||||
const { data: menus, total } = await supabaseService.select('resources', {
|
||||
filter: {
|
||||
'type': { eq: TYPE }
|
||||
},
|
||||
order: {
|
||||
column: 'created_at',
|
||||
ascending: false
|
||||
},
|
||||
page,
|
||||
pageSize
|
||||
});
|
||||
|
||||
if (error) throw error;
|
||||
setMenuList(data);
|
||||
setMenuList(menus || []);
|
||||
setPagination(prev => ({
|
||||
...prev,
|
||||
current: page,
|
||||
pageSize,
|
||||
total
|
||||
}));
|
||||
} catch (error) {
|
||||
message.error('获取数据失败:' + error.message);
|
||||
message.error('获取菜单数据失败');
|
||||
console.error(error);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
@@ -101,12 +118,12 @@ export default function MenuManagement() {
|
||||
// 获取角色列表
|
||||
const fetchRoles = async () => {
|
||||
try {
|
||||
const { data, error } = await supabase
|
||||
.from('roles')
|
||||
.select('*')
|
||||
.order('name');
|
||||
|
||||
if (error) throw error;
|
||||
const { data } = await supabaseService.select('roles', {
|
||||
order: {
|
||||
column: 'name',
|
||||
ascending: true
|
||||
}
|
||||
});
|
||||
setRoles(data || []);
|
||||
} catch (error) {
|
||||
message.error('获取角色数据失败');
|
||||
@@ -127,27 +144,20 @@ export default function MenuManagement() {
|
||||
}
|
||||
};
|
||||
|
||||
let result;
|
||||
if (form.getFieldValue('id')) {
|
||||
result = await supabase
|
||||
.from('resources')
|
||||
.update(menuData)
|
||||
.eq('id', form.getFieldValue('id'))
|
||||
.select();
|
||||
await supabaseService.update('resources',
|
||||
{ id: form.getFieldValue('id') },
|
||||
menuData
|
||||
);
|
||||
} else {
|
||||
result = await supabase
|
||||
.from('resources')
|
||||
.insert([menuData])
|
||||
.select();
|
||||
await supabaseService.insert('resources', menuData);
|
||||
}
|
||||
|
||||
if (result.error) throw result.error;
|
||||
|
||||
message.success('保存成功');
|
||||
setIsModalVisible(false);
|
||||
fetchMenuList();
|
||||
fetchMenuList(pagination.current, pagination.pageSize);
|
||||
} catch (error) {
|
||||
message.error('保存失败:' + error.message);
|
||||
message.error('保存失败:' + (error.message || '未知错误'));
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
@@ -168,19 +178,17 @@ export default function MenuManagement() {
|
||||
const handleDelete = async (id) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
const {data, error } = await supabase
|
||||
.from('resources')
|
||||
.delete()
|
||||
.eq('id', id);
|
||||
if (error) throw error;
|
||||
if(data.length>0){
|
||||
await supabaseService.delete('resources', { id });
|
||||
message.success('删除成功');
|
||||
fetchMenuList();
|
||||
|
||||
// 如果当前页只有一条数据且不是第一页,删除后自动跳转到上一页
|
||||
if (menuList.length === 1 && pagination.current > 1) {
|
||||
fetchMenuList(pagination.current - 1, pagination.pageSize);
|
||||
} else {
|
||||
message.error('删除失败');
|
||||
fetchMenuList(pagination.current, pagination.pageSize);
|
||||
}
|
||||
} catch (error) {
|
||||
message.error('删除失败:' + error.message);
|
||||
message.error('删除失败:' + (error.message || '未知错误'));
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
@@ -196,7 +204,7 @@ export default function MenuManagement() {
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
fetchMenuList();
|
||||
fetchMenuList(1, pagination.pageSize);
|
||||
fetchRoles();
|
||||
}, []);
|
||||
|
||||
@@ -221,6 +229,23 @@ export default function MenuManagement() {
|
||||
columns={columns}
|
||||
dataSource={menuList}
|
||||
loading={loading}
|
||||
pagination={{
|
||||
...pagination,
|
||||
showSizeChanger: true,
|
||||
showQuickJumper: true,
|
||||
showTotal: (total) => `共 ${total} 条记录`,
|
||||
pageSizeOptions: ['10', '20', '50', '100'],
|
||||
onChange: (page, pageSize) => {
|
||||
if (pageSize !== pagination.pageSize) {
|
||||
// 如果是改变每页条数,重置到第一页
|
||||
setPagination(prev => ({ ...prev, pageSize }));
|
||||
fetchMenuList(1, pageSize);
|
||||
} else {
|
||||
// 如果是改变页码,获取对应页数据
|
||||
fetchMenuList(page, pageSize);
|
||||
}
|
||||
}
|
||||
}}
|
||||
rowKey="id"
|
||||
/>
|
||||
|
||||
|
||||
@@ -52,7 +52,6 @@ export default function PermissionManagement() {
|
||||
resources:resource_id(*)
|
||||
`, { count: 'exact' });
|
||||
|
||||
// 添加排序
|
||||
if (params.field && params.order) {
|
||||
const ascending = params.order === 'ascend';
|
||||
query = query.order(params.field, { ascending });
|
||||
@@ -544,7 +543,16 @@ export default function PermissionManagement() {
|
||||
dataSource={permissions}
|
||||
rowKey="id"
|
||||
loading={loading}
|
||||
pagination={pagination}
|
||||
pagination={{
|
||||
...pagination,
|
||||
showSizeChanger: true,
|
||||
showQuickJumper: true,
|
||||
showTotal: (total) => `共 ${total} 条记录`,
|
||||
pageSizeOptions: ['10', '20', '50', '100'],
|
||||
onChange: (page, pageSize) => {
|
||||
setPagination(prev => ({ ...prev,page, pageSize }));
|
||||
}
|
||||
}}
|
||||
onChange={handleTableChange}
|
||||
className='w-full'
|
||||
/>
|
||||
|
||||
@@ -3,7 +3,7 @@ import { Table, Form, Button, Space, Popconfirm, Tag, message } from 'antd';
|
||||
import { EditOutlined, DeleteOutlined, SaveOutlined, CloseOutlined } from '@ant-design/icons';
|
||||
import { EditableCell } from './EditableCell';
|
||||
import { ExpandedMemberships } from './ExpandedMemberships';
|
||||
export const TeamTable = ({ tableLoading,pagination,dataSource, onTableChange,onDelete ,onUpdate}) => {
|
||||
export const TeamTable = ({ tableLoading,pagination,dataSource,setPagination, onTableChange,onDelete ,onUpdate}) => {
|
||||
const [form] = Form.useForm();
|
||||
const [editingKey, setEditingKey] = useState('');
|
||||
const [loading, setLoading] = useState(false);
|
||||
@@ -182,7 +182,6 @@ export const TeamTable = ({ tableLoading,pagination,dataSource, onTableChange,on
|
||||
<Form form={form} component={false}>
|
||||
<Table
|
||||
scroll={{ x: true}}
|
||||
pagination={pagination}
|
||||
loading={loading||tableLoading}
|
||||
components={{
|
||||
body: {
|
||||
@@ -193,6 +192,16 @@ export const TeamTable = ({ tableLoading,pagination,dataSource, onTableChange,on
|
||||
dataSource={dataSource}
|
||||
columns={mergedColumns}
|
||||
rowKey="id"
|
||||
pagination={{
|
||||
...pagination,
|
||||
showSizeChanger: true,
|
||||
showQuickJumper: true,
|
||||
showTotal: (total) => `共 ${total} 条记录`,
|
||||
pageSizeOptions: ['10', '20', '50', '100'],
|
||||
onChange: (page, pageSize) => {
|
||||
setPagination(prev => ({ ...prev,page, pageSize }));
|
||||
}
|
||||
}}
|
||||
expandable={{
|
||||
expandedRowRender: (record) => (
|
||||
<ExpandedMemberships
|
||||
|
||||
@@ -186,6 +186,7 @@ const TeamManagement = () => {
|
||||
<Card title="团队管理" >
|
||||
<TeamHeader onSearch={handleSearch} onAdd={handleAdd} />
|
||||
<TeamTable
|
||||
setPagination={setPagination}
|
||||
loading={loading}
|
||||
dataSource={teams}
|
||||
pagination={pagination}
|
||||
|
||||
Reference in New Issue
Block a user