|
@@ -13,6 +13,30 @@ interface TaskCrudProps {
|
|
|
onAddClose?: () => void;
|
|
onAddClose?: () => void;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+interface TaskFormState {
|
|
|
|
|
+ task: string;
|
|
|
|
|
+ status: string;
|
|
|
|
|
+ progress: number;
|
|
|
|
|
+ dataset: string;
|
|
|
|
|
+ input: string;
|
|
|
|
|
+ output: string;
|
|
|
|
|
+ preset: string;
|
|
|
|
|
+ priority: number;
|
|
|
|
|
+ isOpen: boolean;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const initialTaskState: TaskFormState = {
|
|
|
|
|
+ task: "handbrake",
|
|
|
|
|
+ status: "pending",
|
|
|
|
|
+ progress: 0,
|
|
|
|
|
+ dataset: "",
|
|
|
|
|
+ input: "",
|
|
|
|
|
+ output: "",
|
|
|
|
|
+ preset: "Fast 1080p30",
|
|
|
|
|
+ priority: 0,
|
|
|
|
|
+ isOpen: false
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
export default function TaskCrud({
|
|
export default function TaskCrud({
|
|
|
editTask,
|
|
editTask,
|
|
|
onEditClose,
|
|
onEditClose,
|
|
@@ -21,65 +45,47 @@ export default function TaskCrud({
|
|
|
}: TaskCrudProps) {
|
|
}: TaskCrudProps) {
|
|
|
const queryClient = useQueryClient();
|
|
const queryClient = useQueryClient();
|
|
|
const { addNotification } = useNotifications();
|
|
const { addNotification } = useNotifications();
|
|
|
- const [isOpen, setIsOpen] = useState(false);
|
|
|
|
|
- const [task, setTask] = useState("");
|
|
|
|
|
- const [status, setStatus] = useState("");
|
|
|
|
|
- const [progress, setProgress] = useState(0);
|
|
|
|
|
- const [dataset, setDataset] = useState("");
|
|
|
|
|
- const [input, setInput] = useState("");
|
|
|
|
|
- const [output, setOutput] = useState("");
|
|
|
|
|
- const [preset, setPreset] = useState("");
|
|
|
|
|
- const [priority, setPriority] = useState(0);
|
|
|
|
|
|
|
+ const [formState, setFormState] = useState<TaskFormState>(initialTaskState);
|
|
|
|
|
|
|
|
const isEditing = !!editTask && Object.keys(editTask).length > 0;
|
|
const isEditing = !!editTask && Object.keys(editTask).length > 0;
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
|
if (isEditing && editTask) {
|
|
if (isEditing && editTask) {
|
|
|
- setTask(editTask.task || "handbrake");
|
|
|
|
|
- setStatus(editTask.status || "");
|
|
|
|
|
- setProgress(editTask.progress || 0);
|
|
|
|
|
- setDataset(editTask.dataset || "");
|
|
|
|
|
- setInput(editTask.input || "");
|
|
|
|
|
- setOutput(editTask.output || "");
|
|
|
|
|
- setPreset(editTask.preset || "");
|
|
|
|
|
- setPriority(editTask.priority || 0);
|
|
|
|
|
- setIsOpen(true);
|
|
|
|
|
|
|
+ setFormState({
|
|
|
|
|
+ task: editTask.task || "handbrake",
|
|
|
|
|
+ status: editTask.status || "",
|
|
|
|
|
+ progress: editTask.progress || 0,
|
|
|
|
|
+ dataset: editTask.dataset || "",
|
|
|
|
|
+ input: editTask.input || "",
|
|
|
|
|
+ output: editTask.output || "",
|
|
|
|
|
+ preset: editTask.preset || "",
|
|
|
|
|
+ priority: editTask.priority || 0,
|
|
|
|
|
+ isOpen: true
|
|
|
|
|
+ });
|
|
|
} else if (isAdding) {
|
|
} else if (isAdding) {
|
|
|
- setTask("handbrake");
|
|
|
|
|
- setStatus("pending");
|
|
|
|
|
- setProgress(0);
|
|
|
|
|
- setDataset("");
|
|
|
|
|
- setInput("");
|
|
|
|
|
- setOutput("");
|
|
|
|
|
- setPreset("Fast 1080p30");
|
|
|
|
|
- setPriority(0);
|
|
|
|
|
- setIsOpen(true);
|
|
|
|
|
|
|
+ setFormState({ ...initialTaskState, isOpen: true });
|
|
|
}
|
|
}
|
|
|
}, [editTask, isEditing, isAdding]);
|
|
}, [editTask, isEditing, isAdding]);
|
|
|
|
|
|
|
|
|
|
+ const resetForm = () => {
|
|
|
|
|
+ setFormState(initialTaskState);
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
const createMutation = useMutation({
|
|
const createMutation = useMutation({
|
|
|
mutationFn: () =>
|
|
mutationFn: () =>
|
|
|
post(`/tasks`, {
|
|
post(`/tasks`, {
|
|
|
- task,
|
|
|
|
|
- status,
|
|
|
|
|
- progress,
|
|
|
|
|
- dataset,
|
|
|
|
|
- input,
|
|
|
|
|
- output,
|
|
|
|
|
- preset,
|
|
|
|
|
- priority
|
|
|
|
|
|
|
+ task: formState.task,
|
|
|
|
|
+ status: formState.status,
|
|
|
|
|
+ progress: formState.progress,
|
|
|
|
|
+ dataset: formState.dataset,
|
|
|
|
|
+ input: formState.input,
|
|
|
|
|
+ output: formState.output,
|
|
|
|
|
+ preset: formState.preset,
|
|
|
|
|
+ priority: formState.priority
|
|
|
}),
|
|
}),
|
|
|
onSuccess: () => {
|
|
onSuccess: () => {
|
|
|
queryClient.refetchQueries({ queryKey: ["tasks"] });
|
|
queryClient.refetchQueries({ queryKey: ["tasks"] });
|
|
|
- setTask("handbrake");
|
|
|
|
|
- setStatus("pending");
|
|
|
|
|
- setProgress(0);
|
|
|
|
|
- setDataset("");
|
|
|
|
|
- setInput("");
|
|
|
|
|
- setOutput("");
|
|
|
|
|
- setPreset("Fast 1080p30");
|
|
|
|
|
- setPriority(0);
|
|
|
|
|
- setIsOpen(false);
|
|
|
|
|
|
|
+ resetForm();
|
|
|
if (onAddClose) onAddClose();
|
|
if (onAddClose) onAddClose();
|
|
|
toast.success("Task created successfully");
|
|
toast.success("Task created successfully");
|
|
|
addNotification({
|
|
addNotification({
|
|
@@ -93,26 +99,18 @@ export default function TaskCrud({
|
|
|
const updateMutation = useMutation({
|
|
const updateMutation = useMutation({
|
|
|
mutationFn: () =>
|
|
mutationFn: () =>
|
|
|
put(`/tasks/${editTask.id}`, {
|
|
put(`/tasks/${editTask.id}`, {
|
|
|
- task,
|
|
|
|
|
- status,
|
|
|
|
|
- progress,
|
|
|
|
|
- dataset,
|
|
|
|
|
- input,
|
|
|
|
|
- output,
|
|
|
|
|
- preset,
|
|
|
|
|
- priority
|
|
|
|
|
|
|
+ task: formState.task,
|
|
|
|
|
+ status: formState.status,
|
|
|
|
|
+ progress: formState.progress,
|
|
|
|
|
+ dataset: formState.dataset,
|
|
|
|
|
+ input: formState.input,
|
|
|
|
|
+ output: formState.output,
|
|
|
|
|
+ preset: formState.preset,
|
|
|
|
|
+ priority: formState.priority
|
|
|
}),
|
|
}),
|
|
|
onSuccess: () => {
|
|
onSuccess: () => {
|
|
|
queryClient.refetchQueries({ queryKey: ["tasks"] });
|
|
queryClient.refetchQueries({ queryKey: ["tasks"] });
|
|
|
- setTask("handbrake");
|
|
|
|
|
- setStatus("pending");
|
|
|
|
|
- setProgress(0);
|
|
|
|
|
- setDataset("");
|
|
|
|
|
- setInput("");
|
|
|
|
|
- setOutput("");
|
|
|
|
|
- setPreset("Fast 1080p30");
|
|
|
|
|
- setPriority(0);
|
|
|
|
|
- setIsOpen(false);
|
|
|
|
|
|
|
+ resetForm();
|
|
|
if (onEditClose) onEditClose();
|
|
if (onEditClose) onEditClose();
|
|
|
toast.success("Task updated successfully");
|
|
toast.success("Task updated successfully");
|
|
|
addNotification({
|
|
addNotification({
|
|
@@ -133,33 +131,17 @@ export default function TaskCrud({
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const handleClose = () => {
|
|
const handleClose = () => {
|
|
|
- setIsOpen(false);
|
|
|
|
|
- setTask("handbrake");
|
|
|
|
|
- setStatus("pending");
|
|
|
|
|
- setProgress(0);
|
|
|
|
|
- setDataset("");
|
|
|
|
|
- setInput("");
|
|
|
|
|
- setOutput("");
|
|
|
|
|
- setPreset("Fast 1080p30");
|
|
|
|
|
- setPriority(0);
|
|
|
|
|
|
|
+ resetForm();
|
|
|
if (onEditClose) onEditClose();
|
|
if (onEditClose) onEditClose();
|
|
|
if (onAddClose) onAddClose();
|
|
if (onAddClose) onAddClose();
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const handleAddClick = () => {
|
|
const handleAddClick = () => {
|
|
|
- setTask("handbrake");
|
|
|
|
|
- setStatus("pending");
|
|
|
|
|
- setProgress(0);
|
|
|
|
|
- setDataset("");
|
|
|
|
|
- setInput("");
|
|
|
|
|
- setOutput("");
|
|
|
|
|
- setPreset("Fast 1080p30");
|
|
|
|
|
- setPriority(0);
|
|
|
|
|
- setIsOpen(true);
|
|
|
|
|
|
|
+ setFormState({ ...initialTaskState, isOpen: true });
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// If not editing and not adding, render the add button
|
|
// If not editing and not adding, render the add button
|
|
|
- if (!isEditing && !isAdding && !isOpen) {
|
|
|
|
|
|
|
+ if (!isEditing && !isAdding && !formState.isOpen) {
|
|
|
return (
|
|
return (
|
|
|
<button
|
|
<button
|
|
|
onClick={handleAddClick}
|
|
onClick={handleAddClick}
|
|
@@ -183,140 +165,134 @@ export default function TaskCrud({
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (isEditing) {
|
|
|
|
|
- return (
|
|
|
|
|
- <SlideInForm
|
|
|
|
|
- isOpen={isOpen}
|
|
|
|
|
- onClose={handleClose}
|
|
|
|
|
- title="Edit Task"
|
|
|
|
|
- actions={
|
|
|
|
|
- <div className="flex justify-end space-x-3">
|
|
|
|
|
- <button
|
|
|
|
|
- type="button"
|
|
|
|
|
- onClick={handleClose}
|
|
|
|
|
- className="inline-flex items-center rounded-md border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-900 px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 shadow-sm hover:bg-gray-50 dark:hover:bg-gray-800 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"
|
|
|
|
|
- >
|
|
|
|
|
- Cancel
|
|
|
|
|
- </button>
|
|
|
|
|
- <button
|
|
|
|
|
- type="submit"
|
|
|
|
|
- disabled={createMutation.isPending}
|
|
|
|
|
- className="inline-flex items-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"
|
|
|
|
|
- >
|
|
|
|
|
- Update Task
|
|
|
|
|
- </button>
|
|
|
|
|
- </div>
|
|
|
|
|
- }
|
|
|
|
|
- >
|
|
|
|
|
- <form onSubmit={handleSubmit} className="space-y-4">
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Task Type
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="Task Type"
|
|
|
|
|
- value={task}
|
|
|
|
|
- onChange={(e) => setTask(e.target.value)}
|
|
|
|
|
- required
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Status
|
|
|
|
|
- </label>
|
|
|
|
|
- <select
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- value={status}
|
|
|
|
|
- onChange={(e) => setStatus(e.target.value)}
|
|
|
|
|
- >
|
|
|
|
|
- <option value="pending">Pending</option>
|
|
|
|
|
- <option value="processing">Processing</option>
|
|
|
|
|
- <option value="completed">Completed</option>
|
|
|
|
|
- <option value="failed">Failed</option>
|
|
|
|
|
- <option value="skipped">Skipped</option>
|
|
|
|
|
- </select>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Progress
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- type="number"
|
|
|
|
|
- min="0"
|
|
|
|
|
- max="100"
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="Progress"
|
|
|
|
|
- value={progress}
|
|
|
|
|
- onChange={(e) => setProgress(parseInt(e.target.value) || 0)}
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Dataset
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="Dataset"
|
|
|
|
|
- value={dataset}
|
|
|
|
|
- onChange={(e) => setDataset(e.target.value)}
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Input File
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="Input File Path"
|
|
|
|
|
- value={input}
|
|
|
|
|
- onChange={(e) => setInput(e.target.value)}
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Output File
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="Output File Path"
|
|
|
|
|
- value={output}
|
|
|
|
|
- onChange={(e) => setOutput(e.target.value)}
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Preset
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="HandBrake Preset"
|
|
|
|
|
- value={preset}
|
|
|
|
|
- onChange={(e) => setPreset(e.target.value)}
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Priority
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- type="number"
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="Priority"
|
|
|
|
|
- value={priority}
|
|
|
|
|
- onChange={(e) => setPriority(parseInt(e.target.value) || 0)}
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- </form>
|
|
|
|
|
- </SlideInForm>
|
|
|
|
|
- );
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ const renderForm = () => (
|
|
|
|
|
+ <form onSubmit={handleSubmit} className="space-y-4">
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
+ Task Type
|
|
|
|
|
+ </label>
|
|
|
|
|
+ <input
|
|
|
|
|
+ className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
+ placeholder="Task Type"
|
|
|
|
|
+ value={formState.task}
|
|
|
|
|
+ onChange={(e) => setFormState({ ...formState, task: e.target.value })}
|
|
|
|
|
+ required
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
+ Status
|
|
|
|
|
+ </label>
|
|
|
|
|
+ <select
|
|
|
|
|
+ className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
+ value={formState.status}
|
|
|
|
|
+ onChange={(e) =>
|
|
|
|
|
+ setFormState({ ...formState, status: e.target.value })
|
|
|
|
|
+ }
|
|
|
|
|
+ >
|
|
|
|
|
+ <option value="pending">Pending</option>
|
|
|
|
|
+ <option value="processing">Processing</option>
|
|
|
|
|
+ <option value="completed">Completed</option>
|
|
|
|
|
+ <option value="failed">Failed</option>
|
|
|
|
|
+ <option value="skipped">Skipped</option>
|
|
|
|
|
+ </select>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
+ Progress
|
|
|
|
|
+ </label>
|
|
|
|
|
+ <input
|
|
|
|
|
+ type="number"
|
|
|
|
|
+ min="0"
|
|
|
|
|
+ max="100"
|
|
|
|
|
+ className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
+ placeholder="Progress"
|
|
|
|
|
+ value={formState.progress}
|
|
|
|
|
+ onChange={(e) =>
|
|
|
|
|
+ setFormState({
|
|
|
|
|
+ ...formState,
|
|
|
|
|
+ progress: parseInt(e.target.value) || 0
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
+ Dataset
|
|
|
|
|
+ </label>
|
|
|
|
|
+ <input
|
|
|
|
|
+ className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
+ placeholder="Dataset"
|
|
|
|
|
+ value={formState.dataset}
|
|
|
|
|
+ onChange={(e) =>
|
|
|
|
|
+ setFormState({ ...formState, dataset: e.target.value })
|
|
|
|
|
+ }
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
+ Input File
|
|
|
|
|
+ </label>
|
|
|
|
|
+ <input
|
|
|
|
|
+ className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
+ placeholder="Input File Path"
|
|
|
|
|
+ value={formState.input}
|
|
|
|
|
+ onChange={(e) =>
|
|
|
|
|
+ setFormState({ ...formState, input: e.target.value })
|
|
|
|
|
+ }
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
+ Output File
|
|
|
|
|
+ </label>
|
|
|
|
|
+ <input
|
|
|
|
|
+ className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
+ placeholder="Output File Path"
|
|
|
|
|
+ value={formState.output}
|
|
|
|
|
+ onChange={(e) =>
|
|
|
|
|
+ setFormState({ ...formState, output: e.target.value })
|
|
|
|
|
+ }
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
+ Preset
|
|
|
|
|
+ </label>
|
|
|
|
|
+ <input
|
|
|
|
|
+ className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
+ placeholder="HandBrake Preset"
|
|
|
|
|
+ value={formState.preset}
|
|
|
|
|
+ onChange={(e) =>
|
|
|
|
|
+ setFormState({ ...formState, preset: e.target.value })
|
|
|
|
|
+ }
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
+ Priority
|
|
|
|
|
+ </label>
|
|
|
|
|
+ <input
|
|
|
|
|
+ type="number"
|
|
|
|
|
+ className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
+ placeholder="Priority"
|
|
|
|
|
+ value={formState.priority}
|
|
|
|
|
+ onChange={(e) =>
|
|
|
|
|
+ setFormState({
|
|
|
|
|
+ ...formState,
|
|
|
|
|
+ priority: parseInt(e.target.value) || 0
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </form>
|
|
|
|
|
+ );
|
|
|
|
|
|
|
|
return (
|
|
return (
|
|
|
<SlideInForm
|
|
<SlideInForm
|
|
|
- isOpen={isOpen}
|
|
|
|
|
|
|
+ isOpen={formState.isOpen}
|
|
|
onClose={handleClose}
|
|
onClose={handleClose}
|
|
|
- title="Add New Task"
|
|
|
|
|
|
|
+ title={isEditing ? "Edit Task" : "Add New Task"}
|
|
|
actions={
|
|
actions={
|
|
|
<div className="flex justify-end space-x-3">
|
|
<div className="flex justify-end space-x-3">
|
|
|
<button
|
|
<button
|
|
@@ -336,106 +312,7 @@ export default function TaskCrud({
|
|
|
</div>
|
|
</div>
|
|
|
}
|
|
}
|
|
|
>
|
|
>
|
|
|
- <form onSubmit={handleSubmit} className="space-y-4">
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Task Type
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="Task Type"
|
|
|
|
|
- value={task}
|
|
|
|
|
- onChange={(e) => setTask(e.target.value)}
|
|
|
|
|
- required
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Status
|
|
|
|
|
- </label>
|
|
|
|
|
- <select
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- value={status}
|
|
|
|
|
- onChange={(e) => setStatus(e.target.value)}
|
|
|
|
|
- >
|
|
|
|
|
- <option value="pending">Pending</option>
|
|
|
|
|
- <option value="processing">Processing</option>
|
|
|
|
|
- <option value="completed">Completed</option>
|
|
|
|
|
- <option value="failed">Failed</option>
|
|
|
|
|
- <option value="skipped">Skipped</option>
|
|
|
|
|
- </select>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Progress
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- type="number"
|
|
|
|
|
- min="0"
|
|
|
|
|
- max="100"
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="Progress"
|
|
|
|
|
- value={progress}
|
|
|
|
|
- onChange={(e) => setProgress(parseInt(e.target.value) || 0)}
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Dataset
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="Dataset"
|
|
|
|
|
- value={dataset}
|
|
|
|
|
- onChange={(e) => setDataset(e.target.value)}
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Input File
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="Input File Path"
|
|
|
|
|
- value={input}
|
|
|
|
|
- onChange={(e) => setInput(e.target.value)}
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Output File
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="Output File Path"
|
|
|
|
|
- value={output}
|
|
|
|
|
- onChange={(e) => setOutput(e.target.value)}
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Preset
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="HandBrake Preset"
|
|
|
|
|
- value={preset}
|
|
|
|
|
- onChange={(e) => setPreset(e.target.value)}
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-1">
|
|
|
|
|
- Priority
|
|
|
|
|
- </label>
|
|
|
|
|
- <input
|
|
|
|
|
- type="number"
|
|
|
|
|
- className="block w-full rounded-md border-gray-300 dark:border-gray-700 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"
|
|
|
|
|
- placeholder="Priority"
|
|
|
|
|
- value={priority}
|
|
|
|
|
- onChange={(e) => setPriority(parseInt(e.target.value) || 0)}
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
- </form>
|
|
|
|
|
|
|
+ {renderForm()}
|
|
|
</SlideInForm>
|
|
</SlideInForm>
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|