Skip to content

Tasks

Tasks are first-class nodes (TaskSchema) with status, priority, assignees, due dates, and project membership. They show up — and are editable in place — on every surface that renders them: the Tasks view, the sidebar mini-dashboard, page checklists, kanban boards, and the right context panel.

The main surface: list and board layouts with keyboard verbs — j/k to move, x to complete, s for status, p for priority, Enter to edit. Clicking a row expands an editor beneath it; board cards open a peek overlay; the right context panel hosts the same live editor for the focused task.

Deep links are first-class:

  • /tasks?task=<id> opens that task’s editor directly.
  • /tasks?project=<id> scopes the surface to a project (with a clearable chip); quick-added tasks join that project.

A personal mini-dashboard in the left panel:

  • Pinned — tasks you pinned, surfaced first
  • In progress — your tasks in a started status
  • Assigned to me — priority-ordered (urgent → low, then nearest due date), paginated
  • Projects — projects you follow, with open-task counts; click one to scope the Tasks view to it

Rows are draggable onto canvases and deep-link into the Tasks view.

Task checklists inside pages, task widgets on dashboards, and task rows in database views all expand the same shared editor — title with @mention-to-assign, status/priority pickers, a due-date popover (Today / Tomorrow / Next week / pick a date / clear), an assignee picker, and a pin toggle.

Every task surface has a quick-add input. Type @ while entering the title to assign as you type — pending assignees render as removable chips before the task is created.

Field authority: pages own their checklists

Section titled “Field authority: pages own their checklists”

A task can be hosted by a page (created from a checklist item in a document). The hosting page is the source of truth for the fields it renders inline:

FieldOwner
Title, assignees, due dateThe hosting page (document content)
Status, priority, completion, pinsThe task node — editable everywhere

On the page itself, edits to doc-owned fields write through the live document (mention nodes, due chips) and the page then reconciles the task node. On other surfaces (e.g. /tasks), doc-owned fields of hosted tasks render read-only with an Open page affordance — a node-side write would be silently overwritten by the page’s next snapshot, so the app doesn’t offer one.

Tasks created outside a page (quick-add, Tasks view, widgets) have no hosting page and every field is editable everywhere.

Tasks are ordinary nodes — the same hooks apply:

import { useQuery, useMutate } from '@xnetjs/react'
const { data: myTasks } = useQuery(TaskSchema, {
filter: { assignees: { contains: me }, status: { not: 'done' } },
sort: [{ field: 'priority' }, { field: 'dueDate' }]
})
const { update } = useMutate()
await update(TaskSchema, taskId, { status: 'in-progress' })