// Workflow user-tasks list page. // // Fetches pending human tasks from the embedded workflow engine // and renders them in a DataTable. Clicking a row navigates to // the task detail page where the user can complete the task. import { useEffect, useState } from 'react' import { useNavigate } from 'react-router-dom' import { workflow } from '@/api/client' import type { UserTaskSummary } from '@/types/api' import { PageHeader } from '@/components/PageHeader' import { Loading } from '@/components/Loading' import { ErrorBox } from '@/components/ErrorBox' import { DataTable, type Column } from '@/components/DataTable' import { useT } from '@/i18n/LocaleContext' export function UserTasksPage() { const t = useT() const navigate = useNavigate() const [rows, setRows] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { workflow .listTasks() .then(setRows) .catch((e: unknown) => setError(e instanceof Error ? e : new Error(String(e)))) .finally(() => setLoading(false)) }, []) const columns: Column[] = [ { header: t('label.taskName'), key: 'taskName', render: (r) => ( ), }, { header: t('label.process'), key: 'processDefinitionKey' }, { header: t('label.formKey'), key: 'formKey', render: (r) => r.formKey ?? '\u2014' }, { header: t('label.created'), key: 'createTime' }, { header: t('label.assignee'), key: 'assignee', render: (r) => r.assignee ?? '\u2014' }, ] return (
{loading && } {error && } {!loading && !error && ( r.taskId} empty={
{t('label.noPendingTasks')}
} /> )}
) }