|
|
|
|
|
|
|
|
function testCompatibility() { |
|
|
const requiredFeatures = { |
|
|
'Promise': window.Promise, |
|
|
'fetch': window.fetch, |
|
|
'Web Components': window.customElements, |
|
|
'Shadow DOM': 'attachShadow' in Element.prototype, |
|
|
'ES6 Modules': 'noModule' in HTMLScriptElement.prototype, |
|
|
'CSS Variables': window.CSS && CSS.supports('color', 'var(--test)') |
|
|
}; |
|
|
|
|
|
const missingFeatures = Object.entries(requiredFeatures) |
|
|
.filter(([_, supported]) => !supported) |
|
|
.map(([name]) => name); |
|
|
|
|
|
if (missingFeatures.length > 0) { |
|
|
const warning = document.createElement('div'); |
|
|
warning.className = 'compatibility-warning'; |
|
|
warning.innerHTML = ` |
|
|
<div class="warning-content"> |
|
|
<h3>⚠️ Compatibility Warning</h3> |
|
|
<p>Your browser is missing these required features:</p> |
|
|
<ul>${missingFeatures.map(f => `<li>${f}</li>`).join('')}</ul> |
|
|
<p>Please update your browser or use a modern alternative like Chrome, Firefox, or Edge.</p> |
|
|
</div> |
|
|
`; |
|
|
document.body.prepend(warning); |
|
|
return false; |
|
|
} |
|
|
return true; |
|
|
} |
|
|
|
|
|
const dbTables = [ |
|
|
{ |
|
|
table_name: 'documents', |
|
|
table_schema: 'Stores document metadata including OCR processing info', |
|
|
row_count: 50430, |
|
|
columns: [ |
|
|
'id', 'doc_id', 'file_path', 'file_type', 'content', |
|
|
'file_hash', 'processing_time_seconds', 'file_size_bytes', |
|
|
'ocr_date' |
|
|
] |
|
|
}, |
|
|
{ |
|
|
table_name: 'users', |
|
|
table_schema: 'Contains user account information and permissions', |
|
|
row_count: 15 |
|
|
}, |
|
|
{ |
|
|
table_name: 'sessions', |
|
|
table_schema: 'Tracks active user sessions and login history', |
|
|
row_count: 28 |
|
|
} |
|
|
]; |
|
|
|
|
|
async function fetchTables() { |
|
|
try { |
|
|
|
|
|
const localResponse = await fetch('/api/tables.json'); |
|
|
if (localResponse.ok) { |
|
|
const data = await localResponse.json(); |
|
|
return data.tables || dbTables; |
|
|
} |
|
|
|
|
|
|
|
|
console.warn('Using default table data - local API not available'); |
|
|
return dbTables; |
|
|
} catch (error) { |
|
|
console.error('Table fetch error:', error); |
|
|
showError('Using default table data - could not connect to API'); |
|
|
return dbTables; |
|
|
} |
|
|
} |
|
|
|
|
|
function displayTables(tables) { |
|
|
const tablesContainer = document.querySelector('.divide-y'); |
|
|
if (!tablesContainer) return; |
|
|
|
|
|
tablesContainer.innerHTML = ''; |
|
|
|
|
|
tables.forEach(table => { |
|
|
const tableElement = document.createElement('div'); |
|
|
tableElement.className = 'p-6 hover:bg-gray-50 transition cursor-pointer group'; |
|
|
tableElement.innerHTML = ` |
|
|
<div class="flex justify-between items-center"> |
|
|
<div> |
|
|
<div class="flex items-center space-x-3"> |
|
|
<div class="bg-indigo-100 p-2 rounded-lg"> |
|
|
<i data-feather="database" class="text-indigo-600 w-4 h-4"></i> |
|
|
</div> |
|
|
<div> |
|
|
<h3 class="font-medium text-gray-800">${table.table_name}</h3> |
|
|
<p class="text-sm text-gray-500">${table.table_schema || 'No description available'}</p> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
<div class="flex items-center space-x-4"> |
|
|
<span class="text-xs bg-gray-100 px-2 py-1 rounded text-gray-600"> |
|
|
${table.row_count || '?'} rows |
|
|
</span> |
|
|
<i data-feather="chevron-right" class="text-gray-400 group-hover:text-indigo-500 transition"></i> |
|
|
</div> |
|
|
</div> |
|
|
`; |
|
|
tablesContainer.appendChild(tableElement); |
|
|
}); |
|
|
feather.replace(); |
|
|
} |
|
|
|
|
|
|
|
|
function showError(message) { |
|
|
const errorElement = document.createElement('div'); |
|
|
errorElement.className = 'bg-red-50 text-red-600 p-4 rounded-lg mb-6'; |
|
|
errorElement.textContent = message; |
|
|
document.querySelector('.max-w-4xl').prepend(errorElement); |
|
|
} |
|
|
|
|
|
document.addEventListener('DOMContentLoaded', async () => { |
|
|
|
|
|
if (!testCompatibility()) { |
|
|
console.error('Browser missing required features'); |
|
|
return; |
|
|
} |
|
|
console.log('Application initialized'); |
|
|
|
|
|
const loading = document.getElementById('loading'); |
|
|
try { |
|
|
const tables = await fetchTables(); |
|
|
displayTables(tables); |
|
|
} catch (error) { |
|
|
console.error('Initialization error:', error); |
|
|
showError('Using default table data - could not initialize'); |
|
|
displayTables(dbTables); |
|
|
} finally { |
|
|
if (loading) loading.style.display = 'none'; |
|
|
} |
|
|
}); |
|
|
|
|
|
document.getElementById('searchInput')?.addEventListener('input', function(e) { |
|
|
const searchTerm = e.target.value.toLowerCase(); |
|
|
const tablesContainer = document.querySelector('.divide-y'); |
|
|
if (!tablesContainer) return; |
|
|
|
|
|
const allTables = tablesContainer.querySelectorAll('div.p-6'); |
|
|
allTables.forEach(table => { |
|
|
const name = table.querySelector('h3').textContent.toLowerCase(); |
|
|
const desc = table.querySelector('p').textContent.toLowerCase(); |
|
|
if (name.includes(searchTerm) || desc.includes(searchTerm)) { |
|
|
table.style.display = 'block'; |
|
|
} else { |
|
|
table.style.display = 'none'; |
|
|
} |
|
|
}); |
|
|
}); |
|
|
|