fix(ui): fix list view column spacing, rubber-band selection, and clippy warnings

Add column-gap to list header/items, prevent rubber-band selection from
swallowing clicks on list headers and file items, preserve rubber-band
selection after mouseup, and extract type aliases to resolve clippy
type_complexity warnings.
This commit is contained in:
Jared Wolff
2026-03-05 21:07:19 -05:00
parent d8eecbd9ca
commit 4617c1c1df
7 changed files with 53 additions and 37 deletions
+4
View File
@@ -13,6 +13,7 @@
.list-header {
display: grid;
grid-template-columns: var(--files-list-columns);
column-gap: 12px;
padding: 15px;
font-weight: 600;
color: #2d3748;
@@ -24,6 +25,7 @@
.file-item {
display: grid;
grid-template-columns: var(--files-list-columns);
column-gap: 12px;
padding: 12px 15px;
border-bottom: 1px solid #f0f0f0;
align-items: center;
@@ -332,6 +334,7 @@
border: 2px dashed #ffc107;
}
[data-theme="dark"] .files-list-view {
background-color: #1e293b;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
@@ -380,3 +383,4 @@
[data-theme="dark"] .file-item.drop-target {
background-color: rgba(255, 193, 7, 0.05);
}
+2
View File
@@ -517,6 +517,8 @@ function setupEventListeners() {
// Deselect all cards when clicking empty area (not on a card, menu, or modal)
// Note: multiSelect._hookGlobalDeselect() handles clearing the internal
// selection state; this handler only covers the legacy CSS class removal.
// Skip if a rubber-band selection just finished — the click is a side-effect.
if (window.__rubberBandJustFinished) return;
if (!e.target.closest('.file-card') && !e.target.closest('.file-item') && !e.target.closest('.context-menu') && !e.target.closest('.about-modal') && !e.target.closest('.batch-action-bar') && !e.target.closest('.list-header.selection-mode')) {
document.querySelectorAll('.file-card.selected').forEach(c => c.classList.remove('selected'));
document.querySelectorAll('.file-item.selected').forEach(c => c.classList.remove('selected'));
+11 -2
View File
@@ -1350,9 +1350,11 @@ function initRubberBandSelection() {
container.addEventListener('mousedown', (e) => {
// Only start if clicking empty area (not on a card, button, menu, input…)
if (e.button !== 0) return; // left click only
if (e.target.closest('.file-card') || e.target.closest('.context-menu') ||
if (e.target.closest('.file-card') || e.target.closest('.file-item') ||
e.target.closest('.context-menu') ||
e.target.closest('.upload-dropdown') || e.target.closest('button') ||
e.target.closest('input') || e.target.closest('.breadcrumb')) return;
e.target.closest('input') || e.target.closest('.breadcrumb') ||
e.target.closest('.list-header')) return;
active = true;
startX = e.clientX;
@@ -1420,9 +1422,16 @@ function initRubberBandSelection() {
document.addEventListener('mouseup', () => {
if (!active) return;
active = false;
const hadSelection = selRect.style.display === 'block';
selRect.style.display = 'none';
// Update the batch bar after rubber band selection completes
if (window.multiSelect) window.multiSelect._syncUI();
// Suppress the click event that follows mouseup so the global
// deselect handler doesn't immediately clear the selection.
if (hadSelection) {
window.__rubberBandJustFinished = true;
requestAnimationFrame(() => { window.__rubberBandJustFinished = false; });
}
});
}
+1
View File
@@ -532,6 +532,7 @@ const multiSelect = {
_hookGlobalDeselect() {
document.addEventListener('click', (e) => {
if (window.__rubberBandJustFinished) return;
if (e.target.closest('.file-card, .file-item, .context-menu, .batch-action-bar, .list-header.selection-mode, .about-modal, .rename-dialog, .share-dialog, .confirm-dialog, .modal-overlay, input, button')) return;
if (this.hasSelection) this.clear();
});