diff --git a/CHANGELOG.md b/CHANGELOG.md index eeaa0e04..5ecc1a13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Hermes Web UI -- Changelog +## [Unreleased] + +### Fixed + +- **bug(kanban): Kanban panel header `+` button looked dead — now opens a proper create-task modal** ([#1964](https://github.com/nesquena/hermes-webui/issues/1964)). The "New task" button at the top of the Kanban sidebar panel was wired to `createKanbanTask()`, which silently `return`s when the inline `#kanbanNewTaskTitle` input is empty. Because that input lives below five rows of filters (search, assignee, tenant, archived/mine toggles, stats, bulk-action bar), it's typically off-screen on first open — clicking the obvious header `+` did nothing visible. Now the header `+` opens a centered modal overlay (`#kanbanTaskModal`, same `.kanban-modal-overlay` shell as the existing create-board modal) with fields for Title (required), Description, Status (Triage / Todo / Ready), Priority, Assignee (with datalist suggestions from the active board), and Tenant (with datalist). ESC closes, click on backdrop closes, Enter on simple inputs submits (Enter in the description textarea inserts a newline, as expected). Submit hits `/api/kanban/tasks` POST with whichever fields the user populated and auto-opens the new task's detail view. Inline quick-add (`Enter` on `#kanbanNewTaskTitle`) is preserved as a power-user shortcut. Adds 11 new i18n keys across all 8 supported locales (`kanban_title`, `kanban_description`, `kanban_description_placeholder`, `kanban_status`, `kanban_assignee`, `kanban_assignee_placeholder`, `kanban_tenant`, `kanban_tenant_placeholder`, `kanban_priority`, `kanban_priority_hint`, `kanban_title_required`). Improves `.kanban-modal-error` styling so validation errors render as a properly-boxed red alert instead of unstyled body text — benefits the existing create-board modal too. Adds a regression test (`tests/test_kanban_ui_static.py::test_kanban_new_task_header_button_opens_modal`). + ## [v0.51.30] — 2026-05-08 — 3-PR contributor batch (Release G: offline recovery + PWA hardening + opt-in session jump buttons + opt-in endless-scroll) ### Added (3 PRs, all from @ai-ag2026) diff --git a/static/i18n.js b/static/i18n.js index 8b86a209..54a821da 100644 --- a/static/i18n.js +++ b/static/i18n.js @@ -530,6 +530,17 @@ const LOCALES = { kanban_no_comments: 'No comments', kanban_no_events: 'No events', kanban_no_runs: 'No runs', + kanban_title: 'Title', + kanban_description: 'Description', + kanban_description_placeholder: 'Optional — what needs to happen, acceptance criteria, links', + kanban_status: 'Status', + kanban_assignee: 'Assignee', + kanban_assignee_placeholder: 'Optional — leave blank for any worker', + kanban_tenant: 'Tenant', + kanban_tenant_placeholder: 'Optional — project or team slug', + kanban_priority: 'Priority', + kanban_priority_hint: 'Higher numbers run first. Default 0.', + kanban_title_required: 'Title is required.', kanban_new_task: 'New task', kanban_add_comment: 'Add comment', kanban_only_mine: 'Only mine', @@ -1568,6 +1579,17 @@ const LOCALES = { kanban_no_comments: 'コメントなし', kanban_no_events: 'イベントなし', kanban_no_runs: '実行なし', + kanban_title: 'タイトル', + kanban_description: '説明', + kanban_description_placeholder: '任意 — 何をすべきか、受け入れ基準、リンク', + kanban_status: 'ステータス', + kanban_assignee: '担当者', + kanban_assignee_placeholder: '任意 — 空欄で任意のワーカーに', + kanban_tenant: 'テナント', + kanban_tenant_placeholder: '任意 — プロジェクトまたはチームのスラッグ', + kanban_priority: '優先度', + kanban_priority_hint: '値が大きいほど優先されます。既定値は 0。', + kanban_title_required: 'タイトルは必須です。', kanban_new_task: '新規タスク', kanban_add_comment: 'コメント追加', kanban_only_mine: '自分のみ', @@ -2439,6 +2461,17 @@ const LOCALES = { kanban_no_comments: 'No comments', kanban_no_events: 'No events', kanban_no_runs: 'No runs', + kanban_title: 'Заголовок', + kanban_description: 'Описание', + kanban_description_placeholder: 'Необязательно — что нужно сделать, критерии приёмки, ссылки', + kanban_status: 'Статус', + kanban_assignee: 'Исполнитель', + kanban_assignee_placeholder: 'Необязательно — оставьте пустым для любого исполнителя', + kanban_tenant: 'Арендатор', + kanban_tenant_placeholder: 'Необязательно — слаг проекта или команды', + kanban_priority: 'Приоритет', + kanban_priority_hint: 'Большие числа выполняются первыми. По умолчанию 0.', + kanban_title_required: 'Заголовок обязателен.', kanban_new_task: 'New task', kanban_add_comment: 'Add comment', kanban_only_mine: 'Only mine', @@ -3411,6 +3444,17 @@ const LOCALES = { kanban_no_comments: 'No comments', kanban_no_events: 'No events', kanban_no_runs: 'No runs', + kanban_title: 'Título', + kanban_description: 'Descripción', + kanban_description_placeholder: 'Opcional — qué hay que hacer, criterios de aceptación, enlaces', + kanban_status: 'Estado', + kanban_assignee: 'Responsable', + kanban_assignee_placeholder: 'Opcional — déjalo en blanco para cualquier trabajador', + kanban_tenant: 'Tenant', + kanban_tenant_placeholder: 'Opcional — slug del proyecto o equipo', + kanban_priority: 'Prioridad', + kanban_priority_hint: 'Los números más altos se ejecutan primero. Predeterminado: 0.', + kanban_title_required: 'El título es obligatorio.', kanban_new_task: 'New task', kanban_add_comment: 'Add comment', kanban_only_mine: 'Only mine', @@ -4371,6 +4415,17 @@ const LOCALES = { kanban_no_comments: 'No comments', kanban_no_events: 'No events', kanban_no_runs: 'No runs', + kanban_title: 'Titel', + kanban_description: 'Beschreibung', + kanban_description_placeholder: 'Optional — was zu tun ist, Akzeptanzkriterien, Links', + kanban_status: 'Status', + kanban_assignee: 'Zugewiesen an', + kanban_assignee_placeholder: 'Optional — leer lassen für beliebigen Worker', + kanban_tenant: 'Mandant', + kanban_tenant_placeholder: 'Optional — Projekt- oder Team-Slug', + kanban_priority: 'Priorität', + kanban_priority_hint: 'Höhere Zahlen laufen zuerst. Standard: 0.', + kanban_title_required: 'Titel ist erforderlich.', kanban_new_task: 'New task', kanban_add_comment: 'Add comment', kanban_only_mine: 'Only mine', @@ -5352,6 +5407,17 @@ const LOCALES = { kanban_no_comments: 'No comments', kanban_no_events: 'No events', kanban_no_runs: 'No runs', + kanban_title: '标题', + kanban_description: '描述', + kanban_description_placeholder: '可选 — 需要做什么、验收标准、链接', + kanban_status: '状态', + kanban_assignee: '负责人', + kanban_assignee_placeholder: '可选 — 留空表示任意工作器', + kanban_tenant: '租户', + kanban_tenant_placeholder: '可选 — 项目或团队标识', + kanban_priority: '优先级', + kanban_priority_hint: '数值越高越先执行,默认为 0。', + kanban_title_required: '标题为必填项。', kanban_new_task: 'New task', kanban_add_comment: 'Add comment', kanban_only_mine: 'Only mine', @@ -7387,6 +7453,17 @@ const LOCALES = { kanban_no_comments: 'No comments', kanban_no_events: 'No events', kanban_no_runs: 'No runs', + kanban_title: 'Título', + kanban_description: 'Descrição', + kanban_description_placeholder: 'Opcional — o que precisa ser feito, critérios de aceitação, links', + kanban_status: 'Status', + kanban_assignee: 'Responsável', + kanban_assignee_placeholder: 'Opcional — deixe em branco para qualquer worker', + kanban_tenant: 'Tenant', + kanban_tenant_placeholder: 'Opcional — slug do projeto ou equipe', + kanban_priority: 'Prioridade', + kanban_priority_hint: 'Números maiores executam primeiro. Padrão: 0.', + kanban_title_required: 'O título é obrigatório.', kanban_new_task: 'New task', kanban_add_comment: 'Add comment', kanban_only_mine: 'Only mine', @@ -8323,6 +8400,17 @@ const LOCALES = { kanban_no_comments: 'No comments', kanban_no_events: 'No events', kanban_no_runs: 'No runs', + kanban_title: '제목', + kanban_description: '설명', + kanban_description_placeholder: '선택 — 해야 할 일, 수락 기준, 링크', + kanban_status: '상태', + kanban_assignee: '담당자', + kanban_assignee_placeholder: '선택 — 비워두면 누구나 가능', + kanban_tenant: '테넌트', + kanban_tenant_placeholder: '선택 — 프로젝트 또는 팀 슬러그', + kanban_priority: '우선순위', + kanban_priority_hint: '높은 숫자가 먼저 실행됩니다. 기본값: 0.', + kanban_title_required: '제목은 필수입니다.', kanban_new_task: 'New task', kanban_add_comment: 'Add comment', kanban_only_mine: 'Only mine', diff --git a/static/index.html b/static/index.html index 319901e1..fdd014d2 100644 --- a/static/index.html +++ b/static/index.html @@ -146,7 +146,7 @@