fix(kanban): merge dashboard batch QOL with i18n + collapse + assignee-casing

PR #23240 was branched before main landed:
- c39168453 i18n localization (16 locales)
- a91e5a875 native <details> collapse + skip empty metadata
- 0e0ddaac8 tone down completed-run metadata panel
- b308dd7d7 preserve assignee casing in dashboard

The cherry-pick took PR's dist/index.js wholesale via -X theirs,
which dropped those features. This commit re-applies them by
hand-merging the 7 conflict regions:

1. bulk-action catch handler: keep PR's failedIds + loadBoard,
   keep main's t-in-deps for tx() i18n calls
2. Refresh button: keep main's tx(t, 'refresh', ...), add PR's
   Clear filters button with tx(t, 'clearFilters', ...)
3. Archive button: keep main's tx(t, 'archive', ...), add PR's
   priority setter with tx(t, 'priority'/'setPriority', ...)
4. Column header: keep main's colHelp i18n var, add PR's
   column-select-all checkbox
5/6. lane.tasks/column.tasks .map: keep main's t->tk rename
   (avoids shadowing the i18n t), apply tk to PR's failed/
   draggingSource props
7. Card checkbox label-wrap: keep PR's <label> structure
   (larger hit target), keep main's tx(i18n, 'selectForBulk', ...)

Adds three new i18n keys (clearFilters, priority, setPriority)
that fall back to English via tx() until translators add them
to the kanban catalog, matching the existing pattern.
This commit is contained in:
Teknium1 2026-05-10 20:53:51 -07:00 committed by Teknium
parent b60462a205
commit b8bf2f817d

View file

@ -829,7 +829,7 @@
setFailedIds(new Set(selectedIds));
loadBoard();
});
}, [selectedIds, loadBoard, board]);
}, [selectedIds, loadBoard, board, t]);
// --- board switching ----------------------------------------------------
const switchBoard = useCallback(function (nextSlug) {
@ -1659,7 +1659,7 @@
onClick: props.onRefresh,
size: "sm",
title: "Reload the board from the database. The board auto-refreshes on task events; this is for forcing a re-read.",
}, "Refresh"),
}, tx(t, "refresh", "Refresh")),
h(Button, {
onClick: function () {
props.setSearch("");
@ -1669,7 +1669,7 @@
},
size: "sm",
title: "Clear all active filters (search, tenant, assignee, archived).",
}, "Clear filters"),
}, tx(t, "clearFilters", "Clear filters")),
);
}
@ -1722,14 +1722,14 @@
},
size: "sm",
title: "Archive selected tasks. They disappear from the default board view but remain in the database.",
}, "Archive"),
}, tx(t, "archive", "Archive")),
h("div", { className: "hermes-kanban-bulk-priority",
title: "Set priority on selected tasks. Higher = claimed first." },
h(Input, {
type: "number",
value: priority,
onChange: function (e) { setPriority(e.target.value); },
placeholder: "pri",
placeholder: tx(t, "priority", "pri"),
className: "h-7 text-xs w-16",
}),
h(Button, {
@ -1740,7 +1740,7 @@
},
disabled: priority === "",
size: "sm",
}, "Set priority"),
}, tx(t, "setPriority", "Set priority")),
),
h("div", { className: "hermes-kanban-bulk-reassign",
title: "Reassign selected tasks to a different Hermes profile. Pick a profile (or unassign) and click Apply." },
@ -1893,7 +1893,7 @@
onDrop: handleDrop,
},
h("div", { className: "hermes-kanban-column-header",
title: COLUMN_HELP[props.column.name] || "" },
title: colHelp || "" },
h("input", {
type: "checkbox",
className: "hermes-kanban-col-check",
@ -1941,11 +1941,11 @@
),
lane.tasks.map(function (tk) {
return h(TaskCard, {
key: t.id, task: t,
selected: props.selectedIds.has(t.id),
failed: props.failedIds && props.failedIds.has(t.id),
key: tk.id, task: tk,
selected: props.selectedIds.has(tk.id),
failed: props.failedIds && props.failedIds.has(tk.id),
draggingTaskId: props.draggingTaskId,
draggingSource: props.draggingTaskId && props.selectedIds.has(props.draggingTaskId) && props.selectedIds.size > 1 && props.selectedIds.has(t.id),
draggingSource: props.draggingTaskId && props.selectedIds.has(props.draggingTaskId) && props.selectedIds.size > 1 && props.selectedIds.has(tk.id),
toggleSelected: props.toggleSelected,
toggleRange: props.toggleRange,
onOpen: props.onOpen,
@ -1955,11 +1955,11 @@
})
: props.column.tasks.map(function (tk) {
return h(TaskCard, {
key: t.id, task: t,
selected: props.selectedIds.has(t.id),
failed: props.failedIds && props.failedIds.has(t.id),
key: tk.id, task: tk,
selected: props.selectedIds.has(tk.id),
failed: props.failedIds && props.failedIds.has(tk.id),
draggingTaskId: props.draggingTaskId,
draggingSource: props.draggingTaskId && props.selectedIds.has(props.draggingTaskId) && props.selectedIds.size > 1 && props.selectedIds.has(t.id),
draggingSource: props.draggingTaskId && props.selectedIds.has(props.draggingTaskId) && props.selectedIds.size > 1 && props.selectedIds.has(tk.id),
toggleSelected: props.toggleSelected,
toggleRange: props.toggleRange,
onOpen: props.onOpen,
@ -2072,7 +2072,7 @@
h("div", { className: "hermes-kanban-card-row" },
h("label", {
className: "hermes-kanban-card-check-wrap",
title: "Select for bulk actions",
title: tx(i18n, "selectForBulk", "Select for bulk actions"),
onClick: function (e) { e.stopPropagation(); },
},
h("input", {