280 lines
9.5 KiB
JavaScript
280 lines
9.5 KiB
JavaScript
import React, { useState } from 'react';
|
|
import { ListGenerator } from '../../components/forms/listGenerator';
|
|
import { FormGenerator } from '../../components/forms/formGenerator';
|
|
|
|
const AITasksDashboard = () => {
|
|
const [selectedTask, setSelectedTask] = useState(null);
|
|
const [tasks, setTasks] = useState([
|
|
{
|
|
id: 1,
|
|
name: 'Task A',
|
|
type: 'Training',
|
|
status: 'In Progress',
|
|
lastModified: '2024-03-20',
|
|
progress: 45
|
|
},
|
|
{
|
|
id: 2,
|
|
name: 'Task B',
|
|
type: 'Inference',
|
|
status: 'Completed',
|
|
lastModified: '2024-03-19',
|
|
progress: 100
|
|
}
|
|
]);
|
|
const [isFormVisible, setIsFormVisible] = useState(false);
|
|
const [formMode, setFormMode] = useState('create');
|
|
const [message, setMessage] = useState({ type: '', text: '' });
|
|
|
|
const handleTaskSelect = (task) => {
|
|
setSelectedTask(task);
|
|
};
|
|
|
|
const handleTaskAction = (action, task) => {
|
|
switch (action) {
|
|
case 'delete':
|
|
handleDeleteTask(task.id);
|
|
break;
|
|
case 'edit':
|
|
handleEditTask(task);
|
|
break;
|
|
case 'cancel':
|
|
handleCancelTask(task.id);
|
|
break;
|
|
case 'restart':
|
|
handleRestartTask(task.id);
|
|
break;
|
|
default:
|
|
console.log('Unknown action:', action);
|
|
}
|
|
};
|
|
|
|
const handleCreateTask = () => {
|
|
setFormMode('create');
|
|
setIsFormVisible(true);
|
|
setSelectedTask(null);
|
|
};
|
|
|
|
const handleEditTask = (task) => {
|
|
setFormMode('edit');
|
|
setIsFormVisible(true);
|
|
setSelectedTask(task);
|
|
};
|
|
|
|
const handleDeleteTask = (taskId) => {
|
|
setTasks(tasks.filter(task => task.id !== taskId));
|
|
if (selectedTask?.id === taskId) {
|
|
setSelectedTask(null);
|
|
}
|
|
setMessage({ type: 'success', text: 'Task has been deleted' });
|
|
};
|
|
|
|
const handleCancelTask = (taskId) => {
|
|
setTasks(tasks.map(task =>
|
|
task.id === taskId
|
|
? { ...task, status: 'Cancelled', progress: 0 }
|
|
: task
|
|
));
|
|
setMessage({ type: 'success', text: 'Task has been cancelled' });
|
|
};
|
|
|
|
const handleRestartTask = (taskId) => {
|
|
setTasks(tasks.map(task =>
|
|
task.id === taskId
|
|
? { ...task, status: 'In Progress', progress: 0 }
|
|
: task
|
|
));
|
|
setMessage({ type: 'success', text: 'Task has been restarted' });
|
|
};
|
|
|
|
const handleFormSubmit = (formData) => {
|
|
if (formMode === 'create') {
|
|
const newTask = {
|
|
id: tasks.length + 1,
|
|
...formData,
|
|
lastModified: new Date().toISOString().split('T')[0],
|
|
status: 'In Progress',
|
|
progress: 0
|
|
};
|
|
setTasks([...tasks, newTask]);
|
|
setMessage({ type: 'success', text: 'Task has been created' });
|
|
} else {
|
|
setTasks(tasks.map(task =>
|
|
task.id === selectedTask.id
|
|
? { ...task, ...formData, lastModified: new Date().toISOString().split('T')[0] }
|
|
: task
|
|
));
|
|
setMessage({ type: 'success', text: 'Task has been updated' });
|
|
}
|
|
setIsFormVisible(false);
|
|
};
|
|
|
|
const handleFormCancel = () => {
|
|
setIsFormVisible(false);
|
|
setSelectedTask(null);
|
|
};
|
|
|
|
const getTaskActions = (task) => {
|
|
const actions = [];
|
|
|
|
if (task.status === 'In Progress') {
|
|
actions.push({
|
|
label: 'Cancel',
|
|
action: 'cancel',
|
|
className: 'cancel-button'
|
|
});
|
|
} else if (task.status === 'Completed' || task.status === 'Cancelled') {
|
|
actions.push({
|
|
label: 'Restart',
|
|
action: 'restart',
|
|
className: 'restart-button'
|
|
});
|
|
}
|
|
|
|
actions.push(
|
|
{
|
|
label: 'Edit',
|
|
action: 'edit',
|
|
className: 'update-button'
|
|
},
|
|
{
|
|
label: 'Delete',
|
|
action: 'delete',
|
|
className: 'delete-button'
|
|
}
|
|
);
|
|
|
|
return actions;
|
|
};
|
|
|
|
const formFields = [
|
|
{
|
|
name: 'name',
|
|
label: 'Task Name',
|
|
type: 'text',
|
|
required: true,
|
|
value: selectedTask?.name || ''
|
|
},
|
|
{
|
|
name: 'type',
|
|
label: 'Task Type',
|
|
type: 'select',
|
|
required: true,
|
|
options: [
|
|
{ value: 'Training', label: 'Training' },
|
|
{ value: 'Inference', label: 'Inference' },
|
|
{ value: 'Evaluation', label: 'Evaluation' }
|
|
],
|
|
value: selectedTask?.type || 'Training'
|
|
},
|
|
{
|
|
name: 'status',
|
|
label: 'Status',
|
|
type: 'select',
|
|
required: true,
|
|
options: [
|
|
{ value: 'In Progress', label: 'In Progress' },
|
|
{ value: 'Completed', label: 'Completed' },
|
|
{ value: 'Failed', label: 'Failed' },
|
|
{ value: 'Cancelled', label: 'Cancelled' }
|
|
],
|
|
value: selectedTask?.status || 'In Progress'
|
|
}
|
|
];
|
|
|
|
return (
|
|
<div className="list-container">
|
|
<div className="dashboard-header">
|
|
<h2>AI Tasks</h2>
|
|
<button
|
|
className="create-button"
|
|
onClick={handleCreateTask}
|
|
>
|
|
<i className="fas fa-plus"></i>
|
|
Task
|
|
</button>
|
|
</div>
|
|
|
|
{message.text && (
|
|
<div className={`message ${message.type}`}>
|
|
{message.text}
|
|
</div>
|
|
)}
|
|
|
|
{isFormVisible && (
|
|
<div className="form-overlay">
|
|
<div className="form-container">
|
|
<FormGenerator
|
|
fields={formFields}
|
|
onSubmit={handleFormSubmit}
|
|
onCancel={handleFormCancel}
|
|
title={formMode === 'create' ? 'Create new task' : 'Edit task'}
|
|
/>
|
|
</div>
|
|
</div>
|
|
)}
|
|
|
|
<ListGenerator
|
|
data={tasks}
|
|
selectedItem={selectedTask}
|
|
onItemSelect={handleTaskSelect}
|
|
onItemAction={handleTaskAction}
|
|
getItemActions={getTaskActions}
|
|
renderItem={(task) => (
|
|
<div className="list-row">
|
|
<div className="item-info">
|
|
<div className="item-name">{task.name}</div>
|
|
<div className="item-type">{task.type}</div>
|
|
<div className={`item-status ${task.status.toLowerCase().replace(' ', '-')}`}>
|
|
{task.status}
|
|
</div>
|
|
<div className="item-progress">
|
|
<div className="progress-bar">
|
|
<div
|
|
className="progress-fill"
|
|
style={{ width: `${task.progress}%` }}
|
|
/>
|
|
</div>
|
|
<span>{task.progress}%</span>
|
|
</div>
|
|
</div>
|
|
<div className="item-details">
|
|
<div>Last Modified: {task.lastModified}</div>
|
|
</div>
|
|
</div>
|
|
)}
|
|
renderDetails={(task) => (
|
|
<div className="details-panel">
|
|
<h3>Task Details</h3>
|
|
<div className="detail-row">
|
|
<span className="detail-label">ID:</span>
|
|
<span className="detail-value">{task.id}</span>
|
|
</div>
|
|
<div className="detail-row">
|
|
<span className="detail-label">Name:</span>
|
|
<span className="detail-value">{task.name}</span>
|
|
</div>
|
|
<div className="detail-row">
|
|
<span className="detail-label">Type:</span>
|
|
<span className="detail-value">{task.type}</span>
|
|
</div>
|
|
<div className="detail-row">
|
|
<span className="detail-label">Status:</span>
|
|
<span className="detail-value">{task.status}</span>
|
|
</div>
|
|
<div className="detail-row">
|
|
<span className="detail-label">Progress:</span>
|
|
<span className="detail-value">{task.progress}%</span>
|
|
</div>
|
|
<div className="detail-row">
|
|
<span className="detail-label">Last Modified:</span>
|
|
<span className="detail-value">{task.lastModified}</span>
|
|
</div>
|
|
</div>
|
|
)}
|
|
/>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default AITasksDashboard;
|