import IconFont from '@/components/IconFont'; import TreeGroup from '@/components/shared/TreeGroup'; import { DEFAULT_PAGE_SIZE } from '@/constants'; import { apiSearchThings } from '@/services/master/ThingController'; import { EditOutlined, EnvironmentOutlined } from '@ant-design/icons'; import { ActionType, ProCard, ProColumns, ProTable, } from '@ant-design/pro-components'; import { FormattedMessage, useIntl } from '@umijs/max'; import { Button, Divider, Grid, Space, Tag, theme } from 'antd'; import message from 'antd/es/message'; import Paragraph from 'antd/lib/typography/Paragraph'; import { useRef, useState } from 'react'; import CreateDevice from './components/CreateDevice'; import EditDeviceModal from './components/EditDeviceModal'; const ManagerDevicePage = () => { const { useBreakpoint } = Grid; const intl = useIntl(); const screens = useBreakpoint(); const { token } = theme.useToken(); const actionRef = useRef(null); const [isLoading, setIsLoading] = useState(false); const [messageApi, contextHolder] = message.useMessage(); const [selectedRowsState, setSelectedRowsState] = useState< MasterModel.Thing[] >([]); const [groupCheckedKeys, setGroupCheckedKeys] = useState< string | string[] | null >(null); const [isEditModalVisible, setIsEditModalVisible] = useState(false); const [editingDevice, setEditingDevice] = useState( null, ); const handleClickAssign = (device: MasterModel.Thing) => { console.log('Device ', device); }; const handleEdit = (device: MasterModel.Thing) => { setEditingDevice(device); setIsEditModalVisible(true); }; const handleEditCancel = () => { setIsEditModalVisible(false); setEditingDevice(null); }; const handleEditSubmit = async (values: any) => { // TODO: call update API here if available. For now just simulate success. console.log('Update values for', editingDevice?.id, values); messageApi.success('Cập nhật thành công'); setIsEditModalVisible(false); setEditingDevice(null); actionRef.current?.reload(); }; const columns: ProColumns[] = [ { key: 'name', title: ( ), tip: intl.formatMessage({ id: 'master.devices.name.tip', defaultMessage: 'The device name', }), dataIndex: 'name', render: (_, record) => ( {record?.name} ), }, { key: 'external_id', title: ( ), tip: intl.formatMessage({ id: 'master.devices.external_id.tip', defaultMessage: 'The external identifier', }), responsive: ['lg', 'md'], dataIndex: ['metadata', 'external_id'], render: (_, record) => record?.metadata?.external_id ? ( {record?.metadata?.external_id} ) : ( '-' ), }, { key: 'type', hideInSearch: true, title: ( ), tip: intl.formatMessage({ id: 'master.devices.type.tip', defaultMessage: 'The device type', }), dataIndex: ['metadata', 'type'], render: (_, record) => record?.metadata?.type || '...', }, { key: 'connected', hideInSearch: true, title: , dataIndex: ['metadata', 'connected'], render: (_, record) => ( {record?.metadata?.connected ? intl.formatMessage({ id: 'master.devices.online', defaultMessage: 'Online', }) : intl.formatMessage({ id: 'master.devices.offline', defaultMessage: 'Offline', })} ), }, { title: ( ), hideInSearch: true, render: (_, device) => { return ( } >