|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import React, { useMemo, useState } from 'react'; |
|
|
import { Empty } from '@douyinfe/semi-ui'; |
|
|
import CardTable from '../../common/ui/CardTable'; |
|
|
import { |
|
|
IllustrationNoResult, |
|
|
IllustrationNoResultDark, |
|
|
} from '@douyinfe/semi-illustrations'; |
|
|
import { getDeploymentsColumns } from './DeploymentsColumnDefs'; |
|
|
|
|
|
|
|
|
import ViewLogsModal from './modals/ViewLogsModal'; |
|
|
import ExtendDurationModal from './modals/ExtendDurationModal'; |
|
|
import ViewDetailsModal from './modals/ViewDetailsModal'; |
|
|
import UpdateConfigModal from './modals/UpdateConfigModal'; |
|
|
import ConfirmationDialog from './modals/ConfirmationDialog'; |
|
|
|
|
|
const DeploymentsTable = (deploymentsData) => { |
|
|
const { |
|
|
deployments, |
|
|
loading, |
|
|
searching, |
|
|
activePage, |
|
|
pageSize, |
|
|
deploymentCount, |
|
|
compactMode, |
|
|
visibleColumns, |
|
|
setSelectedKeys, |
|
|
handlePageChange, |
|
|
handlePageSizeChange, |
|
|
handleRow, |
|
|
t, |
|
|
COLUMN_KEYS, |
|
|
|
|
|
startDeployment, |
|
|
restartDeployment, |
|
|
deleteDeployment, |
|
|
syncDeploymentToChannel, |
|
|
setEditingDeployment, |
|
|
setShowEdit, |
|
|
refresh, |
|
|
} = deploymentsData; |
|
|
|
|
|
|
|
|
const [selectedDeployment, setSelectedDeployment] = useState(null); |
|
|
const [showLogsModal, setShowLogsModal] = useState(false); |
|
|
const [showExtendModal, setShowExtendModal] = useState(false); |
|
|
const [showDetailsModal, setShowDetailsModal] = useState(false); |
|
|
const [showConfigModal, setShowConfigModal] = useState(false); |
|
|
const [showConfirmDialog, setShowConfirmDialog] = useState(false); |
|
|
const [confirmOperation, setConfirmOperation] = useState('delete'); |
|
|
|
|
|
|
|
|
const handleViewLogs = (deployment) => { |
|
|
setSelectedDeployment(deployment); |
|
|
setShowLogsModal(true); |
|
|
}; |
|
|
|
|
|
const handleExtendDuration = (deployment) => { |
|
|
setSelectedDeployment(deployment); |
|
|
setShowExtendModal(true); |
|
|
}; |
|
|
|
|
|
const handleViewDetails = (deployment) => { |
|
|
setSelectedDeployment(deployment); |
|
|
setShowDetailsModal(true); |
|
|
}; |
|
|
|
|
|
const handleUpdateConfig = (deployment, operation = 'update') => { |
|
|
setSelectedDeployment(deployment); |
|
|
if (operation === 'delete' || operation === 'destroy') { |
|
|
setConfirmOperation(operation); |
|
|
setShowConfirmDialog(true); |
|
|
} else { |
|
|
setShowConfigModal(true); |
|
|
} |
|
|
}; |
|
|
|
|
|
const handleConfirmAction = () => { |
|
|
if (selectedDeployment && confirmOperation === 'delete') { |
|
|
deleteDeployment(selectedDeployment.id); |
|
|
} |
|
|
setShowConfirmDialog(false); |
|
|
setSelectedDeployment(null); |
|
|
}; |
|
|
|
|
|
const handleModalSuccess = (updatedDeployment) => { |
|
|
|
|
|
refresh?.(); |
|
|
}; |
|
|
|
|
|
|
|
|
const allColumns = useMemo(() => { |
|
|
return getDeploymentsColumns({ |
|
|
t, |
|
|
COLUMN_KEYS, |
|
|
startDeployment, |
|
|
restartDeployment, |
|
|
deleteDeployment, |
|
|
setEditingDeployment, |
|
|
setShowEdit, |
|
|
refresh, |
|
|
activePage, |
|
|
deployments, |
|
|
|
|
|
onViewLogs: handleViewLogs, |
|
|
onExtendDuration: handleExtendDuration, |
|
|
onViewDetails: handleViewDetails, |
|
|
onUpdateConfig: handleUpdateConfig, |
|
|
onSyncToChannel: syncDeploymentToChannel, |
|
|
}); |
|
|
}, [ |
|
|
t, |
|
|
COLUMN_KEYS, |
|
|
startDeployment, |
|
|
restartDeployment, |
|
|
deleteDeployment, |
|
|
syncDeploymentToChannel, |
|
|
setEditingDeployment, |
|
|
setShowEdit, |
|
|
refresh, |
|
|
activePage, |
|
|
deployments, |
|
|
]); |
|
|
|
|
|
|
|
|
const getVisibleColumns = () => { |
|
|
return allColumns.filter((column) => visibleColumns[column.key]); |
|
|
}; |
|
|
|
|
|
const visibleColumnsList = useMemo(() => { |
|
|
return getVisibleColumns(); |
|
|
}, [visibleColumns, allColumns]); |
|
|
|
|
|
const tableColumns = useMemo(() => { |
|
|
if (compactMode) { |
|
|
|
|
|
return visibleColumnsList.map(({ fixed, width, ...rest }) => ({ |
|
|
...rest, |
|
|
width: width ? Math.max(width * 0.8, 80) : undefined, |
|
|
})); |
|
|
} |
|
|
return visibleColumnsList; |
|
|
}, [compactMode, visibleColumnsList]); |
|
|
|
|
|
return ( |
|
|
<> |
|
|
<CardTable |
|
|
columns={tableColumns} |
|
|
dataSource={deployments} |
|
|
scroll={compactMode ? { x: 800 } : { x: 1200 }} |
|
|
pagination={{ |
|
|
currentPage: activePage, |
|
|
pageSize: pageSize, |
|
|
total: deploymentCount, |
|
|
pageSizeOpts: [10, 20, 50, 100], |
|
|
showSizeChanger: true, |
|
|
onPageSizeChange: handlePageSizeChange, |
|
|
onPageChange: handlePageChange, |
|
|
}} |
|
|
hidePagination={true} |
|
|
expandAllRows={false} |
|
|
onRow={handleRow} |
|
|
rowSelection={{ |
|
|
onChange: (selectedRowKeys, selectedRows) => { |
|
|
setSelectedKeys(selectedRows); |
|
|
}, |
|
|
}} |
|
|
empty={ |
|
|
<Empty |
|
|
image={<IllustrationNoResult style={{ width: 150, height: 150 }} />} |
|
|
darkModeImage={ |
|
|
<IllustrationNoResultDark style={{ width: 150, height: 150 }} /> |
|
|
} |
|
|
description={t('搜索无结果')} |
|
|
style={{ padding: 30 }} |
|
|
/> |
|
|
} |
|
|
className='rounded-xl overflow-hidden' |
|
|
size='middle' |
|
|
loading={loading || searching} |
|
|
/> |
|
|
|
|
|
{/* Enhanced Modals */} |
|
|
<ViewLogsModal |
|
|
visible={showLogsModal} |
|
|
onCancel={() => setShowLogsModal(false)} |
|
|
deployment={selectedDeployment} |
|
|
t={t} |
|
|
/> |
|
|
|
|
|
<ExtendDurationModal |
|
|
visible={showExtendModal} |
|
|
onCancel={() => setShowExtendModal(false)} |
|
|
deployment={selectedDeployment} |
|
|
onSuccess={handleModalSuccess} |
|
|
t={t} |
|
|
/> |
|
|
|
|
|
<ViewDetailsModal |
|
|
visible={showDetailsModal} |
|
|
onCancel={() => setShowDetailsModal(false)} |
|
|
deployment={selectedDeployment} |
|
|
t={t} |
|
|
/> |
|
|
|
|
|
<UpdateConfigModal |
|
|
visible={showConfigModal} |
|
|
onCancel={() => setShowConfigModal(false)} |
|
|
deployment={selectedDeployment} |
|
|
onSuccess={handleModalSuccess} |
|
|
t={t} |
|
|
/> |
|
|
|
|
|
<ConfirmationDialog |
|
|
visible={showConfirmDialog} |
|
|
onCancel={() => setShowConfirmDialog(false)} |
|
|
onConfirm={handleConfirmAction} |
|
|
title={t('确认操作')} |
|
|
type="danger" |
|
|
deployment={selectedDeployment} |
|
|
operation={confirmOperation} |
|
|
t={t} |
|
|
/> |
|
|
</> |
|
|
); |
|
|
}; |
|
|
|
|
|
export default DeploymentsTable; |
|
|
|