hzl-web 1.14.1 → 1.16.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.
Files changed (2) hide show
  1. package/dist/ui/index.html +122 -1
  2. package/package.json +1 -1
@@ -73,6 +73,7 @@
73
73
  display: flex;
74
74
  align-items: center;
75
75
  gap: 6px;
76
+ position: relative;
76
77
  }
77
78
 
78
79
  .filter-label {
@@ -136,6 +137,58 @@
136
137
  border-color: var(--accent);
137
138
  }
138
139
 
140
+ /* Column Visibility Dropdown */
141
+ .columns-toggle {
142
+ font-family: var(--font-mono);
143
+ font-size: 12px;
144
+ background: var(--bg-primary);
145
+ color: var(--text-primary);
146
+ border: 1px solid var(--border);
147
+ padding: 4px 8px;
148
+ border-radius: 4px;
149
+ cursor: pointer;
150
+ }
151
+
152
+ .columns-toggle:hover {
153
+ border-color: var(--accent);
154
+ }
155
+
156
+ .columns-dropdown {
157
+ display: none;
158
+ position: absolute;
159
+ top: 100%;
160
+ left: 0;
161
+ margin-top: 4px;
162
+ background: var(--bg-secondary);
163
+ border: 1px solid var(--border);
164
+ border-radius: 4px;
165
+ padding: 8px;
166
+ z-index: 100;
167
+ min-width: 140px;
168
+ }
169
+
170
+ .columns-dropdown.open {
171
+ display: block;
172
+ }
173
+
174
+ .column-checkbox {
175
+ display: flex;
176
+ align-items: center;
177
+ gap: 8px;
178
+ padding: 4px 0;
179
+ cursor: pointer;
180
+ font-size: 12px;
181
+ color: var(--text-primary);
182
+ }
183
+
184
+ .column-checkbox:hover {
185
+ color: var(--accent);
186
+ }
187
+
188
+ .column-checkbox input {
189
+ accent-color: var(--accent);
190
+ }
191
+
139
192
  /* Kanban Board */
140
193
  .board {
141
194
  display: flex;
@@ -146,7 +199,9 @@
146
199
  }
147
200
 
148
201
  .column {
149
- flex: 0 0 280px;
202
+ flex: 1 1 220px;
203
+ min-width: 180px;
204
+ max-width: 320px;
150
205
  background: var(--bg-secondary);
151
206
  border-radius: 8px;
152
207
  display: flex;
@@ -154,6 +209,10 @@
154
209
  max-height: calc(100vh - 85px);
155
210
  }
156
211
 
212
+ .column.hidden {
213
+ display: none;
214
+ }
215
+
157
216
  .column-header {
158
217
  padding: 12px;
159
218
  border-bottom: 1px solid var(--border);
@@ -609,6 +668,26 @@
609
668
  <option value="30000">30s</option>
610
669
  </select>
611
670
  </div>
671
+ <div class="filter-group">
672
+ <button class="columns-toggle" id="columnsToggle">Columns</button>
673
+ <div class="columns-dropdown" id="columnsDropdown">
674
+ <label class="column-checkbox">
675
+ <input type="checkbox" value="backlog" checked> Backlog
676
+ </label>
677
+ <label class="column-checkbox">
678
+ <input type="checkbox" value="ready" checked> Ready
679
+ </label>
680
+ <label class="column-checkbox">
681
+ <input type="checkbox" value="in_progress" checked> In Progress
682
+ </label>
683
+ <label class="column-checkbox">
684
+ <input type="checkbox" value="blocked" checked> Blocked
685
+ </label>
686
+ <label class="column-checkbox">
687
+ <input type="checkbox" value="done" checked> Done
688
+ </label>
689
+ </div>
690
+ </div>
612
691
  </div>
613
692
  <div class="header-right">
614
693
  <div class="connection-indicator">
@@ -720,6 +799,21 @@
720
799
  const modalBody = document.getElementById('modalBody');
721
800
  const hamburgerBtn = document.getElementById('hamburgerBtn');
722
801
  const mobileTabs = document.getElementById('mobileTabs');
802
+ const columnsToggle = document.getElementById('columnsToggle');
803
+ const columnsDropdown = document.getElementById('columnsDropdown');
804
+
805
+ // Column visibility
806
+ const COLUMNS = ['backlog', 'ready', 'in_progress', 'blocked', 'done'];
807
+
808
+ function updateColumnVisibility() {
809
+ COLUMNS.forEach(status => {
810
+ const checkbox = columnsDropdown.querySelector(`input[value="${status}"]`);
811
+ const column = document.querySelector(`.column[data-status="${status}"]`);
812
+ if (column && checkbox) {
813
+ column.classList.toggle('hidden', !checkbox.checked);
814
+ }
815
+ });
816
+ }
723
817
 
724
818
  // Load saved preferences
725
819
  function loadPreferences() {
@@ -730,6 +824,12 @@
730
824
  if (prefs.dateFilter) dateFilter.value = prefs.dateFilter;
731
825
  if (prefs.projectFilter) projectFilter.value = prefs.projectFilter;
732
826
  if (prefs.refreshFilter) refreshFilter.value = prefs.refreshFilter;
827
+ if (Array.isArray(prefs.columnVisibility)) {
828
+ columnsDropdown.querySelectorAll('input[type="checkbox"]').forEach(cb => {
829
+ cb.checked = prefs.columnVisibility.includes(cb.value);
830
+ });
831
+ updateColumnVisibility();
832
+ }
733
833
  } catch (e) {}
734
834
  }
735
835
  }
@@ -739,6 +839,9 @@
739
839
  dateFilter: dateFilter.value,
740
840
  projectFilter: projectFilter.value,
741
841
  refreshFilter: refreshFilter.value,
842
+ columnVisibility: Array.from(
843
+ columnsDropdown.querySelectorAll('input[type="checkbox"]:checked')
844
+ ).map(cb => cb.value),
742
845
  };
743
846
  localStorage.setItem('hzl-dashboard-prefs', JSON.stringify(prefs));
744
847
  }
@@ -1163,6 +1266,7 @@
1163
1266
  if (e.key === 'Escape') {
1164
1267
  closeModal();
1165
1268
  activityPanel.classList.remove('open');
1269
+ columnsDropdown.classList.remove('open');
1166
1270
  }
1167
1271
  });
1168
1272
 
@@ -1195,6 +1299,23 @@
1195
1299
  filters.style.display = filters.style.display === 'none' ? 'flex' : 'none';
1196
1300
  });
1197
1301
 
1302
+ // Column visibility dropdown
1303
+ columnsToggle.addEventListener('click', (e) => {
1304
+ e.stopPropagation();
1305
+ columnsDropdown.classList.toggle('open');
1306
+ });
1307
+
1308
+ document.addEventListener('click', () => {
1309
+ columnsDropdown.classList.remove('open');
1310
+ });
1311
+
1312
+ columnsDropdown.addEventListener('click', (e) => e.stopPropagation());
1313
+
1314
+ columnsDropdown.addEventListener('change', () => {
1315
+ updateColumnVisibility();
1316
+ savePreferences();
1317
+ });
1318
+
1198
1319
  // Initialize
1199
1320
  loadPreferences();
1200
1321
  startPolling();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hzl-web",
3
- "version": "1.14.1",
3
+ "version": "1.16.0",
4
4
  "description": "Web dashboard for HZL - A Kanban-style task monitoring UI.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",