agent-tasks 1.9.8 → 1.9.9
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/ui/app.js +72 -41
- package/dist/ui/board.js +2 -2
- package/dist/ui/drag.js +7 -7
- package/dist/ui/inline-edit.js +1 -1
- package/dist/ui/panel.js +14 -14
- package/dist/ui/ui-utils.js +1 -1
- package/package.json +1 -1
package/dist/ui/app.js
CHANGED
|
@@ -30,6 +30,7 @@ TaskBoard._fetch = function (url, opts) {
|
|
|
30
30
|
return fetch(TaskBoard._baseUrl + url, opts);
|
|
31
31
|
};
|
|
32
32
|
TaskBoard._wsUrl = null;
|
|
33
|
+
TaskBoard._root = document;
|
|
33
34
|
|
|
34
35
|
var filters = {
|
|
35
36
|
search: '',
|
|
@@ -75,7 +76,7 @@ TaskBoard.saveCollapsed = saveCollapsed;
|
|
|
75
76
|
// ---- Theme ----
|
|
76
77
|
|
|
77
78
|
function updateThemeIcon(theme) {
|
|
78
|
-
var icon =
|
|
79
|
+
var icon = TaskBoard._root.querySelector('.theme-icon');
|
|
79
80
|
if (icon) icon.textContent = theme === 'dark' ? 'light_mode' : 'dark_mode';
|
|
80
81
|
}
|
|
81
82
|
|
|
@@ -121,14 +122,14 @@ function updateFilterDropdowns() {
|
|
|
121
122
|
var projects = [...new Set(state.tasks.map((t) => t.project).filter(Boolean))].sort();
|
|
122
123
|
var assignees = [...new Set(state.tasks.map((t) => t.assigned_to).filter(Boolean))].sort();
|
|
123
124
|
|
|
124
|
-
var projectSelect =
|
|
125
|
+
var projectSelect = TaskBoard._root.getElementById('filter-project');
|
|
125
126
|
var currentProject = projectSelect.value;
|
|
126
127
|
projectSelect.innerHTML =
|
|
127
128
|
'<option value="">All projects</option>' +
|
|
128
129
|
projects.map((p) => `<option value="${esc(p)}">${esc(p)}</option>`).join('');
|
|
129
130
|
projectSelect.value = currentProject;
|
|
130
131
|
|
|
131
|
-
var assigneeSelect =
|
|
132
|
+
var assigneeSelect = TaskBoard._root.getElementById('filter-assignee');
|
|
132
133
|
var currentAssignee = assigneeSelect.value;
|
|
133
134
|
assigneeSelect.innerHTML =
|
|
134
135
|
'<option value="">All assignees</option>' +
|
|
@@ -137,13 +138,13 @@ function updateFilterDropdowns() {
|
|
|
137
138
|
}
|
|
138
139
|
|
|
139
140
|
function applyRestoredFilters() {
|
|
140
|
-
var searchInput =
|
|
141
|
+
var searchInput = TaskBoard._root.getElementById('filter-search');
|
|
141
142
|
if (filters.search && searchInput) searchInput.value = filters.search;
|
|
142
|
-
var projectSelect =
|
|
143
|
+
var projectSelect = TaskBoard._root.getElementById('filter-project');
|
|
143
144
|
if (filters.project && projectSelect) projectSelect.value = filters.project;
|
|
144
|
-
var assigneeSelect =
|
|
145
|
+
var assigneeSelect = TaskBoard._root.getElementById('filter-assignee');
|
|
145
146
|
if (filters.assignee && assigneeSelect) assigneeSelect.value = filters.assignee;
|
|
146
|
-
var prioritySelect =
|
|
147
|
+
var prioritySelect = TaskBoard._root.getElementById('filter-priority');
|
|
147
148
|
if (filters.minPriority && prioritySelect) prioritySelect.value = String(filters.minPriority);
|
|
148
149
|
}
|
|
149
150
|
|
|
@@ -191,7 +192,7 @@ function connect() {
|
|
|
191
192
|
}
|
|
192
193
|
|
|
193
194
|
function setConnectionStatus(status) {
|
|
194
|
-
var el =
|
|
195
|
+
var el = TaskBoard._root.getElementById('connection-status');
|
|
195
196
|
el.textContent =
|
|
196
197
|
status === 'connected' ? 'Connected' : status === 'connecting' ? 'Connecting' : 'Disconnected';
|
|
197
198
|
el.className = 'status-badge ' + status;
|
|
@@ -215,7 +216,7 @@ function handleFullState(data) {
|
|
|
215
216
|
if (data.stages) state.stages = data.stages;
|
|
216
217
|
if (data.gateConfigs) state.gateConfigs = data.gateConfigs;
|
|
217
218
|
if (data.version) {
|
|
218
|
-
|
|
219
|
+
TaskBoard._root.getElementById('version').textContent = 'v' + data.version;
|
|
219
220
|
}
|
|
220
221
|
updateFilterDropdowns();
|
|
221
222
|
applyRestoredFilters();
|
|
@@ -239,7 +240,7 @@ function quickFingerprint(data) {
|
|
|
239
240
|
}
|
|
240
241
|
|
|
241
242
|
function dismissLoading() {
|
|
242
|
-
var overlay =
|
|
243
|
+
var overlay = TaskBoard._root.getElementById('loading-overlay');
|
|
243
244
|
if (overlay && !overlay.classList.contains('hidden')) {
|
|
244
245
|
overlay.classList.add('hidden');
|
|
245
246
|
overlay.setAttribute('aria-hidden', 'true');
|
|
@@ -357,7 +358,7 @@ function handleEvent(event) {
|
|
|
357
358
|
// ---- Legacy Modal (cleanup only) ----
|
|
358
359
|
|
|
359
360
|
function closeModal() {
|
|
360
|
-
|
|
361
|
+
TaskBoard._root.getElementById('task-modal').hidden = true;
|
|
361
362
|
}
|
|
362
363
|
|
|
363
364
|
// ---- Init ----
|
|
@@ -367,7 +368,7 @@ function _init() {
|
|
|
367
368
|
if (savedTheme === 'dark') document.documentElement.setAttribute('data-theme', 'dark');
|
|
368
369
|
updateThemeIcon(savedTheme || 'light');
|
|
369
370
|
|
|
370
|
-
|
|
371
|
+
TaskBoard._root.getElementById('theme-toggle')?.addEventListener('click', () => {
|
|
371
372
|
var isDark = document.documentElement.getAttribute('data-theme') === 'dark';
|
|
372
373
|
var next = isDark ? 'light' : 'dark';
|
|
373
374
|
if (isDark) {
|
|
@@ -379,7 +380,7 @@ function _init() {
|
|
|
379
380
|
updateThemeIcon(next);
|
|
380
381
|
});
|
|
381
382
|
|
|
382
|
-
|
|
383
|
+
TaskBoard._root.getElementById('filter-search')?.addEventListener('input', (e) => {
|
|
383
384
|
clearTimeout(searchDebounce);
|
|
384
385
|
searchDebounce = setTimeout(() => {
|
|
385
386
|
filters.search = e.target.value;
|
|
@@ -389,21 +390,21 @@ function _init() {
|
|
|
389
390
|
}, 200);
|
|
390
391
|
});
|
|
391
392
|
|
|
392
|
-
|
|
393
|
+
TaskBoard._root.getElementById('filter-project')?.addEventListener('change', (e) => {
|
|
393
394
|
filters.project = e.target.value;
|
|
394
395
|
saveFilters();
|
|
395
396
|
TaskBoard.resetColumnVisibleCounts();
|
|
396
397
|
render();
|
|
397
398
|
});
|
|
398
399
|
|
|
399
|
-
|
|
400
|
+
TaskBoard._root.getElementById('filter-assignee')?.addEventListener('change', (e) => {
|
|
400
401
|
filters.assignee = e.target.value;
|
|
401
402
|
saveFilters();
|
|
402
403
|
TaskBoard.resetColumnVisibleCounts();
|
|
403
404
|
render();
|
|
404
405
|
});
|
|
405
406
|
|
|
406
|
-
|
|
407
|
+
TaskBoard._root.getElementById('filter-priority')?.addEventListener('change', (e) => {
|
|
407
408
|
filters.minPriority = parseInt(e.target.value) || 0;
|
|
408
409
|
saveFilters();
|
|
409
410
|
TaskBoard.resetColumnVisibleCounts();
|
|
@@ -412,7 +413,7 @@ function _init() {
|
|
|
412
413
|
|
|
413
414
|
// ---- Event Delegation (board) ----
|
|
414
415
|
|
|
415
|
-
|
|
416
|
+
TaskBoard._root.getElementById('board')?.addEventListener('click', (e) => {
|
|
416
417
|
var action = e.target.closest('[data-action]');
|
|
417
418
|
|
|
418
419
|
if (action) {
|
|
@@ -469,7 +470,7 @@ function _init() {
|
|
|
469
470
|
}
|
|
470
471
|
});
|
|
471
472
|
|
|
472
|
-
|
|
473
|
+
TaskBoard._root.getElementById('board')?.addEventListener('dblclick', (e) => {
|
|
473
474
|
var titleEl = e.target.closest('[data-action="edit-title"]');
|
|
474
475
|
if (titleEl) {
|
|
475
476
|
e.stopPropagation();
|
|
@@ -477,7 +478,7 @@ function _init() {
|
|
|
477
478
|
}
|
|
478
479
|
});
|
|
479
480
|
|
|
480
|
-
|
|
481
|
+
TaskBoard._root.getElementById('board')?.addEventListener('keydown', (e) => {
|
|
481
482
|
if (e.key === 'Enter') {
|
|
482
483
|
var card = e.target.closest('.task-card[data-task-id]');
|
|
483
484
|
if (card) TaskBoard.openPanel(parseInt(card.dataset.taskId, 10));
|
|
@@ -486,7 +487,7 @@ function _init() {
|
|
|
486
487
|
|
|
487
488
|
// ---- Collapsed column click (expand) ----
|
|
488
489
|
|
|
489
|
-
|
|
490
|
+
TaskBoard._root.getElementById('board')?.addEventListener('click', (e) => {
|
|
490
491
|
var col = e.target.closest('.kanban-column.collapsed');
|
|
491
492
|
if (col) {
|
|
492
493
|
var stage = col.dataset.stage;
|
|
@@ -496,8 +497,8 @@ function _init() {
|
|
|
496
497
|
}
|
|
497
498
|
});
|
|
498
499
|
|
|
499
|
-
|
|
500
|
-
|
|
500
|
+
TaskBoard._root.getElementById('modal-close-btn')?.addEventListener('click', closeModal);
|
|
501
|
+
TaskBoard._root.getElementById('task-modal')?.addEventListener('click', (e) => {
|
|
501
502
|
if (e.target === e.currentTarget) closeModal();
|
|
502
503
|
});
|
|
503
504
|
|
|
@@ -517,12 +518,12 @@ function _init() {
|
|
|
517
518
|
TaskBoard.closePanel();
|
|
518
519
|
return;
|
|
519
520
|
}
|
|
520
|
-
var modal =
|
|
521
|
+
var modal = TaskBoard._root.getElementById('task-modal');
|
|
521
522
|
if (modal && !modal.hidden) {
|
|
522
523
|
closeModal();
|
|
523
524
|
return;
|
|
524
525
|
}
|
|
525
|
-
var cleanupModal =
|
|
526
|
+
var cleanupModal = TaskBoard._root.getElementById('cleanup-modal');
|
|
526
527
|
if (cleanupModal && !cleanupModal.classList.contains('hidden')) {
|
|
527
528
|
cleanupModal.classList.add('hidden');
|
|
528
529
|
return;
|
|
@@ -539,29 +540,29 @@ function _init() {
|
|
|
539
540
|
((e.ctrlKey || e.metaKey) && e.key === 'k')
|
|
540
541
|
) {
|
|
541
542
|
e.preventDefault();
|
|
542
|
-
|
|
543
|
+
TaskBoard._root.getElementById('filter-search')?.focus();
|
|
543
544
|
}
|
|
544
545
|
});
|
|
545
546
|
|
|
546
547
|
// ---- Cleanup Dialog ----
|
|
547
548
|
|
|
548
|
-
|
|
549
|
-
|
|
549
|
+
TaskBoard._root.getElementById('cleanup-btn')?.addEventListener('click', () => {
|
|
550
|
+
TaskBoard._root.getElementById('cleanup-modal').classList.remove('hidden');
|
|
550
551
|
});
|
|
551
552
|
|
|
552
|
-
|
|
553
|
-
|
|
553
|
+
TaskBoard._root.getElementById('cleanup-close-btn')?.addEventListener('click', () => {
|
|
554
|
+
TaskBoard._root.getElementById('cleanup-modal').classList.add('hidden');
|
|
554
555
|
});
|
|
555
556
|
|
|
556
|
-
|
|
557
|
+
TaskBoard._root.getElementById('cleanup-modal')?.addEventListener('click', (e) => {
|
|
557
558
|
if (e.target === e.currentTarget) {
|
|
558
|
-
|
|
559
|
+
TaskBoard._root.getElementById('cleanup-modal').classList.add('hidden');
|
|
559
560
|
}
|
|
560
561
|
});
|
|
561
562
|
|
|
562
|
-
|
|
563
|
+
TaskBoard._root.getElementById('cleanup-completed')?.addEventListener('click', () => {
|
|
563
564
|
var showToast = TaskBoard.showToast;
|
|
564
|
-
|
|
565
|
+
TaskBoard._root.getElementById('cleanup-modal').classList.add('hidden');
|
|
565
566
|
TaskBoard._fetch('/api/cleanup', {
|
|
566
567
|
method: 'POST',
|
|
567
568
|
headers: { 'Content-Type': 'application/json' },
|
|
@@ -578,7 +579,7 @@ function _init() {
|
|
|
578
579
|
.catch(() => showToast('Cleanup failed', 'Network error', 'error'));
|
|
579
580
|
});
|
|
580
581
|
|
|
581
|
-
|
|
582
|
+
TaskBoard._root.getElementById('cleanup-everything')?.addEventListener('click', () => {
|
|
582
583
|
var showToast = TaskBoard.showToast;
|
|
583
584
|
if (
|
|
584
585
|
!confirm(
|
|
@@ -586,7 +587,7 @@ function _init() {
|
|
|
586
587
|
)
|
|
587
588
|
)
|
|
588
589
|
return;
|
|
589
|
-
|
|
590
|
+
TaskBoard._root.getElementById('cleanup-modal').classList.add('hidden');
|
|
590
591
|
TaskBoard._fetch('/api/cleanup', {
|
|
591
592
|
method: 'POST',
|
|
592
593
|
headers: { 'Content-Type': 'application/json' },
|
|
@@ -756,7 +757,7 @@ function _init() {
|
|
|
756
757
|
updateThemeIcon(theme);
|
|
757
758
|
}
|
|
758
759
|
|
|
759
|
-
var themeToggle =
|
|
760
|
+
var themeToggle = TaskBoard._root.getElementById('theme-toggle');
|
|
760
761
|
if (themeToggle) themeToggle.style.display = 'none';
|
|
761
762
|
});
|
|
762
763
|
|
|
@@ -777,16 +778,42 @@ TaskBoard.mount = function (container, options) {
|
|
|
777
778
|
options = options || {};
|
|
778
779
|
TaskBoard._baseUrl = options.baseUrl || '';
|
|
779
780
|
TaskBoard._wsUrl = options.wsUrl || null;
|
|
780
|
-
|
|
781
|
+
|
|
782
|
+
var shadow = container.attachShadow({ mode: 'open' });
|
|
783
|
+
|
|
784
|
+
if (options.cssUrl) {
|
|
781
785
|
var link = document.createElement('link');
|
|
782
|
-
link.id = 'tb-plugin-css';
|
|
783
786
|
link.rel = 'stylesheet';
|
|
784
787
|
link.href = options.cssUrl;
|
|
785
|
-
|
|
788
|
+
shadow.appendChild(link);
|
|
786
789
|
}
|
|
790
|
+
|
|
791
|
+
var fonts = document.createElement('link');
|
|
792
|
+
fonts.rel = 'stylesheet';
|
|
793
|
+
fonts.href =
|
|
794
|
+
'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap';
|
|
795
|
+
shadow.appendChild(fonts);
|
|
796
|
+
var icons = document.createElement('link');
|
|
797
|
+
icons.rel = 'stylesheet';
|
|
798
|
+
icons.href =
|
|
799
|
+
'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap';
|
|
800
|
+
shadow.appendChild(icons);
|
|
801
|
+
|
|
802
|
+
var pluginStyle = document.createElement('style');
|
|
803
|
+
pluginStyle.textContent =
|
|
804
|
+
':host { display:block; width:100%; height:100%; overflow:hidden; }' +
|
|
805
|
+
'.tb-wrapper { font-family:var(--font-sans); font-size:14px; color:var(--text); background:var(--bg); line-height:1.5; width:100%; height:100%; overflow:hidden; }' +
|
|
806
|
+
'.tb-wrapper #app { height:100%; }';
|
|
807
|
+
shadow.appendChild(pluginStyle);
|
|
808
|
+
|
|
787
809
|
if (typeof TaskBoard._template === 'function') {
|
|
788
|
-
|
|
810
|
+
var wrapper = document.createElement('div');
|
|
811
|
+
wrapper.className = 'theme-dark tb-wrapper';
|
|
812
|
+
wrapper.innerHTML = TaskBoard._template();
|
|
813
|
+
shadow.appendChild(wrapper);
|
|
789
814
|
}
|
|
815
|
+
|
|
816
|
+
TaskBoard._root = shadow;
|
|
790
817
|
_init();
|
|
791
818
|
};
|
|
792
819
|
|
|
@@ -797,8 +824,12 @@ TaskBoard.unmount = function () {
|
|
|
797
824
|
ws = null;
|
|
798
825
|
}
|
|
799
826
|
clearTimeout(reconnectTimer);
|
|
827
|
+
TaskBoard._root = document;
|
|
800
828
|
};
|
|
801
829
|
|
|
802
|
-
// ---- Auto-init for
|
|
830
|
+
// ---- Auto-init — check URL params for embedded mode (iframe in agent-desk) ----
|
|
803
831
|
|
|
832
|
+
var _params = new URLSearchParams(location.search);
|
|
833
|
+
if (_params.get('baseUrl')) TaskBoard._baseUrl = _params.get('baseUrl');
|
|
834
|
+
if (_params.get('wsUrl')) TaskBoard._wsUrl = _params.get('wsUrl');
|
|
804
835
|
_init();
|
package/dist/ui/board.js
CHANGED
|
@@ -212,7 +212,7 @@ function renderBoard() {
|
|
|
212
212
|
var getFilteredTasks = TaskBoard.getFilteredTasks;
|
|
213
213
|
var getBlockedTaskIds = TaskBoard.getBlockedTaskIds;
|
|
214
214
|
|
|
215
|
-
const board =
|
|
215
|
+
const board = TaskBoard._root.getElementById('board');
|
|
216
216
|
const blocked = getBlockedTaskIds();
|
|
217
217
|
const filtered = getFilteredTasks();
|
|
218
218
|
const visibleStages = state.stages.filter((s) => s !== 'cancelled');
|
|
@@ -350,7 +350,7 @@ function renderStats() {
|
|
|
350
350
|
const pending = state.tasks.filter((t) => t.status === 'pending').length;
|
|
351
351
|
const done = state.tasks.filter((t) => t.status === 'completed').length;
|
|
352
352
|
|
|
353
|
-
const statsEl =
|
|
353
|
+
const statsEl = TaskBoard._root.getElementById('stats');
|
|
354
354
|
const values = { total, active, pending, done };
|
|
355
355
|
|
|
356
356
|
morph(
|
package/dist/ui/drag.js
CHANGED
|
@@ -27,11 +27,11 @@ function onDragEnd(e) {
|
|
|
27
27
|
if (card) card.classList.remove('dragging');
|
|
28
28
|
draggedTaskId = null;
|
|
29
29
|
stopDragAutoScroll();
|
|
30
|
-
|
|
30
|
+
TaskBoard._root
|
|
31
31
|
.querySelectorAll('.kanban-column.drag-over')
|
|
32
32
|
.forEach((c) => c.classList.remove('drag-over'));
|
|
33
|
-
|
|
34
|
-
const board =
|
|
33
|
+
TaskBoard._root.querySelectorAll('.drop-placeholder').forEach((p) => p.remove());
|
|
34
|
+
const board = TaskBoard._root.getElementById('board');
|
|
35
35
|
board.classList.remove('drag-scroll-left', 'drag-scroll-right');
|
|
36
36
|
}
|
|
37
37
|
|
|
@@ -39,7 +39,7 @@ function onDragOver(e, col) {
|
|
|
39
39
|
e.preventDefault();
|
|
40
40
|
e.dataTransfer.dropEffect = 'move';
|
|
41
41
|
if (col && !col.classList.contains('drag-over')) {
|
|
42
|
-
|
|
42
|
+
TaskBoard._root
|
|
43
43
|
.querySelectorAll('.kanban-column.drag-over')
|
|
44
44
|
.forEach((c) => c.classList.remove('drag-over'));
|
|
45
45
|
col.classList.add('drag-over');
|
|
@@ -52,7 +52,7 @@ function onDrop(e, col) {
|
|
|
52
52
|
|
|
53
53
|
e.preventDefault();
|
|
54
54
|
if (col) col.classList.remove('drag-over');
|
|
55
|
-
|
|
55
|
+
TaskBoard._root.querySelectorAll('.drop-placeholder').forEach((p) => p.remove());
|
|
56
56
|
|
|
57
57
|
if (!draggedTaskId) return;
|
|
58
58
|
const targetStage = col.dataset.stage;
|
|
@@ -74,7 +74,7 @@ function onDrop(e, col) {
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
function startDragAutoScroll() {
|
|
77
|
-
const board =
|
|
77
|
+
const board = TaskBoard._root.getElementById('board');
|
|
78
78
|
dragScrollInterval = setInterval(() => {
|
|
79
79
|
if (!draggedTaskId) return;
|
|
80
80
|
const rect = board.getBoundingClientRect();
|
|
@@ -105,7 +105,7 @@ function stopDragAutoScroll() {
|
|
|
105
105
|
// ---- Drag event wiring ----
|
|
106
106
|
|
|
107
107
|
function initDragEvents() {
|
|
108
|
-
var board =
|
|
108
|
+
var board = TaskBoard._root.getElementById('board');
|
|
109
109
|
|
|
110
110
|
board.addEventListener('dragstart', (e) => {
|
|
111
111
|
const card = e.target.closest('.task-card[data-task-id]');
|
package/dist/ui/inline-edit.js
CHANGED
|
@@ -15,7 +15,7 @@ var activeDropdown = null;
|
|
|
15
15
|
function showInlineCreate(stage) {
|
|
16
16
|
dismissInlineCreate();
|
|
17
17
|
|
|
18
|
-
const col =
|
|
18
|
+
const col = TaskBoard._root.querySelector(`.kanban-column[data-stage="${stage}"]`);
|
|
19
19
|
if (!col) return;
|
|
20
20
|
|
|
21
21
|
const addBtn = col.querySelector('.column-add-btn');
|
package/dist/ui/panel.js
CHANGED
|
@@ -117,10 +117,10 @@ function openPanel(id) {
|
|
|
117
117
|
if (!task) return;
|
|
118
118
|
|
|
119
119
|
state.panelTaskId = id;
|
|
120
|
-
const wrapper =
|
|
120
|
+
const wrapper = TaskBoard._root.getElementById('board-wrapper');
|
|
121
121
|
wrapper.classList.add('panel-open');
|
|
122
122
|
|
|
123
|
-
const panel =
|
|
123
|
+
const panel = TaskBoard._root.getElementById('side-panel');
|
|
124
124
|
const hasArtifacts = (state.artifactCounts[id] || 0) > 0;
|
|
125
125
|
if (hasArtifacts) {
|
|
126
126
|
panel.classList.add('panel-wide');
|
|
@@ -136,14 +136,14 @@ function openPanel(id) {
|
|
|
136
136
|
|
|
137
137
|
function closePanel() {
|
|
138
138
|
TaskBoard.state.panelTaskId = null;
|
|
139
|
-
const wrapper =
|
|
139
|
+
const wrapper = TaskBoard._root.getElementById('board-wrapper');
|
|
140
140
|
wrapper.classList.remove('panel-open');
|
|
141
141
|
hidePanelBackdrop();
|
|
142
142
|
highlightActiveCard(null);
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
function showPanelBackdrop() {
|
|
146
|
-
let backdrop =
|
|
146
|
+
let backdrop = TaskBoard._root.getElementById('panel-backdrop');
|
|
147
147
|
if (!backdrop) {
|
|
148
148
|
backdrop = document.createElement('div');
|
|
149
149
|
backdrop.id = 'panel-backdrop';
|
|
@@ -155,16 +155,16 @@ function showPanelBackdrop() {
|
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
function hidePanelBackdrop() {
|
|
158
|
-
const backdrop =
|
|
158
|
+
const backdrop = TaskBoard._root.getElementById('panel-backdrop');
|
|
159
159
|
if (backdrop) backdrop.style.display = 'none';
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
function highlightActiveCard(id) {
|
|
163
|
-
|
|
163
|
+
TaskBoard._root
|
|
164
164
|
.querySelectorAll('.task-card.active-card')
|
|
165
165
|
.forEach((c) => c.classList.remove('active-card'));
|
|
166
166
|
if (id) {
|
|
167
|
-
const card =
|
|
167
|
+
const card = TaskBoard._root.querySelector(`.task-card[data-task-id="${id}"]`);
|
|
168
168
|
if (card) card.classList.add('active-card');
|
|
169
169
|
}
|
|
170
170
|
}
|
|
@@ -179,8 +179,8 @@ function renderPanelContent(task) {
|
|
|
179
179
|
var renderMarkdown = TaskBoard.renderMarkdown;
|
|
180
180
|
var renderAvatar = TaskBoard.renderAvatar;
|
|
181
181
|
|
|
182
|
-
const panelBody =
|
|
183
|
-
const panelHeader =
|
|
182
|
+
const panelBody = TaskBoard._root.getElementById('panel-body');
|
|
183
|
+
const panelHeader = TaskBoard._root.getElementById('panel-header-content');
|
|
184
184
|
|
|
185
185
|
const stageClass = `stage-${task.stage}`;
|
|
186
186
|
|
|
@@ -375,7 +375,7 @@ function renderPanelContent(task) {
|
|
|
375
375
|
// ---- Comment submission ----
|
|
376
376
|
|
|
377
377
|
function submitComment(taskId) {
|
|
378
|
-
const input =
|
|
378
|
+
const input = TaskBoard._root.getElementById('comment-input');
|
|
379
379
|
const content = input?.value?.trim();
|
|
380
380
|
if (!content) return;
|
|
381
381
|
|
|
@@ -394,7 +394,7 @@ function submitComment(taskId) {
|
|
|
394
394
|
// ---- Artifact interactions ----
|
|
395
395
|
|
|
396
396
|
function toggleArtifact(id) {
|
|
397
|
-
const wrapper =
|
|
397
|
+
const wrapper = TaskBoard._root.getElementById(id);
|
|
398
398
|
if (!wrapper) return;
|
|
399
399
|
const isCollapsed = wrapper.classList.contains('artifact-collapsed');
|
|
400
400
|
wrapper.classList.toggle('artifact-collapsed', !isCollapsed);
|
|
@@ -438,7 +438,7 @@ function copyArtifact(btn) {
|
|
|
438
438
|
|
|
439
439
|
function openArtifactFullscreen(artId) {
|
|
440
440
|
var esc = TaskBoard.esc;
|
|
441
|
-
const wrapper =
|
|
441
|
+
const wrapper = TaskBoard._root.getElementById(artId);
|
|
442
442
|
if (!wrapper) return;
|
|
443
443
|
const content = wrapper.querySelector('.artifact-code, .diff-viewer');
|
|
444
444
|
if (!content) return;
|
|
@@ -479,7 +479,7 @@ function openArtifactFullscreen(artId) {
|
|
|
479
479
|
// ---- Panel resize ----
|
|
480
480
|
|
|
481
481
|
function initPanelResize() {
|
|
482
|
-
const panel =
|
|
482
|
+
const panel = TaskBoard._root.getElementById('side-panel');
|
|
483
483
|
if (!panel) return;
|
|
484
484
|
const handle = document.createElement('div');
|
|
485
485
|
handle.className = 'panel-resize-handle';
|
|
@@ -517,7 +517,7 @@ function initPanelResize() {
|
|
|
517
517
|
// ---- Panel event delegation ----
|
|
518
518
|
|
|
519
519
|
function initPanelEvents() {
|
|
520
|
-
|
|
520
|
+
TaskBoard._root.getElementById('side-panel').addEventListener('click', (e) => {
|
|
521
521
|
const closeBtn = e.target.closest('[data-action="close-panel"]');
|
|
522
522
|
if (closeBtn) {
|
|
523
523
|
closePanel();
|
package/dist/ui/ui-utils.js
CHANGED
|
@@ -282,7 +282,7 @@ function renderDiff(content) {
|
|
|
282
282
|
// ---- Toast ----
|
|
283
283
|
|
|
284
284
|
function showToast(title, body, type) {
|
|
285
|
-
const container =
|
|
285
|
+
const container = TaskBoard._root.getElementById('toast-container');
|
|
286
286
|
const el = document.createElement('div');
|
|
287
287
|
el.className = 'toast';
|
|
288
288
|
|
package/package.json
CHANGED