You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add an inline "Add task" button to the footer of each kanban column that lets users create a task with just a title — without opening the full task creation form. Pressing Enter commits the task to the column; pressing Escape cancels.
This change also replaces the current "Board view coming soon" placeholder in ProjectBoard.vue with a real column-rendering layout and basic task cards, making it the first concrete step toward the full kanban board implementation.
Spec:openspec/changes/task-quick-add
Specs
kanban-board — Column layout rendering (replaces placeholder), basic task card display, and quick-add inline task creation at the column footer. The inline footer quick-add is a new interaction path distinct from the existing empty-column "+ Add task" button (which opens the full task form modal).
Tasks
Setup
1. Render kanban columns in ProjectBoard.vue
The "Board view coming soon" NcEmptyContent is removed from the template
columns computed property returns columns from useObjectStore filtered to the current project, sorted by order
Columns render as a horizontal <div class="project-board__columns"> with one .project-board__column per column entry
Each column shows its title in a .project-board__column-header
When columns.length === 0 and not loading, an NcEmptyContent renders with text "No columns yet"
A loading indicator (NcLoadingIcon or similar) is shown while columnsLoading is true
7. Create basic TaskCard.vue component
File src/components/TaskCard.vue exists with name: 'TaskCard'
Prop: task: Object (required)
Card renders task.title as the primary text
Card renders a priority indicator dot using Nextcloud CSS variables for color
Card renders task.dueDate if present — red text using var(--color-error) if the date is in the past
Card renders task.assignee if present (display name, or UUID last-8 as fallback)
All user-visible strings use t('planix', '...')
Card is keyboard-focusable (tabindex="0") for future navigation wiring
QuickAddTask component
2. Create QuickAddTask.vue component
File src/components/QuickAddTask.vue exists with name: 'QuickAddTask'
Add an inline "Add task" button to the footer of each kanban column that lets users create a task with just a title — without opening the full task creation form. Pressing Enter commits the task to the column; pressing Escape cancels.
This change also replaces the current "Board view coming soon" placeholder in
ProjectBoard.vuewith a real column-rendering layout and basic task cards, making it the first concrete step toward the full kanban board implementation.Spec:
openspec/changes/task-quick-addSpecs
Tasks
Setup
1. Render kanban columns in ProjectBoard.vue
columnscomputed property returns columns fromuseObjectStorefiltered to the current project, sorted byorder<div class="project-board__columns">with one.project-board__columnper column entrytitlein a.project-board__column-headercolumns.length === 0and not loading, anNcEmptyContentrenders with text "No columns yet"NcLoadingIconor similar) is shown whilecolumnsLoadingis true7. Create basic TaskCard.vue component
src/components/TaskCard.vueexists withname: 'TaskCard'task: Object(required)task.titleas the primary texttask.dueDateif present — red text usingvar(--color-error)if the date is in the pasttask.assigneeif present (display name, or UUID last-8 as fallback)t('planix', '...')tabindex="0") for future navigation wiringQuickAddTask component
2. Create QuickAddTask.vue component
src/components/QuickAddTask.vueexists withname: 'QuickAddTask'columnId: String(required),projectId: String(required)active: false,draft: '',saving: false,errorMessage: ''active === false: renders anNcButtonwith label "Add task" and aPlusIconactive === true: renders the expanded form with<label>(visually hidden),<textarea>, optional error span, Save button, Cancel buttonactivate()setsactive = true, clearserrorMessage, and focuses the textarea via$nextTickcancel()setsactive = false, clearsdraftanderrorMessage, and returns focus to the trigger buttonNcButton,NcLoadingIconare imported and registered incomponents: {}PlusIconis imported fromvue-material-design-icons/Plus.vuet('planix', '...')3. Wire keyboard handling (Enter / Escape)
@keydown.enter.preventcallshandleEnter(event)handleEnterdoes nothing ifdraft.trim()is empty orsaving === truehandleEntercallssubmit()otherwise@keydown.esccallscancel()submit()4. Connect to task creation store / API
submit()setssaving = trueand clearserrorMessagebefore the requestaxiosfrom@nextcloud/axios(NEVER rawfetch())generateUrl('/apps/openregister/api/objects')with correct register, schema, and object payloadregisterandschemavalues are resolved from the registered object type$emit('task-created', { task: response.data }), thencancel()is calledawaitcall is wrapped intry/catcherrorMessageis set,saving = false(draft is NOT cleared)5. Add loading state and error feedback
<textarea>has:disabled="saving"binding:disabled="saving || !draft.trim()"bindingNcLoadingIconand text "Saving…" whensaving === true, and "Save" otherwise:disabled="saving"bindingrole="alert"renders between textarea and action buttons whenerrorMessageis set.quick-add-task__errorusescolor: var(--color-error)Quality
t('planix', '...')<textarea>has an associated<label>via matchingfor/idpairrole="form"andaria-labelNcButtonhas:aria-labelso icon-only rendering is accessiblerole="alert"so screen readers announce errors immediately