* Create file element (tile) * @param {string} name * @param {string} url * @param {HTMLElement} [recycledEl] - Optional recycled element for reuse * @returns {HTMLElement}
(name, url, recycledEl)
| 259 | * @returns {HTMLElement} |
| 260 | */ |
| 261 | createFileElement(name, url, recycledEl) { |
| 262 | const iconClass = helpers.getIconForFile(name); |
| 263 | |
| 264 | // Try to recycle existing element |
| 265 | if (recycledEl && recycledEl.dataset.type === "file") { |
| 266 | recycledEl.dataset.url = url; |
| 267 | recycledEl.dataset.name = name; |
| 268 | const textEl = recycledEl.querySelector(".text"); |
| 269 | const iconEl = recycledEl.querySelector("span:first-child"); |
| 270 | if (textEl) textEl.textContent = name; |
| 271 | if (iconEl) iconEl.className = iconClass; |
| 272 | return recycledEl; |
| 273 | } |
| 274 | |
| 275 | const $tile = tile({ |
| 276 | lead: tag("span", { className: iconClass }), |
| 277 | text: name, |
| 278 | }); |
| 279 | |
| 280 | $tile.dataset.url = url; |
| 281 | $tile.dataset.name = name; |
| 282 | $tile.dataset.type = "file"; |
| 283 | |
| 284 | $tile.addEventListener("click", (e) => { |
| 285 | e.stopPropagation(); |
| 286 | this.options.onFileClick?.(url, name); |
| 287 | }); |
| 288 | |
| 289 | $tile.addEventListener("contextmenu", (e) => { |
| 290 | e.stopPropagation(); |
| 291 | this.options.onContextMenu?.("file", url, name, $tile); |
| 292 | }); |
| 293 | |
| 294 | return $tile; |
| 295 | } |
| 296 | |
| 297 | /** |
| 298 | * Clear all rendered content |
no test coverage detected