feat(ui): hide empty workboard columns (#89615)

This commit is contained in:
Val Alexander
2026-06-13 02:57:14 -05:00
committed by GitHub
parent 751d3db1cc
commit 32ce06daf8
41 changed files with 177 additions and 73 deletions
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:11.780Z",
"generatedAt": "2026-06-13T03:39:02.012Z",
"locale": "ar",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:10.484Z",
"generatedAt": "2026-06-13T03:38:59.718Z",
"locale": "de",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:10.741Z",
"generatedAt": "2026-06-13T03:39:00.183Z",
"locale": "es",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:14.091Z",
"generatedAt": "2026-06-13T03:39:07.282Z",
"locale": "fa",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:11.517Z",
"generatedAt": "2026-06-13T03:39:01.551Z",
"locale": "fr",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:12.811Z",
"generatedAt": "2026-06-13T03:39:04.043Z",
"locale": "id",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:12.038Z",
"generatedAt": "2026-06-13T03:39:02.458Z",
"locale": "it",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:10.997Z",
"generatedAt": "2026-06-13T03:39:00.639Z",
"locale": "ja-JP",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:11.259Z",
"generatedAt": "2026-06-13T03:39:01.114Z",
"locale": "ko",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:13.835Z",
"generatedAt": "2026-06-13T03:39:06.373Z",
"locale": "nl",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:13.065Z",
"generatedAt": "2026-06-13T03:39:04.514Z",
"locale": "pl",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:10.230Z",
"generatedAt": "2026-06-13T03:38:59.154Z",
"locale": "pt-BR",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:13.322Z",
"generatedAt": "2026-06-13T03:39:05.135Z",
"locale": "th",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:12.297Z",
"generatedAt": "2026-06-13T03:39:02.997Z",
"locale": "tr",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:12.554Z",
"generatedAt": "2026-06-13T03:39:03.555Z",
"locale": "uk",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:13.580Z",
"generatedAt": "2026-06-13T03:39:05.578Z",
"locale": "vi",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:09.713Z",
"generatedAt": "2026-06-13T03:38:56.901Z",
"locale": "zh-CN",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+4 -4
View File
@@ -34,12 +34,12 @@
"workboard.unknownStatus",
"workboard.viewDetails"
],
"generatedAt": "2026-06-10T18:02:09.977Z",
"generatedAt": "2026-06-13T03:38:58.644Z",
"locale": "zh-TW",
"model": "claude-opus-4-8",
"provider": "anthropic",
"sourceHash": "d31dac3a16f784afca7d2c01a614ceeb2d90bb455a67114a0830a3c045210715",
"totalKeys": 1335,
"translatedKeys": 1302,
"sourceHash": "644e37fe678b6c9f31954656d675e2bd8a6f133171ef56c55aabc321ccde5b04",
"totalKeys": 1336,
"translatedKeys": 1303,
"workflow": 1
}
+1
View File
@@ -611,6 +611,7 @@ export const ar: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "البحث في البطاقات",
allPriorities: "كل الأولويات",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "أفلِت العمل هنا",
lifecycleUnlinked: "لا توجد جلسة",
lifecycleUnlinkedDetail: "ابدأ جلسة أو اربطها",
+1
View File
@@ -616,6 +616,7 @@ export const de: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "Karten suchen",
allPriorities: "Alle Prioritäten",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "Arbeit hier ablegen",
lifecycleUnlinked: "Keine Sitzung",
lifecycleUnlinkedDetail: "Sitzung starten oder verknüpfen",
+1
View File
@@ -610,6 +610,7 @@ export const en: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "Search cards",
allPriorities: "All priorities",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "Drop work here",
lifecycleUnlinked: "No session",
lifecycleUnlinkedDetail: "Start or link a session",
+1
View File
@@ -613,6 +613,7 @@ export const es: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "Buscar tarjetas",
allPriorities: "Todas las prioridades",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "Suelta el trabajo aquí",
lifecycleUnlinked: "Sin sesión",
lifecycleUnlinkedDetail: "Inicia o vincula una sesión",
+1
View File
@@ -613,6 +613,7 @@ export const fa: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "جستجوی کارت‌ها",
allPriorities: "همه اولویت‌ها",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "کار را اینجا رها کنید",
lifecycleUnlinked: "بدون جلسه",
lifecycleUnlinkedDetail: "یک جلسه را شروع یا پیوند کنید",
+1
View File
@@ -615,6 +615,7 @@ export const fr: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "Rechercher des cartes",
allPriorities: "Toutes les priorités",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "Déposez le travail ici",
lifecycleUnlinked: "Aucune session",
lifecycleUnlinkedDetail: "Démarrer ou lier une session",
+1
View File
@@ -612,6 +612,7 @@ export const id: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "Cari kartu",
allPriorities: "Semua prioritas",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "Letakkan pekerjaan di sini",
lifecycleUnlinked: "Tidak ada sesi",
lifecycleUnlinkedDetail: "Mulai atau tautkan sesi",
+1
View File
@@ -614,6 +614,7 @@ export const it: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "Cerca schede",
allPriorities: "Tutte le priorità",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "Rilascia qui il lavoro",
lifecycleUnlinked: "Nessuna sessione",
lifecycleUnlinkedDetail: "Avvia o collega una sessione",
+1
View File
@@ -615,6 +615,7 @@ export const ja_JP: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "カードを検索",
allPriorities: "すべての優先度",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "ここに作業をドロップ",
lifecycleUnlinked: "セッションなし",
lifecycleUnlinkedDetail: "セッションを開始またはリンク",
+1
View File
@@ -611,6 +611,7 @@ export const ko: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "카드 검색",
allPriorities: "모든 우선순위",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "여기에 작업을 놓으세요",
lifecycleUnlinked: "세션 없음",
lifecycleUnlinkedDetail: "세션을 시작하거나 연결하세요",
+1
View File
@@ -614,6 +614,7 @@ export const nl: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "Kaarten zoeken",
allPriorities: "Alle prioriteiten",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "Sleep werk hierheen",
lifecycleUnlinked: "Geen sessie",
lifecycleUnlinkedDetail: "Start of koppel een sessie",
+1
View File
@@ -613,6 +613,7 @@ export const pl: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "Szukaj kart",
allPriorities: "Wszystkie priorytety",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "Upuść pracę tutaj",
lifecycleUnlinked: "Brak sesji",
lifecycleUnlinkedDetail: "Rozpocznij lub połącz sesję",
+1
View File
@@ -612,6 +612,7 @@ export const pt_BR: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "Pesquisar cartões",
allPriorities: "Todas as prioridades",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "Solte o trabalho aqui",
lifecycleUnlinked: "Nenhuma sessão",
lifecycleUnlinkedDetail: "Inicie ou vincule uma sessão",
+1
View File
@@ -610,6 +610,7 @@ export const th: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "ค้นหาการ์ด",
allPriorities: "ทุกลำดับความสำคัญ",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "วางงานที่นี่",
lifecycleUnlinked: "ไม่มีเซสชัน",
lifecycleUnlinkedDetail: "เริ่มหรือเชื่อมโยงเซสชัน",
+1
View File
@@ -615,6 +615,7 @@ export const tr: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "Kartlarda ara",
allPriorities: "Tüm öncelikler",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "İşi buraya bırakın",
lifecycleUnlinked: "Oturum yok",
lifecycleUnlinkedDetail: "Bir oturum başlatın veya bağlayın",
+1
View File
@@ -614,6 +614,7 @@ export const uk: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "Шукати картки",
allPriorities: "Усі пріоритети",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "Перетягніть роботу сюди",
lifecycleUnlinked: "Немає сесії",
lifecycleUnlinkedDetail: "Запустіть або пов’яжіть сесію",
+1
View File
@@ -613,6 +613,7 @@ export const vi: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "Tìm kiếm thẻ",
allPriorities: "Tất cả mức ưu tiên",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "Thả công việc vào đây",
lifecycleUnlinked: "Không có phiên",
lifecycleUnlinkedDetail: "Bắt đầu hoặc liên kết một phiên",
+1
View File
@@ -609,6 +609,7 @@ export const zh_CN: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "搜索卡片",
allPriorities: "所有优先级",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "将工作拖放到此处",
lifecycleUnlinked: "无会话",
lifecycleUnlinkedDetail: "启动或关联会话",
+1
View File
@@ -609,6 +609,7 @@ export const zh_TW: TranslationMap = {
labelsPlaceholder: "ui, docs",
searchPlaceholder: "搜尋卡片",
allPriorities: "所有優先順序",
hideEmptyColumns: "Hide empty columns",
emptyColumn: "將工作拖放到這裡",
lifecycleUnlinked: "沒有工作階段",
lifecycleUnlinkedDetail: "開始或連結工作階段",
+19
View File
@@ -137,6 +137,25 @@
min-width: min(280px, 100%);
}
.workboard-toggle {
display: inline-flex;
align-items: center;
gap: 7px;
min-height: var(--workboard-control-height);
color: var(--muted);
font-size: 0.8rem;
font-weight: 600;
line-height: 1.2;
white-space: nowrap;
}
.workboard-toggle input {
width: 15px;
height: 15px;
margin: 0;
accent-color: var(--accent);
}
.workboard-modal {
position: fixed;
inset: 0;
+2
View File
@@ -355,6 +355,7 @@ export type WorkboardUiState = {
agentFilter: string;
showArchived: boolean;
layout: "comfortable" | "compact";
hideEmptyColumns: boolean;
draftOpen: boolean;
editingCardId: string | null;
draftTitle: string;
@@ -402,6 +403,7 @@ function createDefaultState(): WorkboardUiState {
agentFilter: "all",
showArchived: false,
layout: "compact",
hideEmptyColumns: false,
draftOpen: false,
editingCardId: null,
draftTitle: "",
+49
View File
@@ -81,6 +81,55 @@ describe("renderWorkboard", () => {
expect(container.querySelector(".workboard-card__priority")?.textContent).toContain("high");
});
it("can hide empty columns while keeping populated columns visible", () => {
const host = {};
const state = getWorkboardState(host);
state.loaded = true;
state.cards = [
{
id: "card-1",
title: "Keep visible",
status: "todo",
priority: "normal",
labels: [],
position: 1000,
createdAt: 1,
updatedAt: 1,
},
];
const container = document.createElement("div");
const props = {
host,
client: null,
connected: true,
pluginEnabled: true,
agentsList: null,
sessions: [],
onOpenSession: () => undefined,
onRequestUpdate: () => undefined,
} satisfies WorkboardRenderProps;
render(renderWorkboard(props), container);
expect(container.querySelectorAll(".workboard-column")).toHaveLength(9);
const toggle = container.querySelector<HTMLInputElement>(
'input[name="workboard-hide-empty-columns"]',
);
expect(toggle).toBeInstanceOf(HTMLInputElement);
toggle!.checked = true;
toggle!.dispatchEvent(new Event("change", { bubbles: true }));
render(renderWorkboard(props), container);
const columnHeadings = Array.from(
container.querySelectorAll<HTMLElement>(".workboard-column__header h2"),
).map((heading) => heading.textContent?.trim());
expect(state.hideEmptyColumns).toBe(true);
expect(container.querySelectorAll(".workboard-column")).toHaveLength(1);
expect(columnHeadings).toEqual(["Todo"]);
expect(container.textContent).toContain("Todo");
expect(container.textContent).toContain("Keep visible");
});
it("does not render Invalid Date for Date-invalid card timestamps", () => {
const host = {};
const state = getWorkboardState(host);
+16 -1
View File
@@ -1884,6 +1884,9 @@ export function renderWorkboard(props: WorkboardProps) {
for (const card of filtered) {
byStatus.get(card.status)?.push(card);
}
const visibleStatuses = state.hideEmptyColumns
? state.statuses.filter((status) => (byStatus.get(status)?.length ?? 0) > 0)
: state.statuses;
const dialogOpen = state.draftOpen || Boolean(getVisibleDetailCard(state));
return html`
@@ -1975,6 +1978,18 @@ export function renderWorkboard(props: WorkboardProps) {
${icons.layoutComfortable}
</button>
</div>
<label class="workboard-toggle">
<input
type="checkbox"
name="workboard-hide-empty-columns"
.checked=${state.hideEmptyColumns}
@change=${(event: Event) => {
state.hideEmptyColumns = (event.currentTarget as HTMLInputElement).checked;
props.onRequestUpdate?.();
}}
/>
<span>${t("workboard.hideEmptyColumns")}</span>
</label>
</div>
<div class="workboard-toolbar__actions">
<button
@@ -2034,7 +2049,7 @@ export function renderWorkboard(props: WorkboardProps) {
${state.error ? html`<div class="callout danger">${state.error}</div>` : nothing}
${renderDispatchSummary(state)}
<div class="workboard-board workboard-board--${state.layout}">
${state.statuses.map((status) => renderColumn(props, status, byStatus.get(status) ?? []))}
${visibleStatuses.map((status) => renderColumn(props, status, byStatus.get(status) ?? []))}
</div>
</div>
${renderCardModal(props)} ${renderCardDetailsPanel(props)}