agkan 2.2.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/board/server.d.ts +2 -2
- package/dist/board/server.d.ts.map +1 -1
- package/dist/board/server.js +231 -158
- package/dist/board/server.js.map +1 -1
- package/dist/cli/commands/board.d.ts.map +1 -1
- package/dist/cli/commands/board.js +2 -1
- package/dist/cli/commands/board.js.map +1 -1
- package/package.json +1 -1
package/dist/board/server.d.ts
CHANGED
|
@@ -3,6 +3,6 @@ import { TaskService } from '../services/TaskService';
|
|
|
3
3
|
import { TaskTagService } from '../services/TaskTagService';
|
|
4
4
|
import { MetadataService } from '../services/MetadataService';
|
|
5
5
|
import { StorageProvider } from '../db/types/storage';
|
|
6
|
-
export declare function createBoardApp(taskService?: TaskService, taskTagService?: TaskTagService, metadataService?: MetadataService, db?: StorageProvider): Hono;
|
|
7
|
-
export declare function startBoardServer(port: number): void;
|
|
6
|
+
export declare function createBoardApp(taskService?: TaskService, taskTagService?: TaskTagService, metadataService?: MetadataService, db?: StorageProvider, boardTitle?: string): Hono;
|
|
7
|
+
export declare function startBoardServer(port: number, boardTitle?: string): void;
|
|
8
8
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAI9D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAI9D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA+xBtD,wBAAgB,cAAc,CAC5B,WAAW,CAAC,EAAE,WAAW,EACzB,cAAc,CAAC,EAAE,cAAc,EAC/B,eAAe,CAAC,EAAE,eAAe,EACjC,EAAE,CAAC,EAAE,eAAe,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAWN;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAMxE"}
|
package/dist/board/server.js
CHANGED
|
@@ -52,38 +52,15 @@ function renderCard(task, tags) {
|
|
|
52
52
|
${tagBadges ? `<div class="card-tags">${tagBadges}</div>` : ''}
|
|
53
53
|
</div>`;
|
|
54
54
|
}
|
|
55
|
-
|
|
56
|
-
const columns = STATUSES.map((status) => {
|
|
57
|
-
const tasks = tasksByStatus.get(status) || [];
|
|
58
|
-
const color = STATUS_COLORS[status];
|
|
59
|
-
const label = STATUS_LABELS[status];
|
|
60
|
-
const cards = tasks.map((t) => renderCard(t, tagMap.get(t.id) || [])).join('');
|
|
61
|
-
return `
|
|
62
|
-
<div class="column" data-status="${status}">
|
|
63
|
-
<div class="column-header" style="border-top-color:${color}">
|
|
64
|
-
<span class="column-title" style="color:${color}">${label}</span>
|
|
65
|
-
<span class="column-header-right">
|
|
66
|
-
<span class="column-count">${tasks.length}</span>
|
|
67
|
-
<button class="add-btn" data-status="${status}" title="Add task">+</button>
|
|
68
|
-
</span>
|
|
69
|
-
</div>
|
|
70
|
-
<div class="column-body" id="col-${status}">
|
|
71
|
-
${cards}
|
|
72
|
-
</div>
|
|
73
|
-
</div>`;
|
|
74
|
-
}).join('');
|
|
75
|
-
return `<!DOCTYPE html>
|
|
76
|
-
<html lang="en">
|
|
77
|
-
<head>
|
|
78
|
-
<meta charset="UTF-8">
|
|
79
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
80
|
-
<title>agkan board</title>
|
|
81
|
-
<style>
|
|
55
|
+
const BOARD_STYLES = `
|
|
82
56
|
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
83
57
|
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #f1f5f9; color: #1e293b; }
|
|
84
|
-
header { background: #1e293b; color: white; padding: 12px 20px; }
|
|
58
|
+
header { background: #1e293b; color: white; padding: 12px 20px; display: flex; align-items: center; justify-content: space-between; }
|
|
85
59
|
header h1 { font-size: 18px; font-weight: 700; }
|
|
86
|
-
.board {
|
|
60
|
+
.board-title { font-size: 14px; font-weight: 400; opacity: 0.75; }
|
|
61
|
+
.board-container { display: flex; width: 100%; height: calc(100vh - 48px); gap: 0; }
|
|
62
|
+
.board { display: flex; gap: 12px; padding: 16px; overflow-x: auto; flex: 1; align-items: flex-start; min-width: 0; }
|
|
63
|
+
.board.with-panel { padding-right: 0; }
|
|
87
64
|
.column { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; width: 240px; flex-shrink: 0; display: flex; flex-direction: column; border-top: 3px solid transparent; }
|
|
88
65
|
.column-header { padding: 10px 12px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid #e2e8f0; }
|
|
89
66
|
.column-title { font-size: 13px; font-weight: 700; }
|
|
@@ -126,16 +103,16 @@ function renderBoard(tasksByStatus, tagMap) {
|
|
|
126
103
|
.modal-actions button.primary:hover { background: #2563eb; }
|
|
127
104
|
.toast { position: fixed; bottom: 20px; right: 20px; background: #ef4444; color: white; padding: 10px 16px; border-radius: 6px; font-size: 13px; opacity: 0; transition: opacity 0.3s; pointer-events: none; }
|
|
128
105
|
.toast.show { opacity: 1; }
|
|
129
|
-
.detail-panel { position:
|
|
106
|
+
.detail-panel { position: relative; width: 0; height: calc(100vh - 48px); background: white; box-shadow: none; border-left: 0 solid #e2e8f0; display: flex; flex-direction: column; max-width: 800px; overflow: hidden; transition: width 0.25s ease; }
|
|
130
107
|
.detail-panel-resize-handle { position: absolute; top: 0; left: 0; width: 6px; height: 100%; cursor: col-resize; z-index: 10; background: transparent; }
|
|
131
108
|
.detail-panel-resize-handle:hover, .detail-panel-resize-handle.dragging { background: rgba(59,130,246,0.3); }
|
|
132
|
-
.detail-panel.open {
|
|
133
|
-
.detail-panel-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; border-bottom: 1px solid #e2e8f0; }
|
|
134
|
-
.detail-panel-header h2 { font-size: 16px; font-weight: 700; color: #1e293b; margin: 0; }
|
|
135
|
-
.detail-panel-close { background: none; border: none; font-size: 20px; color: #64748b; cursor: pointer; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; border-radius: 4px; }
|
|
109
|
+
.detail-panel.open { width: 400px; min-width: 280px; border-left-width: 1px; }
|
|
110
|
+
.detail-panel-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; border-bottom: 1px solid #e2e8f0; flex-shrink: 0; }
|
|
111
|
+
.detail-panel-header h2 { font-size: 16px; font-weight: 700; color: #1e293b; margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
112
|
+
.detail-panel-close { background: none; border: none; font-size: 20px; color: #64748b; cursor: pointer; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; border-radius: 4px; flex-shrink: 0; }
|
|
136
113
|
.detail-panel-close:hover { background: #f1f5f9; color: #1e293b; }
|
|
137
|
-
.detail-panel-body { flex: 1; overflow-y: auto; padding: 20px; }
|
|
138
|
-
.detail-field { margin-bottom: 16px; }
|
|
114
|
+
.detail-panel-body { flex: 1; overflow-y: auto; padding: 20px; min-width: 0; }
|
|
115
|
+
.detail-field { margin-bottom: 16px; word-wrap: break-word; }
|
|
139
116
|
.detail-field-label { font-size: 11px; font-weight: 700; text-transform: uppercase; color: #94a3b8; margin-bottom: 4px; letter-spacing: 0.05em; }
|
|
140
117
|
.detail-field-value { font-size: 13px; color: #1e293b; line-height: 1.5; }
|
|
141
118
|
.detail-field-value.empty { color: #94a3b8; font-style: italic; }
|
|
@@ -145,55 +122,16 @@ function renderBoard(tasksByStatus, tagMap) {
|
|
|
145
122
|
.detail-meta-table td { padding: 4px 0; font-size: 12px; }
|
|
146
123
|
.detail-meta-table td:first-child { color: #64748b; width: 100px; }
|
|
147
124
|
.detail-meta-table td:last-child { color: #1e293b; }
|
|
148
|
-
.detail-panel-footer { padding: 12px 20px; border-top: 1px solid #e2e8f0; display: flex; justify-content: flex-end; }
|
|
125
|
+
.detail-panel-footer { padding: 12px 20px; border-top: 1px solid #e2e8f0; display: flex; justify-content: flex-end; flex-shrink: 0; }
|
|
149
126
|
.detail-panel-footer button { padding: 7px 18px; border-radius: 6px; font-size: 13px; font-weight: 600; cursor: pointer; border: 1px solid #3b82f6; background: #3b82f6; color: white; }
|
|
150
127
|
.detail-panel-footer button:hover { background: #2563eb; border-color: #2563eb; }
|
|
151
128
|
.detail-edit-input { width: 100%; border: 1px solid #e2e8f0; border-radius: 6px; padding: 7px 10px; font-size: 13px; font-family: inherit; background: white; color: #1e293b; }
|
|
152
129
|
.detail-edit-input:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.2); }
|
|
153
|
-
.detail-edit-textarea { width: 100%; border: 1px solid #e2e8f0; border-radius: 6px; padding: 7px 10px; font-size: 13px; font-family: inherit; resize: vertical; min-height:
|
|
130
|
+
.detail-edit-textarea { width: 100%; border: 1px solid #e2e8f0; border-radius: 6px; padding: 7px 10px; font-size: 13px; font-family: inherit; resize: vertical; min-height: 240px; background: white; color: #1e293b; }
|
|
154
131
|
.detail-edit-textarea:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.2); }
|
|
155
132
|
.detail-edit-select { width: 100%; border: 1px solid #e2e8f0; border-radius: 6px; padding: 7px 10px; font-size: 13px; font-family: inherit; background: white; color: #1e293b; }
|
|
156
|
-
.detail-edit-select:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.2); }
|
|
157
|
-
|
|
158
|
-
</head>
|
|
159
|
-
<body>
|
|
160
|
-
<header><h1>agkan board</h1></header>
|
|
161
|
-
<div class="board">${columns}</div>
|
|
162
|
-
<div class="modal-overlay" id="add-modal">
|
|
163
|
-
<div class="modal">
|
|
164
|
-
<h2>Add Task</h2>
|
|
165
|
-
<label for="add-title">Title</label>
|
|
166
|
-
<input type="text" id="add-title" placeholder="Task title">
|
|
167
|
-
<label for="add-body">Description</label>
|
|
168
|
-
<textarea id="add-body" placeholder="Optional"></textarea>
|
|
169
|
-
<label for="add-priority">Priority</label>
|
|
170
|
-
<select id="add-priority">
|
|
171
|
-
<option value="">None</option>
|
|
172
|
-
${models_1.PRIORITIES.map((p) => `<option value="${p}">${p.charAt(0).toUpperCase() + p.slice(1)}</option>`).join('\n ')}
|
|
173
|
-
</select>
|
|
174
|
-
<input type="hidden" id="add-status">
|
|
175
|
-
<div class="modal-actions">
|
|
176
|
-
<button id="add-cancel">Cancel</button>
|
|
177
|
-
<button id="add-submit" class="primary">Add</button>
|
|
178
|
-
</div>
|
|
179
|
-
</div>
|
|
180
|
-
</div>
|
|
181
|
-
<div class="context-menu" id="context-menu">
|
|
182
|
-
<div class="context-menu-item danger" id="ctx-delete">Delete task</div>
|
|
183
|
-
</div>
|
|
184
|
-
<div class="detail-panel" id="detail-panel">
|
|
185
|
-
<div class="detail-panel-resize-handle" id="detail-panel-resize-handle"></div>
|
|
186
|
-
<div class="detail-panel-header">
|
|
187
|
-
<h2 id="detail-panel-title">Task Detail</h2>
|
|
188
|
-
<button class="detail-panel-close" id="detail-panel-close" title="Close">×</button>
|
|
189
|
-
</div>
|
|
190
|
-
<div class="detail-panel-body" id="detail-panel-body"></div>
|
|
191
|
-
<div class="detail-panel-footer">
|
|
192
|
-
<button id="detail-save-btn">Save</button>
|
|
193
|
-
</div>
|
|
194
|
-
</div>
|
|
195
|
-
<div class="toast" id="toast">Failed to update task</div>
|
|
196
|
-
<script>
|
|
133
|
+
.detail-edit-select:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.2); }`;
|
|
134
|
+
const BOARD_SCRIPT = `
|
|
197
135
|
let draggedCard = null;
|
|
198
136
|
let sourceBody = null;
|
|
199
137
|
|
|
@@ -357,7 +295,11 @@ function renderBoard(tasksByStatus, tagMap) {
|
|
|
357
295
|
}
|
|
358
296
|
});
|
|
359
297
|
|
|
360
|
-
// Detail panel
|
|
298
|
+
// Detail panel - create and insert into board-container
|
|
299
|
+
const boardContainer = document.querySelector('.board-container');
|
|
300
|
+
const detailPanelHtml = '<div class="detail-panel" id="detail-panel"><div class="detail-panel-resize-handle" id="detail-panel-resize-handle"></div><div class="detail-panel-header"><h2 id="detail-panel-title">Task Detail</h2><button class="detail-panel-close" id="detail-panel-close" title="Close">×</button></div><div class="detail-panel-body" id="detail-panel-body"></div><div class="detail-panel-footer"><button id="detail-save-btn">Save</button></div></div>';
|
|
301
|
+
boardContainer.insertAdjacentHTML('beforeend', detailPanelHtml);
|
|
302
|
+
|
|
361
303
|
const detailPanel = document.getElementById('detail-panel');
|
|
362
304
|
const detailPanelTitle = document.getElementById('detail-panel-title');
|
|
363
305
|
const detailPanelBody = document.getElementById('detail-panel-body');
|
|
@@ -365,6 +307,7 @@ function renderBoard(tasksByStatus, tagMap) {
|
|
|
365
307
|
|
|
366
308
|
function closeDetailPanel() {
|
|
367
309
|
detailPanel.classList.remove('open');
|
|
310
|
+
detailPanel.style.width = '';
|
|
368
311
|
detailTaskId = null;
|
|
369
312
|
}
|
|
370
313
|
|
|
@@ -374,25 +317,27 @@ function renderBoard(tasksByStatus, tagMap) {
|
|
|
374
317
|
const resizeHandle = document.getElementById('detail-panel-resize-handle');
|
|
375
318
|
const PANEL_MIN_WIDTH = 280;
|
|
376
319
|
const PANEL_MAX_WIDTH = 800;
|
|
320
|
+
const PANEL_DEFAULT_WIDTH = 400;
|
|
377
321
|
const PANEL_WIDTH_KEY = 'detailPanelWidth';
|
|
378
322
|
|
|
379
323
|
(function initPanelWidth() {
|
|
380
324
|
const saved = localStorage.getItem(PANEL_WIDTH_KEY);
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
}
|
|
325
|
+
const targetWidth = (saved && /^\d+$/.test(saved))
|
|
326
|
+
? Math.min(PANEL_MAX_WIDTH, Math.max(PANEL_MIN_WIDTH, parseInt(saved, 10)))
|
|
327
|
+
: PANEL_DEFAULT_WIDTH;
|
|
328
|
+
// Store the width for when panel opens (width is 0 when closed)
|
|
329
|
+
detailPanel.dataset.preferredWidth = String(targetWidth);
|
|
387
330
|
})();
|
|
388
331
|
|
|
389
332
|
resizeHandle.addEventListener('mousedown', function(e) {
|
|
390
333
|
e.preventDefault();
|
|
334
|
+
if (!detailPanel.classList.contains('open')) return;
|
|
391
335
|
const startX = e.clientX;
|
|
392
336
|
const startWidth = detailPanel.offsetWidth;
|
|
393
337
|
resizeHandle.classList.add('dragging');
|
|
394
338
|
document.body.style.userSelect = 'none';
|
|
395
339
|
document.body.style.cursor = 'col-resize';
|
|
340
|
+
detailPanel.style.transition = 'none';
|
|
396
341
|
|
|
397
342
|
function onMouseMove(e) {
|
|
398
343
|
const delta = startX - e.clientX;
|
|
@@ -404,6 +349,7 @@ function renderBoard(tasksByStatus, tagMap) {
|
|
|
404
349
|
resizeHandle.classList.remove('dragging');
|
|
405
350
|
document.body.style.userSelect = '';
|
|
406
351
|
document.body.style.cursor = '';
|
|
352
|
+
detailPanel.style.transition = '';
|
|
407
353
|
localStorage.setItem(PANEL_WIDTH_KEY, detailPanel.offsetWidth);
|
|
408
354
|
document.removeEventListener('mousemove', onMouseMove);
|
|
409
355
|
document.removeEventListener('mouseup', onMouseUp);
|
|
@@ -540,18 +486,69 @@ function renderBoard(tasksByStatus, tagMap) {
|
|
|
540
486
|
if (!res.ok) throw new Error('Server error');
|
|
541
487
|
const data = await res.json();
|
|
542
488
|
renderDetailPanel(data);
|
|
543
|
-
detailPanel.classList.
|
|
489
|
+
if (!detailPanel.classList.contains('open')) {
|
|
490
|
+
const preferredWidth = detailPanel.dataset.preferredWidth || PANEL_DEFAULT_WIDTH;
|
|
491
|
+
detailPanel.style.width = preferredWidth + 'px';
|
|
492
|
+
detailPanel.classList.add('open');
|
|
493
|
+
}
|
|
544
494
|
} catch {
|
|
545
495
|
showToast('Failed to load task details');
|
|
546
496
|
}
|
|
547
497
|
});
|
|
548
498
|
});
|
|
549
499
|
|
|
550
|
-
// Board polling: reload when updated_at changes (skip during drag
|
|
500
|
+
// Board polling: reload when updated_at changes (skip during drag)
|
|
551
501
|
let lastUpdatedAt = null;
|
|
502
|
+
async function refreshBoardCards() {
|
|
503
|
+
try {
|
|
504
|
+
const res = await fetch('/api/board/cards');
|
|
505
|
+
if (!res.ok) return;
|
|
506
|
+
const data = await res.json();
|
|
507
|
+
const columns = data.columns;
|
|
508
|
+
columns.forEach(col => {
|
|
509
|
+
const body = document.getElementById('col-' + col.status);
|
|
510
|
+
if (!body) return;
|
|
511
|
+
body.innerHTML = col.html;
|
|
512
|
+
const colEl = body.closest('.column');
|
|
513
|
+
if (colEl) colEl.querySelector('.column-count').textContent = col.count;
|
|
514
|
+
// Re-attach drag event listeners to new cards
|
|
515
|
+
body.querySelectorAll('.card').forEach(card => {
|
|
516
|
+
card.addEventListener('dragstart', e => {
|
|
517
|
+
draggedCard = card;
|
|
518
|
+
sourceBody = card.parentElement;
|
|
519
|
+
card.classList.add('dragging');
|
|
520
|
+
e.dataTransfer.effectAllowed = 'move';
|
|
521
|
+
});
|
|
522
|
+
card.addEventListener('dragend', () => {
|
|
523
|
+
card.classList.remove('dragging');
|
|
524
|
+
draggedCard = null;
|
|
525
|
+
sourceBody = null;
|
|
526
|
+
});
|
|
527
|
+
card.addEventListener('click', async e => {
|
|
528
|
+
if (e.defaultPrevented) return;
|
|
529
|
+
const taskId = card.dataset.id;
|
|
530
|
+
try {
|
|
531
|
+
const res = await fetch('/api/tasks/' + taskId);
|
|
532
|
+
if (!res.ok) throw new Error('Server error');
|
|
533
|
+
const data = await res.json();
|
|
534
|
+
renderDetailPanel(data);
|
|
535
|
+
if (!detailPanel.classList.contains('open')) {
|
|
536
|
+
const preferredWidth = detailPanel.dataset.preferredWidth || PANEL_DEFAULT_WIDTH;
|
|
537
|
+
detailPanel.style.width = preferredWidth + 'px';
|
|
538
|
+
detailPanel.classList.add('open');
|
|
539
|
+
}
|
|
540
|
+
} catch {
|
|
541
|
+
showToast('Failed to load task details');
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
});
|
|
545
|
+
});
|
|
546
|
+
} catch {
|
|
547
|
+
// Ignore network errors during card refresh
|
|
548
|
+
}
|
|
549
|
+
}
|
|
552
550
|
async function pollBoardUpdates() {
|
|
553
551
|
if (draggedCard !== null) return;
|
|
554
|
-
if (detailPanel.classList.contains('open')) return;
|
|
555
552
|
try {
|
|
556
553
|
const res = await fetch('/api/board/updated-at');
|
|
557
554
|
if (!res.ok) return;
|
|
@@ -560,15 +557,81 @@ function renderBoard(tasksByStatus, tagMap) {
|
|
|
560
557
|
if (lastUpdatedAt === null) {
|
|
561
558
|
lastUpdatedAt = ts;
|
|
562
559
|
} else if (ts !== lastUpdatedAt) {
|
|
563
|
-
|
|
560
|
+
lastUpdatedAt = ts;
|
|
561
|
+
if (detailPanel.classList.contains('open')) {
|
|
562
|
+
await refreshBoardCards();
|
|
563
|
+
} else {
|
|
564
|
+
location.reload();
|
|
565
|
+
}
|
|
564
566
|
}
|
|
565
567
|
} catch {
|
|
566
568
|
// Ignore network errors during polling
|
|
567
569
|
}
|
|
568
570
|
}
|
|
569
571
|
setInterval(pollBoardUpdates, 10000);
|
|
570
|
-
pollBoardUpdates()
|
|
571
|
-
|
|
572
|
+
pollBoardUpdates();`;
|
|
573
|
+
function renderColumn(status, tasks, tagMap) {
|
|
574
|
+
const color = STATUS_COLORS[status];
|
|
575
|
+
const label = STATUS_LABELS[status];
|
|
576
|
+
const cards = tasks.map((t) => renderCard(t, tagMap.get(t.id) || [])).join('');
|
|
577
|
+
return `
|
|
578
|
+
<div class="column" data-status="${status}">
|
|
579
|
+
<div class="column-header" style="border-top-color:${color}">
|
|
580
|
+
<span class="column-title" style="color:${color}">${label}</span>
|
|
581
|
+
<span class="column-header-right">
|
|
582
|
+
<span class="column-count">${tasks.length}</span>
|
|
583
|
+
<button class="add-btn" data-status="${status}" title="Add task">+</button>
|
|
584
|
+
</span>
|
|
585
|
+
</div>
|
|
586
|
+
<div class="column-body" id="col-${status}">
|
|
587
|
+
${cards}
|
|
588
|
+
</div>
|
|
589
|
+
</div>`;
|
|
590
|
+
}
|
|
591
|
+
const BOARD_PRIORITY_OPTIONS = models_1.PRIORITIES.map((p) => `<option value="${p}">${p.charAt(0).toUpperCase() + p.slice(1)}</option>`).join('\n ');
|
|
592
|
+
const BOARD_BODY_STATIC = `
|
|
593
|
+
<div class="modal-overlay" id="add-modal">
|
|
594
|
+
<div class="modal">
|
|
595
|
+
<h2>Add Task</h2>
|
|
596
|
+
<label for="add-title">Title</label>
|
|
597
|
+
<input type="text" id="add-title" placeholder="Task title">
|
|
598
|
+
<label for="add-body">Description</label>
|
|
599
|
+
<textarea id="add-body" placeholder="Optional"></textarea>
|
|
600
|
+
<label for="add-priority">Priority</label>
|
|
601
|
+
<select id="add-priority">
|
|
602
|
+
<option value="">None</option>
|
|
603
|
+
${BOARD_PRIORITY_OPTIONS}
|
|
604
|
+
</select>
|
|
605
|
+
<input type="hidden" id="add-status">
|
|
606
|
+
<div class="modal-actions">
|
|
607
|
+
<button id="add-cancel">Cancel</button>
|
|
608
|
+
<button id="add-submit" class="primary">Add</button>
|
|
609
|
+
</div>
|
|
610
|
+
</div>
|
|
611
|
+
</div>
|
|
612
|
+
<div class="context-menu" id="context-menu">
|
|
613
|
+
<div class="context-menu-item danger" id="ctx-delete">Delete task</div>
|
|
614
|
+
</div>
|
|
615
|
+
<div class="toast" id="toast">Failed to update task</div>
|
|
616
|
+
<script>${BOARD_SCRIPT}
|
|
617
|
+
</script>`;
|
|
618
|
+
function renderBoard(tasksByStatus, tagMap, boardTitle) {
|
|
619
|
+
const columns = STATUSES.map((status) => renderColumn(status, tasksByStatus.get(status) || [], tagMap)).join('');
|
|
620
|
+
const titleHtml = boardTitle ? `<span class="board-title">${escapeHtml(boardTitle)}</span>` : '';
|
|
621
|
+
return `<!DOCTYPE html>
|
|
622
|
+
<html lang="en">
|
|
623
|
+
<head>
|
|
624
|
+
<meta charset="UTF-8">
|
|
625
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
626
|
+
<title>agkan board</title>
|
|
627
|
+
<style>${BOARD_STYLES}
|
|
628
|
+
</style>
|
|
629
|
+
</head>
|
|
630
|
+
<body>
|
|
631
|
+
<header><h1>agkan board</h1>${titleHtml}</header>
|
|
632
|
+
<div class="board-container">
|
|
633
|
+
<div class="board">${columns}</div>${BOARD_BODY_STATIC}
|
|
634
|
+
</div>
|
|
572
635
|
</body>
|
|
573
636
|
</html>`;
|
|
574
637
|
}
|
|
@@ -601,48 +664,38 @@ function buildTaskUpdateInput(body) {
|
|
|
601
664
|
}
|
|
602
665
|
return { input };
|
|
603
666
|
}
|
|
604
|
-
function
|
|
605
|
-
const
|
|
606
|
-
const
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
const
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
`);
|
|
637
|
-
const tagsRow = stmtTags.get();
|
|
638
|
-
const fingerprint = `${baseRow.max_updated_at}|${tagsRow.max_created_at}|${tagsRow.count}`;
|
|
639
|
-
const updatedAt = baseRow.max_updated_at === null && tagsRow.max_created_at === null ? null : fingerprint;
|
|
640
|
-
return c.json({ updatedAt });
|
|
641
|
-
});
|
|
642
|
-
app.get('/api/tasks', (c) => {
|
|
643
|
-
const tasks = ts.listTasks({}, 'id', 'asc');
|
|
644
|
-
return c.json({ tasks });
|
|
645
|
-
});
|
|
667
|
+
function buildTasksByStatus(tasks) {
|
|
668
|
+
const tasksByStatus = new Map();
|
|
669
|
+
for (const status of STATUSES) {
|
|
670
|
+
tasksByStatus.set(status, []);
|
|
671
|
+
}
|
|
672
|
+
for (const task of tasks) {
|
|
673
|
+
tasksByStatus.get(task.status)?.push(task);
|
|
674
|
+
}
|
|
675
|
+
for (const [status, statusTasks] of tasksByStatus) {
|
|
676
|
+
tasksByStatus.set(status, sortByPriority(statusTasks));
|
|
677
|
+
}
|
|
678
|
+
return tasksByStatus;
|
|
679
|
+
}
|
|
680
|
+
function getBoardUpdatedAt(database) {
|
|
681
|
+
const baseRow = database
|
|
682
|
+
.prepare(`
|
|
683
|
+
SELECT MAX(updated_at) as max_updated_at FROM (
|
|
684
|
+
SELECT updated_at FROM tasks UNION ALL SELECT updated_at FROM task_metadata
|
|
685
|
+
)
|
|
686
|
+
`)
|
|
687
|
+
.get();
|
|
688
|
+
const tagsRow = database
|
|
689
|
+
.prepare(`
|
|
690
|
+
SELECT MAX(created_at) as max_created_at, COUNT(*) as count FROM task_tags
|
|
691
|
+
`)
|
|
692
|
+
.get();
|
|
693
|
+
if (baseRow.max_updated_at === null && tagsRow.max_created_at === null)
|
|
694
|
+
return null;
|
|
695
|
+
return `${baseRow.max_updated_at}|${tagsRow.max_created_at}|${tagsRow.count}`;
|
|
696
|
+
}
|
|
697
|
+
function registerTaskApiRoutes(app, { ts, tts, ms }) {
|
|
698
|
+
app.get('/api/tasks', (c) => c.json({ tasks: ts.listTasks({}, 'id', 'asc') }));
|
|
646
699
|
app.post('/api/tasks', async (c) => {
|
|
647
700
|
const body = await c.req.json();
|
|
648
701
|
if (!body.title || typeof body.title !== 'string' || !body.title.trim()) {
|
|
@@ -650,54 +703,74 @@ function createBoardApp(taskService, taskTagService, metadataService, db) {
|
|
|
650
703
|
}
|
|
651
704
|
const status = body.status && STATUSES.includes(body.status) ? body.status : 'backlog';
|
|
652
705
|
const priority = body.priority && (0, models_1.isPriority)(body.priority) ? body.priority : undefined;
|
|
653
|
-
|
|
654
|
-
return c.json(task, 201);
|
|
706
|
+
return c.json(ts.createTask({ title: body.title.trim(), body: body.body || undefined, status, priority }), 201);
|
|
655
707
|
});
|
|
656
708
|
app.get('/api/tasks/:id', (c) => {
|
|
657
709
|
const id = Number(c.req.param('id'));
|
|
658
|
-
if (isNaN(id))
|
|
710
|
+
if (isNaN(id))
|
|
659
711
|
return c.json({ error: 'Invalid task id' }, 400);
|
|
660
|
-
}
|
|
661
712
|
const task = ts.getTask(id);
|
|
662
|
-
if (!task)
|
|
713
|
+
if (!task)
|
|
663
714
|
return c.json({ error: 'Task not found' }, 404);
|
|
664
|
-
}
|
|
665
|
-
const tags = tts.getTagsForTask(id);
|
|
666
|
-
const metadata = ms.listMetadata(id);
|
|
667
|
-
return c.json({ task, tags, metadata });
|
|
715
|
+
return c.json({ task, tags: tts.getTagsForTask(id), metadata: ms.listMetadata(id) });
|
|
668
716
|
});
|
|
669
717
|
app.patch('/api/tasks/:id', async (c) => {
|
|
670
718
|
const id = Number(c.req.param('id'));
|
|
671
|
-
if (isNaN(id))
|
|
719
|
+
if (isNaN(id))
|
|
672
720
|
return c.json({ error: 'Invalid task id' }, 400);
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
const { input, error } = buildTaskUpdateInput(body);
|
|
676
|
-
if (error) {
|
|
721
|
+
const { input, error } = buildTaskUpdateInput(await c.req.json());
|
|
722
|
+
if (error)
|
|
677
723
|
return c.json({ error }, 400);
|
|
678
|
-
}
|
|
679
724
|
const task = ts.updateTask(id, input);
|
|
680
|
-
if (!task)
|
|
725
|
+
if (!task)
|
|
681
726
|
return c.json({ error: 'Task not found' }, 404);
|
|
682
|
-
}
|
|
683
727
|
return c.json(task);
|
|
684
728
|
});
|
|
685
729
|
app.delete('/api/tasks/:id', (c) => {
|
|
686
730
|
const id = Number(c.req.param('id'));
|
|
687
|
-
if (isNaN(id))
|
|
731
|
+
if (isNaN(id))
|
|
688
732
|
return c.json({ error: 'Invalid task id' }, 400);
|
|
689
|
-
|
|
690
|
-
const task = ts.getTask(id);
|
|
691
|
-
if (!task) {
|
|
733
|
+
if (!ts.getTask(id))
|
|
692
734
|
return c.json({ error: 'Task not found' }, 404);
|
|
693
|
-
}
|
|
694
735
|
ts.deleteTask(id);
|
|
695
736
|
return c.json({ success: true });
|
|
696
737
|
});
|
|
738
|
+
}
|
|
739
|
+
function buildBoardCardsPayload(tasksByStatus, tagMap) {
|
|
740
|
+
return STATUSES.map((status) => {
|
|
741
|
+
const tasks = tasksByStatus.get(status) || [];
|
|
742
|
+
const html = tasks.map((t) => renderCard(t, tagMap.get(t.id) || [])).join('');
|
|
743
|
+
return { status, html, count: tasks.length };
|
|
744
|
+
});
|
|
745
|
+
}
|
|
746
|
+
function registerBoardRoutes(app, services) {
|
|
747
|
+
const { ts, tts, database, boardTitle } = services;
|
|
748
|
+
app.get('/', (c) => {
|
|
749
|
+
const tasksByStatus = buildTasksByStatus(ts.listTasks({}, 'id', 'asc'));
|
|
750
|
+
return c.html(renderBoard(tasksByStatus, tts.getAllTaskTags(), boardTitle));
|
|
751
|
+
});
|
|
752
|
+
app.get('/api/board/updated-at', (c) => c.json({ updatedAt: getBoardUpdatedAt(database) }));
|
|
753
|
+
app.get('/api/board/cards', (c) => {
|
|
754
|
+
const tasksByStatus = buildTasksByStatus(ts.listTasks({}, 'id', 'asc'));
|
|
755
|
+
const columns = buildBoardCardsPayload(tasksByStatus, tts.getAllTaskTags());
|
|
756
|
+
return c.json({ columns });
|
|
757
|
+
});
|
|
758
|
+
registerTaskApiRoutes(app, services);
|
|
759
|
+
}
|
|
760
|
+
function createBoardApp(taskService, taskTagService, metadataService, db, boardTitle) {
|
|
761
|
+
const app = new hono_1.Hono();
|
|
762
|
+
const services = {
|
|
763
|
+
ts: taskService ?? new TaskService_1.TaskService(),
|
|
764
|
+
tts: taskTagService ?? new TaskTagService_1.TaskTagService(),
|
|
765
|
+
ms: metadataService ?? new MetadataService_1.MetadataService(),
|
|
766
|
+
database: db ?? (0, connection_1.getDatabase)(),
|
|
767
|
+
boardTitle,
|
|
768
|
+
};
|
|
769
|
+
registerBoardRoutes(app, services);
|
|
697
770
|
return app;
|
|
698
771
|
}
|
|
699
|
-
function startBoardServer(port) {
|
|
700
|
-
const app = createBoardApp();
|
|
772
|
+
function startBoardServer(port, boardTitle) {
|
|
773
|
+
const app = createBoardApp(undefined, undefined, undefined, undefined, boardTitle);
|
|
701
774
|
(0, node_server_1.serve)({ fetch: app.fetch, port }, () => {
|
|
702
775
|
console.log(`Board running at http://localhost:${port}`);
|
|
703
776
|
});
|
package/dist/board/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":";;AAmnBA,wCAsHC;AAED,4CAMC;AAjvBD,+BAA4B;AAC5B,mDAA0C;AAC1C,yDAAsD;AACtD,+DAA4D;AAC5D,iEAA8D;AAC9D,sCAA+F;AAE/F,iDAA+C;AAG/C,MAAM,QAAQ,GAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAEzG,MAAM,aAAa,GAA+B;IAChD,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,aAAa;IAC1B,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,aAAa,GAA+B;IAChD,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,SAAS;IACtB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,UAAU,CAAC,IAAU,EAAE,IAAW;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,MAAM,aAAa,GAAG,QAAQ;QAC5B,CAAC,CAAC,kCAAkC,UAAU,CAAC,QAAQ,CAAC,KAAK,UAAU,CAAC,QAAQ,CAAC,SAAS;QAC1F,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE7F,OAAO;kDACyC,IAAI,CAAC,EAAE,kBAAkB,IAAI,CAAC,MAAM;;iCAErD,IAAI,CAAC,EAAE;UAC9B,aAAa;;gCAES,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9C,SAAS,CAAC,CAAC,CAAC,0BAA0B,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE;WACzD,CAAC;AACZ,CAAC;AAED,SAAS,WAAW,CAAC,aAAsC,EAAE,MAA0B;IACrF,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE/E,OAAO;yCAC8B,MAAM;6DACc,KAAK;oDACd,KAAK,KAAK,KAAK;;yCAE1B,KAAK,CAAC,MAAM;mDACF,MAAM;;;2CAGd,MAAM;YACrC,KAAK;;aAEJ,CAAC;IACZ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAsFc,OAAO;;;;;;;;;;;UAWpB,mBAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAoPlG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;0BAC9B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;2BACvB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;4BAC5B,IAAI,CAAC,SAAS,CAAC,mBAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA0J9C,CAAC;AACT,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,uBAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,uBAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,EAAE,GAAG,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;AAWD,SAAS,oBAAoB,CAAC,IAAmB;IAC/C,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACvB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QACnD,CAAC;QACD,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAA,mBAAU,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IACrF,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,SAAgB,cAAc,CAC5B,WAAyB,EACzB,cAA+B,EAC/B,eAAiC,EACjC,EAAoB;IAEpB,MAAM,GAAG,GAAG,IAAI,WAAI,EAAE,CAAC;IACvB,MAAM,EAAE,GAAG,WAAW,IAAI,IAAI,yBAAW,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAG,cAAc,IAAI,IAAI,+BAAc,EAAE,CAAC;IACnD,MAAM,EAAE,GAAG,eAAe,IAAI,IAAI,iCAAe,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,EAAE,IAAI,IAAA,wBAAW,GAAE,CAAC;IAErC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;QAEpC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAsB,CAAC;QACpD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAED,KAAK,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,aAAa,EAAE,CAAC;YAClD,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC;;;;;;KAMjC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAuC,CAAC;QAEpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC;;KAEjC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAsD,CAAC;QAEnF,MAAM,WAAW,GAAG,GAAG,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3F,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,KAAK,IAAI,IAAI,OAAO,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;QAE1G,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAKzB,CAAC;QACL,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACxE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAA,mBAAU,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzG,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,GAAG,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,GAAG,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAiB,CAAC;QAC/C,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE;QACjC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,GAAG,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QACD,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAE7B,IAAA,mBAAK,EAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmBxD"}
|
|
@@ -8,6 +8,7 @@ function setupBoardCommand(program) {
|
|
|
8
8
|
.command('board')
|
|
9
9
|
.description('Start a local Kanban board viewer at localhost')
|
|
10
10
|
.option('-p, --port <number>', 'Port to listen on', '8080')
|
|
11
|
+
.option('-t, --title <text>', 'Board title to display in the header')
|
|
11
12
|
.action((options) => {
|
|
12
13
|
try {
|
|
13
14
|
const port = parseInt(options.port, 10);
|
|
@@ -16,7 +17,7 @@ function setupBoardCommand(program) {
|
|
|
16
17
|
process.exit(1);
|
|
17
18
|
return;
|
|
18
19
|
}
|
|
19
|
-
(0, server_1.startBoardServer)(port);
|
|
20
|
+
(0, server_1.startBoardServer)(port, options.title);
|
|
20
21
|
}
|
|
21
22
|
catch (error) {
|
|
22
23
|
(0, error_handler_1.handleError)(error, {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":";;AAIA,
|
|
1
|
+
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":";;AAIA,8CAmBC;AAtBD,+CAAsD;AACtD,0DAAqD;AAErD,SAAgB,iBAAiB,CAAC,OAAgB;IAChD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,CAAC;SAC1D,MAAM,CAAC,oBAAoB,EAAE,sCAAsC,CAAC;SACpE,MAAM,CAAC,CAAC,OAAyC,EAAE,EAAE;QACpD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,IAAA,yBAAgB,EAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,2BAAW,EAAC,KAAc,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|