refactor(files): merge grid and list builder, use CSS only to switch between views
This commit is contained in:
@@ -55,15 +55,14 @@ const multiSelect = {
|
||||
clear() {
|
||||
this._selected.clear();
|
||||
this._lastClickedIndex = -1;
|
||||
document.querySelectorAll('.file-card.selected, .file-item.selected')
|
||||
document.querySelectorAll('.file-item.selected')
|
||||
.forEach(el => el.classList.remove('selected'));
|
||||
document.querySelectorAll('.item-checkbox').forEach(cb => cb.checked = false);
|
||||
this._syncUI();
|
||||
},
|
||||
|
||||
selectAll() {
|
||||
this._selectAllInContainer('files-grid', '.file-card');
|
||||
this._selectAllInContainer('files-list-view', '.file-item');
|
||||
this._selectAllInContainer('files-list', '.file-item');
|
||||
this._syncUI();
|
||||
},
|
||||
|
||||
@@ -148,7 +147,7 @@ const multiSelect = {
|
||||
},
|
||||
|
||||
_getAllVisibleItems() {
|
||||
return [...document.querySelectorAll('.file-item, .file-card')];
|
||||
return [...document.querySelectorAll('.file-item')];
|
||||
},
|
||||
|
||||
_extractInfo(el) {
|
||||
@@ -482,9 +481,10 @@ const multiSelect = {
|
||||
document.addEventListener('keydown', (e) => {
|
||||
if (e.target.closest('input, textarea, [contenteditable], .rename-dialog, .share-dialog, .confirm-dialog')) return;
|
||||
|
||||
// ctrl+a cmd+a
|
||||
if ((e.ctrlKey || e.metaKey) && e.key === 'a') {
|
||||
const grid = document.getElementById('files-grid');
|
||||
if (grid && grid.closest('.files-container')) {
|
||||
const filesList = document.getElementById('files-list');
|
||||
if (filesList && filesList.closest('.files-container')) {
|
||||
e.preventDefault();
|
||||
this.selectAll();
|
||||
}
|
||||
@@ -512,4 +512,4 @@ const multiSelect = {
|
||||
};
|
||||
|
||||
// Expose globally
|
||||
window.multiSelect = multiSelect;
|
||||
window.multiSelect = multiSelect;
|
||||
|
||||
@@ -103,17 +103,18 @@ const search = {
|
||||
* @param {Object} results - Enriched search results from backend
|
||||
*/
|
||||
displaySearchResults(results) {
|
||||
const filesGrid = document.getElementById('files-grid');
|
||||
const filesListView = document.getElementById('files-list-view');
|
||||
window.ui.resetFilesList(); // ensure also list visible & error hidden
|
||||
const filesList = document.getElementById('files-list');
|
||||
|
||||
filesGrid.innerHTML = '';
|
||||
filesListView.innerHTML = `
|
||||
// reset list
|
||||
filesList.innerHTML = `
|
||||
<div class="list-header">
|
||||
<div class="list-header-checkbox"><input type="checkbox" id="select-all-checkbox" title="Select all"></div>
|
||||
<div data-i18n="files.name">Name</div>
|
||||
<div data-i18n="files.type">Type</div>
|
||||
<div data-i18n="files.size">Size</div>
|
||||
<div data-i18n="files.modified">Modified</div>
|
||||
<div></div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
@@ -142,7 +143,7 @@ const search = {
|
||||
</button>
|
||||
</div>
|
||||
`;
|
||||
filesGrid.appendChild(searchHeader);
|
||||
filesList.appendChild(searchHeader);
|
||||
|
||||
// Sort dropdown — re-searches with new sort order (server-side)
|
||||
const sortSelect = document.getElementById('search-sort-select');
|
||||
@@ -172,13 +173,10 @@ const search = {
|
||||
|
||||
// Empty state
|
||||
if (results.files.length === 0 && results.folders.length === 0) {
|
||||
const emptyState = document.createElement('div');
|
||||
emptyState.className = 'empty-state';
|
||||
emptyState.innerHTML = `
|
||||
window.ui.showError(`
|
||||
<i class="fas fa-search empty-state-icon"></i>
|
||||
<p class="search-empty-text">No results found for this search</p>
|
||||
`;
|
||||
filesGrid.appendChild(emptyState);
|
||||
`);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -167,11 +167,10 @@ const favorites = {
|
||||
await this._fetchFromServer();
|
||||
}
|
||||
|
||||
const filesGrid = document.getElementById('files-grid');
|
||||
const filesListView = document.getElementById('files-list-view');
|
||||
window.ui.resetFilesList(); // ensure also list visible & error hidden
|
||||
const filesList = document.getElementById('files-list');
|
||||
|
||||
filesGrid.innerHTML = '';
|
||||
filesListView.innerHTML = `
|
||||
filesList.innerHTML = `
|
||||
<div class="list-header">
|
||||
<div class="list-header-checkbox"><input type="checkbox" id="select-all-checkbox" title="Select all"></div>
|
||||
<div data-i18n="files.name">Name</div>
|
||||
@@ -184,14 +183,11 @@ const favorites = {
|
||||
window.ui.updateBreadcrumb('');
|
||||
|
||||
if (this._cache.size === 0) {
|
||||
const emptyState = document.createElement('div');
|
||||
emptyState.className = 'empty-state';
|
||||
emptyState.innerHTML = `
|
||||
window.ui.showError( `
|
||||
<i class="fas fa-star empty-state-icon"></i>
|
||||
<p>${window.i18n ? window.i18n.t('favorites.empty_state') : 'No favorite items'}</p>
|
||||
<p>${window.i18n ? window.i18n.t('favorites.empty_hint') : 'To mark as favorite, right-click on any file or folder'}</p>
|
||||
`;
|
||||
filesGrid.appendChild(emptyState);
|
||||
`);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -86,32 +86,28 @@ const recent = {
|
||||
|
||||
const recentItems = await response.json();
|
||||
|
||||
const filesGrid = document.getElementById('files-grid');
|
||||
const filesListView = document.getElementById('files-list-view');
|
||||
window.ui.resetFilesList(); // ensure also list visible & error hidden
|
||||
const filesList = document.getElementById('files-list');
|
||||
|
||||
filesGrid.innerHTML = '';
|
||||
filesListView.innerHTML = `
|
||||
filesList.innerHTML = `
|
||||
<div class="list-header">
|
||||
<div class="list-header-checkbox"><input type="checkbox" id="select-all-checkbox" title="Select all"></div>
|
||||
<div data-i18n="files.name">Name</div>
|
||||
<div data-i18n="files.type">Type</div>
|
||||
<div data-i18n="files.size">Size</div>
|
||||
<div data-i18n="recent.accessed">Accessed</div>
|
||||
<div></div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
window.ui.updateBreadcrumb('');
|
||||
|
||||
if (recentItems.length === 0) {
|
||||
const emptyState = document.createElement('div');
|
||||
emptyState.className = 'empty-state';
|
||||
emptyState.innerHTML = `
|
||||
window.ui.showError(`
|
||||
<i class="fas fa-clock empty-state-icon"></i>
|
||||
<p>${window.i18n ? window.i18n.t('recent.empty_state') : 'No recent files'}</p>
|
||||
<p>${window.i18n ? window.i18n.t('recent.empty_hint') : 'Files you open will appear here'}</p>
|
||||
`;
|
||||
filesGrid.appendChild(emptyState);
|
||||
return;
|
||||
`);
|
||||
}
|
||||
|
||||
const folders = [];
|
||||
|
||||
Reference in New Issue
Block a user