(subfolders)
| 7113 | } |
| 7114 | |
| 7115 | async function sortSubfoldersForCurrentOrder(subfolders) { |
| 7116 | const base = Array.isArray(subfolders) ? [...subfolders] : []; |
| 7117 | if (!base.length) return base; |
| 7118 | |
| 7119 | const sourceId = getActivePaneSourceId(); |
| 7120 | const col = sortOrder?.column || "uploaded"; |
| 7121 | const ascending = sortOrder?.ascending !== false; |
| 7122 | const dir = ascending ? 1 : -1; |
| 7123 | |
| 7124 | // Name sort (A–Z / Z–A) |
| 7125 | if (col === "name") { |
| 7126 | base.sort((a, b) => { |
| 7127 | const n1 = (a.name || "").toLowerCase(); |
| 7128 | const n2 = (b.name || "").toLowerCase(); |
| 7129 | if (n1 < n2) return -1 * dir; |
| 7130 | if (n1 > n2) return 1 * dir; |
| 7131 | return 0; |
| 7132 | }); |
| 7133 | return base; |
| 7134 | } |
| 7135 | |
| 7136 | // Size sort – use folder stats (bytes) |
| 7137 | if (col === "size" || col === "filesize") { |
| 7138 | const statsList = await Promise.all( |
| 7139 | base.map(sf => fetchFolderStats(sf.full, sourceId).catch(() => null)) |
| 7140 | ); |
| 7141 | |
| 7142 | const decorated = base.map((sf, idx) => { |
| 7143 | const stats = statsList[idx]; |
| 7144 | let bytes = 0; |
| 7145 | |
| 7146 | if (stats) { |
| 7147 | const candidates = [ |
| 7148 | stats.bytes, |
| 7149 | stats.sizeBytes, |
| 7150 | stats.size, |
| 7151 | stats.totalBytes |
| 7152 | ]; |
| 7153 | for (const v of candidates) { |
| 7154 | const n = Number(v); |
| 7155 | if (Number.isFinite(n) && n >= 0) { |
| 7156 | bytes = n; |
| 7157 | break; |
| 7158 | } |
| 7159 | } |
| 7160 | } |
| 7161 | |
| 7162 | return { sf, bytes }; |
| 7163 | }); |
| 7164 | |
| 7165 | decorated.sort((a, b) => { |
| 7166 | if (a.bytes < b.bytes) return -1 * dir; |
| 7167 | if (a.bytes > b.bytes) return 1 * dir; |
| 7168 | |
| 7169 | // tie-break by name |
| 7170 | const n1 = (a.sf.name || "").toLowerCase(); |
| 7171 | const n2 = (b.sf.name || "").toLowerCase(); |
| 7172 | if (n1 < n2) return -1 * dir; |
no test coverage detected