+ {/* Tabs map to getAll's `asTaskAdmin`. */}
+
+ switchTab(v === 'manage')}>
+
+
+
+ My Tasks
+ {!asTaskAdmin && totalCount > 0 && (
+
+ {totalCount}
+
+ )}
+
+
+
+ Manage Tasks
+ {asTaskAdmin && totalCount > 0 && (
+
+ {totalCount}
+
+ )}
+
+
+
+
+
+ {/* Toolbar */}
+
+
+
setStatus(v as TaskStatus | 'all')}
+ options={STATUS_OPTIONS}
+ />
+ setPriority(v as TaskPriority | 'all')}
+ options={PRIORITY_OPTIONS}
+ />
+ {showAssigneeFilter && (
+
+ )}
+
+ {asTaskAdmin && selectedIds.size > 0 && (
+
setBulkAction('assign')}
+ onReassign={() => setBulkAction('reassign')}
+ onUnassigned={() => {
+ setSelectedIds(new Set())
+ refresh()
+ }}
+ />
+ )}
+
+
+
+
+
+ {/* Table */}
+
+ {error ? (
+
+ {error}
+
+ ) : loading && tasks.length === 0 ? (
+
+ ) : visibleTasks.length === 0 ? (
+
}
+ title="No tasks"
+ description={`No tasks match the current filters${
+ folderId == null ? ' across your folders.' : ' in the selected folder.'
+ }`}
+ />
+ ) : (
+
+
+
+
+ {asTaskAdmin && (
+
+ 0 && selectedIds.size === visibleTasks.length
+ }
+ onCheckedChange={toggleSelectAll}
+ />
+
+ )}
+ Title
+ Type
+ Status
+ Priority
+ Assignee
+ Created
+
+
+
+
+ {visibleTasks.map((task) => {
+ const sla = slaBadge(task.taskSlaDetail?.status)
+ const sb = statusBadge(task.status)
+ const pb = priorityBadge(task.priority)
+ const isSelected = selectedIds.has(task.id)
+ return (
+ {
+ if (asTaskAdmin) toggleSelect(task.id)
+ else if (task.type === TaskType.DocumentValidation)
+ setValidationTask(task)
+ else setCompleteTask(task)
+ }}
+ className="cursor-pointer"
+ >
+ {asTaskAdmin && (
+ e.stopPropagation()}>
+ toggleSelect(task.id)}
+ />
+
+ )}
+
+
+
+ {task.title}
+
+ {sla && (
+
+ {sla.label}
+
+ )}
+
+
+
+ {taskTypeLabel(task.type)}
+
+
+ {sb.label}
+
+
+ {pb.label}
+
+
+ {task.assignedToUser?.displayName ?? (
+ assignedToGroup(task) ? (
+
+
+ Group
+
+ ) : (
+ —
+ )
+ )}
+
+
+ {formatDateTime(task.createdTime)}
+
+
+ {asTaskAdmin ? (
+ // Detail peek without losing row selection.
+
+ ) : (
+
+ )}
+
+
+ )
+ })}
+
+
+
+ )}
+
+
+ {/* Pagination */}
+ {totalCount > 0 && (
+
+
+ Showing {rangeStart}–{rangeEnd} of {totalCount}
+
+
+
+
+ Page {page} of {totalPages}
+
+
+
+
+ )}
+
+ {completeTask && (
+
setCompleteTask(null)}
+ onDone={() => {
+ setCompleteTask(null)
+ refresh()
+ }}
+ onShowDetail={() => setDetailTask(completeTask)}
+ />
+ )}
+
+ {detailTask && (
+ setDetailTask(null)}
+ onChanged={refresh}
+ onValidate={
+ detailTask.type === TaskType.DocumentValidation
+ ? () => {
+ const target = detailTask
+ setDetailTask(null)
+ setValidationTask(target)
+ }
+ : undefined
+ }
+ />
+ )}
+
+ {validationTask && (
+ setValidationTask(null)}
+ onCompleted={() => {
+ setValidationTask(null)
+ refresh()
+ }}
+ />
+ )}
+
+ {bulkAction != null && selectedTasks.length > 0 && (
+ setBulkAction(null)}
+ onDone={() => {
+ setBulkAction(null)
+ setSelectedIds(new Set())
+ refresh()
+ }}
+ />
+ )}
+
+ {creating && (
+ setCreating(false)} onDone={refresh} />
+ )}
+
+ )
+}
+
+/** Folder picker — direct Popover+Command (apollo-wind's Combobox filters by value=id). */
+function FolderPicker({
+ value,
+ onChange,
+}: {
+ value: number | null
+ onChange: (id: number | null) => void
+}) {
+ const { folders, loading, error } = useFolders()
+ const [open, setOpen] = useState(false)
+
+ const selectedLabel = useMemo(() => {
+ if (value == null) return 'All folders'
+ return folders.find((f) => f.id === value)?.fullyQualifiedName ?? `Folder ${value}`
+ }, [folders, value])
+
+ return (
+