agkan 2.14.0 → 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 +231 -202
  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,82 @@
1
+ "use strict";
2
+ // Drag and drop functionality
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.sourceBody = exports.draggedCard = void 0;
5
+ exports.updateCount = updateCount;
6
+ exports.attachDragListeners = attachDragListeners;
7
+ exports.initDragDrop = initDragDrop;
8
+ const utils_1 = require("./utils");
9
+ exports.draggedCard = null;
10
+ exports.sourceBody = null;
11
+ function updateCount(status) {
12
+ const col = document.querySelector(`.column[data-status="${status}"]`);
13
+ if (!col)
14
+ return;
15
+ const countEl = col.querySelector('.column-count');
16
+ const bodyEl = col.querySelector('.column-body');
17
+ if (countEl && bodyEl) {
18
+ countEl.textContent = String(bodyEl.children.length);
19
+ }
20
+ }
21
+ async function handleDrop(e, newStatus, colEl) {
22
+ e.preventDefault();
23
+ colEl.classList.remove('drag-over');
24
+ if (!exports.draggedCard)
25
+ return;
26
+ const taskId = exports.draggedCard.dataset.id;
27
+ const oldStatus = exports.draggedCard.dataset.status;
28
+ if (oldStatus === newStatus)
29
+ return;
30
+ const targetBody = document.getElementById('col-' + newStatus);
31
+ const prevBody = exports.sourceBody;
32
+ targetBody.appendChild(exports.draggedCard);
33
+ exports.draggedCard.dataset.status = newStatus;
34
+ updateCount(oldStatus);
35
+ updateCount(newStatus);
36
+ try {
37
+ const res = await fetch('/api/tasks/' + taskId, {
38
+ method: 'PATCH',
39
+ headers: { 'Content-Type': 'application/json' },
40
+ body: JSON.stringify({ status: newStatus }),
41
+ });
42
+ if (!res.ok)
43
+ throw new Error('Server error');
44
+ }
45
+ catch {
46
+ if (prevBody && exports.draggedCard) {
47
+ prevBody.appendChild(exports.draggedCard);
48
+ exports.draggedCard.dataset.status = oldStatus;
49
+ updateCount(oldStatus);
50
+ updateCount(newStatus);
51
+ }
52
+ (0, utils_1.showToast)();
53
+ }
54
+ }
55
+ function attachDragListeners(card) {
56
+ card.addEventListener('dragstart', (e) => {
57
+ exports.draggedCard = card;
58
+ exports.sourceBody = card.parentElement;
59
+ card.classList.add('dragging');
60
+ if (e.dataTransfer)
61
+ e.dataTransfer.effectAllowed = 'move';
62
+ });
63
+ card.addEventListener('dragend', () => {
64
+ card.classList.remove('dragging');
65
+ exports.draggedCard = null;
66
+ exports.sourceBody = null;
67
+ });
68
+ }
69
+ function initDragDrop() {
70
+ document.querySelectorAll('.card').forEach((card) => {
71
+ attachDragListeners(card);
72
+ });
73
+ document.querySelectorAll('.column').forEach((col) => {
74
+ col.addEventListener('dragover', (e) => {
75
+ e.preventDefault();
76
+ col.classList.add('drag-over');
77
+ });
78
+ col.addEventListener('dragleave', () => col.classList.remove('drag-over'));
79
+ col.addEventListener('drop', (e) => handleDrop(e, col.dataset.status, col));
80
+ });
81
+ }
82
+ //# sourceMappingURL=dragDrop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dragDrop.js","sourceRoot":"","sources":["../../../src/board/client/dragDrop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function isFiltersActive(): boolean;
2
+ export declare function applyFilters(): void;
3
+ export declare function renderFilterTagPills(): void;
4
+ export declare function initFilterBar(): void;
5
+ export declare function initFilters(): void;
6
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/board/client/filters.ts"],"names":[],"mappings":"AAKA,wBAAgB,eAAe,IAAI,OAAO,CAMzC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAUnC;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CA0B3C;AAED,wBAAgB,aAAa,IAAI,IAAI,CA0GpC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAKlC"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ // Filter bar functionality
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.isFiltersActive = isFiltersActive;
5
+ exports.applyFilters = applyFilters;
6
+ exports.renderFilterTagPills = renderFilterTagPills;
7
+ exports.initFilterBar = initFilterBar;
8
+ exports.initFilters = initFilters;
9
+ const boardPolling_1 = require("./boardPolling");
10
+ const tags_1 = require("./tags");
11
+ function isFiltersActive() {
12
+ return (boardPolling_1.activeFilters.priorities.length > 0 ||
13
+ boardPolling_1.activeFilters.tagIds.length > 0 ||
14
+ boardPolling_1.activeFilters.assignee !== '');
15
+ }
16
+ function applyFilters() {
17
+ const clearBtn = document.getElementById('filter-clear');
18
+ if (clearBtn) {
19
+ if (isFiltersActive()) {
20
+ clearBtn.classList.add('visible');
21
+ }
22
+ else {
23
+ clearBtn.classList.remove('visible');
24
+ }
25
+ }
26
+ (0, boardPolling_1.refreshBoardCards)();
27
+ }
28
+ function renderFilterTagPills() {
29
+ const container = document.getElementById('filter-tags-control');
30
+ if (!container)
31
+ return;
32
+ // Remove existing pills
33
+ container.querySelectorAll('.filter-tag-pill').forEach((p) => p.remove());
34
+ // Add pills for active tag filters
35
+ boardPolling_1.activeFilters.tagIds.forEach((tagId) => {
36
+ const tag = tags_1.allAvailableTags.find((t) => t.id === tagId);
37
+ if (!tag)
38
+ return;
39
+ const pill = document.createElement('span');
40
+ pill.className = 'filter-tag-pill';
41
+ const label = document.createTextNode(tag.name);
42
+ const removeBtn = document.createElement('button');
43
+ removeBtn.className = 'filter-tag-pill-remove';
44
+ removeBtn.title = 'Remove tag filter';
45
+ removeBtn.innerHTML = '×';
46
+ removeBtn.addEventListener('click', () => {
47
+ const idx = boardPolling_1.activeFilters.tagIds.indexOf(tagId);
48
+ if (idx !== -1)
49
+ boardPolling_1.activeFilters.tagIds.splice(idx, 1);
50
+ renderFilterTagPills();
51
+ applyFilters();
52
+ });
53
+ pill.appendChild(label);
54
+ pill.appendChild(removeBtn);
55
+ container.insertBefore(pill, container.querySelector('.filter-tag-dropdown-wrapper'));
56
+ });
57
+ }
58
+ function initFilterBar() {
59
+ // Priority toggle buttons
60
+ document.querySelectorAll('.filter-priority-btn').forEach((btn) => {
61
+ btn.addEventListener('click', () => {
62
+ const priority = btn.dataset.priority;
63
+ const idx = boardPolling_1.activeFilters.priorities.indexOf(priority);
64
+ if (idx === -1) {
65
+ boardPolling_1.activeFilters.priorities.push(priority);
66
+ btn.classList.add('active');
67
+ }
68
+ else {
69
+ boardPolling_1.activeFilters.priorities.splice(idx, 1);
70
+ btn.classList.remove('active');
71
+ }
72
+ applyFilters();
73
+ });
74
+ });
75
+ // Assignee input with debounce
76
+ const assigneeInput = document.getElementById('filter-assignee');
77
+ let assigneeTimer = null;
78
+ if (assigneeInput) {
79
+ assigneeInput.addEventListener('input', () => {
80
+ if (assigneeTimer)
81
+ clearTimeout(assigneeTimer);
82
+ assigneeTimer = setTimeout(() => {
83
+ boardPolling_1.activeFilters.assignee = assigneeInput.value.trim();
84
+ applyFilters();
85
+ }, 300);
86
+ });
87
+ }
88
+ // Clear button
89
+ const clearBtn = document.getElementById('filter-clear');
90
+ if (clearBtn) {
91
+ clearBtn.addEventListener('click', () => {
92
+ boardPolling_1.activeFilters.tagIds = [];
93
+ boardPolling_1.activeFilters.priorities = [];
94
+ boardPolling_1.activeFilters.assignee = '';
95
+ document
96
+ .querySelectorAll('.filter-priority-btn')
97
+ .forEach((btn) => btn.classList.remove('active'));
98
+ if (assigneeInput)
99
+ assigneeInput.value = '';
100
+ renderFilterTagPills();
101
+ applyFilters();
102
+ });
103
+ }
104
+ // Tag filter dropdown
105
+ const tagsControl = document.getElementById('filter-tags-control');
106
+ if (tagsControl) {
107
+ const dropdownWrapper = document.createElement('div');
108
+ dropdownWrapper.className = 'filter-tag-dropdown-wrapper';
109
+ const addBtn = document.createElement('button');
110
+ addBtn.className = 'filter-tag-add-btn';
111
+ addBtn.textContent = '+ Tag';
112
+ const dropdown = document.createElement('div');
113
+ dropdown.className = 'filter-tag-dropdown';
114
+ dropdownWrapper.appendChild(addBtn);
115
+ dropdownWrapper.appendChild(dropdown);
116
+ tagsControl.appendChild(dropdownWrapper);
117
+ function renderTagDropdown() {
118
+ dropdown.innerHTML = '';
119
+ const available = tags_1.allAvailableTags.filter((t) => !boardPolling_1.activeFilters.tagIds.includes(t.id));
120
+ if (available.length === 0) {
121
+ const empty = document.createElement('div');
122
+ empty.className = 'filter-tag-dropdown-empty';
123
+ empty.textContent = 'No tags available';
124
+ dropdown.appendChild(empty);
125
+ }
126
+ else {
127
+ available.forEach((tag) => {
128
+ const opt = document.createElement('div');
129
+ opt.className = 'filter-tag-dropdown-option';
130
+ opt.textContent = tag.name;
131
+ opt.addEventListener('mousedown', (e) => {
132
+ e.preventDefault();
133
+ boardPolling_1.activeFilters.tagIds.push(tag.id);
134
+ dropdown.classList.remove('open');
135
+ renderFilterTagPills();
136
+ applyFilters();
137
+ });
138
+ dropdown.appendChild(opt);
139
+ });
140
+ }
141
+ }
142
+ addBtn.addEventListener('click', () => {
143
+ if (dropdown.classList.contains('open')) {
144
+ dropdown.classList.remove('open');
145
+ }
146
+ else {
147
+ renderTagDropdown();
148
+ const rect = addBtn.getBoundingClientRect();
149
+ dropdown.style.top = rect.bottom + 2 + 'px';
150
+ dropdown.style.left = rect.left + 'px';
151
+ dropdown.classList.add('open');
152
+ }
153
+ });
154
+ document.addEventListener('click', (e) => {
155
+ if (!dropdownWrapper.contains(e.target)) {
156
+ dropdown.classList.remove('open');
157
+ }
158
+ });
159
+ }
160
+ }
161
+ function initFilters() {
162
+ // Initialize filter bar after tags are loaded
163
+ (0, tags_1.loadAllTags)().then(() => {
164
+ initFilterBar();
165
+ });
166
+ }
167
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/board/client/filters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/board/client/main.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ // Main entry point for board client-side code
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const dragDrop_1 = require("./dragDrop");
5
+ const autoScroll_1 = require("./autoScroll");
6
+ const addTaskModal_1 = require("./addTaskModal");
7
+ const contextMenu_1 = require("./contextMenu");
8
+ const detailPanel_1 = require("./detailPanel");
9
+ const boardPolling_1 = require("./boardPolling");
10
+ const filters_1 = require("./filters");
11
+ const burgerMenu_1 = require("./burgerMenu");
12
+ (0, dragDrop_1.initDragDrop)();
13
+ (0, autoScroll_1.initAutoScroll)();
14
+ (0, addTaskModal_1.initAddTaskModal)();
15
+ (0, contextMenu_1.initContextMenu)();
16
+ (0, detailPanel_1.initDetailPanel)();
17
+ (0, boardPolling_1.initBoardPolling)();
18
+ (0, filters_1.initFilters)();
19
+ (0, burgerMenu_1.initBurgerMenu)();
20
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/board/client/main.ts"],"names":[],"mappings":";AAAA,8CAA8C;;AAE9C,yCAA0C;AAC1C,6CAA8C;AAC9C,iDAAkD;AAClD,+CAAgD;AAChD,+CAAgD;AAChD,iDAAkD;AAClD,uCAAwC;AACxC,6CAA8C;AAE9C,IAAA,uBAAY,GAAE,CAAC;AACf,IAAA,2BAAc,GAAE,CAAC;AACjB,IAAA,+BAAgB,GAAE,CAAC;AACnB,IAAA,6BAAe,GAAE,CAAC;AAClB,IAAA,6BAAe,GAAE,CAAC;AAClB,IAAA,+BAAgB,GAAE,CAAC;AACnB,IAAA,qBAAW,GAAE,CAAC;AACd,IAAA,2BAAc,GAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Tag } from './types';
2
+ export declare let allAvailableTags: Tag[];
3
+ export declare function registerGetDetailTaskId(fn: () => number | null): void;
4
+ export declare function loadAllTags(): Promise<void>;
5
+ export declare function renderTagsSection(currentTags: Tag[]): void;
6
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../src/board/client/tags.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAG9B,eAAO,IAAI,gBAAgB,EAAE,GAAG,EAAO,CAAC;AAKxC,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAErE;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CASjD;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,IAAI,CAuK1D"}
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ // Tag selection and management
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.allAvailableTags = void 0;
5
+ exports.registerGetDetailTaskId = registerGetDetailTaskId;
6
+ exports.loadAllTags = loadAllTags;
7
+ exports.renderTagsSection = renderTagsSection;
8
+ const utils_1 = require("./utils");
9
+ exports.allAvailableTags = [];
10
+ // Callback to get the current detail task ID without circular import
11
+ let _getDetailTaskId = null;
12
+ function registerGetDetailTaskId(fn) {
13
+ _getDetailTaskId = fn;
14
+ }
15
+ async function loadAllTags() {
16
+ try {
17
+ const res = await fetch('/api/tags');
18
+ if (!res.ok)
19
+ return;
20
+ const data = await res.json();
21
+ exports.allAvailableTags = data.tags || [];
22
+ }
23
+ catch {
24
+ // Ignore errors loading tags
25
+ }
26
+ }
27
+ function renderTagsSection(currentTags) {
28
+ const container = document.getElementById('detail-tags-container');
29
+ if (!container)
30
+ return;
31
+ container.innerHTML =
32
+ '<div class="tag-select-wrapper"><div class="tag-select-control" id="tag-select-control"></div><div class="tag-select-dropdown" id="tag-select-dropdown"></div></div>';
33
+ const control = document.getElementById('tag-select-control');
34
+ const dropdown = document.getElementById('tag-select-dropdown');
35
+ let focusedOptionIndex = -1;
36
+ let inputValue = '';
37
+ function getFilteredTags() {
38
+ const currentTagIds = new Set(currentTags.map((t) => t.id));
39
+ const available = exports.allAvailableTags.filter((t) => !currentTagIds.has(t.id));
40
+ if (!inputValue.trim())
41
+ return available;
42
+ const q = inputValue.toLowerCase();
43
+ return available.filter((t) => t.name.toLowerCase().includes(q));
44
+ }
45
+ const input = document.createElement('input');
46
+ input.className = 'tag-select-input';
47
+ input.type = 'text';
48
+ input.autocomplete = 'off';
49
+ control.appendChild(input);
50
+ function renderPills() {
51
+ control.querySelectorAll('.tag-pill').forEach((p) => p.remove());
52
+ currentTags.forEach((t) => {
53
+ const pill = document.createElement('span');
54
+ pill.className = 'tag-pill';
55
+ pill.dataset.tagId = String(t.id);
56
+ const label = document.createTextNode(t.name);
57
+ const removeBtn = document.createElement('button');
58
+ removeBtn.className = 'tag-pill-remove';
59
+ removeBtn.title = 'Remove tag';
60
+ removeBtn.setAttribute('data-tag-id', String(t.id));
61
+ removeBtn.innerHTML = '&times;';
62
+ removeBtn.addEventListener('click', async (e) => {
63
+ e.stopPropagation();
64
+ const detailTaskId = _getDetailTaskId ? _getDetailTaskId() : null;
65
+ try {
66
+ const res = await fetch('/api/tasks/' + detailTaskId + '/tags/' + t.id, {
67
+ method: 'DELETE',
68
+ });
69
+ if (!res.ok)
70
+ throw new Error('Server error');
71
+ const idx = currentTags.findIndex((x) => String(x.id) === String(t.id));
72
+ if (idx !== -1)
73
+ currentTags.splice(idx, 1);
74
+ renderPills();
75
+ renderDropdown();
76
+ }
77
+ catch {
78
+ (0, utils_1.showToast)('Failed to remove tag');
79
+ }
80
+ });
81
+ pill.appendChild(label);
82
+ pill.appendChild(removeBtn);
83
+ control.insertBefore(pill, input);
84
+ });
85
+ input.placeholder = currentTags.length === 0 ? 'Add tags...' : '';
86
+ }
87
+ function renderDropdown() {
88
+ const filtered = getFilteredTags();
89
+ dropdown.innerHTML = '';
90
+ focusedOptionIndex = -1;
91
+ if (filtered.length === 0) {
92
+ const noOpt = document.createElement('div');
93
+ noOpt.className = 'tag-select-no-options';
94
+ noOpt.textContent = inputValue ? 'No matching tags' : 'No tags available';
95
+ dropdown.appendChild(noOpt);
96
+ }
97
+ else {
98
+ filtered.forEach((t, i) => {
99
+ const opt = document.createElement('div');
100
+ opt.className = 'tag-select-option';
101
+ opt.dataset.tagId = String(t.id);
102
+ opt.textContent = t.name;
103
+ opt.addEventListener('mouseover', () => setFocusedOption(i));
104
+ opt.addEventListener('mousedown', async (e) => {
105
+ e.preventDefault();
106
+ await addTag(String(t.id));
107
+ });
108
+ dropdown.appendChild(opt);
109
+ });
110
+ }
111
+ }
112
+ function setFocusedOption(index) {
113
+ const opts = dropdown.querySelectorAll('.tag-select-option');
114
+ opts.forEach((o, i) => o.classList.toggle('focused', i === index));
115
+ focusedOptionIndex = index;
116
+ }
117
+ function openDropdown() {
118
+ renderDropdown();
119
+ dropdown.classList.add('open');
120
+ }
121
+ function closeDropdown() {
122
+ dropdown.classList.remove('open');
123
+ focusedOptionIndex = -1;
124
+ }
125
+ async function addTag(tagId) {
126
+ const detailTaskId = _getDetailTaskId ? _getDetailTaskId() : null;
127
+ try {
128
+ const res = await fetch('/api/tasks/' + detailTaskId + '/tags', {
129
+ method: 'POST',
130
+ headers: { 'Content-Type': 'application/json' },
131
+ body: JSON.stringify({ tagId: Number(tagId) }),
132
+ });
133
+ if (!res.ok)
134
+ throw new Error('Server error');
135
+ const tag = exports.allAvailableTags.find((t) => String(t.id) === String(tagId));
136
+ if (tag)
137
+ currentTags.push(tag);
138
+ input.value = '';
139
+ inputValue = '';
140
+ renderPills();
141
+ renderDropdown();
142
+ }
143
+ catch {
144
+ (0, utils_1.showToast)('Failed to add tag');
145
+ }
146
+ }
147
+ control.addEventListener('click', () => input.focus());
148
+ input.addEventListener('focus', () => openDropdown());
149
+ input.addEventListener('blur', () => setTimeout(() => closeDropdown(), 150));
150
+ input.addEventListener('input', () => {
151
+ inputValue = input.value;
152
+ renderDropdown();
153
+ if (!dropdown.classList.contains('open'))
154
+ openDropdown();
155
+ });
156
+ input.addEventListener('keydown', async (e) => {
157
+ const filtered = getFilteredTags();
158
+ const opts = dropdown.querySelectorAll('.tag-select-option');
159
+ if (e.key === 'ArrowDown') {
160
+ e.preventDefault();
161
+ setFocusedOption(Math.min(focusedOptionIndex + 1, opts.length - 1));
162
+ }
163
+ else if (e.key === 'ArrowUp') {
164
+ e.preventDefault();
165
+ setFocusedOption(Math.max(focusedOptionIndex - 1, 0));
166
+ }
167
+ else if (e.key === 'Enter') {
168
+ e.preventDefault();
169
+ if (focusedOptionIndex >= 0 && filtered[focusedOptionIndex]) {
170
+ await addTag(String(filtered[focusedOptionIndex].id));
171
+ }
172
+ }
173
+ else if (e.key === 'Escape') {
174
+ closeDropdown();
175
+ input.blur();
176
+ }
177
+ else if (e.key === 'Backspace' && input.value === '' && currentTags.length > 0) {
178
+ e.preventDefault();
179
+ const last = currentTags[currentTags.length - 1];
180
+ const detailTaskId = _getDetailTaskId ? _getDetailTaskId() : null;
181
+ try {
182
+ const res = await fetch('/api/tasks/' + detailTaskId + '/tags/' + last.id, {
183
+ method: 'DELETE',
184
+ });
185
+ if (!res.ok)
186
+ throw new Error('Server error');
187
+ currentTags.splice(currentTags.length - 1, 1);
188
+ renderPills();
189
+ renderDropdown();
190
+ }
191
+ catch {
192
+ (0, utils_1.showToast)('Failed to remove tag');
193
+ }
194
+ }
195
+ });
196
+ renderPills();
197
+ }
198
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../../src/board/client/tags.ts"],"names":[],"mappings":";AAAA,+BAA+B;;;AAU/B,0DAEC;AAED,kCASC;AAED,8CAuKC;AA7LD,mCAAoC;AAEzB,QAAA,gBAAgB,GAAU,EAAE,CAAC;AAExC,qEAAqE;AACrE,IAAI,gBAAgB,GAAiC,IAAI,CAAC;AAE1D,SAAgB,uBAAuB,CAAC,EAAuB;IAC7D,gBAAgB,GAAG,EAAE,CAAC;AACxB,CAAC;AAEM,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO;QACpB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,wBAAgB,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;AACH,CAAC;AAED,SAAgB,iBAAiB,CAAC,WAAkB;IAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;IACnE,IAAI,CAAC,SAAS;QAAE,OAAO;IAEvB,SAAS,CAAC,SAAS;QACjB,sKAAsK,CAAC;IAEzK,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAgB,CAAC;IAC7E,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAgB,CAAC;IAC/E,IAAI,kBAAkB,GAAG,CAAC,CAAC,CAAC;IAC5B,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,SAAS,eAAe;QACtB,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,wBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC;QACzC,MAAM,CAAC,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,SAAS,GAAG,kBAAkB,CAAC;IACrC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;IACpB,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;IAC3B,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAE3B,SAAS,WAAW;QAClB,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACnD,SAAS,CAAC,SAAS,GAAG,iBAAiB,CAAC;YACxC,SAAS,CAAC,KAAK,GAAG,YAAY,CAAC;YAC/B,SAAS,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpD,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;YAChC,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,CAAa,EAAE,EAAE;gBAC1D,CAAC,CAAC,eAAe,EAAE,CAAC;gBACpB,MAAM,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClE,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,aAAa,GAAG,YAAY,GAAG,QAAQ,GAAG,CAAC,CAAC,EAAE,EAAE;wBACtE,MAAM,EAAE,QAAQ;qBACjB,CAAC,CAAC;oBACH,IAAI,CAAC,GAAG,CAAC,EAAE;wBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;oBAC7C,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACxE,IAAI,GAAG,KAAK,CAAC,CAAC;wBAAE,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBAC3C,WAAW,EAAE,CAAC;oBACd,cAAc,EAAE,CAAC;gBACnB,CAAC;gBAAC,MAAM,CAAC;oBACP,IAAA,iBAAS,EAAC,sBAAsB,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACxB,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAC5B,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,CAAC;IAED,SAAS,cAAc;QACrB,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QACnC,QAAQ,CAAC,SAAS,GAAG,EAAE,CAAC;QACxB,kBAAkB,GAAG,CAAC,CAAC,CAAC;QACxB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5C,KAAK,CAAC,SAAS,GAAG,uBAAuB,CAAC;YAC1C,KAAK,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,mBAAmB,CAAC;YAC1E,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACxB,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC1C,GAAG,CAAC,SAAS,GAAG,mBAAmB,CAAC;gBACpC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACjC,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC;gBACzB,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7D,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,EAAE,CAAa,EAAE,EAAE;oBACxD,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;gBACH,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,SAAS,gBAAgB,CAAC,KAAa;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CAAc,oBAAoB,CAAC,CAAC;QAC1E,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;QACnE,kBAAkB,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,SAAS,YAAY;QACnB,cAAc,EAAE,CAAC;QACjB,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,SAAS,aAAa;QACpB,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,kBAAkB,GAAG,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,UAAU,MAAM,CAAC,KAAa;QACjC,MAAM,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAClE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,aAAa,GAAG,YAAY,GAAG,OAAO,EAAE;gBAC9D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;aAC/C,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YAC7C,MAAM,GAAG,GAAG,wBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACzE,IAAI,GAAG;gBAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/B,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;YACjB,UAAU,GAAG,EAAE,CAAC;YAChB,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,IAAA,iBAAS,EAAC,mBAAmB,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;IACtD,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7E,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACnC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,cAAc,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,YAAY,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,CAAgB,EAAE,EAAE;QAC3D,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CAAc,oBAAoB,CAAC,CAAC;QAC1E,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YAC1B,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACtE,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC/B,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YAC7B,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,kBAAkB,IAAI,CAAC,IAAI,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC5D,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC9B,aAAa,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,KAAK,EAAE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjF,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAClE,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,aAAa,GAAG,YAAY,GAAG,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE;oBACzE,MAAM,EAAE,QAAQ;iBACjB,CAAC,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC7C,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9C,WAAW,EAAE,CAAC;gBACd,cAAc,EAAE,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,IAAA,iBAAS,EAAC,sBAAsB,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,WAAW,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,48 @@
1
+ export interface Tag {
2
+ id: number;
3
+ name: string;
4
+ }
5
+ export interface TaskData {
6
+ id: number;
7
+ title: string;
8
+ body?: string | null;
9
+ status: string;
10
+ priority?: string | null;
11
+ created_at?: string;
12
+ updated_at?: string;
13
+ }
14
+ export interface TaskDetail {
15
+ task: TaskData;
16
+ tags: Tag[];
17
+ metadata: Array<{
18
+ key: string;
19
+ value: string;
20
+ }>;
21
+ blockedBy: Array<{
22
+ id: number;
23
+ }>;
24
+ blocking: Array<{
25
+ id: number;
26
+ }>;
27
+ parent: {
28
+ id: number;
29
+ title: string;
30
+ } | null;
31
+ }
32
+ export interface Comment {
33
+ id: number;
34
+ content: string;
35
+ author?: string | null;
36
+ created_at?: string;
37
+ }
38
+ export interface ActiveFilters {
39
+ tagIds: number[];
40
+ priorities: string[];
41
+ assignee: string;
42
+ }
43
+ export interface ColumnData {
44
+ status: string;
45
+ html: string;
46
+ count: number;
47
+ }
48
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/board/client/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjC,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // Shared types for client-side board code
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/board/client/types.ts"],"names":[],"mappings":";AAAA,0CAA0C"}
@@ -0,0 +1,4 @@
1
+ export declare function escapeHtmlClient(str: string | null | undefined): string;
2
+ export declare function relativeTime(isoStr: string | null | undefined): string;
3
+ export declare function showToast(msg?: string): void;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/board/client/utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKvE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CActE;AAED,wBAAgB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAM5C"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ // Utility functions
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.escapeHtmlClient = escapeHtmlClient;
5
+ exports.relativeTime = relativeTime;
6
+ exports.showToast = showToast;
7
+ function escapeHtmlClient(str) {
8
+ if (!str)
9
+ return '';
10
+ const div = document.createElement('div');
11
+ div.textContent = String(str);
12
+ return div.innerHTML;
13
+ }
14
+ function relativeTime(isoStr) {
15
+ if (!isoStr)
16
+ return '';
17
+ const diff = Date.now() - new Date(isoStr).getTime();
18
+ const sec = Math.floor(diff / 1000);
19
+ if (sec < 60)
20
+ return 'just now';
21
+ const min = Math.floor(sec / 60);
22
+ if (min < 60)
23
+ return min + 'm ago';
24
+ const hr = Math.floor(min / 60);
25
+ if (hr < 24)
26
+ return hr + 'h ago';
27
+ const day = Math.floor(hr / 24);
28
+ if (day < 30)
29
+ return day + 'd ago';
30
+ const mo = Math.floor(day / 30);
31
+ if (mo < 12)
32
+ return mo + 'mo ago';
33
+ return Math.floor(mo / 12) + 'y ago';
34
+ }
35
+ function showToast(msg) {
36
+ const toast = document.getElementById('toast');
37
+ if (!toast)
38
+ return;
39
+ if (msg)
40
+ toast.textContent = msg;
41
+ toast.classList.add('show');
42
+ setTimeout(() => toast.classList.remove('show'), 3000);
43
+ }
44
+ //# sourceMappingURL=utils.js.map