document.addEventListener('DOMContentLoaded', () => { const scopeSelect = document.getElementById('scopeSelect'); const parentSelect = document.getElementById('parentSelect'); const licenceInput = document.getElementById('licenceInput'); const dateFromInput = document.getElementById('dateFromInput'); const dateToInput = document.getElementById('dateToInput'); const directionInput = document.getElementById('directionInput'); const documentTypeInput = document.getElementById('documentTypeInput'); const endPointInput = document.getElementById('endPointInput'); const searchInput = document.getElementById('searchInput'); const pageSizeSelect = document.getElementById('pageSizeSelect'); const searchBtn = document.getElementById('searchBtn'); const clearBtn = document.getElementById('clearBtn'); const prevPageBtn = document.getElementById('prevPageBtn'); const nextPageBtn = document.getElementById('nextPageBtn'); const tableBody = document.getElementById('usageTableBody'); const paginationSummary = document.getElementById('paginationSummary'); const usageError = document.getElementById('usageError'); const usageInfo = document.getElementById('usageInfo'); let currentPage = 1; let totalRows = 0; const formatDate = (value) => { if (!value) return ''; const dt = new Date(value); if (Number.isNaN(dt.getTime())) return value; return dt.toISOString().slice(0, 19).replace('T', ' '); }; function setError(message) { usageError.textContent = message; usageError.classList.remove('d-none'); } function clearError() { usageError.textContent = ''; usageError.classList.add('d-none'); } function setInfo(message) { usageInfo.textContent = message; usageInfo.classList.remove('d-none'); } function clearInfo() { usageInfo.textContent = ''; usageInfo.classList.add('d-none'); } function updateScopeInputs() { const scope = scopeSelect.value; parentSelect.disabled = scope !== 'parent'; licenceInput.disabled = scope !== 'licence'; } function buildQueryParams(pageOverride = null) { const params = new URLSearchParams(); params.set('scope', scopeSelect.value); params.set('page', String(pageOverride || currentPage)); params.set('page_size', pageSizeSelect.value); if (parentSelect.value) params.set('parent_name', parentSelect.value); if (licenceInput.value.trim()) params.set('licence_number', licenceInput.value.trim()); if (dateFromInput.value) params.set('date_from', dateFromInput.value); if (dateToInput.value) params.set('date_to', dateToInput.value); if (directionInput.value.trim()) params.set('direction', directionInput.value.trim()); if (documentTypeInput.value.trim()) params.set('document_type', documentTypeInput.value.trim()); if (endPointInput.value.trim()) params.set('end_point', endPointInput.value.trim()); if (searchInput.value.trim()) params.set('search', searchInput.value.trim()); return params; } function renderRows(rows) { tableBody.innerHTML = ''; if (!rows || rows.length === 0) { const row = document.createElement('tr'); row.innerHTML = 'No records found for this filter set.'; tableBody.appendChild(row); return; } rows.forEach((item) => { const tr = document.createElement('tr'); tr.innerHTML = ` ${formatDate(item.timestamp_utc)} ${item.parent_name || ''} ${item.licence_no || ''} ${item.company_name || ''} ${item.end_point || ''} ${item.direction || ''} ${item.document_type || ''} ${item.credit_used ?? 0} ${item.guid || ''} ${item.erp_document_number || ''} ${item.identifier_id || ''} ${item.magma_runset || ''} ${(item.local_status || '') + ' / ' + (item.central_sync_status || '')} `; tableBody.appendChild(tr); }); } function renderPagination(page, pageSize, total) { const pageCount = Math.max(1, Math.ceil(total / pageSize)); paginationSummary.textContent = `Page ${page} of ${pageCount} (${total} total rows)`; prevPageBtn.disabled = page <= 1; nextPageBtn.disabled = page >= pageCount; } async function fetchRows(pageOverride = null) { clearError(); clearInfo(); const params = buildQueryParams(pageOverride); const response = await fetch(`/api/api_submissions_usage_rows?${params.toString()}`); const payload = await response.json(); if (!response.ok) { throw new Error(payload.error || `Request failed (${response.status})`); } if (payload.available === false) { renderRows([]); renderPagination(1, Number(pageSizeSelect.value), 0); setInfo(payload.message || 'API submissions data is not available yet.'); return; } currentPage = payload.page || 1; totalRows = payload.total_rows || 0; renderRows(payload.rows || []); renderPagination(currentPage, payload.page_size || Number(pageSizeSelect.value), totalRows); } searchBtn.addEventListener('click', async () => { currentPage = 1; try { await fetchRows(1); } catch (err) { setError(err.message); } }); clearBtn.addEventListener('click', async () => { scopeSelect.value = 'all'; parentSelect.value = ''; licenceInput.value = ''; dateFromInput.value = ''; dateToInput.value = ''; directionInput.value = ''; documentTypeInput.value = ''; endPointInput.value = ''; searchInput.value = ''; pageSizeSelect.value = '50'; updateScopeInputs(); currentPage = 1; try { await fetchRows(1); } catch (err) { setError(err.message); } }); prevPageBtn.addEventListener('click', async () => { if (currentPage <= 1) return; try { await fetchRows(currentPage - 1); } catch (err) { setError(err.message); } }); nextPageBtn.addEventListener('click', async () => { const pageSize = Number(pageSizeSelect.value); const pageCount = Math.max(1, Math.ceil(totalRows / pageSize)); if (currentPage >= pageCount) return; try { await fetchRows(currentPage + 1); } catch (err) { setError(err.message); } }); scopeSelect.addEventListener('change', updateScopeInputs); updateScopeInputs(); const urlParams = new URLSearchParams(window.location.search); if (urlParams.get('scope')) scopeSelect.value = urlParams.get('scope'); if (urlParams.get('parent_name')) parentSelect.value = decodeURIComponent(urlParams.get('parent_name')); if (urlParams.get('licence_number')) licenceInput.value = urlParams.get('licence_number'); if (urlParams.get('end_point')) endPointInput.value = urlParams.get('end_point'); updateScopeInputs(); searchBtn.click(); });