feat: 支持表格单元格快捷编辑
This commit is contained in:
@@ -4,6 +4,7 @@ import type { ColumnsType } from 'antd/es/table';
|
||||
import { PlusOutlined } from '@ant-design/icons';
|
||||
import api from '../api';
|
||||
import PermissionButton from '../components/PermissionButton';
|
||||
import EditableCell from '../components/EditableCell';
|
||||
import { message } from '../ui/app-message';
|
||||
|
||||
interface ClassroomOption {
|
||||
@@ -119,6 +120,12 @@ const AttendanceDevicesPage: React.FC = () => {
|
||||
}
|
||||
};
|
||||
|
||||
const saveCell = async (record: AttendanceDeviceRow, field: string, value: unknown) => {
|
||||
await api.put(`/attendance-devices/${record.id}`, { [field]: value });
|
||||
message.success('已保存');
|
||||
await loadData();
|
||||
};
|
||||
|
||||
const handleDelete = async (id: number) => {
|
||||
try {
|
||||
await api.delete(`/attendance-devices/${id}`);
|
||||
@@ -130,37 +137,102 @@ const AttendanceDevicesPage: React.FC = () => {
|
||||
};
|
||||
|
||||
const columns: ColumnsType<AttendanceDeviceRow> = [
|
||||
{ title: '设备名称', dataIndex: 'deviceName', width: 180 },
|
||||
{
|
||||
title: '设备名称',
|
||||
dataIndex: 'deviceName',
|
||||
width: 180,
|
||||
render: (value: string, record) => (
|
||||
<EditableCell
|
||||
value={value}
|
||||
required
|
||||
permission="classroom:edit"
|
||||
onSave={(next) => saveCell(record, 'deviceName', next)}
|
||||
>
|
||||
{value}
|
||||
</EditableCell>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: 'SN 码',
|
||||
dataIndex: 'deviceSn',
|
||||
width: 220,
|
||||
render: (value) => <span style={{ fontFamily: 'monospace' }}>{value}</span>,
|
||||
render: (value, record) => (
|
||||
<EditableCell
|
||||
value={value}
|
||||
required
|
||||
permission="classroom:edit"
|
||||
onSave={(next) => saveCell(record, 'deviceSn', next)}
|
||||
>
|
||||
<span style={{ fontFamily: 'monospace' }}>{value}</span>
|
||||
</EditableCell>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '绑定教室',
|
||||
dataIndex: ['classroom', 'name'],
|
||||
width: 160,
|
||||
render: (_value, record) => record.classroom?.name || `教室 ${record.classroomId}`,
|
||||
render: (_value, record) => (
|
||||
<EditableCell
|
||||
value={record.classroomId}
|
||||
editor="select"
|
||||
options={classrooms.map((item) => ({
|
||||
value: item.id,
|
||||
label: item.building ? `${item.building} · ${item.name}` : item.name,
|
||||
}))}
|
||||
permission="classroom:edit"
|
||||
required
|
||||
onSave={(next) => saveCell(record, 'classroomId', next)}
|
||||
>
|
||||
{record.classroom?.name || `教室 ${record.classroomId}`}
|
||||
</EditableCell>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '位置',
|
||||
dataIndex: 'location',
|
||||
render: (value) => value || <span style={{ color: '#999' }}>—</span>,
|
||||
render: (value, record) => (
|
||||
<EditableCell
|
||||
value={value}
|
||||
permission="classroom:edit"
|
||||
onSave={(next) => saveCell(record, 'location', next)}
|
||||
>
|
||||
{value || <span style={{ color: '#999' }}>—</span>}
|
||||
</EditableCell>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '状态',
|
||||
dataIndex: 'status',
|
||||
width: 90,
|
||||
render: (value: keyof typeof statusMeta) => (
|
||||
<Tag color={statusMeta[value]?.color}>{statusMeta[value]?.text || value}</Tag>
|
||||
render: (value: keyof typeof statusMeta, record) => (
|
||||
<EditableCell
|
||||
value={value}
|
||||
editor="select"
|
||||
options={[
|
||||
{ value: 'active', label: '启用' },
|
||||
{ value: 'disabled', label: '停用' },
|
||||
]}
|
||||
permission="classroom:edit"
|
||||
onSave={(next) => saveCell(record, 'status', next)}
|
||||
>
|
||||
<Tag color={statusMeta[value]?.color}>{statusMeta[value]?.text || value}</Tag>
|
||||
</EditableCell>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '备注',
|
||||
dataIndex: 'notes',
|
||||
ellipsis: true,
|
||||
render: (value) => value || <span style={{ color: '#999' }}>—</span>,
|
||||
render: (value, record) => (
|
||||
<EditableCell
|
||||
value={value}
|
||||
editor="textarea"
|
||||
permission="classroom:edit"
|
||||
onSave={(next) => saveCell(record, 'notes', next)}
|
||||
>
|
||||
{value || <span style={{ color: '#999' }}>—</span>}
|
||||
</EditableCell>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
|
||||
Reference in New Issue
Block a user