agkan 2.14.1 → 2.14.3

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.
Files changed (61) hide show
  1. package/dist/board/boardStyles.d.ts +1 -1
  2. package/dist/board/boardStyles.d.ts.map +1 -1
  3. package/dist/board/boardStyles.js +1 -1
  4. package/dist/board/client/addTaskModal.d.ts +2 -0
  5. package/dist/board/client/addTaskModal.d.ts.map +1 -0
  6. package/dist/board/client/addTaskModal.js +64 -0
  7. package/dist/board/client/addTaskModal.js.map +1 -0
  8. package/dist/board/client/autoScroll.d.ts +4 -0
  9. package/dist/board/client/autoScroll.d.ts.map +1 -0
  10. package/dist/board/client/autoScroll.js +59 -0
  11. package/dist/board/client/autoScroll.js.map +1 -0
  12. package/dist/board/client/board.js +228 -201
  13. package/dist/board/client/boardPolling.d.ts +15 -0
  14. package/dist/board/client/boardPolling.d.ts.map +1 -0
  15. package/dist/board/client/boardPolling.js +144 -0
  16. package/dist/board/client/boardPolling.js.map +1 -0
  17. package/dist/board/client/burgerMenu.d.ts +2 -0
  18. package/dist/board/client/burgerMenu.d.ts.map +1 -0
  19. package/dist/board/client/burgerMenu.js +80 -0
  20. package/dist/board/client/burgerMenu.js.map +1 -0
  21. package/dist/board/client/contextMenu.d.ts +2 -0
  22. package/dist/board/client/contextMenu.d.ts.map +1 -0
  23. package/dist/board/client/contextMenu.js +52 -0
  24. package/dist/board/client/contextMenu.js.map +1 -0
  25. package/dist/board/client/detailPanel.d.ts +8 -0
  26. package/dist/board/client/detailPanel.d.ts.map +1 -0
  27. package/dist/board/client/detailPanel.js +565 -0
  28. package/dist/board/client/detailPanel.js.map +1 -0
  29. package/dist/board/client/dragDrop.d.ts +6 -0
  30. package/dist/board/client/dragDrop.d.ts.map +1 -0
  31. package/dist/board/client/dragDrop.js +82 -0
  32. package/dist/board/client/dragDrop.js.map +1 -0
  33. package/dist/board/client/filters.d.ts +6 -0
  34. package/dist/board/client/filters.d.ts.map +1 -0
  35. package/dist/board/client/filters.js +167 -0
  36. package/dist/board/client/filters.js.map +1 -0
  37. package/dist/board/client/main.d.ts +2 -0
  38. package/dist/board/client/main.d.ts.map +1 -0
  39. package/dist/board/client/main.js +20 -0
  40. package/dist/board/client/main.js.map +1 -0
  41. package/dist/board/client/tags.d.ts +6 -0
  42. package/dist/board/client/tags.d.ts.map +1 -0
  43. package/dist/board/client/tags.js +198 -0
  44. package/dist/board/client/tags.js.map +1 -0
  45. package/dist/board/client/types.d.ts +48 -0
  46. package/dist/board/client/types.d.ts.map +1 -0
  47. package/dist/board/client/types.js +4 -0
  48. package/dist/board/client/types.js.map +1 -0
  49. package/dist/board/client/utils.d.ts +4 -0
  50. package/dist/board/client/utils.d.ts.map +1 -0
  51. package/dist/board/client/utils.js +44 -0
  52. package/dist/board/client/utils.js.map +1 -0
  53. package/package.json +1 -1
  54. package/dist/services/ProcessService.d.ts +0 -54
  55. package/dist/services/ProcessService.d.ts.map +0 -1
  56. package/dist/services/ProcessService.js +0 -147
  57. package/dist/services/ProcessService.js.map +0 -1
  58. package/dist/services/TmuxService.d.ts +0 -2
  59. package/dist/services/TmuxService.d.ts.map +0 -1
  60. package/dist/services/TmuxService.js +0 -7
  61. package/dist/services/TmuxService.js.map +0 -1
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ // Board polling: reload when updated_at changes
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.activeFilters = void 0;
5
+ exports.getLastUpdatedAt = getLastUpdatedAt;
6
+ exports.setLastUpdatedAt = setLastUpdatedAt;
7
+ exports.buildFilterParams = buildFilterParams;
8
+ exports.registerDetailPanelCallbacks = registerDetailPanelCallbacks;
9
+ exports.refreshBoardCards = refreshBoardCards;
10
+ exports.pollBoardUpdates = pollBoardUpdates;
11
+ exports.initBoardPolling = initBoardPolling;
12
+ const dragDrop_1 = require("./dragDrop");
13
+ const autoScroll_1 = require("./autoScroll");
14
+ let lastUpdatedAt = null;
15
+ function getLastUpdatedAt() {
16
+ return lastUpdatedAt;
17
+ }
18
+ function setLastUpdatedAt(val) {
19
+ lastUpdatedAt = val;
20
+ }
21
+ exports.activeFilters = { tagIds: [], priorities: [], assignee: '' };
22
+ function buildFilterParams() {
23
+ const params = new URLSearchParams();
24
+ if (exports.activeFilters.priorities.length > 0) {
25
+ params.set('priority', exports.activeFilters.priorities.join(','));
26
+ }
27
+ if (exports.activeFilters.tagIds.length > 0) {
28
+ params.set('tags', exports.activeFilters.tagIds.join(','));
29
+ }
30
+ if (exports.activeFilters.assignee) {
31
+ params.set('assignee', exports.activeFilters.assignee);
32
+ }
33
+ return params;
34
+ }
35
+ // Callbacks to be set by detailPanel module after initialization
36
+ // This breaks the circular dependency
37
+ let _openTaskDetail = null;
38
+ let _renderDetailPanel = null;
39
+ let _showUpdateWarning = null;
40
+ let _getDetailTaskId = null;
41
+ function registerDetailPanelCallbacks(callbacks) {
42
+ _openTaskDetail = callbacks.openTaskDetail;
43
+ _renderDetailPanel = callbacks.renderDetailPanel;
44
+ _showUpdateWarning = callbacks.showUpdateWarning;
45
+ _getDetailTaskId = callbacks.getDetailTaskId;
46
+ }
47
+ async function refreshBoardCards() {
48
+ const filterParams = buildFilterParams();
49
+ const url = '/api/board/cards' + (filterParams.toString() ? '?' + filterParams.toString() : '');
50
+ try {
51
+ const res = await fetch(url);
52
+ if (!res.ok)
53
+ return;
54
+ const data = await res.json();
55
+ const columns = data.columns;
56
+ columns.forEach((col) => {
57
+ const body = document.getElementById('col-' + col.status);
58
+ if (!body)
59
+ return;
60
+ body.innerHTML = col.html;
61
+ const colEl = body.closest('.column');
62
+ if (colEl) {
63
+ const countEl = colEl.querySelector('.column-count');
64
+ if (countEl)
65
+ countEl.textContent = String(col.count);
66
+ }
67
+ // Re-attach drag event listeners to new cards
68
+ body.querySelectorAll('.card').forEach((card) => {
69
+ (0, dragDrop_1.attachDragListeners)(card);
70
+ card.addEventListener('click', async (e) => {
71
+ if (e.defaultPrevented)
72
+ return;
73
+ if (_openTaskDetail)
74
+ await _openTaskDetail(card.dataset.id);
75
+ });
76
+ });
77
+ // Re-attach auto-scroll
78
+ (0, autoScroll_1.attachAutoScrollToBody)(body);
79
+ });
80
+ // If detail panel is open, refresh its content if the task was updated
81
+ const detailTaskId = _getDetailTaskId ? _getDetailTaskId() : null;
82
+ if (detailTaskId !== null) {
83
+ const editableFields = [
84
+ 'detail-edit-title',
85
+ 'detail-edit-body',
86
+ 'detail-edit-status',
87
+ 'detail-edit-priority',
88
+ ];
89
+ const isEditing = editableFields.some((id) => document.activeElement && document.activeElement.id === id);
90
+ if (isEditing) {
91
+ if (_showUpdateWarning)
92
+ _showUpdateWarning();
93
+ }
94
+ else {
95
+ try {
96
+ const taskRes = await fetch('/api/tasks/' + detailTaskId);
97
+ if (taskRes.ok) {
98
+ const taskData = await taskRes.json();
99
+ if (_renderDetailPanel)
100
+ _renderDetailPanel(taskData);
101
+ }
102
+ }
103
+ catch {
104
+ // Ignore network errors during detail panel refresh
105
+ }
106
+ }
107
+ }
108
+ }
109
+ catch {
110
+ // Ignore network errors during card refresh
111
+ }
112
+ }
113
+ async function pollBoardUpdates() {
114
+ if (dragDrop_1.draggedCard !== null)
115
+ return;
116
+ try {
117
+ const res = await fetch('/api/board/updated-at');
118
+ if (!res.ok)
119
+ return;
120
+ const data = await res.json();
121
+ const ts = data.updatedAt;
122
+ const detailPanel = document.getElementById('detail-panel');
123
+ if (lastUpdatedAt === null) {
124
+ lastUpdatedAt = ts;
125
+ }
126
+ else if (ts !== lastUpdatedAt) {
127
+ lastUpdatedAt = ts;
128
+ if (detailPanel.classList.contains('open')) {
129
+ await refreshBoardCards();
130
+ }
131
+ else {
132
+ location.reload();
133
+ }
134
+ }
135
+ }
136
+ catch {
137
+ // Ignore network errors during polling
138
+ }
139
+ }
140
+ function initBoardPolling() {
141
+ setInterval(pollBoardUpdates, 5000);
142
+ pollBoardUpdates();
143
+ }
144
+ //# sourceMappingURL=boardPolling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boardPolling.js","sourceRoot":"","sources":["../../../src/board/client/boardPolling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function initBurgerMenu(): void;
2
+ //# sourceMappingURL=burgerMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"burgerMenu.d.ts","sourceRoot":"","sources":["../../../src/board/client/burgerMenu.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,IAAI,IAAI,CA+ErC"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ // Burger menu, purge tasks, and version info functionality
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.initBurgerMenu = initBurgerMenu;
5
+ function initBurgerMenu() {
6
+ const burgerBtn = document.getElementById('burger-menu-btn');
7
+ const burgerDropdown = document.getElementById('burger-menu-dropdown');
8
+ burgerBtn.addEventListener('click', (e) => {
9
+ e.stopPropagation();
10
+ burgerDropdown.classList.toggle('open');
11
+ });
12
+ document.addEventListener('click', (e) => {
13
+ if (!burgerDropdown.contains(e.target) && e.target !== burgerBtn) {
14
+ burgerDropdown.classList.remove('open');
15
+ }
16
+ });
17
+ // Purge tasks
18
+ const purgeModal = document.getElementById('purge-confirm-modal');
19
+ const purgeConfirmBtn = document.getElementById('purge-confirm-btn');
20
+ const purgeCancelBtn = document.getElementById('purge-cancel-btn');
21
+ const purgeResultEl = document.getElementById('purge-result');
22
+ document.getElementById('burger-purge-tasks')?.addEventListener('click', () => {
23
+ burgerDropdown.classList.remove('open');
24
+ purgeResultEl.textContent = '';
25
+ purgeModal.classList.add('show');
26
+ });
27
+ purgeCancelBtn.addEventListener('click', () => {
28
+ purgeModal.classList.remove('show');
29
+ });
30
+ purgeConfirmBtn.addEventListener('click', async () => {
31
+ purgeConfirmBtn.disabled = true;
32
+ purgeConfirmBtn.textContent = 'Purging...';
33
+ try {
34
+ const res = await fetch('/api/tasks/purge', {
35
+ method: 'POST',
36
+ headers: { 'Content-Type': 'application/json' },
37
+ body: JSON.stringify({}),
38
+ });
39
+ const data = await res.json();
40
+ if (res.ok) {
41
+ purgeResultEl.textContent = 'Purged ' + data.count + ' task(s).';
42
+ setTimeout(() => {
43
+ purgeModal.classList.remove('show');
44
+ }, 1500);
45
+ location.reload();
46
+ }
47
+ else {
48
+ purgeResultEl.textContent = 'Error: ' + (data.error || 'Unknown error');
49
+ }
50
+ }
51
+ catch {
52
+ purgeResultEl.textContent = 'Failed to purge tasks.';
53
+ }
54
+ finally {
55
+ purgeConfirmBtn.disabled = false;
56
+ purgeConfirmBtn.textContent = 'Purge';
57
+ }
58
+ });
59
+ // Version info
60
+ const versionModal = document.getElementById('version-info-modal');
61
+ const versionCloseBtn = document.getElementById('version-info-close');
62
+ const versionTextEl = document.getElementById('version-info-text');
63
+ document.getElementById('burger-version-info')?.addEventListener('click', async () => {
64
+ burgerDropdown.classList.remove('open');
65
+ versionTextEl.textContent = 'Loading...';
66
+ versionModal.classList.add('show');
67
+ try {
68
+ const res = await fetch('/api/version');
69
+ const data = await res.json();
70
+ versionTextEl.textContent = 'agkan v' + data.version;
71
+ }
72
+ catch {
73
+ versionTextEl.textContent = 'Failed to load version.';
74
+ }
75
+ });
76
+ versionCloseBtn.addEventListener('click', () => {
77
+ versionModal.classList.remove('show');
78
+ });
79
+ }
80
+ //# sourceMappingURL=burgerMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"burgerMenu.js","sourceRoot":"","sources":["../../../src/board/client/burgerMenu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function initContextMenu(): void;
2
+ //# sourceMappingURL=contextMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextMenu.d.ts","sourceRoot":"","sources":["../../../src/board/client/contextMenu.ts"],"names":[],"mappings":"AAKA,wBAAgB,eAAe,IAAI,IAAI,CA6CtC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ // Context menu functionality
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.initContextMenu = initContextMenu;
5
+ const utils_1 = require("./utils");
6
+ const dragDrop_1 = require("./dragDrop");
7
+ function initContextMenu() {
8
+ const ctxMenu = document.getElementById('context-menu');
9
+ let ctxTargetCard = null;
10
+ document.addEventListener('contextmenu', (e) => {
11
+ const card = e.target.closest('.card');
12
+ if (!card) {
13
+ ctxMenu.style.display = 'none';
14
+ return;
15
+ }
16
+ e.preventDefault();
17
+ ctxTargetCard = card;
18
+ ctxMenu.style.left = e.clientX + 'px';
19
+ ctxMenu.style.top = e.clientY + 'px';
20
+ ctxMenu.style.display = 'block';
21
+ });
22
+ document.addEventListener('click', (e) => {
23
+ if (!e.target.closest('#context-menu')) {
24
+ ctxMenu.style.display = 'none';
25
+ ctxTargetCard = null;
26
+ }
27
+ });
28
+ document.getElementById('ctx-delete')?.addEventListener('click', async (e) => {
29
+ e.stopPropagation();
30
+ ctxMenu.style.display = 'none';
31
+ if (!ctxTargetCard)
32
+ return;
33
+ const card = ctxTargetCard;
34
+ ctxTargetCard = null;
35
+ const taskId = card.dataset.id;
36
+ const status = card.dataset.status;
37
+ if (!confirm('Delete task #' + taskId + '?'))
38
+ return;
39
+ card.remove();
40
+ (0, dragDrop_1.updateCount)(status);
41
+ try {
42
+ const res = await fetch('/api/tasks/' + taskId, { method: 'DELETE' });
43
+ if (!res.ok)
44
+ throw new Error('Server error');
45
+ }
46
+ catch {
47
+ location.reload();
48
+ (0, utils_1.showToast)('Failed to delete task');
49
+ }
50
+ });
51
+ }
52
+ //# sourceMappingURL=contextMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextMenu.js","sourceRoot":"","sources":["../../../src/board/client/contextMenu.ts"],"names":[],"mappings":";AAAA,6BAA6B;;AAK7B,0CA6CC;AAhDD,mCAAoC;AACpC,yCAAyC;AAEzC,SAAgB,eAAe;IAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAgB,CAAC;IACvE,IAAI,aAAa,GAAuB,IAAI,CAAC;IAE7C,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,CAAa,EAAE,EAAE;QACzD,MAAM,IAAI,GAAI,CAAC,CAAC,MAAsB,CAAC,OAAO,CAAc,OAAO,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,aAAa,GAAG,IAAI,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAa,EAAE,EAAE;QACnD,IAAI,CAAE,CAAC,CAAC,MAAsB,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAC/B,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,CAAa,EAAE,EAAE;QACvF,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QAC/B,IAAI,CAAC,aAAa;YAAE,OAAO;QAC3B,MAAM,IAAI,GAAG,aAAa,CAAC;QAC3B,aAAa,GAAG,IAAI,CAAC;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,EAAG,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAO,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,MAAM,GAAG,GAAG,CAAC;YAAE,OAAO;QAErD,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAA,sBAAW,EAAC,MAAM,CAAC,CAAC;QAEpB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,aAAa,GAAG,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,IAAA,iBAAS,EAAC,uBAAuB,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { TaskDetail } from './types';
2
+ export declare function getDetailTaskId(): number | null;
3
+ export declare function closeDetailPanel(): void;
4
+ export declare function renderDetailPanel(data: TaskDetail): void;
5
+ export declare function openTaskDetail(taskId: string): Promise<void>;
6
+ export declare function showUpdateWarning(): void;
7
+ export declare function initDetailPanel(): void;
8
+ //# sourceMappingURL=detailPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detailPanel.d.ts","sourceRoot":"","sources":["../../../src/board/client/detailPanel.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAUrC,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC;AA8MD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAuJxD;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBlE;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAgCxC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAoKtC"}