|
1998 | 1998 | toast(`Template: ${S.model.toUpperCase()}`, 'info'); |
1999 | 1999 | }); |
2000 | 2000 | } |
| 2001 | + |
| 2002 | + // Drag and Drop functionality |
| 2003 | + const dragDropZone = $('dragDropZone'); |
| 2004 | + const dragDropOverlay = $('dragDropOverlay'); |
| 2005 | + |
| 2006 | + if (dragDropZone) { |
| 2007 | + // Prevent default drag behaviors on the entire zone |
| 2008 | + ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { |
| 2009 | + dragDropZone.addEventListener(eventName, e => { |
| 2010 | + e.preventDefault(); |
| 2011 | + e.stopPropagation(); |
| 2012 | + }, false); |
| 2013 | + }); |
| 2014 | + |
| 2015 | + // Highlight drop zone when dragging over it |
| 2016 | + ['dragenter', 'dragover'].forEach(eventName => { |
| 2017 | + dragDropZone.addEventListener(eventName, () => { |
| 2018 | + dragDropZone.classList.add('drag-over'); |
| 2019 | + }, false); |
| 2020 | + }); |
| 2021 | + |
| 2022 | + ['dragleave', 'drop'].forEach(eventName => { |
| 2023 | + dragDropZone.addEventListener(eventName, () => { |
| 2024 | + dragDropZone.classList.remove('drag-over'); |
| 2025 | + }, false); |
| 2026 | + }); |
| 2027 | + |
| 2028 | + // Handle dropped files |
| 2029 | + dragDropZone.addEventListener('drop', e => { |
| 2030 | + const items = e.dataTransfer.items; |
| 2031 | + if (!items || items.length === 0) return; |
| 2032 | + |
| 2033 | + // Check if folder was dropped (check webkitdirectory support) |
| 2034 | + const files = e.dataTransfer.files; |
| 2035 | + if (files.length > 0) { |
| 2036 | + // Show loader IMMEDIATELY |
| 2037 | + load(true, 'Loading dropped files...'); |
| 2038 | + // Process files in next tick to let loader render |
| 2039 | + setTimeout(() => loadFiles(files), 0); |
| 2040 | + } else { |
| 2041 | + toast('Please drop a folder, not individual files', 'warning'); |
| 2042 | + } |
| 2043 | + }, false); |
| 2044 | + |
| 2045 | + // Click on zone to trigger folder selection |
| 2046 | + dragDropZone.addEventListener('click', e => { |
| 2047 | + // Don't trigger if clicking the button itself |
| 2048 | + if (!e.target.closest('.btn-select-dir')) { |
| 2049 | + if (D.sel) D.sel.click(); |
| 2050 | + } |
| 2051 | + }); |
| 2052 | + } |
| 2053 | + |
2001 | 2054 | // Optimize file input change handler |
2002 | 2055 | inp.onchange = e => { |
2003 | 2056 | if (!e.target.files.length) return; |
|
0 commit comments